簡(jiǎn)介
挖礦是增加比特幣貨幣供應(yīng)的過(guò)程。這個(gè)過(guò)程同時(shí)還保證了比特幣系統(tǒng)的安全以及支付的安全,避免雙重支付。雙重支付是指多次花費(fèi)同一筆比特幣。例如我有一張一元的鈔票,先買了一個(gè)冰激凌,然后把錢偷偷拿回來(lái),再用這一張一元鈔票買了一串燒烤。
礦工們驗(yàn)證每一筆交易,并把交易寫入到區(qū)塊中。基本上每10分鐘就有一個(gè)新區(qū)塊被“挖掘”出來(lái),新區(qū)塊包含從上一個(gè)區(qū)塊產(chǎn)生時(shí)到新區(qū)塊產(chǎn)生時(shí)間段內(nèi)的所有交易。這些交易依次被打包進(jìn)新區(qū)塊,然后新區(qū)塊會(huì)被加入到區(qū)塊鏈中。我們把區(qū)塊被寫入到區(qū)塊鏈中的過(guò)程叫交易確認(rèn),也叫做挖礦,一個(gè)交易被確認(rèn),說(shuō)明這筆交易已經(jīng)被加入到區(qū)塊鏈中。交易只有經(jīng)過(guò)確認(rèn)后,新的擁有者才能使用這筆交易(或者說(shuō)UTXO)。
挖礦的過(guò)程(將交易打包成區(qū)塊,并把區(qū)塊加入到區(qū)塊鏈中)會(huì)產(chǎn)生兩種收益,一是成功把區(qū)塊寫入到區(qū)塊鏈時(shí),比特幣系統(tǒng)提供的比特幣獎(jiǎng)勵(lì)。另一種收益是交易發(fā)起者提供的手續(xù)費(fèi)。
比特幣系統(tǒng)以一個(gè)確定的,不斷減緩的速度創(chuàng)造比特幣。大約每10分鐘礦工可以創(chuàng)造一個(gè)新區(qū)塊,這就伴隨著一定數(shù)量的比特幣由比特幣系統(tǒng)新生出來(lái)。每創(chuàng)造出210000個(gè)區(qū)塊,大約耗時(shí)4年,比特幣獎(jiǎng)勵(lì)的數(shù)量減半。最開(kāi)始挖出一個(gè)區(qū)塊獎(jiǎng)勵(lì)50個(gè)比特幣,4年后,變成25個(gè),以此類推?,F(xiàn)在是12.5個(gè)比特幣。比特幣總數(shù)是2100萬(wàn)個(gè),當(dāng)所有比特幣都被發(fā)放完后,挖礦將不會(huì)再獲得系統(tǒng)獎(jiǎng)勵(lì)的比特幣,只會(huì)得到交易的手續(xù)費(fèi)。所以,比特幣也是一種通貨緊縮貨幣。
去中心化共識(shí)
去中心化共識(shí)由比特幣節(jié)點(diǎn)的4種獨(dú)立執(zhí)行過(guò)程相互作用而產(chǎn)生。
- 每個(gè)全節(jié)點(diǎn)依據(jù)通用綜合標(biāo)準(zhǔn)對(duì)交易進(jìn)行獨(dú)立驗(yàn)證
- 通過(guò)完成工作量證明算法的驗(yàn)算,挖礦節(jié)點(diǎn)將交易記錄獨(dú)立打包進(jìn)新區(qū)塊
- 每個(gè)節(jié)點(diǎn)獨(dú)立的對(duì)新區(qū)塊進(jìn)行校驗(yàn)并組裝進(jìn)區(qū)塊鏈中
- 每個(gè)節(jié)點(diǎn)對(duì)區(qū)塊鏈進(jìn)行獨(dú)立選擇,在工作量證明機(jī)制下選擇累積工作量最大的區(qū)塊鏈
交易塊齡,礦工費(fèi)和優(yōu)先級(jí)
礦工在把交易打包進(jìn)區(qū)塊之前,會(huì)對(duì)交易進(jìn)行優(yōu)先級(jí)排序。計(jì)算優(yōu)先級(jí)的方式是交易的輸入值和塊齡的乘積除以交易的總長(zhǎng)度(字節(jié))
Priority = Value of input * Input age / Transaction size
塊齡指的是當(dāng)前UTXO被記錄到區(qū)塊為止所經(jīng)歷的區(qū)塊數(shù)。
挖礦節(jié)點(diǎn)在創(chuàng)造區(qū)塊時(shí),區(qū)塊中用來(lái)存儲(chǔ)交易信息的前50k字節(jié)是保留給優(yōu)先級(jí)較高的交易的,不管這些交易是否包含手續(xù)費(fèi)(隨著時(shí)間的推移,區(qū)塊塊齡會(huì)越來(lái)越大,那些以前優(yōu)先級(jí)低的交易,優(yōu)先級(jí)會(huì)越來(lái)越高)。然后節(jié)點(diǎn)會(huì)選擇包含最小手續(xù)費(fèi)的交易,將他們按照“每千字節(jié)礦工費(fèi)”進(jìn)行排序,選擇出手續(xù)費(fèi)較高的交易,加入到區(qū)塊中。如果此時(shí)這些交易還沒(méi)有填滿區(qū)塊,那么節(jié)點(diǎn)就會(huì)選擇不包含手續(xù)費(fèi)的交易。有些礦工會(huì)打包這些不含手續(xù)費(fèi)的交易,而有些礦工則忽略不包含手續(xù)費(fèi)的交易,這些策略都可以配置。如果此時(shí)節(jié)點(diǎn)的交易池中還有交易沒(méi)有被加入到區(qū)塊中,且區(qū)塊已經(jīng)被交易填滿,那么在交易池中的交易會(huì)在下次打包區(qū)塊時(shí)被加入到區(qū)塊中。
創(chuàng)幣交易
在區(qū)塊中的第一筆交易是特殊的交易,稱為創(chuàng)幣交易或者coinbase交易。這是獎(jiǎng)勵(lì)給礦工比特幣的交易。
創(chuàng)幣交易不包含前面提到過(guò)的解鎖腳本字段(scriptSig),也就是說(shuō)不需要驗(yàn)證交易的簽名,取而代之的是coinbase字段,最小2字節(jié),最長(zhǎng)100字節(jié)。除了開(kāi)始的幾個(gè)字節(jié)由比特幣系統(tǒng)填充好外,其余的字節(jié)可由礦工隨意填寫。中本聰在創(chuàng)世塊中的coinbase字段中就加入了泰晤士報(bào)的一段報(bào)道
工作量證明算法
區(qū)塊中有個(gè)字段nonce,我們需要找到滿足算法條件的nonce。舉個(gè)簡(jiǎn)單的例子,比如我們玩兒一對(duì)骰子,第一局,我們的目標(biāo)(nonce)是骰子的和小于12,只要你不扔出兩個(gè)6,你就贏了。第二局,目標(biāo)是小于11,贏的概率也比較大,以此類推,當(dāng)目標(biāo)是小于2的時(shí)候,難度就很大了。這就是工作量證明算法的簡(jiǎn)單原理,只能通過(guò)不停嘗試,找到我們的目標(biāo),來(lái)完成這個(gè)挖礦的工作。
難度調(diào)整
剛才我們說(shuō)到扔骰子游戲的目標(biāo),這個(gè)目標(biāo)值越小,我們的難度就越大。在比特幣系統(tǒng)中,工作量證明的算法難度是由比特幣系統(tǒng)動(dòng)態(tài)調(diào)整,這么做是為了保證不管有多少節(jié)點(diǎn)參與進(jìn)來(lái),系統(tǒng)的總算力有多大,都要維持10分鐘左右一個(gè)區(qū)塊的挖礦速度。難度調(diào)整是由最新2016個(gè)區(qū)塊產(chǎn)生的時(shí)長(zhǎng)與20160分鐘比較得出,也就是實(shí)際產(chǎn)生區(qū)塊時(shí)長(zhǎng)與期望產(chǎn)生區(qū)塊時(shí)長(zhǎng)的比值進(jìn)行相應(yīng)調(diào)整。如果超過(guò)期望時(shí)長(zhǎng),算法難度降低,少于期望時(shí)長(zhǎng),算法難度增加
校驗(yàn)新區(qū)塊
比特幣共識(shí)的第三步就是通過(guò)網(wǎng)絡(luò)中的節(jié)點(diǎn)獨(dú)立驗(yàn)證新區(qū)塊完成。區(qū)塊驗(yàn)證過(guò)程也有一套通用的規(guī)則。
- 區(qū)塊的數(shù)據(jù)結(jié)構(gòu)在語(yǔ)法上有效
- 區(qū)塊頭的哈希值小于目標(biāo)難度
- 區(qū)塊時(shí)間戳早于驗(yàn)證時(shí)刻未來(lái)兩小時(shí)(允許時(shí)差,時(shí)間錯(cuò)誤)
- 區(qū)塊大小在規(guī)定范圍內(nèi)
- 第一筆交易是coinbase交易(有且只有一個(gè))
- 獨(dú)立驗(yàn)證區(qū)塊內(nèi)的交易有效性
這樣的獨(dú)立校驗(yàn)確保礦工不會(huì)有欺詐行為。任何節(jié)點(diǎn)都是獨(dú)立驗(yàn)證的,與其它節(jié)點(diǎn)無(wú)關(guān),驗(yàn)證方式統(tǒng)一,任何一個(gè)節(jié)點(diǎn)偽造的區(qū)塊都會(huì)被其它節(jié)點(diǎn)識(shí)破,并拋棄掉。如果一定要作弊,那需要其它所有節(jié)點(diǎn)承認(rèn)你的區(qū)塊,這個(gè)難度難于上青天。
區(qū)塊鏈的選擇和組裝
比特幣共識(shí)的最后一步是將區(qū)塊集合至最大工作量證明的鏈中。一旦一個(gè)節(jié)點(diǎn)發(fā)現(xiàn)了新區(qū)塊,他將嘗試把新的區(qū)塊鏈接到現(xiàn)存的區(qū)塊鏈中。
節(jié)點(diǎn)維護(hù)著3種區(qū)塊,第一種是鏈接到主鏈的,第二種是從主鏈上產(chǎn)生的分支,最后一種是在已知的鏈中沒(méi)有找到父區(qū)塊的區(qū)塊。
任何時(shí)候,主鏈都是累積了最大工作量證明的鏈,也是最長(zhǎng)的鏈,除非兩條鏈等長(zhǎng),其中一個(gè)累積的工作量證明更大。主鏈也會(huì)有分支,在分支中的區(qū)塊與主鏈區(qū)塊是“兄弟區(qū)塊”,這些“兄弟區(qū)塊”是有效的,但沒(méi)有包含在主鏈中,保留他們的原因是在未來(lái)的某一時(shí)刻,他們所在的鏈延長(zhǎng)了,并在工作量證明累積上大于主鏈,那么主鏈的后續(xù)就是他們,這就是主鏈的分叉行為。
由于網(wǎng)絡(luò)延遲等等原因,并不能保證所有點(diǎn)在同一時(shí)間所保存的區(qū)塊鏈完全一致,這就可能導(dǎo)致節(jié)點(diǎn)之間的區(qū)塊鏈不一致。但由于節(jié)點(diǎn)總是會(huì)采用累積最大工作量證明的鏈,所以最終不同節(jié)點(diǎn)的鏈會(huì)收斂到主鏈上
礦池
隨著工作量證明算法難度的提升,單人挖礦幾乎不可能挖到比特幣了,為此,多個(gè)礦工合伙來(lái)挖一個(gè)區(qū)塊就成為了很自然的選擇,礦池應(yīng)運(yùn)而生。
任何節(jié)點(diǎn)都可以加入礦池,一旦礦池挖出了區(qū)塊,得到的比特幣將會(huì)按照不同節(jié)點(diǎn)的貢獻(xiàn)程度分得一定數(shù)額的比特幣,這比單人挖礦風(fēng)險(xiǎn)低得多。
礦池也分為托管礦池和P2P礦池,也就是中心化礦池和去中心化礦池。前者人為控制,有一個(gè)中心服務(wù)器來(lái)負(fù)責(zé)調(diào)度礦池中的礦工,而礦池的管理員就有了作弊的可能。去中心化礦池不需要一個(gè)中心服務(wù)器來(lái)管理礦池,礦池是自治的。
共識(shí)攻擊
比特幣的共識(shí)機(jī)制使得礦工或礦池對(duì)比特幣系統(tǒng)發(fā)起共識(shí)攻擊的難度很大,至少理論上是這樣的,從礦工自身利益出發(fā),也不太可能對(duì)比特幣發(fā)起攻擊,一旦比特幣的共識(shí)機(jī)制有問(wèn)題了,攻擊者手上的比特幣也就不值錢了。但共識(shí)攻擊只會(huì)影響區(qū)塊鏈未來(lái)的共識(shí),或者說(shuō)最多只能影響過(guò)去的10個(gè)區(qū)塊。隨著時(shí)間的推移,區(qū)塊鏈長(zhǎng)度的增加,整個(gè)比特幣區(qū)塊鏈被篡改的可能性越來(lái)越低。理論上,一個(gè)包含惡意區(qū)塊區(qū)塊鏈的分叉可能很長(zhǎng),長(zhǎng)到超過(guò)主鏈,從而達(dá)到篡改的目的,但構(gòu)造這樣一個(gè)包含惡意區(qū)塊的超過(guò)主鏈的鏈,需要非常非常大的算力。共識(shí)攻擊不能盜走其他人的比特幣,改變過(guò)去的交易。共識(shí)攻擊能夠造成的唯一影響是最近的10個(gè)區(qū)塊,并可以通過(guò)拒絕服務(wù)攻擊來(lái)阻止區(qū)塊產(chǎn)生。
共識(shí)攻擊的典型攻擊場(chǎng)景是這樣的,一個(gè)礦池?fù)碛姓麄€(gè)比特幣網(wǎng)絡(luò)51%的算力,而在這個(gè)礦池中的人用比特幣購(gòu)買了一些物品,這筆比特幣交易被寫入到了區(qū)塊,同時(shí)他在生成一個(gè)包含他把這筆比特幣轉(zhuǎn)給了自己的交易的區(qū)塊,然后把正常的區(qū)塊發(fā)布出去,同時(shí)發(fā)布有問(wèn)題的區(qū)塊,然后通過(guò)51%的算力,瘋狂挖礦,延長(zhǎng)有問(wèn)題的區(qū)塊的鏈,達(dá)到讓其他節(jié)點(diǎn)接收有問(wèn)題區(qū)塊的鏈,從而讓一筆比特幣使用了兩次,即轉(zhuǎn)給了商家,又轉(zhuǎn)回給了自己。為了避免此類攻擊,通常在交易達(dá)到6個(gè)確認(rèn)(6個(gè)礦工驗(yàn)證了這個(gè)區(qū)塊的有效性)以后,才會(huì)被認(rèn)為交易成功。
另外,51%攻擊理論上是要掌控全網(wǎng)51%的算力,實(shí)際上,有安全組織統(tǒng)計(jì)過(guò),只要算力超過(guò)30%,就可以發(fā)起共識(shí)攻擊。51%的算力,只是保證這樣的攻擊幾乎都會(huì)成功。