比特幣是個大帳本蹈矮,也是個由多方參與者構(gòu)成的網(wǎng)絡(luò)砰逻。所以從賬本的角度來看,有交易雙方和記賬人這三個角色泛鸟;從網(wǎng)絡(luò)構(gòu)成的角度看蝠咆,有全節(jié)點(diǎn)、挖礦節(jié)點(diǎn)、SPV節(jié)點(diǎn)這幾種主要節(jié)點(diǎn)刚操。
其實(shí)這兩種描述都是對比特幣的參與者的描述闸翅,只是從不同的角度對參與者進(jìn)行了各有側(cè)重的描述。
這些參與者都各有各的任務(wù)菊霜,各有各的功能坚冀,我認(rèn)為其中最重要的角色/參與者就是礦工即記賬人。
一鉴逞,挖礦很重要记某!
全節(jié)點(diǎn)可以驗(yàn)證交易,但是挖礦節(jié)點(diǎn)才能確認(rèn)交易构捡,這意味著我轉(zhuǎn)給你一個比特幣這事雖然發(fā)生了液南,雖然我特愿意轉(zhuǎn)給你,雖然我轉(zhuǎn)給你的比特幣是沒被雙花過勾徽,雖然我也向你的地址轉(zhuǎn)賬了贺拣,但是最終你是否能收到這個比特幣卻要依賴于礦工是否把我發(fā)起的這筆交易打包進(jìn)區(qū)塊,并且對全網(wǎng)廣播捂蕴,只有被打包了并且不可更改的情況下這筆轉(zhuǎn)賬交易才算數(shù)譬涡,這就是驗(yàn)證和確認(rèn)的區(qū)別。只是“驗(yàn)證”還不夠啥辨,一定要“確認(rèn)”涡匀,本該是你的錢才能真的屬于你。
所以挖礦這事對于比特幣很重要溉知,它保證了比特幣系統(tǒng)的安全陨瘩,保證了比特幣賬本里的記錄真實(shí)有效,也參與維持了比特幣的價值级乍。
二舌劳,我為什么要干挖礦這個苦差事?
?挖礦很重要玫荣,但是礦工們憑什么要做這件事甚淡?總要有動力讓他去行動才行,這時候給礦工發(fā)放獎勵就必不可少了捅厂。沒錯贯卦,因?yàn)榭梢垣@得獎勵,所以有人愿意花錢費(fèi)力的來挖礦焙贷。
礦工的獎勵分兩個部分:挖礦得到的狗頭金(coinbase)和交易手續(xù)費(fèi)撵割。
挖礦獎勵除了能確保比特幣賬本的真實(shí)有效,同時還起到了比特幣的發(fā)行作用(就是指給礦工獎勵的coinbase)
比特幣的發(fā)行是每隔210000個塊即大約4年辙芍,系統(tǒng)會自動計(jì)算減半啡彬,這個減半的實(shí)現(xiàn)是有計(jì)算規(guī)則的羹与,節(jié)點(diǎn)按照目前的塊高度運(yùn)用特定的函數(shù)公式計(jì)算得出。
礦工交易手續(xù)費(fèi)是通過計(jì)算區(qū)塊內(nèi)所有交易的輸入庶灿、輸出差額得出的注簿。
所以礦工們會拼命的投入人力物力去競爭,去爭奪記賬權(quán)跳仿,爭奪獎勵诡渴,加入挖礦的人越多比特幣的系統(tǒng)就越安全,就越是被信任菲语,它的價值就越被認(rèn)同妄辩,然后又吸引更多的人來挖礦,這就是一個正循環(huán)山上。
三眼耀,憑什么這個家伙得到獎勵?---工作量證明(POW)
工作量證明佩憾,礦工們?yōu)榱藸帄Z獎勵哮伟,大家競爭去算一道題,這道題的算法是:把上個區(qū)塊頭加上一個變量值-NONCE混一塊做哈希運(yùn)算妄帘,它的目標(biāo)是要求得一個值楞黄,這個值要小于難度目標(biāo)值(難度目標(biāo)值是由節(jié)點(diǎn)按公式自動算出的)每個礦工算的這道題由于它們搜集的交易各不相同,所以做的題目內(nèi)容不同抡驼,但算題的難度和規(guī)則是一樣的鬼廓。
關(guān)于nonce不太容易理解,打個比方:礦工算的題就相當(dāng)于在給一個方程式求解致盟,沒有任何捷徑或模式讓礦工能快速找到答案碎税,只能是一個數(shù)一個數(shù)帶進(jìn)去解方程,就這個笨辦法馏锡。這個方法求解的時候難雷蹂,但是驗(yàn)算起來特別容易。
在這就有個疑問杯道,這個nonce 一定存在嗎匪煌?要是算遍了都沒找到這個值怎么辦呢?
難度目標(biāo)值蕉饼,是不斷調(diào)整的虐杯,調(diào)整的根據(jù)就是看最近這2016個區(qū)塊在這20160分鐘里出塊的速度和理想的出塊速度去對比玛歌,太快了就把難度目標(biāo)值調(diào)小了(即難度大增大)昧港,太慢了就把難度目標(biāo)值調(diào)大了(即難度降低),當(dāng)然如何調(diào)整也是有一個預(yù)定的規(guī)則支子,有相應(yīng)的函數(shù)创肥,節(jié)點(diǎn)會自己去計(jì)算。
難度目標(biāo)值存在的意義是為了維持比特幣平均每十分鐘出一個塊的速度,也就是在維持比特幣的發(fā)行速度叹侄。出的太快了就往慢調(diào)一下巩搏,出的太慢了就往快調(diào)一下。
在這里我不由的想一個問題趾代,為什么要定成10分鐘出一個塊呢贯底?三分鐘、兩分鐘撒强、甚至一分鐘不是更快嗎禽捆,更好嗎?
工作量證明能說明一件事飘哨,就是你最聰明你最快胚想,這個帳給你記,這個獎勵給你芽隆,此外還說明一件事浊服,說明你是個好人,你是個善意節(jié)點(diǎn)胚吁,因?yàn)楫?dāng)壞人的話這個工作量就是成本牙躺,而這個成本太高了,于是也擋住了想到系統(tǒng)里搗亂的壞家伙們腕扶,從這個角度來說也維護(hù)了比特幣系統(tǒng)的安全性述呐。
說到這就真的能明白挖礦起到的重要作用,它是比特幣系統(tǒng)的重要一環(huán)蕉毯,是一個重要的參與者乓搬。
四,假如我是一個礦工
礦工有兩種:獨(dú)立礦工和屬于礦池的礦工代虾。
獨(dú)立礦工就是直接與比特幣網(wǎng)絡(luò)連接的挖礦節(jié)點(diǎn)进肯,而另一類礦工不是直接與比特幣網(wǎng)絡(luò)相連,是一群礦工連著礦池棉磨,由礦池連接著比特幣網(wǎng)絡(luò)江掩。
目前比特幣的算力太強(qiáng)大了,單獨(dú)的礦工是難以挖到礦了乘瓤,要加入礦池环形,礦池會把這個活分任務(wù)量攤給礦工們一起計(jì)算,幾十臺幾百臺礦機(jī)肯定比一臺礦機(jī)算的快衙傀。
假如我是一個礦工來捋捋我是怎么干活的抬吟。
1.先以一筆我接收到的交易為線索來描述它被打包進(jìn)區(qū)塊的過程。
假如我是個礦工的的話统抬,我的節(jié)點(diǎn)會收到交易火本,然后驗(yàn)證交易危队,驗(yàn)證合格的交易會放入一個內(nèi)存池。接著我會構(gòu)建一個候選區(qū)塊钙畔,這個區(qū)塊有區(qū)塊頭和區(qū)塊身體茫陆,區(qū)塊頭包括版本號、父區(qū)塊(頭部)哈希擎析、MERKLE根簿盅、時間戳、難度目標(biāo)值揍魂、NONCE(Nonce值是由計(jì)算得出后填入的)挪鹏。如果我是全網(wǎng)最快一個算出這道題的,我把去塊頭所有信息填上愉烙,再把交易的輸入輸出這些具體信息打包進(jìn)區(qū)塊的身體(輸入中包括coinbase)讨盒,這樣一個區(qū)塊新鮮出爐,然后我向全世界的其他節(jié)點(diǎn)發(fā)出這個區(qū)塊步责。其他節(jié)點(diǎn)接收到后驗(yàn)證我的這個區(qū)塊各個值是否正確返顺,里面的所有交易是否正確,一切無誤后把這個區(qū)塊加到它的鏈上并且把塊傳播到其他節(jié)點(diǎn)蔓肯。
2.?再以一個已經(jīng)打包好的區(qū)塊的角度看我的礦工節(jié)點(diǎn)是怎么干活的遂鹊。
假如上一個塊的高度是20000,我正在努力解答問題蔗包,想盡快獲得20001這個塊的打包記賬權(quán)秉扑,忽然我的網(wǎng)絡(luò)收到了叫20001的塊,我立刻停下解這道題的工作调限,一邊驗(yàn)證這個區(qū)塊舟陆,一邊構(gòu)造下一個區(qū)塊。我在內(nèi)存池里把屬于上一個區(qū)塊的交易揪出來耻矮,把剩下的不超過區(qū)塊SIZE的交易拿來重新構(gòu)建候選區(qū)塊秦躯,開始關(guān)于20002個區(qū)塊的解題比賽。
以上大概的描述了礦工是干什么的裆装,有什么作用踱承,它是怎樣工作的,也弄明白了POW的好與壞哨免。
五茎活,幾個思考題
在喬老師的《精通比特幣》關(guān)于這一章的學(xué)習(xí)中提到了幾個思考題:比特幣的挖礦到底在計(jì)算什么?數(shù)學(xué)模型是什么琢唾?這種計(jì)算是不是為了某些別的東西载荔,而比特幣只是個附屬商品?為什么我覺得比特幣更像商品慧耍,而這個商品的原料只是計(jì)算能力身辨?
我覺得比特幣的挖礦就是在用一個笨辦法找一個解丐谋,它運(yùn)用的數(shù)學(xué)方法書中描述這也是種哈希運(yùn)算芍碧。這種計(jì)算是為了讓比特幣網(wǎng)絡(luò)的參與者之一礦工來維持這個系統(tǒng)的安全煌珊,比特幣和這個系統(tǒng)渾然一體,究竟它是附屬還是最終目的呢泌豆?若說比特幣是目的定庵,那它更像是商品,算力是原料踪危,共識機(jī)制蔬浙,加密技術(shù)和分布式網(wǎng)絡(luò)只不過是生產(chǎn)比特幣并使其能夠有卓爾不群的優(yōu)良品質(zhì)的工藝而已,若說它是附屬贞远,那誰才是主角畴博,是底層的區(qū)塊鏈技術(shù)嗎?沒有比特幣的底層不就是一堆沒有生機(jī)無法活動起來的機(jī)器嗎蓝仲?你說呢俱病?