當前位置:
首頁 > 最新 > 鏈表,哈希,挖礦等-區塊鏈技術學習筆記

鏈表,哈希,挖礦等-區塊鏈技術學習筆記

開篇

很多年沒有看到像區塊鏈這樣有生命力的事物了。它像一個欣欣向榮的新大陸一樣,把技術理想主義者,圍觀者,投資者,投機者,甚至流氓騙子各色人等聚集在一起。

在此亂象中,我深感於現在區塊鏈,觀點太多,事實太少。我作為一個個體去摸這頭大象的時候,比較擅長的是以技術的角度切入,看它到底是如何工作,如何發展的,從而把這一隻象腿摸清楚。我把自己的學習記錄下來。這些記錄可能很入門,甚至有錯誤,但是或許對於同樣感興趣的人有所幫助。

鏈表

從技術角度看,區塊鏈的底層是精妙設計的鏈表數據結構。

什麼是鏈表呢?就是有順序的一串數據塊,一個跟在另一個後面,這個順序是嚴格規定的,不能亂。區塊鏈,食物鏈,供應鏈,資金鏈,甚至鄙視鏈,描述的就是這樣有順序的一串物品。

我們以比特幣為例,來剖析這個鏈表。

為了構成鏈表,鏈表的數據塊裡面有兩個基本的部分:區塊頭,和數據本身。區塊頭裡面有一個欄位指明了上一個區塊的id,而所有區塊的id既不是順序的,也不是隨機的,而是區塊頭這80個位元組的兩次哈希值。

哈希 Hash

這可能是區塊鏈裡面最讓非理工科出身的學習者費解的概念了。聽起來很嚇人,實際很簡單。哈希就是一個演算法,能把任意長度的內容(無論是一個數,還是文章,圖像,視頻,總之就是任何數字化的信息)轉換成一串看似沒有規律的固定長度的數字(哈希值),並保證結果唯一,而從這個結果幾乎沒有辦法推算出原始數據。比特幣用的是叫做SHA256的哈希演算法。

比如:1的SHA256哈希結果是:0x6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

2的SHA256哈希結果是:

0xd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35

我們把這個哈希值看成亂碼好了,因為唯一的規律就是沒有規律。同時,在原始數據中哪怕有一點點改動,產生的哈希就會產生巨大的變化。這個特性常常用來做「數字指紋」。

用日常例子來打個比方。比如按照配方做菜就是個哈希過程:有了配方精確的做菜容易,而從菜品推測出配方難得多。給出兩個數算出他們的平方和比較容易,給出一個數求是哪兩個數的平方和就難很多。哈希演算法就大概這麼個意思。

區塊頭和id

剛才講到,每個區塊的id從它的區塊頭的80個位元組數據兩次SHA256哈希得到。區塊鏈的一個精妙的設計就是,它對於的id是有要求的。只有滿足特定的規則的id才是合法的。這個規則就是:區塊頭的哈希值必須小於一個數,直觀看到的就是,每個新的區塊的長達64個字元的id必須以比如18個零開頭,一個合法的區塊id是長成這個樣子的:0000000000000000003c19cdbebe2df5c7f82558e2c80a0c7341e25072b732a2

區塊頭這80個位元組裡面的6個欄位,5個是不能改的,它們是:

1. 版本號         最近一直是0x20000000

2. 上一個塊的哈希值    這個是排隊時候的隊尾,改了就排不到隊里了

3. 數據的哈希       這個是區塊里的交易數據,也不能改

4. 時間          不能改,就是現在的時間。

5. 難度          每個給定的時間全網的難度是一樣的

只有第六個欄位是隨便寫的,這個數字叫做Nounce

6. Nounce

網路上任何一台機器只要找到一個合適的數字填到自己的這個區塊的Nounce位置,使得區塊頭這6個欄位(80個位元組)的數據的哈希值的哈希值以18個以上的0開頭,誰就找到了那個金子!既然我們無法事先寫好一個滿足18個0的數字然後反推Nounce,唯一的做法就是從0開始一個一個的嘗試,看結果是不是滿足要求,不滿足就再試下一個,直到找到。

這個過程被戲稱為挖礦。其實我覺得這個過程和淘金更像。淘金者做的事情很簡單,卻很重複,就是對於河裡所有沙子,拿起來一個,判斷是不是金子。如果不是,扔掉再拿一個。如此重複幾百萬次,總有一個是金子。而在區塊鏈世界,那64個十六進位的字元串,第一個是0的概率是1/16,第二個也是0的概率再乘以1/16,第18個還是零的概率可想而知。所以大家為了找到這個金子一般的Nounce一般要花費十幾億次嘗試,雖然每次算哈希的工作並不那麼費時間,重複十幾億次還是要耗費巨大的計算機資源和電力資源。

比特幣體系的另外一個精妙設計就是它動態的調整難度,以無論有多少台礦機在尋找那個珍貴的正確的Nounce,都保證大約每10分鐘產生一個塊。這也是一個類似經濟學的演算法。它每2016的塊(也就是2周)就計算一下前面2016個塊平均每個塊花了多少時間,如果低於10分鐘就按照低的比例調高難度,如果高於10分鐘調低難度。這樣礦機無論增減,比特幣都可以按照每10分鐘找到一個塊的金數字並且生成一個合法的塊。

找到了那個金子一樣的數字以後呢?

誰找到了那個數字,誰都可以向全網廣播這個新塊了。而真正的財富秘密在於在這個新塊的數據區的交易數據裡面,第一條交易中,挖礦的人可以憑空的給一個地址(通常是自己的)發放12.5個比特幣。這是規則認可的,就好像賭場里荷官可以合法的從桌上拿一部分錢進自己的口袋一樣。這12.5個比特幣是比特幣網路上唯一沒有發款人,只有收款人的交易,新的比特幣就這樣憑空誕生了。這個激勵每4年減半,再過兩年就只有6.25個了,這樣2140年左右兩千一百萬個比特幣就基本上全產生了並且不會增加了。

區塊鏈的網路

剛才描述的是在一台電腦上的樣子。實際上,這一串數據是通過P2P網路分布在無數的電腦(節點)上的。任何礦工找到了那個金子數字後就立刻全網路剛播新找到的塊。如果所有節點在一個大的聊天室裡面倒也簡單,但實際上這個廣播是跟烽火台一樣接力的傳遞的。每個節點告訴周圍的,然後它再告訴周圍的。有意或無意的,就會有兩個或多個礦工近似同時對於網路的一部分分別宣布發現了新塊。這個時候的規則就是,每個節點只會接受最長的鏈並且丟棄較短的鏈。經過幾個節點後一定有一個勝出,另外一個被拋棄,而添加新塊是需要算力的,最終一定是擁有最大算力的一方獲勝。這也就是如果沒有人掌超過50%的算力就無法控制區塊鏈。

小結

以比特幣體系為例,最底層就是一串這樣以80個位元組的區塊頭開始,約1M的數據跟著的數據。用哈希這樣的演算法,一層一層的鎖定,形成了固若金湯的鏈條。再把它分布在成千上萬的節點上,再又成千上萬的礦機通過挖礦來保持算力高壓,讓篡改數據需要算力門檻。同時,任何人對於歷史數據,哪怕就改了很小的一部分,數據的哈希就變了,區塊頭就變了,它的兩次哈希結果就變了,它後面的塊就連不上來了,就會被立刻發現。如此幾層嵌套,一個人類到現在為止最為安全和防篡改的公共信息系統誕生了。

下面幾篇會記錄一下錢包,公鑰密鑰,智能合約,發放通證(Token),區塊鏈應用,區塊鏈對於組織的影響等等方面繼續記錄學習過程。感謝阮一峰,華宏偉,王哲,趙君,Tim Chen的指正和幫助。

後注

註:這個跟其他的各種「本質是」並不矛盾,比如區塊鏈本質是分散式賬本也對,這個是在鏈表結構上面構建的,也有人說本質是加密貨幣,這也對,因為貨幣是在分散式賬本之上構建的。這些說法之間不是非此即彼的矛盾關係,而是不同層次的應用的問題。

註:自然界誰吃誰的順序,生產中的誰供貨給誰,再組裝後工會給誰的順序,資金從哪裡流到哪裡,再流到哪裡等等,都是這樣的數據結構。

註: 區塊頭的第三個欄位其實不是數據的直接哈希,而是一個樹狀結構Merkle根。

註:剛才所說的18個零是一種近似的說法。嚴格地說,是算出來的本塊的ID必須小於一個叫做叫做目標數的數。這個數越小(就是開始的0越多),就越難。

註:嚴格的意義說最長的鏈不是最多區塊的鏈,而是鏈上的所有塊的難度總量最大的鏈。

註:只給感興趣的人看:0x20000000 (十進位536870912)是從BIP9開始規定的新的版本號規則,開始用一個位數表示一個獨立的功能,以區分未來的軟分叉。0x20000000 相當於block的第五個版本。

註:以我寫文章的時候最新的一個塊為例,它的80位區塊頭是這樣的:

非常不方便的地方在於比特幣選擇了小端存儲,就是習慣意義的倒著寫數字的方式。按照顏色,如上就是:版本號上一個塊的哈希數據哈希時間難度Nounce。這個80位數字的兩次SHA256哈希就是這一個塊的id,18個零開頭,滿足要求:00000000000000000043752089261f2b6699cd988d9f5b1732a5a259b50984cf

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 玩轉電腦 的精彩文章:

TAG:玩轉電腦 |