區(qū)塊鏈的設(shè)計(jì)目標(biāo)和工作原理解析
要講區(qū)塊鏈卻不講數(shù)字貨幣是不可能的。畢竟區(qū)塊鏈?zhǔn)菫榱藵M(mǎn)足比特幣獨(dú)特的需求才被創(chuàng)造出來(lái)的。
比特幣的目標(biāo)是能夠替代傳統(tǒng)貨幣,作為貨幣,它就必須有流通能力。簡(jiǎn)單地說(shuō),比特幣用戶(hù)之間可以互相轉(zhuǎn)移比特幣。而為了保證比特幣的流通能夠正常的進(jìn)行,比特幣軟件必須提供一些最基本的安全上的保證。比如說(shuō),如果A給了你一個(gè)比特幣,這一個(gè)比特幣就是你的了。要是A能隨隨便便把這個(gè)比特幣搶回去,那肯定不行。
如果你使用的是紙質(zhì)貨幣,A要拿回給了你的東西,就必須在物理上把它搶回去。那只要使用物理上的方法保護(hù)好這個(gè)東西就好了。但是如果你用的是支付寶怎么辦?支付寶上的轉(zhuǎn)賬無(wú)非是數(shù)字上的加加減減,并不涉及物理實(shí)體的轉(zhuǎn)移。你所需要做的無(wú)非是信任支付寶這個(gè)第三方的機(jī)構(gòu),相信支付寶沒(méi)有和A串通好,一起坑你的錢(qián)。
但是這兩條到了比特幣身上就都行不通了。比特幣不是物理實(shí)體,同時(shí)也不存在一個(gè)所有人都信任的第三方(比特幣的設(shè)計(jì)目標(biāo)就是創(chuàng)造一種用戶(hù)可以完全匿名的貨幣,自然不可能去依賴(lài)一個(gè)這樣的第三方)。那應(yīng)該怎么辦呢?其實(shí)思路很簡(jiǎn)單:如果A在大庭廣眾之下,當(dāng)著一千個(gè)人的面答應(yīng)把錢(qián)給你,那么就算沒(méi)有第三方的保證,A也很難抵賴(lài)。
從實(shí)現(xiàn)上來(lái)說(shuō),每當(dāng)用戶(hù)使用比特幣進(jìn)行了交易,關(guān)于這次交易的信息就會(huì)被廣播給所有的比特幣用戶(hù)。這樣就算有人想要抵賴(lài),也會(huì)被抓到證據(jù)。
好了,講了這么多,好像問(wèn)題都解決了,那么這里面有區(qū)塊鏈?zhǔn)裁词履兀?/p>
我們可以從一個(gè)新生節(jié)點(diǎn)的角度看一下這個(gè)問(wèn)題。新生節(jié)點(diǎn)要加入比特幣網(wǎng)絡(luò),就必須對(duì)整個(gè)網(wǎng)絡(luò)的情況有所了解。它必須知道網(wǎng)絡(luò)中的整個(gè)交易歷史,因?yàn)橹挥羞@樣它才能知道當(dāng)前其他所有節(jié)點(diǎn)各持有多少比特幣。而這些交易歷史所構(gòu)成的結(jié)構(gòu)就是區(qū)塊鏈。區(qū)塊鏈?zhǔn)且幌盗袇^(qū)塊按照時(shí)間構(gòu)成的一個(gè)鏈條,鏈條中每一個(gè)區(qū)塊都包含數(shù)條交易記錄。
因?yàn)楸忍貛疟旧碓诎踩系囊螅ㄒ?jiàn)前文),區(qū)塊鏈必須滿(mǎn)足一些特性。簡(jiǎn)而言之,就是不能讓人有修改歷史的能力。假設(shè)有一個(gè)區(qū)塊鏈A-》B-》C,任何接收到這個(gè)區(qū)塊鏈的新生節(jié)點(diǎn),必須能夠很方便的驗(yàn)證交易A之后確實(shí)發(fā)生了交易B,交易B之后確實(shí)發(fā)生了交易C。在密碼學(xué)中,防止數(shù)據(jù)被改動(dòng)有一個(gè)很方便的工具,就是hash。如果C之中包含了B的hash值(如sha256值),那么如果有任何人嘗試發(fā)送改動(dòng)過(guò)的B(不妨稱(chēng)為B‘)給新節(jié)點(diǎn),新節(jié)點(diǎn)立刻就能發(fā)現(xiàn)B’的hash值和C中記錄的不符。所以只要新節(jié)點(diǎn)獲取到了區(qū)塊鏈中最新的一個(gè)塊,它就能往回驗(yàn)證整個(gè)歷史的合法性。
那么,新節(jié)點(diǎn)要怎么知道最新的塊是否合法呢?答案其實(shí)是:“它并不能知道?!贝騻€(gè)比方說(shuō),要是你身邊的所有人都商量好了合起伙來(lái)騙你,你就沒(méi)辦法判斷你聽(tīng)到的是不是假話(huà)。但是比特幣網(wǎng)絡(luò)存在這樣一個(gè)假設(shè):“好人總是占大多數(shù)的”。也就是說(shuō),當(dāng)新生節(jié)點(diǎn)向網(wǎng)絡(luò)發(fā)出請(qǐng)求,它收到的最常見(jiàn)的回復(fù)就是合法的回復(fù)。
我們解決掉了歷史驗(yàn)證的問(wèn)題,但還有另一個(gè)問(wèn)題:誰(shuí)有權(quán)利往區(qū)塊鏈上添加新的塊?如果有惡意節(jié)點(diǎn)將“A給C一個(gè)比特幣”改成了“A給B一個(gè)比特幣”,其他節(jié)點(diǎn)應(yīng)該怎么區(qū)分?答案和之前一樣:“它并不能區(qū)分。”但是不要忘了,我們假設(shè)網(wǎng)絡(luò)中的好人是占大多數(shù)的。在大家的計(jì)算能力差不多的情況下,這等同于假設(shè)網(wǎng)絡(luò)中的好人們擁有更多的計(jì)算力資源。也就是說(shuō),如果我們把“往區(qū)塊鏈上增加區(qū)塊”這件事變成一件需要大量計(jì)算的工作,那么擁有更多計(jì)算力資源的好人們就能搶在壞人之前加入新區(qū)塊。
而這個(gè)計(jì)算量巨大的工作,仍然是hash。所有的節(jié)點(diǎn)會(huì)達(dá)成一個(gè)共識(shí):“只接受hash值前幾位符合條件的區(qū)塊”(比如只接收hash值第一位是0的區(qū)塊)。節(jié)點(diǎn)可以通過(guò)改動(dòng)區(qū)塊中的padding來(lái)湊hash值。只要hash算法是安全的,節(jié)點(diǎn)就沒(méi)辦法高效的湊對(duì)hash值,只能暴力嘗試所有的padding來(lái)碰運(yùn)氣。運(yùn)氣好湊上了的節(jié)點(diǎn),還可以在區(qū)塊中增加一條給自己一個(gè)比特幣的交易記錄作為對(duì)自己的獎(jiǎng)勵(lì)。這個(gè)策略還很適合于控制新區(qū)塊出現(xiàn)的速度(比特幣需要在計(jì)算力變動(dòng)的情況下維持勻速增長(zhǎng)),只要增強(qiáng)對(duì)hash值的要求(比如原先要求第一位是0,現(xiàn)在要求頭兩位都是0),就能減慢區(qū)塊鏈增長(zhǎng)的速度。