哈希值比特幣打款
比特幣是一種P2P形式的虛擬加密數字貨幣。點對點傳輸意味著去中心化的支付系統。比特幣是一種虛擬的數字貨幣,是通過特定程序進行大量計算而產生的。此過程稱為“采礦”,而進行采礦的人員稱為“礦工”。實際上,使用計算機來解決復雜的數學問題,以確保比特幣網路的分布式記帳系統的一致性。比特幣網路將自動調整數學問題的難度,以便整個網路大約每10分鍾獲得一個合格的答案。然後,比特幣網路將產生一定數量的比特幣作為獎勵,以獎勵那些得到答案的人。用外行的話說,比特幣不依賴特定的貨幣機構發行,而是通過基於特定演算法的大量計算生成的。
最多可以將256個0或1s組合為2到256的不同數字的冪。這個龐大的集合可以滿足任何與比特幣相關的代幣。哈希的另一個重要特徵是。如果要生成特殊的輸出編號,則只能通過隨機嘗試一個接一個地進行正向計算,並且不能從輸出結果中反轉輸入信息。此功能是比特幣平穩運行的重要基礎。挖掘是通過更改隨機數直到滿足要求來生成不同的哈希值。隨著整個網路計算能力的提高,查找哈希值的難度將增加,從而保持每10分鍾查找一次哈希值的頻率。
2. 小白如何了解比特幣
多去比特幣新聞網看比特幣新聞,以及行情,技術
比特幣的誕生
比特幣的誕生應該算在2008年的11月1號的那一天,一個化名為「中本聰」的人在網上發表了一篇論文。 在這篇論文里,他詳細的描述了一種嶄新的貨幣體系,他將之命名為「比特幣」。
隨後,次年的1月3日,首個比特幣程序在中本聰的手裡誕生,與之一起誕生的是最早挖礦所得的50個比特幣。在那之後他開始逐漸淡出,直到徹底的消失。
人們至今也沒找出這個叫中本聰的人的真實身份,即使如今的運營商、互聯網巨頭與政府已將人們在網路上的行跡牢牢掌握在了手裡。
他在發言時會經常切換美式和英式英語,他隨機在全天不同的時間上線,以隱瞞自己的國籍和時區;他隱藏自己的ip地址,加密自己的郵件,故意偽造一些寫作和發言風格來混淆視聽;此外他還是一名造詣頗深的密碼學專家,對了,他發表論文的地方就叫做 "密碼學郵件列表"。
所以比特幣從誕生時起就帶上了一種黑客精神:對抗任何勢力所強加的審查。
當然我們也可以這么看: 如果一個發明了匿名貨幣系統的黑客,卻連自我身份都不能匿名的話,那整件事會變成一個笑話。
但是所幸,中本聰沒讓我們失望。
1. 什麼是貨幣
我發現要講清楚什麼是比特幣,這一節是無論如何也跑不了的了。我不是什麼經濟領域的專家,我只能很粗淺且只能在很直觀的意義上講述這個問題。(不過就標題所表達出來的本文主旨而言,似乎也足夠了)
高中的課本里有講過(還記得嗎?) , 貨幣是儲存價值的媒介,一種東西要成為貨幣,最重要的,他必須滿足:
1) 稀缺性。
這就是為什麼黃金可以而沙子不能被當作貨幣的原因。稀缺性可以理解為獲得它的難度,越是稀缺要獲得它就越難。 一個直觀的認識是這樣的:假設你一個月的薪水是5000元,它意味著人民幣的稀缺程度恰好到了這樣一個度,即你要付出一個月的勞動才能獲得5000個一元。 你不會同意以5000粒沙子來支付你的薪水,是因為與其通過勞動一個月來獲得它,你大可以去沙灘走一圈就輕輕鬆鬆地得到了。
那麼現在的金融系統是如何保證貨幣的稀缺性的呢?控制發行。貨幣的發行是被牢牢掌握在中央銀行手中的,這樣貨幣的發行量才能做到可控(所以你現在知道了,私自印鈔是違法的)。回到剛剛那個例子, 你同意以5000元來支付你一個月的薪水,是因為人民幣發行量剛好到了這個度。如果此時的人民幣發行量翻倍了,稀缺度相應降低, 這時候你就應該要求以1萬元來支付你的薪水了(但市場的響應往往不會這么快,在這期間你的財富其實是被剝奪了--你的勞動本該獲得一萬元卻只得到5000元的回報)。
2)交易性
貨幣存在的目的當然是為了交易。就像很多人告訴你的那樣,錢是用來花的,不是用來帶進棺材的。所以除了滿足稀缺性以外,一種東西它越是方便交易,那麼他就越符合理想貨幣的標准。所以在貨幣史上,銀元代替了貝殼,紙幣代替了銀元,數字貨幣正逐漸取代紙幣。
這里所說的「交易」,是指財產從一方轉移到另一方,即一方的財產減少相應的另一方增多。對實物貨幣來說,它發生得非常自然,甲要給100元乙,當100元鈔票從甲的手裡轉移到乙的手裡的那一瞬間,交易完成了,甲的財產減去了100元而乙的財產增加了100元,這個過程中沒有第三方的參與,完全是甲和乙之間的私密行為;然而當交易發生在數字貨幣層面上時,就沒這么簡單了,甲要給100元給乙,如何確保交易完成了呢?假設甲和乙在各自的電腦上記錄了自己的財富數額的話,那麼如何確保乙在給自己增加了100元的時候甲如實地給自己減去了100元呢?這個時候我們不得不要引入第三方了--我們稱之為「銀行」的那個傢伙。 當甲要轉移100元給乙時,他不是直接給乙而是給銀行, 「請把我的100元轉給乙」 ,於是銀行在甲的帳目上扣掉100元,再在乙的帳目上加上這100元。(我們假設它慷慨地不收取任何交易費)
以上所說的就是現代貨幣系統的一個粗廓模型,這個模型最大的弊端在於:人們不得不去信任一個中心系統。
數字貨幣的交易必須依賴銀行,而一個人的銀行賬號可能會被審查、限制甚至是剝奪。當一方想要給另一方轉移自己的財富時,銀行可以收取高昂的費用或者直接拒絕(比如你試試匯一筆錢給美國的親戚)。
貨幣的發行必須依賴中央銀行。好吧,這已經是一個廣為人知的秘密了:貨幣一直在貶值,或者說貨幣一直在超額發行(想想20年前的100塊跟現在的100塊)。 我引用兩段話, 一段是凱恩斯說的, 「通過連續的通貨膨脹過程,政府可以秘密地、不為人知地沒收公民財富的一部分。用這種辦法可以任意剝奪人民的財富,在使多數人貧窮的過程中,卻使少數人暴富。」, 另一段,出自哈耶克, 「政府無法克制濫發貨幣的沖動」。
那麼有沒有可能設計出一套貨幣系統,在這個系統里我們不需要一個中心機構,不用被迫去信任任何的第三方, 使貨幣的發行透明可控,貨幣的交易私密而安全呢?
你猜?
2. 什麼是比特幣
所以我們現在可以回答到了,比特幣是一個發行去中心化和交易去中心化的電子貨幣系統。在這個系統里,貨幣的發行量是透明且可預期的,貨幣的交易利用整個網路的協同合作來保證交易的安全。
下面我將逐步拆解比特幣的原理。需要注意的是,比特幣作為一個已經實際在使用的產品,它本身有著非常豐富的細節。本篇目的是向沒有技術背景的讀者講述比特幣的基本原理,因此並不會涉及到這些細節。比如說錢包的地址其實並不是公鑰,而是公鑰的二次哈希值; 區塊鏈的難度要求並不是簡單的把所有區塊鏈的內容做一次哈希運算;等等。但是為了敘述的簡潔性,在不影響對基本原理的講解下這些都做了簡化處理,希望大家能夠理解。
2.0. 比特幣網路 -- 由眾多運行著比特幣程序的節點組成
比特幣是一個由眾多平等的節點組成的網路。
一個節點就是一個比特幣程序,任何能夠連上網和具有一定計算能力的機器都能運行這個程序 -- 所以你家裡的電腦也可以作為比特幣網路里的節點:)
節點之間是可以互相通訊的,同時比特幣有一套機制可以讓一個節點向其他所有節點發出消息,這個行為被稱為「廣播」。
2.1. 區塊鏈 -- 一個公共的賬簿
我們先回到銀行的例子。銀行最基本的功能,無非是維護一個賬簿,而這個賬簿只需如實記錄每一筆交易而已。比如X年X月X日,王小明轉了30塊錢給張大毛;Y年Y月Y日,張大毛轉了12塊錢給李小豆,諸如此類。 根據這個賬簿我們可以查到一個人的所有交易記錄,因而也就能推算出這個人此刻的賬戶余額為多少。比如李小豆從建銀行帳號開始,轉進的交易合計500元,轉出的交易合計300元,那麼可以算出此時李小豆賬戶余額一定是200元。
維護好這個賬簿,並且作為唯一的維護者(只有銀行才有權力查看和修改), 銀行作為一個交易中心的職責就完成了。
比特幣也有賬簿,但是與銀行不同的是,這個賬簿是公開的,任何人可以去查看和審核它。
這個賬簿被稱為"區塊鏈"。你可以把區塊鏈想像成一個小冊子,冊子的每一頁寫滿了交易信息,並且不斷有新的頁加入進來。
2.2 錢包 ---由一對公鑰和私鑰構成的的賬戶
上面一小節,解釋了什麼是比特幣的賬簿。這一小節將解釋這個賬簿里資金的歸屬權問題,亦即比特幣的帳戶系統。
比特幣里的帳戶跟銀行的帳戶有本質的區別。
在銀行賬戶下,銀行記錄下了該賬戶所有者的身份信息(回想一下你去銀行開戶時提交的資料:照片、身份證、電話號碼、家庭住址....),因而只要你能向銀行證明你的身份,你也就獲得了你名下財產的所有權。在這種模型下,銀行扮演了一個全知全能的上帝角色:他知曉現實人們的財富信息。我們除了祈禱上帝不要把我們的信息泄露出去或者利用它干壞事以外,別無他法。
在比特幣的世界裡,並沒有銀行這樣一個機構,它不會強制人們暴露自己的身份以換取資金的安全。比特幣的帳戶只是簡單的由兩串數字構成,分別被稱為「公鑰」和「私鑰」,除此之外再無其他。
這個兩個數字所具有的數學特性 -一個被私鑰加密過的數據只能通過公鑰來解開,所謂的非對稱加密-使它們能夠完美的實現一個帳戶(比特幣世界裡被稱為錢包)需要的功能。
我們把公鑰作為帳戶地址 --在比特幣世界裡也稱錢包地址 --它類似於銀行系統里的帳號,就是當你告訴別人「請給我的帳號打300塊錢」時,需要告訴別人的那一串數字。對銀行來說,它是「招商銀行6214850200251100」,對比特幣而言,它是「 」。
私鑰,是證明錢包所有權的*唯一*憑證,你通過證明你是該錢包的私鑰持有者來獲得該錢包的所有權。注意,和銀行賬號的密碼不同的是,你丟失了密碼還可以通過證實自己的身份來找回,但你一旦丟失了密鑰那這個錢包里的資金就再也找不回了。
因為公鑰和私鑰所具備的非對稱加密的美妙特性,錢包的所有者並不需要通過出示私鑰來證明自己持有它。他只需要出示一段用私鑰加密過的文字,驗證者能用公鑰(即錢包地址)解開這段文字即能證明。
那麼怎麼生成一對這樣的數字呢?
相比於銀行開戶的繁瑣手續,你唯一需要的只是一個實現了該功能的數學軟體。
感謝數學。
2.3 區塊 --- 有難度要求的賬簿頁
前面提到,區塊鏈就是一個賬簿,一個區塊就是這個賬簿里固定大小的一頁。(比特幣規定區塊大小不超過1M,而一筆交易大約250位元組大小,因此一個區塊平均能寫下4000筆左右交易。)
區塊鏈是公共的,每個人都可以下載,驗算和查看區塊鏈里的交易信息。同時每個人也都可以向區塊鏈增加區塊,只是我們需要一種機制來防止壞人們通過提交大量的區塊來拖垮整個網路。這個機制的核心在於我們要使區塊的構造變得有代價,代價大到不可能在短時間內構造出大量的區塊。
比特幣要求,新的區塊必須使區塊鏈具有某種特徵的哈希值才能被允許加入。 哈希值是一種數學運算(感謝數學!),你可以簡單理解為對數據的摘要,不同的數據有不同的哈希值,即使兩個數據只相差一個位元組,他們對應的哈希值也會截然不同。
比特幣通過「要求區塊鏈的哈希值具有某種特徵」來控制構造區塊的難度,這個特徵其實就是要求哈希值開頭的幾位數字為0. 比方說當前比特幣要求哈希值前4位必須位0,我們用P表示當前的區塊鏈,用B表示當前構造的區塊,那麼P+B的哈希值前4位必須為0該區塊B才能被允許加入區塊鏈中。 這里要注意三點, 1. 要構造出這樣一個區塊沒有捷徑,必須通過大量的計算,一遍一遍的往B里放隨機數直到P+B的哈希值滿足要求為止。2. 哈希值前面為0的位數越多,要構造出這個區塊的難度就越大。
好了,我們現在有了控制區塊構造難度的工具了,那麼比特幣通過什麼樣的規則來控制難度呢?
比特幣規定區塊鏈應保持在平均每兩周時間增加2016個區塊(也就是平均10分鍾一個)的速度上。 也就是說,每增加2016個區塊,系統就會算出產生這2016個區塊的時間,如果它小於兩周那麼就提高接下來2016個區塊的難度(比如從要求哈希值前3個必須為0提高到前4個為0), 如果它大於兩周就降低難度(比如從要求4個0降低到3個0), 這樣從長遠來看,就使區塊鏈平均以每10分鍾一個的速度增加了。
也因此可以推論,區塊鏈的難度要求與全網構造區塊的算力成正相關關系。也就是說,參與構造區塊的算力增加那麼難度要求就會提高,相反則會降低,這樣才能使區塊鏈以固定的速度增加。
上面提到,讓構造區塊變得有難度,是為了防止被壞人攻擊。同時,它還有一個作用是防止壞人們將一筆錢花兩次(所謂雙花問題)。 我們看如下一個比特幣的應用場景:
小張要用比特幣在小李那裡網購一個商品,
1) 小李用數學軟體生成好一個比特幣錢包,並將該錢包地址(公鑰)告訴小張。
2) 小張選取了自己一個有足夠余額的錢包,並用這個錢包的私鑰簽發了一筆交易(該交易把一部分比特幣發到小李的錢包地址上),然後把交易廣播給全網路。
3)網路中的一些節點把該交易收納到當前正在構造的區塊中。 第一個成功構造出合法區塊的節點把該區塊廣播給全網路,得到全網路的認可被加到區塊鏈上。
4) 小李發現區塊鏈上已經有一個區塊包含了指向自己錢包地址的交易,並且交易金額正確。 小李隨即給小張發貨。
5)小張發現小李已經發貨,這時他開始重新構造一筆交易,試圖把剛剛發給小李的錢發到自己另外的一個錢包里。這個時候他不能再把這筆交易廣播出去了,因為網路中的其它節點會發現該交易是不合法(花掉一筆已經花掉的錢)而直接拒絕掉, 小李只能自己構造一個包含了該交易的區塊,並且試圖說服網路中的其它節點他的這個節點才是合法而剛剛那個(包含發給小李交易的區塊)是不合法的, 這樣就能實現他一筆錢花兩次的目的。
比特幣規定當區塊鏈發生分叉時(即出現了兩個或以上互斥的合法區塊)時,應該追隨最長的那條。 那意味著小張要實現自己雙花目的,他必須在產生了小李那個區塊後,馬上構造出兩個區塊來,才能說服其他節點跟隨自己的這條鏈。 要達到這個目的,當前時間內他必須擁有(或者接近擁有了)全網51%的算力, 才能搶在其他所有節點之前構造出兩個區塊出來。
2.4 礦工 --- 通過挖礦來爭奪記賬權的區塊鏈維護者們
前一節我們講到,區塊鏈的難度實際上是對區塊鏈的保護,這個難度要求越高區塊鏈就越免於被壞人攻擊。換個方式表述就是,全網構造區塊的算力保障了區塊鏈的安全,全網的算力越高,那麼壞人們獲得全網51%算力的難度就越大,因此越不容易被攻擊。
那麼我們如何激勵節點們貢獻出自己的cpu跟電力來提高全網的算力呢? 答案是區塊獎勵。
比特幣規定,成功構造出合法區塊的節點會獲得一部分比特幣作為獎勵,這部分比特幣是系統生成的,他類似於淘金業里的挖礦,通過辛勤的勞動增加了黃金(比特幣)的流通總量,因此構造區塊的過程被稱為「挖礦」,企圖通過挖礦來獲得區塊獎勵的節點被稱為「礦工」。
挖礦的意義:
1) 它激勵節點們貢獻出算力來保護網路
2) 它實現了一種公平的方式發行比特幣,因為不存在一個中央發行機構。
除了區塊獎勵外,交易者還可以通過額外支付一筆交易費給礦工們來鼓勵他們將自己的交易收納到它的區塊里。這樣當區塊獎勵趨於0時(比特幣總量2100萬枚,意味著越到後面區塊獎勵會越少), 因為有交易費的存在,礦工們也會繼續維護整個網路。值得注意的是這里的交易費跟銀行轉賬費有所不同,銀行的轉賬費是由銀行自上而下規定的,比特幣的交易費是由使用者自由設置自下而上競爭的結果(如果當前交易數量很多而你給的交易費太低的話,可能不會被礦工們收取。)
亦即,礦工成功挖到區塊時,他將獲得 1)區塊獎勵 2)該區塊內所有交易的交易費。
2.5 總結
比特幣的核心是一個公共的賬簿--區塊鏈,每個人都可以核算查看這個賬簿里的交易信息。這個賬簿里不會記錄任何真實世界裡的個人信息,比特幣保護了使用者的隱私。
通過非對稱加密,用戶可以不用出示密鑰就可以證實自己是該密鑰的持有者。因此提供了一個安全的不用信賴任何第三方(對比銀行,你必須信賴它不把你的賬號密碼泄漏出去)的方式發起一筆交易。
因為比特幣是開放的,意味著任何人都可以攻擊比特幣網路。通過控制區塊的難度,使比特幣網路免疫於大部分的攻擊除非攻擊者獲取了接近全網51%的算力。而礦工們是比特幣網路的保護者,比特幣通過區塊獎勵和交易費的方式激勵他們貢獻出自己的cpu,組成巨大的算力屏障,使得任何組織或個人想要發起51%算力攻擊都成為不可能。
3. 區塊鏈技術中的哈希演算法是什麼
1.1. 簡介
計算機行業從業者對哈希這個詞應該非常熟悉,哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。
區塊鏈中哈希函數特性:
函數參數為string類型;
固定大小輸出;
計算高效;
collision-free 即沖突概率小:x != y => hash(x) != hash(y)
隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見演算法有SHA系列和MD5等演算法
1.2. 哈希的用法
哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變數的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。下圖為Hash Pointer的示意圖
4. 關於比特幣的謎題(完結)
你可曾想過: 為什麼礦機算力越大越好?(既然是解數學題那為什麼不是拼誰的演算法厲害啊喂!) 比特幣的數量總和為什麼是2100萬? 比特幣盜竊是怎麼回事? 我不玩比特幣,就真的與比特幣無關了嗎…… 🤔️
關於大眾不再感到陌生的比特幣,背後還有許多巧妙之處。本文介紹了比特幣的基本原理和主要原則,並結合對部分技術細節的剖析,來對上述的一些疑問作出解答。全文較長,約7000字,閱讀時間約為22分鍾,建議收藏後閱讀😁
文章可以分成以下幾個部分:
* 比特幣先驗知識
-- 密碼學相關
-- 比特幣重要概念
* 交易的生命周期
* 區塊鏈的構成
* 區塊鏈的生長
-- 「挖礦」的數學本質
-- 「礦工」的收益
* 比特幣的共識機制
-- 比特幣的去中心化共識
-- 「最長鏈優先」原則
* 比特幣安全性
比特幣作為第一個去中心化的數字貨幣,其設計中運用了不少的密碼學相關知識,主要包括非對稱加密技術、哈希函數等等。理解這些密碼學知識,能幫助我們更好地理解比特幣中的一些概念及規則。
以下是比特幣的一些定義及概念解說,了解過的小夥伴們可以直接跳過~
在比特幣這個創新的支付網路中,一個交易的生命周期大概可以分為幾個階段:創建、傳播和被驗證交織、被打包進區塊記錄到區塊鏈中、獲得更多的確認。圖1對這幾個階段做出了示意。
註:
1⃣️一個支付方A在發起一個比特幣交易時,會使用自己的私鑰對交易信息的哈希值進行簽名。因此A向全網廣播的內容除了交易信息之外,還有自己的公鑰信息、對消息的簽名。其他礦工只要利用A的公鑰即可對這個交易進行驗證,判斷是否真的由A創建。
2⃣️」交易傳播和交易驗證「交替意味著 各個節點基於一定的規則獨立驗證每個交易(共識基礎1) , 一個節點只有認為這個交易有效才會把它繼續傳播出去。
比特幣的底層技術是區塊鏈。區塊鏈系統是一種分布式共識系統,區塊鏈網路中所有的參與節點將就交易的狀態達成一致。
區塊鏈到底是什麼呢?你可以把它理解成一種分布式的交易的共享賬本,以區塊為基本單位鏈接在一起。交易信息將被整理並打包記錄在區塊中。每一個區塊,包含區塊頭,以及緊跟其後的交易列表。區塊頭包含3個區塊元數據集合:前序區塊哈希(嚴格來說是前序區塊頭哈希,因為只有區塊頭被用於哈希運算)、元數據集(包括難度、時間戳、隨機數等)、一個基於加密哈希來高效概括區塊中所有交易的默克爾樹(merkle tree)。了解這個結構,將幫助我們更好地理解挖礦的數學本質。
你可能聽說過「挖礦」這個詞,或者聽說眾人爭相購買挖礦機器來發家致富。但讓人疑惑的是:都說打包區塊的本質是解數學難題,但單憑那些看似簡陋的機器嗡嗡嗡瘋狂耗費電力,就能確保自己解出比特幣難題的勝率高了嗎?比特幣技術原理中,礦工們解決的數學題,難道是一個暴力破解題?
看了一圈,發現礦工們解決的題,還真有點暴力破解的意思,每次嘗試解題的過程幾乎都是茫茫然、去碰運氣的。拼的是誰足夠幸運,也拼誰算的足夠快;算的快了么,試錯次數多,自然勝算也就大了。
解題的背景是這樣的—— 挖礦節點通過基於工作量證明演算法(Proof-of-Work,POW)的證明運算,獨立將交易匯聚到新區塊中(共識基礎2)。 當礦工從網路中接收到一個新的區塊的時候,他發現自己已經在上一輪競爭中失敗了,所以立即開始新區塊的挖礦過程。為了創建一個新的區塊,他從內存池中選擇交易來填充區塊(加入區塊的第一筆交易是一個「鑄幣交易」,3.2節會給出詳相關細節)。接下來是填充欄位來創建區塊頭(包括前序區塊的區塊頭哈希、交易的默克爾樹(Merkel樹)、時間戳、難度目標值、隨機數),然後開始計算這個新區塊的工作量證明。
這個計算的過程簡單來說是對區塊頭部進行兩次sha256運算,得到一個RESULT,如果這個RESULT滿足特定要求,這個人才能算是算對了、才有權利去記賬。滿足要求的RESULT被稱為「工作量證明」(中本聰論文中稱為「proof of work」)。
關於這個計算過程,強調以下幾點:
第一,區塊頭部,包含了前序區塊頭部的哈希、本區塊交易信息的默克爾樹、時間戳、難度目標值、隨機數等信息(見圖2)。
第二,哈希運算具有「知道y,無法推出使得h(x)=y成立的x」、「即使輸入只改變一點點,輸出也會差很多」、「利用任意長度的數據作為輸入,生成一個固定長度的確定結果」的特性。所以大家也不知道什麼樣子的輸入才能產生自己想要的結果,礦工只能不斷嘗試。
第三,前面說到,區塊頭哈希值需要滿足一個特定要求才能成為工作量證明——小於某一閾值,或者說哈希值含有給定前綴。閾值的大小求和挖礦難度有關:挖礦難度是一個動態參數,其值越大,則閾值越小,說明哈希值符合要求的概率更小,礦工每次計算能成為工作量證明的概率越小。比特幣有一個自我調節過程——通過對現有的挖礦算力情況進行估算,來對應調整挖礦難度,可以保證區塊鏈每十分鍾出一個塊,達到控制發行速度的目的。(這個過程的基本思想類似產品筆試的數據估算題,根據「一個提供、一個需要「的思路去構造一個等式,然後求解等式一邊的一個因子;想了解挖礦難度系統和調整方式的同學可以進一步查閱~)
綜合以上三點來看,為了產生工作量證明,用戶基本上會通過調整隨機數來碰運氣(因為其他欄位基本不變)、進行多次運算直至符合要求,別無他法。如此一看,隨機數就具有「幸運數字」的意味了。因此,平均來講,誰計算的能力越強(嘗試的次數越多),就更有希望打包塊。
你可能會想,礦工這么心甘情願地消耗算力去維護區塊鏈,是受到怎樣的利益驅使呢?簡單來說,礦工的收益來源有二:1、計算出工作量證明,創造一個新區塊所獲得的新幣獎勵;2、記賬礦工費。
當礦工找到工作量證明、打包一個新區塊,並把區塊傳送給他的所有對等節點。 每一個挖礦節點都獨立驗證新區塊、把合格的新區塊整合進區塊鏈(共識基礎3) ,並把這個區塊繼續傳給自己的對等節點。結果是,只有經過驗證的區塊才會在網路當中廣泛傳播,保證了誠實礦工挖出的新區塊能被區塊鏈所接納。挖礦成功的個體節點或集體節點,可以同時獲得新幣獎勵和記賬礦工費。
新幣獎勵類似於貨幣的發行,其遵循規則是,第一個四年每一個新區塊產生50btc,第二個四年每一個新區塊產生25btc,第三個四年每個新區塊產生12.5btc,如此周期指數遞減。按照等比數列求和可知,到2140年,比特幣產生的總和約為21000000(所以說比特幣數量有限,天生緊縮)。屆時,不再隨區塊的產生增加新的比特幣,礦工不再擁有第一項收益。但現實中,由於挖礦成本高昂,挖礦成功的往往是是一個礦池的所有參與者。收益被分給礦池地址,礦池按照組內算力貢獻比例來分攤收益的。
記賬礦工費又稱交易費用,以交易輸入和交易輸出之間的差值的形式存在;一個區塊的總交易費用是對加入區塊的所有交易的(交易輸入-交易輸出)求和。一般來說,礦工費越高的交易,會越快被處理。而礦工費在這里起到兩個作用,一個是獎勵礦工,另一個是防止主鏈濫用(防止大家發送交易垃圾信息,因為提出交易是有一定代價的)。
礦工的收益以什麼樣的形式被驗證呢?這里不得不提到 「鑄幣交易」 。每個計算機節點在進行工作量證明計算之前加入區塊的第一筆交易,正是「鑄幣交易」。這個交易從無到有生成比特幣,其金額是新幣獎勵與記賬礦工費的總和,被支付到挖礦礦工自己的比特幣地址。如果礦工找到了一個工作量證明使區塊有效,他就贏得了這個獎勵,因為他構造的「鑄幣交易」生效了。
關於鑄幣交易和「新幣獎勵」,之前有一個讀者問我:一個礦工把自己挖到新區塊的消息公布出去,他的工作量證明 不會被別人剽竊 嗎?
個人認為,至少「鑄幣交易」能防止這件事情發生。讓我們來重申一下計算工作量證明的過程——一個礦工E在新區塊里加入了獎賞自己的「鑄幣交易」,並利用時間戳、前序區塊頭哈希、隨機數、本區塊交易的merkle樹等信息計算出一個符合要求的工作量證明。
在這個過程中,merkle樹啥樣子,取決於包括「鑄幣交易」在內的本區塊所有交易信息。因此可以把鑄幣交易視為工作量證明的間接變數之一。那麼,即使其他人拿到了E的工作量證明,這個工作量證明也是帶有E的印記的、與獎賞E的鑄幣交易相關的,別人根本無法納為己用。
你還可以通過設想以下的場景來加深對共識基礎2「挖礦節點通過基於工作量證明演算法的證明運算,獨立將交易匯聚到新區塊中」的理解。
為什麼一個挖出新區塊的礦工不悄悄使個心眼,在創建區塊之初就把鑄幣交易的金額設成1000BTC呢?原因在於每個節點都是基於相同的規則來獨立驗證區塊的。礦工必須創建完美的、符合公共規則的、正確依據工作量證明方法的區塊;而一個無效的鑄幣交易會導致整個區塊無效,並被其他節點拒絕,永遠無法成為賬本的一部分。可以預想,為了生成這個工作量證明,礦工們已經投入了巨大的算力和電量去挖礦,如果涉嫌欺詐而被否決,其為挖礦付出成本都付諸東流。
綜上所述,礦工不能冒領他人的獎勵,而拿到獎勵的礦工也必須只能拿取符合規定的數額。
比特幣的卓越之處,在於建立了一種去中心化的自發共識。這種共識是自發產生的,是成千上萬在網路中遵循著共同規則的節點,在非同步交互中形成的,不依賴於任何中央機構的調解和干涉。
關於比特幣的4項主要共識基礎,本文在講解對應細節時有提及,下面做一個整合:
這四個過程相輔相成、互相作用,形成了自發的全網共識,促使全網節點組合出可信、公開、權威的總賬。
你可能會想,比特幣是一個去中心化的、基於大眾信任的、依靠眾人力量運轉的一個東西。萬一有一部分礦工被壞人收買了咋辦呢?「51%攻擊」指的又是什麼?比特幣交易所要求的「6個確認」又是怎麼回事?
這里首先要提到比特幣的一個規則「 最長鏈優先 」。意思是, 比特幣的賬單鏈在出現分叉的時候,每個礦工會獨立選擇長(累積了最多工作量證明)的鏈條,在上面繼續挖礦工作(共識基礎4) 。
這個原則主要涉及到兩個問題:
當有兩個礦工A和B同時挖礦成功(算出符合要求的數學答案)時,他們分別把自己計算出來的工作量證明作為下一個塊的前序區塊哈希,生成一個塊銜接到原有的鏈後面,由此出現了兩個分支。
這個時候,這兩個成功的礦工廣播了自己打包成功的消息。由於區塊鏈是一個去中心化的數據結構,區塊消息到達不同節點的時間點不一致,故不同的節點可能擁有不完全一樣的區塊鏈視圖——有的礦工會先收到A的消息,有的則先收到B的消息。為了解決這個問題,收到消息的礦工們遵循一個原則:選擇並嘗試延長最長的鏈。
因此,這兩條分支會各自成長一小段時間,直到他們的長度出現差異(不可能長度一直相同),比如說其中一條鏈的礦工們,更快地打包在支鏈後面又加上一塊。按照「最長鏈優先「的規則,較短的鏈會被拋棄,原本工作在短鏈上的礦工們都回到長鏈上工作。
換言之,分叉只是不同節點暫時的不一致現象,當新區塊被加入到其中某一分支時,最終收斂將解決這一個問題。[讀者可以思考一下,為什麼區塊鏈被設置成每十分鍾挖出來一個塊:如果時間短了,是不是就增加了分支產生的次數?如果時間長了,是不是交易結算的效率就太低了?]
雙重支付的本質其實也是區塊鏈的分叉,但這種分叉卻是「非自然惡意蓄謀」的產物。
我們假設小敏是密謀雙重支付的一方,她把自己僅有的10BTC先給小強、交換一塊黃金,待這條交易信息P被打包進區塊Q後,她從小強手中拿到了黃金。這時,小敏使了個心眼,她想偷偷抹去、篡改區塊Q上的交易信息P,「白嫖」這塊黃金。為了實現這樣的目的,根據「最長鏈優先」法則,小敏必須剔除該筆交易P後、重新進行結算工作,集中算力來形成分叉,並讓分叉以更快的增速超過並取代Q所在的主鏈。如果小敏確實能讓分叉更長,分叉就成為了主鏈,其他節點也會轉向新主鏈上繼續工作。這樣,小強付出了黃金,卻沒有收到這10個比特幣,「賠了夫人又折兵」。
在這個過程中,小敏需要和原鏈進行「抗爭」,使新分叉成為最長的主鏈,這被稱為「共識攻擊」。「共識攻擊」本質上是對下一區塊的爭奪,攻擊方越「強壯」、哈希算力越大,就越容易成功。
「共識攻擊「成功的可能性有多大呢?
大多數比特幣交易所規定,一個交易傳送到區塊鏈上後需要6個「確認」來完成驗證該筆交易。這一規定的根據是,假設意圖造假的礦工擁有10%的算力(挖礦成功概率0.1),那麼造假礦工要構造另一條偽鏈實施長度超越,必須至少成功挖礦6次。那麼原鏈被取代、被拋棄的概率約為0.1的6次方,趨近於0。你可以把比特幣理解為地質構造層,表層可能因為季節變換而有所改變,甚至可能被風颳走,但一旦深入到地下,地質層就能更加穩定、不受干擾。
而假設有一群擁有了51%算力的礦工,他們控制了一半以上的全網哈希算力,可以故意在區塊鏈中製造分叉、進行雙重支付交易 。但事實是,全網哈希算力的大量增加,個體礦工幾乎不可能控制哪怕1%的哈希算力了(但礦池帶來的算力集中化控制,存在一定的風險)。更何況,如果真有擁有如此強大算力的組織,他完全可以憑借自己強大的算力投入到挖礦中去獲取開發新區塊所獲的的比特幣獎勵,誠實挖礦比雙花更有利可圖。
盡管實際上並未出現51%攻擊的問題,但不可否認的是,算力的集中違背了比特幣去中心化這一初衷,並成為其繼續發展的一大隱患。
一個系統的安全性,往往取決於系統安全的最薄弱環節,這也就是所謂的「木桶原理「。與區塊鏈系統相關的安全性問題包括但不限於以下幾項:
(1)在區塊鏈上被廣泛使用的公鑰系統基本上是安全的,但量子演算法在理論上能夠破解公鑰系統;因此,區塊鏈的演算法安全性是相對的。
(2)區塊鏈協議本身存在邏輯缺陷,例如受到黑客攻擊的區塊鏈系統共識機制。
(3)所有數字貨幣系統高度依賴私鑰,私鑰在存儲、使用方面的安全性成為區塊鏈系統安全性中至關緊要的一環。
盡管區塊鏈是去中心化系統,但目前絕大多數數字交易所卻是中心化的,存在著人為安全漏洞及技術安全漏洞。這些數字交易所擁有存放大量加密貨幣的私鑰,這對於黑客來說無疑是最矚目的目標;只要黑客偷走了這些私鑰,就可以獲取到這些加密貨幣。
作者會繼續閱讀相關資料、不斷完善本文,目標是完成一篇通俗易懂的比特幣科普文章。:)
**本文系網上信息與個人理解的結合,如有偏差及誤讀,歡迎讀者指出。也歡迎給出關於文章結構上的指導~
5. 比特幣 哈希值
哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上來說基本上是不可能的。
消息身份驗證代碼 (MAC) 哈希函數通常與數字簽名一起用於對數據進行簽名,而消息檢測代碼 (MDC) 哈希函數則用於數據完整性。
比特幣全網的基本信息如下:
所有需要挖礦的數字貨幣都是存在哈希值的,例如萊特幣、瑞泰幣、狗狗幣、微盟幣、點點幣、元寶幣等等。
6. 錢包提幣到交易所,哈希值有嗎如何查
哈希函數指將哈希表中元素的關鍵鍵值映射為元素存儲位置的函數。哈希表中元素是由哈希函數確定的。將數據元素的關鍵字K作為自變數,通過一定的函數關系(稱為哈希函數),計算出的值,即為該元素的存儲地址。表示為:Addr = H(key)。
應答時間:2021-07-05,最新業務變化請以平安銀行官網公布為准。
[平安銀行我知道]想要知道更多?快來看「平安銀行我知道」吧~
https://b.pingan.com.cn/paim/iknow/index.html
7. 什麼是比特幣挖礦
比特幣挖礦是一種獲得比特幣的方式,簡單來講就是全網礦工一起來做一道題目,誰先做出來,誰就會得到比特幣獎勵,「礦工」需要在區塊努力工作,就是消耗計算資源來處理交易,挖礦對於設備的配置要求相當高,提高設備配置,可以加強運算能力,也能更快的獲得比特幣。 比特幣是一種電子貨幣,由開源的P2P軟體產生,可以用來交易,也可以通過交易來獲利,比特幣挖礦運用的是哈希演算法,在比特幣系統裡面,需要進行大量哈希運算,計算的值需要符合規定,誰運算的快,誰能挖到的比特幣就越多。
拓展資料
比特幣挖礦,是一種利用電腦硬體計算出比特幣的位置並獲取的過程。 挖礦是在比特幣系統中進行記錄數據的一個激勵過程,在比特幣系統個人用戶通過利用CPU或者GPU進行哈希運算,當計算出特定的哈希值之後便擁有了打包區塊的權利。 而為了獎勵這個用戶進行打包區塊,系統就給予一定的比特幣作為報酬。因為這個過程很像現實生活中「挖礦」所以大多數人就把這個過程叫做挖礦。除了比特幣外,其他的電子虛擬貨幣也可以通過挖礦獎勵獲取,如以太坊、門羅幣等等
挖礦風險:
1,貨幣安全
比特幣的支取需要多達數百位的密鑰,而多數人會將這一長串的數字記錄於電腦上,但經常發生的如硬碟損壞等問題,會讓密鑰永久丟失,這也導致了比特幣的丟失。
2,系統風險
系統風險在比特幣這個裡面非常常見,最常見的當屬於分叉。分叉會導致幣價下跌,挖礦收益銳減。不過很多情況表明,分叉反而讓礦工收益,分叉出來的競爭幣也需要礦工的算力來完成鑄幣和交易的過程,為了爭取更多的礦工,競爭幣會提供更多的區塊獎勵及手續費來吸引礦工。風險反而成就了礦工。
8. 詳解比特幣挖礦原理
可以將區塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網路中的每個參與者都把它看作一本所有權的權威記錄。
比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。
至今為止,在主幹區塊鏈上,沒有發生一起成功的攻擊,一次都沒有。
通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鍾產生一個新區塊,每一個新區塊都伴隨著一定數量從無到有的全新比特幣。每開采210,000個塊,大約耗時4年,貨幣發行速率降低50%。
在2016年的某個時刻,在第420,000個區塊被「挖掘」出來之後降低到12.5比特幣/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新幣的發行速度會以指數形式進行64次「二等分」。到那時每區塊發行比特幣數量變為比特幣的最小貨幣單位——1聰。最終,在經過1,344萬個區塊之後,所有的共20,999,999.9769億聰比特幣將全部發行完畢。換句話說, 到2140年左右,會存在接近2,100萬比特幣。在那之後,新的區塊不再包含比特幣獎勵,礦工的收益全部來自交易費。
在收到交易後,每一個節點都會在全網廣播前對這些交易進行校驗,並以接收時的相應順序,為有效的新交易建立一個池(交易池)。
每一個節點在校驗每一筆交易時,都需要對照一個長長的標准列表:
交易的語法和數據結構必須正確。
輸入與輸出列表都不能為空。
交易的位元組大小是小於MAX_BLOCK_SIZE的。
每一個輸出值,以及總量,必須在規定值的范圍內 (小於2,100萬個幣,大於0)。
沒有哈希等於0,N等於-1的輸入(coinbase交易不應當被中繼)。
nLockTime是小於或等於INT_MAX的。
交易的位元組大小是大於或等於100的。
交易中的簽名數量應小於簽名操作數量上限。
解鎖腳本(Sig)只能夠將數字壓入棧中,並且鎖定腳本(Pubkey)必須要符合isStandard的格式 (該格式將會拒絕非標准交易)。
池中或位於主分支區塊中的一個匹配交易必須是存在的。
對於每一個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕。
對於每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易將成為一個孤立的交易。如果與其匹配的交易還沒有出現在池中,那麼將被加入到孤立交易池中。
對於每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個確認。
對於每一個輸入,引用的輸出是必須存在的,並且沒有被花費。
使用引用的輸出交易獲得輸入值,並檢查每一個輸入值和總值是否在規定值的范圍內 (小於2100萬個幣,大於0)。
如果輸入值的總和小於輸出值的總和,交易將被中止。
如果交易費用太低以至於無法進入一個空的區塊,交易將被拒絕。
每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。
以下挖礦節點取名為 A挖礦節點
挖礦節點時刻監聽著傳播到比特幣網路的新區塊。而這些新加入的區塊對挖礦節點有著特殊的意義。礦工間的競爭以新區塊的傳播而結束,如同宣布誰是最後的贏家。對於礦工們來說,獲得一個新區塊意味著某個參與者贏了,而他們則輸了這場競爭。然而,一輪競爭的結束也代表著下一輪競爭的開始。
驗證交易後,比特幣節點會將這些交易添加到自己的內存池中。內存池也稱作交易池,用來暫存尚未被加入到區塊的交易記錄。
A節點需要為內存池中的每筆交易分配一個優先順序,並選擇較高優先順序的交易記錄來構建候選區塊。
一個交易想要成為「較高優先順序」,需滿足的條件:優先值大於57,600,000,這個值的生成依賴於3個參數:一個比特幣(即1億聰),年齡為一天(144個區塊),交易的大小為250個位元組:
High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000
區塊中用來存儲交易的前50K位元組是保留給較高優先順序交易的。 節點在填充這50K位元組的時候,會優先考慮這些最高優先順序的交易,不管它們是否包含了礦工費。這種機制使得高優先順序交易即便是零礦工費,也可以優先被處理。
然後,A挖礦節點會選出那些包含最小礦工費的交易,並按照「每千位元組礦工費」進行排序,優先選擇礦工費高的交易來填充剩下的區塊。
如區塊中仍有剩餘空間,A挖礦節點可以選擇那些不含礦工費的交易。有些礦工會竭盡全力將那些不含礦工費的交易整合到區塊中,而其他礦工也許會選擇忽略這些交易。
在區塊被填滿後,內存池中的剩餘交易會成為下一個區塊的候選交易。因為這些交易還留在內存池中,所以隨著新的區塊被加到鏈上,這些交易輸入時所引用UTXO的深度(即交易「塊齡」)也會隨著變大。由於交易的優先值取決於它交易輸入的「塊齡」,所以這個交易的優先值也就隨之增長了。最後,一個零礦工費交易的優先值就有可能會滿足高優先順序的門檻,被免費地打包進區塊。
UTXO(Unspent Transaction Output) : 每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是「未花費過的交易輸出」,也就是 UTXO。
塊齡:UTXO的「塊齡」是自該UTXO被記錄到區塊鏈為止所經歷過的區塊數,即這個UTXO在區塊鏈中的深度。
區塊中的第一筆交易是筆特殊交易,稱為創幣交易或者coinbase交易。這個交易是由挖礦節點構造並用來獎勵礦工們所做的貢獻的。假設此時一個區塊的獎勵是25比特幣,A挖礦的節點會創建「向A的地址支付25.1個比特幣(包含礦工費0.1個比特幣)」這樣一個交易,把生成交易的獎勵發送到自己的錢包。A挖出區塊獲得的獎勵金額是coinbase獎勵(25個全新的比特幣)和區塊中全部交易礦工費的總和。
A節點已經構建了一個候選區塊,那麼就輪到A的礦機對這個新區塊進行「挖掘」,求解工作量證明演算法以使這個區塊有效。比特幣挖礦過程使用的是SHA256哈希函數。
用最簡單的術語來說, 挖礦節點不斷重復進行嘗試,直到它找到的隨機調整數使得產生的哈希值低於某個特定的目標。 哈希函數的結果無法提前得知,也沒有能得到一個特定哈希值的模式。舉個例子,你一個人在屋裡打檯球,白球從A點到達B點,但是一個人推門進來看到白球在B點,卻無論如何是不知道如何從A到B的。哈希函數的這個特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機修改輸入,直到出現適當的哈希值。
需要以下參數
• block的版本 version
• 上一個block的hash值: prev_hash
• 需要寫入的交易記錄的hash樹的值: merkle_root
• 更新時間: ntime
• 當前難度: nbits
挖礦的過程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范圍是0~2^32, TARGET可以根據當前難度求出的。
簡單打個比方,想像人們不斷扔一對色子以得到小於一個特定點數的游戲。第一局,目標是12。只要你不扔出兩個6,你就會贏。然後下一局目標為11。玩家只能扔10或更小的點數才能贏,不過也很簡單。假如幾局之後目標降低為了5。現在有一半機率以上扔出來的色子加起來點數會超過5,因此無效。隨著目標越來越小,要想贏的話,扔色子的次數會指數級的上升。最終當目標為2時(最小可能點數),只有一個人平均扔36次或2%扔的次數中,他才能贏。
如前所述,目標決定了難度,進而影響求解工作量證明演算法所需要的時間。那麼問題來了:為什麼這個難度值是可調整的?由誰來調整?如何調整?
比特幣的區塊平均每10分鍾生成一個。這就是比特幣的心跳,是貨幣發行速率和交易達成速度的基礎。不僅是在短期內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鍾一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動態的參數,會定期調整以達到每10分鍾一個新區塊的目標。簡單地說,難度被設定在,無論挖礦能力如何,新區塊產生速率都保持在10分鍾一個。
那麼,在一個完全去中心化的網路中,這樣的調整是如何做到的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊(2周產生的區塊)中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鍾(兩周,即這些區塊以10分鍾一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網路發現區塊產生速率比10分鍾要快時會增加難度。如果發現比10分鍾慢時則降低難度。
為了防止難度的變化過快,每個周期的調整幅度必須小於一個因子(值為4)。如果要調整的幅度大於4倍,則按4倍調整。由於在下一個2,016區塊的周期不平衡的情況會繼續存在,所以進一步的難度調整會在下一周期進行。因此平衡哈希計算能力和難度的巨大差異有可能需要花費幾個2,016區塊周期才會完成。
舉個例子,當前A節點在挖277,316個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第277,316個區塊(父區塊為277,315)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。
比特幣共識機制的第三步是通過網路中的每個節點獨立校驗每個新區塊。當新區塊在網路中傳播時,每一個節點在將它轉發到其節點之前,會進行一系列的測試去驗證它。這確保了只有有效的區塊會在網路中傳播。
每一個節點對每一個新區塊的獨立校驗,確保了礦工無法欺詐。在前面的章節中,我們看到了礦工們如何去記錄一筆交易,以獲得在此區塊中創造的新比特幣和交易費。為什麼礦工不為他們自己記錄一筆交易去獲得數以千計的比特幣?這是因為每一個節點根據相同的規則對區塊進行校驗。一個無效的coinbase交易將使整個區塊無效,這將導致該區塊被拒絕,因此,該交易就不會成為總賬的一部分。
比特幣去中心化的共識機制的最後一步是將區塊集合至有最大工作量證明的鏈中。一旦一個節點驗證了一個新的區塊,它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。
節點維護三種區塊:
· 第一種是連接到主鏈上的,
· 第二種是從主鏈上產生分支的(備用鏈),
· 第三種是在已知鏈中沒有找到已知父區塊的。
有時候,新區塊所延長的區塊鏈並不是主鏈,這一點我們將在下面「 區塊鏈分叉」中看到。
如果節點收到了一個有效的區塊,而在現有的區塊鏈中卻未找到它的父區塊,那麼這個區塊被認為是「孤塊」。孤塊會被保存在孤塊池中,直到它們的父區塊被節點收到。一旦收到了父區塊並且將其連接到現有區塊鏈上,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的一部分。當兩個區塊在很短的時間間隔內被挖出來,節點有可能會以相反的順序接收到它們,這個時候孤塊現象就會出現。
選擇了最大難度的區塊鏈後,所有的節點最終在全網范圍內達成共識。隨著更多的工作量證明被添加到鏈中,鏈的暫時性差異最終會得到解決。挖礦節點通過「投票」來選擇它們想要延長的區塊鏈,當它們挖出一個新塊並且延長了一個鏈,新塊本身就代表它們的投票。
因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持一致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是, 每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。
當有兩個候選區塊同時想要延長最長區塊鏈時,分叉事件就會發生。正常情況下,分叉發生在兩名礦工在較短的時間內,各自都算得了工作量證明解的時候。兩個礦工在各自的候選區塊一發現解,便立即傳播自己的「獲勝」區塊到網路中,先是傳播給鄰近的節點而後傳播到整個網路。每個收到有效區塊的節點都會將其並入並延長區塊鏈。如果該節點在隨後又收到了另一個候選區塊,而這個區塊又擁有同樣父區塊,那麼節點會將這個區塊連接到候選鏈上。其結果是,一些節點收到了一個候選區塊,而另一些節點收到了另一個候選區塊,這時兩個不同版本的區塊鏈就出現了。
分叉之前
分叉開始
我們看到兩個礦工幾乎同時挖到了兩個不同的區塊。為了便於跟蹤這個分叉事件,我們設定有一個被標記為紅色的、來自加拿大的區塊,還有一個被標記為綠色的、來自澳大利亞的區塊。
假設有這樣一種情況,一個在加拿大的礦工發現了「紅色」區塊的工作量證明解,在「藍色」的父區塊上延長了塊鏈。幾乎同一時刻,一個澳大利亞的礦工找到了「綠色」區塊的解,也延長了「藍色」區塊。那麼現在我們就有了兩個區塊:一個是源於加拿大的「紅色」區塊;另一個是源於澳大利亞的「綠色」。這兩個區塊都是有效的,均包含有效的工作量證明解並延長同一個父區塊。這個兩個區塊可能包含了幾乎相同的交易,只是在交易的排序上有些許不同。
比特幣網路中鄰近(網路拓撲上的鄰近,而非地理上的)加拿大的節點會首先收到「紅色」區塊,並建立一個最大累計難度的區塊,「紅色」區塊為這個鏈的最後一個區塊(藍色-紅色),同時忽略晚一些到達的「綠色」區塊。相比之下,離澳大利亞更近的節點會判定「綠色」區塊勝出,並以它為最後一個區塊來延長區塊鏈(藍色-綠色),忽略晚幾秒到達的「紅色」區塊。那些首先收到「紅色」區塊的節點,會即刻以這個區塊為父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受「綠色」區塊的節點會以這個區塊為鏈的頂點開始生成新塊,延長這個鏈。
分叉問題幾乎總是在一個區塊內就被解決了。網路中的一部分算力專注於「紅色」區塊為父區塊,在其之上建立新的區塊;另一部分算力則專注在「綠色」區塊上。即便算力在這兩個陣營中平均分配,也總有一個陣營搶在另一個陣營前發現工作量證明解並將其傳播出去。在這個例子中我們可以打個比方,假如工作在「綠色」區塊上的礦工找到了一個「粉色」區塊延長了區塊鏈(藍色-綠色-粉色),他們會立刻傳播這個新區塊,整個網路會都會認為這個區塊是有效的,如上圖所示。
所有在上一輪選擇「綠色」區塊為勝出者的節點會直接將這條鏈延長一個區塊。然而,那些選擇「紅色」區塊為勝出者的節點現在會看到兩個鏈: 「藍色-綠色-粉色」和「藍色-紅色」。 如上圖所示,這些節點會根據結果將 「藍色-綠色-粉色」 這條鏈設置為主鏈,將 「藍色-紅色」 這條鏈設置為備用鏈。 這些節點接納了新的更長的鏈,被迫改變了原有對區塊鏈的觀點,這就叫做鏈的重新共識 。因為「紅」區塊做為父區塊已經不在最長鏈上,導致了他們的候選區塊已經成為了「孤塊」,所以現在任何原本想要在「藍色-紅色」鏈上延長區塊鏈的礦工都會停下來。全網將 「藍色-綠色-粉色」 這條鏈識別為主鏈,「粉色」區塊為這條鏈的最後一個區塊。全部礦工立刻將他們產生的候選區塊的父區塊切換為「粉色」,來延長「藍色-綠色-粉色」這條鏈。
從理論上來說,兩個區塊的分叉是有可能的,這種情況發生在因先前分叉而相互對立起來的礦工,又幾乎同時發現了兩個不同區塊的解。然而,這種情況發生的幾率是很低的。單區塊分叉每周都會發生,而雙塊分叉則非常罕見。
比特幣將區塊間隔設計為10分鍾,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。
9. 比特幣使用哪種演算法來生成比特幣錢包的地址
首先生成私鑰,再由私鑰算出公鑰,再由公鑰經過一系列哈希算出錢包地址。