比特幣區(qū)塊鏈?zhǔn)且粋€(gè)分布式的數(shù)據(jù)庫(kù),它的數(shù)據(jù)可以存在于任何人的電腦中恩袱,只要你的電腦接入了互聯(lián)網(wǎng),有足夠大的磁盤空間可以裝下胶哲。關(guān)于數(shù)據(jù)庫(kù)的體積畔塔,我們可以計(jì)算一下,目前的區(qū)塊高度大約是50w鸯屿,每個(gè)區(qū)塊的大小上限是1M澈吨,那數(shù)據(jù)庫(kù)的體積上限也就是500G,一個(gè)普通的移動(dòng)硬盤就夠了寄摆。而實(shí)際數(shù)據(jù)庫(kù)的體積比這個(gè)數(shù)還要小太多谅辣,因?yàn)楸忍貛旁缙趲缀鯖]有人進(jìn)行交易,區(qū)塊的大小僅215個(gè)字節(jié)左右婶恼。目前這個(gè)體積大概是70個(gè)G左右桑阶。
既然數(shù)據(jù)有這么多份拷貝,那算法又是如何保證這些數(shù)據(jù)是完全一致的呢勾邦,如果有人要篡改數(shù)據(jù)蚣录,會(huì)不會(huì)就不那么安全了?
比特幣為了解決數(shù)據(jù)庫(kù)的安全性和一致性眷篇,使用了兩個(gè)重要機(jī)制萎河。數(shù)據(jù)的安全性機(jī)制可以用一句簡(jiǎn)單的成語(yǔ)來(lái)描述就是【牽一發(fā)而動(dòng)全身】,數(shù)據(jù)一致性機(jī)制也可以用一個(gè)簡(jiǎn)單的原理概括那就是【大多數(shù)人都是好的】蕉饼。
挖礦很難
區(qū)塊鏈?zhǔn)且粋€(gè)分布式數(shù)據(jù)庫(kù)虐杯,全世界的人都在查詢這個(gè)數(shù)據(jù)庫(kù),但是負(fù)責(zé)往數(shù)據(jù)庫(kù)里寫數(shù)據(jù)的角色則只有礦工椎椰。礦工的操作就是構(gòu)造一個(gè)區(qū)塊厦幅,使得這個(gè)區(qū)塊能滿足一定的算法條件沾鳄,就可以加入到全局的區(qū)塊鏈數(shù)據(jù)庫(kù)中慨飘,然后礦工就可以獲得巨額回報(bào)。
那問題是礦工在自己的挖礦機(jī)上構(gòu)造出了一個(gè)區(qū)塊译荞,這個(gè)區(qū)塊是如何同步到全世界的呢瓤的?它使用的是P2P的廣播機(jī)制,可以理解為【擊花傳鼓】吞歼。首先礦工將這個(gè)區(qū)塊加入到本地的區(qū)塊鏈中圈膏,然后將區(qū)塊的信息通過路由器傳遞到互聯(lián)網(wǎng)上,在網(wǎng)路上監(jiān)聽的所有設(shè)備都可以讀取到這個(gè)區(qū)塊的信息篙骡,然后對(duì)這個(gè)區(qū)塊的信息進(jìn)行校驗(yàn)稽坤,看看這個(gè)區(qū)塊是否滿足算法限定的苛刻條件丈甸。如果滿足了算法條件,就將這個(gè)區(qū)塊加入到自己的區(qū)塊鏈中尿褪,并且繼續(xù)對(duì)外傳播新區(qū)塊信息睦擂。
如果挖礦很容易,不但挖礦掙不到錢杖玲,互聯(lián)網(wǎng)網(wǎng)路上還會(huì)引起P2P廣播風(fēng)暴顿仇。那算法究竟對(duì)區(qū)塊限定了什么條件使得挖礦如此艱難呢?
我們來(lái)看一個(gè)區(qū)塊頭
圖中的hash字段就是當(dāng)前區(qū)塊的hash值摆马,prev_block是前一個(gè)區(qū)塊的hash值臼闻。區(qū)塊正是通過hash值串起來(lái)形成了一個(gè)區(qū)塊鏈。hash值是將上一個(gè)塊的hash值和當(dāng)前區(qū)塊頭內(nèi)容信息拼接起來(lái)進(jìn)行兩次sha256哈希得到的16進(jìn)制字符串囤采。
我們發(fā)現(xiàn)這些hash值前面都有很多個(gè)零述呐,那為什么會(huì)有這么多零呢?還有就是sha256哈希算法得到的hash值應(yīng)該是非常隨機(jī)的才對(duì)蕉毯,那如何hash的前綴會(huì)有這么多零呢市埋?
正是這些零造就了挖礦如此艱難。
礦工要隨機(jī)出合適的nonce值恕刘,使得兩次sha256哈希出來(lái)的值前綴至少包含N個(gè)零才可以被算法接受缤谎。假設(shè)使得前綴的第一位冒出一個(gè)零的概率是1/16,那使得N個(gè)位都要為零就必須平均進(jìn)行隨機(jī)16的N次方次nonce值才可以哈希出滿足條件的hash值褐着。圖中有17個(gè)零坷澡,16的17次方是一個(gè)非常可怕的數(shù)字含蓉。
算法還規(guī)定隨著區(qū)塊的高度增加频敛,需要的N值越大。
我們看創(chuàng)世區(qū)塊馅扣,也就是中本聰先生挖的第一個(gè)區(qū)塊
這個(gè)區(qū)塊的hash值前綴才10個(gè)零斟赚,如今挖礦難度已經(jīng)足足上升了16的7次方倍。礦工們?nèi)绻胍掷m(xù)獲得挖礦收益就必須擴(kuò)大礦場(chǎng)升級(jí)計(jì)算硬件差油。這也是為什么比特幣被環(huán)保人士詬病的原因之一拗军,因?yàn)樗馁M(fèi)了太多的能源去做這些【無(wú)意義】的計(jì)算。
未來(lái)挖礦的難度繼續(xù)增大蓄喇,計(jì)算機(jī)的算力會(huì)不會(huì)遇到瓶頸发侵,挖礦的收益會(huì)不會(huì)難以填平能量費(fèi)用,我們不知道妆偏,只能繼續(xù)觀察刃鳄。
區(qū)塊鏈分叉
有這樣一種可能,兩個(gè)礦工幾乎同一時(shí)間挖出了一個(gè)區(qū)塊钱骂,然后廣播到互聯(lián)網(wǎng)建議其它節(jié)點(diǎn)接受自己的區(qū)塊叔锐。節(jié)點(diǎn)收到這兩個(gè)區(qū)塊時(shí)會(huì)感到迷惑挪鹏,該接受哪個(gè)區(qū)塊呢,它很矛盾怎么辦愉烙?能不能隨機(jī)接受一個(gè)呢狰住?不可以,如果每個(gè)節(jié)點(diǎn)都隨機(jī)的話齿梁,全球區(qū)塊鏈數(shù)據(jù)庫(kù)就不一致了催植。
于是區(qū)塊鏈干脆就分叉,分成兩個(gè)支鏈勺择,然后就等著這兩個(gè)支鏈發(fā)展壯大创南,看誰(shuí)的支鏈發(fā)展的越長(zhǎng),最終就選擇誰(shuí)省核。算法規(guī)定優(yōu)先保留長(zhǎng)度較長(zhǎng)的鏈條稿辙。隨著區(qū)塊鏈的繼續(xù)發(fā)展,相對(duì)較短的弱小的分支鏈條將會(huì)被拋棄掉气忠,于是全球數(shù)據(jù)庫(kù)仍將繼續(xù)保持一致邻储。那會(huì)不會(huì)永遠(yuǎn)這兩個(gè)分支鏈條一樣長(zhǎng)呢,有這個(gè)可能旧噪,只是概率太小吨娜,小到幾乎沒可能發(fā)生。正所謂一山不容二虎淘钟,最終只有一個(gè)霸王宦赠。那些因?yàn)榉种чL(zhǎng)度太短被淘汰掉的區(qū)塊是作廢了的,辛苦挖出這些分支塊的礦工也不會(huì)有任何獎(jiǎng)勵(lì)米母,因?yàn)檫@些分支塊上的內(nèi)容不會(huì)被承認(rèn)勾扭。
偽造區(qū)塊
區(qū)塊鏈上登記的BTC很誘人,能不能把鏈條上的UTXO記錄改成自己的賬戶地址铁瞒,這樣不就可以毫不費(fèi)力拿到很多BTC直接成為世界首富了么妙色?
前文提到區(qū)塊的hash串是根據(jù)前驅(qū)區(qū)塊的hash串加上當(dāng)前區(qū)塊的內(nèi)容整體hash出來(lái)的結(jié)果。如果前驅(qū)區(qū)塊的內(nèi)容如果變了慧耍,前驅(qū)區(qū)塊的hash也得變身辨,然后后續(xù)區(qū)塊節(jié)點(diǎn)的hash串也會(huì)跟著變,一直傳遞下去蜂绎,就需要改變指定區(qū)塊的后續(xù)所有區(qū)塊節(jié)點(diǎn)栅表。
假定你在本地的數(shù)據(jù)庫(kù)里把這個(gè)區(qū)塊鏈給修改了笋鄙,還需要將這些修改的區(qū)塊通過互聯(lián)網(wǎng)廣播出去师枣,讓其它的節(jié)點(diǎn)也能接受,這就是個(gè)問題了萧落。收到區(qū)塊的節(jié)點(diǎn)干的第一件事就是校驗(yàn)區(qū)塊是否合法践美,也就是區(qū)塊的hash值是否滿足前置N個(gè)零的苛刻條件洗贰。待合法后,它會(huì)將區(qū)塊接到合適的位置引出一個(gè)分支來(lái)陨倡,這個(gè)位置不會(huì)比當(dāng)前最長(zhǎng)鏈的位置還低6層敛滋,因?yàn)樗惴ㄒ?guī)定落后6層的分支鏈?zhǔn)菚?huì)被拋棄的。這意味著你不可能篡改6層之前的任何區(qū)塊兴革,因?yàn)?層之前的區(qū)塊已經(jīng)塵埃落定了绎晃。
如果算力足夠強(qiáng)大到找到后6層區(qū)塊的目標(biāo)nonce值,確是可以達(dá)到串改數(shù)據(jù)庫(kù)的目的杂曲。但是這樣的篡改行為實(shí)際上是和挖礦行為等價(jià)的庶艾。你所做的不過就是爭(zhēng)取最長(zhǎng)的區(qū)塊鏈,在分支競(jìng)爭(zhēng)長(zhǎng)度時(shí)盡可能取勝而已擎勘。
日本【虛擬貨幣少女】偶像團(tuán)體
閱讀相關(guān)文章咱揍,關(guān)注微信公眾號(hào)/知乎專欄/頭條號(hào)【碼洞】