一: 什么是區塊鏈
區塊鏈是什么?一句話概括,它是一種特殊的分布式數據庫。
有兩個功能:
- 存儲信息,任何需要保存的信息,都可以寫入區塊鏈。
- 任何人都可以架設服務器,加入區塊鏈網絡,成為一個節點。區塊鏈的世界里面,沒有中心節點,每個節點都是平等的,都保存着整個數據庫。你可以向任何一個節點,寫入/讀取數據,因為所有節點最后都會同步,保證區塊鏈一致。
分布式數據庫不是新產品,但是區塊鏈有個革命性的特點就是去中心化,其他數據庫都有管理員,但是區塊鏈沒有。如果有人想對區塊鏈添加審核,是實現不了,因為它的設計目標就是防止出現居於中心地位的管理當局。因為無法管理,所以區塊鏈無法被控制。
二:區塊鏈組成
區塊鏈是由一個個區塊(block)組成。區塊很像數據庫的記錄,每次寫入數據,就是創建區塊。
每個區塊包含兩個內容:
- 區塊頭(Head):記錄當前區塊的特征值
- 區塊體(Body):實際數據
區塊的結構圖如上圖所示。詳情如下:
1)版本號(Version)
用來標識交易版本和所參照的規則。
2)前一區塊哈希值
也稱“父區塊哈希值”,這個哈希值通過對前一個區塊的區塊頭數據進行哈希計算(SHA256算法)得出,它的意義在於:每個新挖出的區塊都按秩序接在前一個區塊的后面。
3)默克爾根(Merkle Root)
在區塊主體中,所有交易信息先進行兩個一組的哈希計算,這種結構叫做Merkle樹(Merkle Tree),而且是一棵倒掛的樹。
如果一個區塊里只有4筆交易,則默克爾樹生成過程
最后的hash值就是區塊頭的Merkle根。Merkle樹能夠快速檢驗交易數據的完整性,即數據是否被篡改過。因為某筆中交易中的一個數據被篡改,都會改變最終的hash。
4)時間戳(Time)
記錄這個區塊生成的時間,精確到秒。每誕生一個新的區塊,就會被蓋上相應的時間戳,這樣就能保證整條鏈上的區塊都按照時間順序進行排列。
5)難度值(Target_bits)
挖出該區塊的難度目標。每產生2016個區塊,數據區塊運算難度會調整一次。比如,比特幣區塊鏈網絡能夠自動調整挖礦的難度,讓礦工每10分鍾才挖出一個區塊。原本需要14天才能挖完2016塊區塊,但不知哪個天殺的突然弄來幾台算力爆表的礦機,7天就搞定了,這就意味着到預定調整期的時候,挖礦難度會增加一倍。
使用一個常量除以難度系數,可以得到目標值(target)。顯然,難度系數越大,目標值就越小。目標值越小,挖礦就難挖,就是新區塊的hash值要小於這個目標值(案例中的14484.162361)。一個hash 32bit的話,可以知道這個hash前面部分很多位數必須是0,即要找出類似 00000000000000000000000000000001 的hash。
6)隨機數(Nonce)
前面說過,當前區塊的哈希由區塊頭唯一決定。如果要對同一個區塊反復計算哈希,就意味着,區塊頭必須不停地變化,否則不可能算出不一樣的哈希。區塊頭里面所有的特征值都是固定的,為了讓區塊頭產生變化,區塊頭故意增加了一個隨機項,叫做 Nonce。Nonce 是一個隨機值,礦工的作用其實就是猜出 Nonce 的值,使得區塊頭的哈希可以小於目標值,從而能夠寫入區塊鏈。Nonce 是非常難猜的,目前只能通過窮舉法一個個試錯。根據協議,Nonce 是一個32位的二進制值,即最大可以到21.47億。
三:難度系數動態調整
采礦具有隨機性,沒法保證正好十分鍾產出一個區塊,有時一分鍾就算出來了,有時幾個小時可能也沒結果。總體來看,隨着硬件設備的提升,以及礦機的數量增長,計算速度一定會越來越快。為了將產出速率恆定在十分鍾,中本聰還設計了難度系數的動態調節機制。他規定,難度系數每兩周(2016個區塊)調整一次。如果這兩周里面,區塊的平均生成速度是9分鍾,就意味着比法定速度快了10%,因此接下來的難度系數就要調高10%;如果平均生成速度是11分鍾,就意味着比法定速度慢了10%,因此接下來的難度系數就要調低10%。難度系數越調越高(目標值越來越小),導致了采礦越來越難。
四:區塊鏈分叉
即使區塊鏈是可靠的,現在還有一個問題沒有解決:如果兩個人同時向區塊鏈寫入數據,也就是說,同時有兩個區塊加入,因為它們都連着前一個區塊,就形成了分叉。這時應該采納哪一個區塊呢?
現在的規則是,新節點總是采用最長的那條區塊鏈。如果區塊鏈有分叉,將看哪個分支在分叉點后面,先達到6個新區塊(稱為"六次確認")。按照10分鍾一個區塊計算,一小時就可以確認。
由於新區塊的生成速度由計算能力決定,所以這條規則就是說,擁有大多數計算能力的那條分支,就是正宗的區塊鏈。
總結:
1)區塊是區塊鏈的基本組成單元。
2)每個區塊由區塊頭和區塊主體組成,頭小身大。
為了保證數據的可靠性,區塊鏈也有自己的代價。一是效率,數據寫入區塊鏈,最少要等待十分鍾,所有節點都同步數據,則需要更多的時間;二是能耗,區塊的生成需要礦工進行無數無意義的計算,這是非常耗費能源的。
參考資料:
http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html
https://www.idcbest.com/idcnews/11001977.html