作者:歷史文章 / 來源:白話區塊鏈
白話區塊鏈,從入門到精通,看我就夠了!
本文轉載自公眾號“肉摩陀"
整編|WangMe
世上真的有這么一本賬本么?有!那么大一本賬,體積多大呢?答案是150Gb。
這里說的賬本是指比特幣的底層載體---區塊鏈。區塊鏈,正如它的名字所顯示,分為區塊和鏈兩部分,區塊即是block,鏈即是chain,合稱blockchain。
不過區塊鏈技術并不是天然綁定比特幣的,但比特幣卻需要區塊鏈作為載體,所以區塊鏈是一種更加底層的技術,它的作用是記載信息。信息可能是交易記錄,產品生產數據,合約履行情況等等。只不過“這本”四十七萬頁的賬本,恰好記載了比特幣的交易記錄,又正好比特幣火了,所以人們才覺得區塊鏈等于比特幣。
那區塊鏈有什么特別呢
首先,該本賬本并不存在于一個單一中央服務器內,而是存在于所有裝了客戶端的電腦硬盤上,也就是所謂的區塊鏈分布式存儲。這里你可以想象區塊鏈就是一部電影,每個客戶端(錢包)安裝完成后,都會從網上自動下載一部和原片一模一樣的副本,保存到本地硬盤。這里用到的技術相信下載過BT的人都知道,叫做P2P。但該賬本是加密的,在沒有私鑰的情況下,誰都無法查看賬本內的詳細交易記錄,也不能交易,關于私鑰,具體請參考詳情參考《聊聊錢包 私鑰 公鑰 地址》。
其次,該賬本一共有四十七萬頁之多,也就是四十七萬個區塊。每頁或者說每個區塊里都記錄著成百上千的交易記錄,要保證四十七萬頁的順序不出錯,是不是想著就頭大了呢!物理世界的書本或賬本每一頁都會有頁碼表示前后關系,區塊鏈世界里每個區塊都由區塊頭和數據主體構成。區塊頭相當于頁碼,記錄了本區塊頭,前一區塊頭,下一區塊頭的hash值。通過這些hash值的前后關聯,保證了區塊的順序,所以區塊頭即是頁碼和鏈。
下圖是第19999個區塊,第20000個區塊和第20001個區塊頭之間的指向關系,每個區塊頭里都有一個唯一hash值,并記載了前一個區塊頭的hash,和后一個區塊的hash,彼此互聯,成為一條鏈。
需要注意的是,比特幣區塊的起始區塊,0號區塊(創世區塊),是不指向任何之前區塊的,因為它是第一塊。
那有人可能會問,能不能把區塊頭黑掉,替換成我編寫的信息呢?
答案是,幾乎不可能!
因為區塊頭的hash值是對區塊頭數據進行SHA256算法加密后生成的一段字符串。該字符串會因為輸入的數據不同而不同,區塊頭本身是一串二進制數據,你改了其中任何一個數字,通過SHA256算法后,就會產生不同的hash值。(舉個例子,我們從網上下載zip文件包時,通常也會包含一段MD5的字符串,該字符串原理類似SHA256,它的作用是驗證文件的完整性。)
如果hash值變了,那就需要去更改本區塊之前和之后對應的區塊,然后是和那些區塊對應的區塊,以此類推生生不息,你需要修改整條鏈上的所有區塊,并且還需要把網絡上超過51%的副本都修改了,才能起作用,考慮到這本賬本有四十七萬頁之多,以及網絡上的眾多副本,這個修改的工作量將會大的驚人。
那區塊頭是怎么和區塊主體連接呢
靠merkle值,下圖顯示了區塊頭內包含的merkle值,merkle值是通過merkle樹算法,將區塊內所有交易數據生成的一串加密字符串。假設一個區塊里有10000筆交易,現在讓每兩筆交易合并,通過兩次SHA256算法生成一個merkle值,然后這5000個merkle值兩兩合并,再生成一個新的merkle值,以不斷重復該過程,直到最后產生唯一的一個merkle值,這個值稱作merkleroot值。這個過程有點像踢足球時候的32進16,16進8,8進4淘汰賽,只不過這里不淘汰,而是合并。
下圖中區塊頭里打了紅色的字符串就是merkleroot
用merkle樹算法的好處是,即使區塊內的交易數據很多,也只需要很少的路徑就能算出merkleroot,比如100萬筆交易只需要20步就可以算出根merkle值,如下圖:
正因為merkle值的這個特點,使得SPV簡單支付(simplified payment verification)和輕錢包成為可能。正常情況下一個包含區塊頭和主體數據的區塊大約是1M,而區塊頭大小只有80字節,用戶可以通過僅下載區塊頭,再下載每次與自己發生merkle值計算的相對交易的merkle值(你可以理解為所有和你提過比賽的球隊)。
回到上面提到的含100萬筆交易的區塊,你只需要下載該區塊的20個merkle節點數據,就能算出merkleroot值,從而證明交易的合法性,這樣的輕錢包的大小可以控制在40m以內。不過SPV和輕錢包的交易確認,仍然需要依賴網絡上擁有完整區塊計算機的數據。
因為區塊鏈技術的以上特點,使得它實現了去中心化,不可篡改,可追溯交易記錄等等功能。不過作為代價,你需要下載所有的區塊鏈數據,就比特幣的應用來說,已經有上百G了,而不同的區塊鏈應用會有不同大小的賬本,我想說,愿你有個足夠大的硬盤。
【勘誤】
7月19日文《聊聊錢包、私鑰、公鑰和地址》中的“ getaddressbyaccount”為筆誤,正確應為“getaddressesbyaccount”。



點擊“閱讀原文”,查看公眾號所有歷史消息。