《精通比特幣》學習:分布式比特幣網絡中節點如何達成共識?

▷池中或位於主分支區塊中的一個匹配交易必須是存在的。

▷對於每一個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕。

▷對於每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易將成為一個孤立的交易。如果與其匹配的交易還沒有出現在池中,那麼將被加入到孤立交易池中。

▷對於每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY(100)個確認。

▷對於每一個輸入,引用的輸出是必須存在的,並且沒有被花費。

▷使用引用的輸出交易獲得輸入值,並檢查每一個輸入值和總值是否在規定值的範圍內 (小於2100萬個幣,大於0)。

▷如果輸入值的總和小於輸出值的總和,交易將被中止。

▷如果交易費用太低以至於無法進入一個空的區塊,交易將被拒絕。

▷每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。

二、整合交易至區塊

在上一個10分鐘內,節點收集了幾百個交易記錄,並將他們放到了內存池中。當節點收到一個新區塊並驗證後,他開始把內存池中的交易拿出來,並移除已經在上一個區塊中出現過的交易記錄,確保任何留在內存池中的交易都是未確認的,等待被記錄到新區塊中。節點把交易打包進一個候選區塊中。稱作候選區塊是因為它還沒有包含有效的工作量證明,不是一個有效的區塊,而只有在礦工成功找到一個工作量證明解之後,這個區塊才生效。

三、求解工作量證明算法以使這個區塊有效

節點已經構建了一個候選區塊,那麼就輪到的節點對這個新區塊進行“挖掘”,求解工作量證明算法以使這個區塊有效。用最簡單的術語來說,挖礦就是重複計算區塊頭的哈希值,不斷修改該參數,直到與哈希值匹配的一個過程。哈希函數的結果無法提前得知,也沒有能得到一個特定哈希值的模式。哈希函數的這個特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機修改輸入,直到出現適當的哈希值。哈希函數的輸入數據的長度是任意的,將產生一個長度固定且絕不雷同的值,可將其視為輸入的數字指紋。對於特定輸入,哈希的結果每次都一樣,任何實現相同哈希函數的人都可以計算和驗證。一個加密哈希函數的主要特徵就是不同的輸入幾乎不可能出現相同的數字指紋。因此,相對於隨機選擇輸入,有意地選擇輸入去生成一個想要的哈希值幾乎是不可能的。

"I am Satoshi Nakamoto"的哈希值。改變原句中的任何一個字母、標點、或增加字母都會產生不同的哈希值。我們在句子末尾加上一個數字,能得到非常不同的哈希值,這個數字就是“Nonce”,那麼通過改變這個數字就能得到不同的值,工作量證明就是通過改變這個值來求得一個符合目標條件的數值。

簡單打個比方,想象人們不斷扔一對色子以得到小於一個特定點數的遊戲。第一局,目標是12。只要你不扔出兩個6,你就會贏。然後下一局目標為11。玩家只能扔10或更小的點數才能贏,不過也很簡單。假如幾局之後目標降低為了5。現在有一半機率以上扔出來的色子加起來點數會超過5,因此無效。隨著目標越來越小,要想贏的話,扔色子的次數會指數級的上升。最終當目標為2時(最小可能點數),只有一個人平均扔36次或2%扔的次數中,他才能贏。

礦工用一些交易構建一個候選區塊。接下來,這個礦工計算這個區塊頭信息的哈希值,看其是否小於當前目標值。如果這個哈希值不小於目標值,礦工就會修改這個nonce(通常將之加1)然後再試一次。按當前比特幣系統的難度,礦工得試10^15次(10的15次方)才能找到一個合適的nonce使區塊頭信息哈希值足夠小。

目標決定了難度,進而影響求解工作量證明算法所需要的時間。那麼問題來了:為什麼這個難度值是可調整的?由誰來調整?如何調整?比特幣的區塊平均每10分鐘生成一個。這就是比特幣的心跳,不僅是在短期內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鐘一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動態的參數,會定期調整以達到每10分鐘一個新區塊的目標。簡單地說,無論挖礦能力如何,新區塊產生速率都保持在10分鐘一個。那麼,在一個完全去中心化的網絡中,這樣的調整是如何做到的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鐘(兩週,即這些區塊以10分鐘一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網絡發現區塊產生速率比10分鐘要快時會增加難度。如果發現比10分鐘慢時則降低難度。

四、校驗新區塊

當新區塊在網絡中傳播時,每一個節點在將它轉發到其節點之前,會進行一系列的測試去驗證它。這確保了只有有效的區塊會在網絡中傳播。獨立校驗還確保了誠實的礦工生成的區塊可以被納入到區塊鏈中,從而獲得獎勵。當一個節點接收到一個新的區塊,它將對照一個長長的標準清單對該區塊進行驗證,若沒有通過驗證,這個區塊將被拒絕。它包括:

  • ▷ 區塊的數據結構語法上有效
  • ▷ 區塊頭的哈希值小於目標難度(確認包含足夠的工作量證明)
  • ▷ 區塊時間戳早於驗證時刻未來兩個小時(允許時間錯誤)
  • ▷ 區塊大小在長度限制之內
  • ▷ 第一個交易(且只有第一個)是coinbase交易
  • ▷ 使用檢查清單驗證區塊內的交易並確保它們的有效性,本書177頁
  • ▷ “交易的獨立校驗”一節已經討論過這個清單。

五、

區塊鏈的組裝與選擇

比特幣去中心化的共識機制的最後一步是將區塊集合至有最大工作量證明的鏈中。一旦一個節點驗證了一個新的區塊,它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。

區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是,每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。節點通過將記錄在每個區塊中的難度加總起來,得到建立這個鏈所要付出的工作量證明的總量。只要所有的節點選擇最長累計難度的區塊鏈,整個比特幣網絡最終會收斂到一致的狀態。分叉即在不同區塊鏈間發生的臨時差異,當更多的區塊添加到了某個分叉中,這個問題便會迎刃而解。

關於區塊鏈分叉和51%攻擊,下一篇專題來學習。


分享到:


相關文章: