花一分鐘來(lái)了解下 區(qū)塊鏈技術(shù)之前的東西
很多年沒(méi)有看到像區(qū)塊鏈這樣有生命力的事物了。它像一個(gè)欣欣向榮的新大陸一樣,把技術(shù)理想主義者,圍觀者,投資者,投機(jī)者,甚至流氓騙子各色人等聚集在一起。
在此亂象中,我深感于現(xiàn)在區(qū)塊鏈,觀點(diǎn)太多,事實(shí)太少。我作為一個(gè)個(gè)體去摸這頭大象的時(shí)候,比較擅長(zhǎng)的是以技術(shù)的角度切入,看它到底是如何工作,如何發(fā)展的,從而把這一只象腿摸清楚。我把自己的學(xué)習(xí)記錄下來(lái)。這些記錄可能很入門(mén),甚至有錯(cuò)誤,但是或許對(duì)于同樣感興趣的人有所幫助。
鏈表從技術(shù)角度看,區(qū)塊鏈的底層是精妙設(shè)計(jì)的鏈表數(shù)據(jù)結(jié)構(gòu)①。
什么是鏈表呢?就是有順序的一串?dāng)?shù)據(jù)塊,一個(gè)跟在另一個(gè)后面,這個(gè)順序是嚴(yán)格規(guī)定的,不能亂。區(qū)塊鏈,食物鏈,供應(yīng)鏈,資金鏈,甚至鄙視鏈,描述的就是這樣有順序的一串物品②。
我們以比特幣為例,來(lái)剖析這個(gè)鏈表。
為了構(gòu)成鏈表,鏈表的數(shù)據(jù)塊里面有兩個(gè)基本的部分:區(qū)塊頭,和數(shù)據(jù)本身。區(qū)塊頭里面有一個(gè)字段指明了上一個(gè)區(qū)塊的id,而所有區(qū)塊的id既不是順序的,也不是隨機(jī)的,而是區(qū)塊頭這80個(gè)字節(jié)的兩次哈希值。
哈希 Hash這可能是區(qū)塊鏈里面最讓非理工科出身的學(xué)習(xí)者費(fèi)解的概念了。聽(tīng)起來(lái)很?chē)樔耍瑢?shí)際很簡(jiǎn)單。哈希就是一個(gè)算法,能把任意長(zhǎng)度的內(nèi)容(無(wú)論是一個(gè)數(shù),還是文章,圖像,視頻,總之就是任何數(shù)字化的信息)轉(zhuǎn)換成一串看似沒(méi)有規(guī)律的固定長(zhǎng)度的數(shù)字(哈希值),并保證結(jié)果唯一,而從這個(gè)結(jié)果幾乎沒(méi)有辦法推算出原始數(shù)據(jù)。比特幣用的是叫做SHA256的哈希算法。
比如: 1 的SHA256哈希結(jié)果是: 0x6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
2 的SHA256哈希結(jié)果是:
0xd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
我們把這個(gè)哈希值看成亂碼好了,因?yàn)槲ㄒ坏囊?guī)律就是沒(méi)有規(guī)律。同時(shí),在原始數(shù)據(jù)中哪怕有一點(diǎn)點(diǎn)改動(dòng),產(chǎn)生的哈希就會(huì)產(chǎn)生巨大的變化。這個(gè)特性常常用來(lái)做“數(shù)字指紋”。
用日常例子來(lái)打個(gè)比方。比如按照配方做菜就是個(gè)哈希過(guò)程:有了配方精確的做菜容易,而從菜品推測(cè)出配方難得多。給出兩個(gè)數(shù)算出他們的平方和比較容易,給出一個(gè)數(shù)求是哪兩個(gè)數(shù)的平方和就難很多。哈希算法就大概這么個(gè)意思。
區(qū)塊頭和id剛才講到,每個(gè)區(qū)塊的id從它的區(qū)塊頭的80個(gè)字節(jié)數(shù)據(jù)兩次SHA256哈希得到。區(qū)塊鏈的一個(gè)精妙的設(shè)計(jì)就是,它對(duì)于的id是有要求的。只有滿(mǎn)足特定的規(guī)則的id才是合法的。這個(gè)規(guī)則就是:區(qū)塊頭的哈希值必須小于一個(gè)數(shù),直觀看到的就是,每個(gè)新的區(qū)塊的長(zhǎng)達(dá)64個(gè)字符的id必須以比如18個(gè)零開(kāi)頭④,一個(gè)合法的區(qū)塊id是長(zhǎng)成這個(gè)樣子的: 000000000000000000 3c19cdbebe2df5c7f82558e2c80a0c7341e25072b732a2
區(qū)塊頭這80個(gè)字節(jié)里面的6個(gè)字段,5個(gè)是不能改的,它們是:
1. 版本號(hào) 最近一直是0x20000000 ⑥
2. 上一個(gè)塊的哈希值 這個(gè)是排隊(duì)時(shí)候的隊(duì)尾,改了就排不到隊(duì)里了
3. 數(shù)據(jù)的哈希 這個(gè)是區(qū)塊里的交易數(shù)據(jù),也不能改③
4. 時(shí)間 不能改,就是現(xiàn)在的時(shí)間。
5. 難度 每個(gè)給定的時(shí)間全網(wǎng)的難度是一樣的④
只有第六個(gè)字段是隨便寫(xiě)的,這個(gè)數(shù)字叫做No nce
6. No nce
網(wǎng)絡(luò)上任何一臺(tái)機(jī)器只要找到一個(gè)合適的數(shù)字填到自己的這個(gè)區(qū)塊的No nce位置,使得區(qū)塊頭這6個(gè)字段(80個(gè)字節(jié))的數(shù)據(jù)的哈希值的哈希值以18個(gè)以上的0開(kāi)頭,誰(shuí)就找到了那個(gè)金子⑦!既然我們無(wú)法事先寫(xiě)好一個(gè)滿(mǎn)足18個(gè)0的數(shù)字然后反推Nounce,唯一的做法就是從0開(kāi)始一個(gè)一個(gè)的嘗試,看結(jié)果是不是滿(mǎn)足要求,不滿(mǎn)足就再試下一個(gè),直到找到。
這個(gè)過(guò)程被戲稱(chēng)為挖礦。其實(shí)我覺(jué)得這個(gè)過(guò)程和淘金更像。淘金者做的事情很簡(jiǎn)單,卻很重復(fù),就是對(duì)于河里所有沙子,拿起來(lái)一個(gè),判斷是不是金子。如果不是,扔掉再拿一個(gè)。如此重復(fù)幾百萬(wàn)次,總有一個(gè)是金子。而在區(qū)塊鏈?zhǔn)澜纾?4個(gè)十六進(jìn)制的字符串,第一個(gè)是0的概率是1/16,第二個(gè)也是0的概率再乘以1/16,第18個(gè)還是零的概率可想而知。所以大家為了找到這個(gè)金子一般的No nce一般要花費(fèi)十幾億次嘗試,雖然每次算哈希的工作并不那么費(fèi)時(shí)間,重復(fù)十幾億次還是要耗費(fèi)巨大的計(jì)算機(jī)資源和電力資源。
比特幣體系的另外一個(gè)精妙設(shè)計(jì)就是它動(dòng)態(tài)的調(diào)整難度,以無(wú)論有多少臺(tái)礦機(jī)在尋找那個(gè)珍貴的正確的No nce,都保證大約每10分鐘產(chǎn)生一個(gè)塊。這也是一個(gè)類(lèi)似經(jīng)濟(jì)學(xué)的算法。它每2016的塊(也就是2周)就計(jì)算一下前面2016個(gè)塊平均每個(gè)塊花了多少時(shí)間,如果低于10分鐘就按照低的比例調(diào)高難度,如果高于10分鐘調(diào)低難度。這樣礦機(jī)無(wú)論增減,比特幣都可以按照每10分鐘找到一個(gè)塊的金數(shù)字并且生成一個(gè)合法的塊。
找到了那個(gè)金子一樣的數(shù)字以后呢?
誰(shuí)找到了那個(gè)數(shù)字,誰(shuí)都可以向全網(wǎng)廣播這個(gè)新塊了。而真正的財(cái)富秘密在于在這個(gè)新塊的數(shù)據(jù)區(qū)的交易數(shù)據(jù)里面,第一條交易中,挖礦的人可以憑空的給一個(gè)地址(通常是自己的)發(fā)放12.5個(gè)比特幣。這是規(guī)則認(rèn)可的,就好像賭場(chǎng)里荷官可以合法的從桌上拿一部分錢(qián)進(jìn)自己的口袋一樣。這12.5個(gè)比特幣是比特幣網(wǎng)絡(luò)上唯一沒(méi)有發(fā)款人,只有收款人的交易,新的比特幣就這樣憑空誕生了。這個(gè)激勵(lì)每4年減半,再過(guò)兩年就只有6.25個(gè)了,這樣2140年左右兩千一百萬(wàn)個(gè)比特幣就基本上全產(chǎn)生了并且不會(huì)增加了。
區(qū)塊鏈的網(wǎng)絡(luò)剛才描述的是在一臺(tái)電腦上的樣子。實(shí)際上,這一串?dāng)?shù)據(jù)是通過(guò)P2P網(wǎng)絡(luò)分布在無(wú)數(shù)的電腦(節(jié)點(diǎn))上的。任何礦工找到了那個(gè)金子數(shù)字后就立刻全網(wǎng)絡(luò)剛播新找到的塊。如果所有節(jié)點(diǎn)在一個(gè)大的聊天室里面倒也簡(jiǎn)單,但實(shí)際上這個(gè)廣播是跟烽火臺(tái)一樣接力的傳遞的。每個(gè)節(jié)點(diǎn)告訴周?chē)?,然后它再告訴周?chē)?。有意或無(wú)意的,就會(huì)有兩個(gè)或多個(gè)礦工近似同時(shí)對(duì)于網(wǎng)絡(luò)的一部分分別宣布發(fā)現(xiàn)了新塊。這個(gè)時(shí)候的規(guī)則就是,每個(gè)節(jié)點(diǎn)只會(huì)接受最長(zhǎng)的鏈并且丟棄較短的鏈⑤。經(jīng)過(guò)幾個(gè)節(jié)點(diǎn)后一定有一個(gè)勝出,另外一個(gè)被拋棄,而添加新塊是需要算力的,最終一定是擁有最大算力的一方獲勝。這也就是如果沒(méi)有人掌超過(guò)50%的算力就無(wú)法控制區(qū)塊鏈。
小結(jié)
以比特幣體系為例,最底層就是一串這樣以80個(gè)字節(jié)的區(qū)塊頭開(kāi)始,約1M的數(shù)據(jù)跟著的數(shù)據(jù)。用哈希這樣的算法,一層一層的鎖定,形成了固若金湯的鏈條。再把它分布在成千上萬(wàn)的節(jié)點(diǎn)上,再又成千上萬(wàn)的礦機(jī)通過(guò)挖礦來(lái)保持算力高壓,讓篡改數(shù)據(jù)需要算力門(mén)檻。同時(shí),任何人對(duì)于歷史數(shù)據(jù),哪怕就改了很小的一部分,數(shù)據(jù)的哈希就變了,區(qū)塊頭就變了,它的兩次哈希結(jié)果就變了,它后面的塊就連不上來(lái)了,就會(huì)被立刻發(fā)現(xiàn)。如此幾層嵌套,一個(gè)人類(lèi)到現(xiàn)在為止最為安全和防篡改的公共信息系統(tǒng)誕生了。