跳到正文

Nakamoto 共識:有效性、鏈工作量、確認與重組

Nakamoto 共識結合獨立執行的有效性規則、無需許可的工作量證明出塊、傳播,以及對累計工作量最大有效鏈的選擇。應分別分析本地視圖、鏈工作量、確認、重組、共同前綴假設、激勵與網路攻擊。

更新於

僅供教育參考,不構成投資建議;投資可能產生損失。

直接回答

Nakamoto 共識是 Bitcoin 式流程:節點獨立執行共識有效性規則,工作量證明生產者無需許可成員名單即可延伸區塊,區塊透過點對點網路傳播,每個節點選擇累計工作量最大的有效分支。它按節點觀察到的視圖排列協定有效交易;它不會讓無效交易變得有效,不會判定帳本之外的事實,也不會產生即時的確定性最終性。

有效性先於鏈選擇。只要分支包含無效的區塊標頭、工作量證明、交易、指令碼、已花費輸出、coinbase 金額或區塊限制,無論其聲稱的高度或工作量多大,都會被拒絕。在符合節點規則且資料可用的分支之間,決定活躍鏈的是累計鏈工作量,而非單純區塊數量。因此,「最長鏈」只是「代表最多工作量證明投入的有效鏈」的非正式簡稱。

活躍鏈尖是暫時性的。相互競爭的有效區塊可能讓連線良好的誠實節點短暫擁有不同本地視圖;新增工作量通常會解決分叉,節點可能在鏈重組中斷開一個分支並連接另一個。交易確認數衡量它在觀察者目前活躍鏈中的深度。在給定算力和網路模型下,更深的區塊可降低追趕機率,但任何確認數都不具有普遍最終性。

該術語不只描述雜湊計算。安全論證還依賴區塊和交易有效性、點對點傳播、誠實採用最大工作量有效鏈、足夠的誠實有效算力、經濟行為,以及使用者獨立觀察預期網路與軟體。共同前綴、鏈增長和鏈品質是只在明確模型中得到證明的形式化屬性,並不是每條實際工作量證明鏈的無條件事實。

如何分析 Nakamoto 共識

  1. 固定身分和觀察範圍。 記錄 chainnetworkgenesis hashclient version、共識規則集、檢查點或 assume-valid 設定、觀察者、對等節點和時間。保存 bestblockhashheightchainwork;在訊息仍傳播時,兩個節點可以誠實地報告不同鏈尖。
  2. 先驗證,再比較工作量。 驗證區塊標頭連結、時間戳約束、解碼目標、工作量證明、Merkle 與 witness 承諾、交易、指令碼、UTXO 花費、coinbase 和區塊資源限制。一個 invalid 分支不會僅憑聲稱更高高度或更多工作量而取得候選資格。
  3. 重建觀察到的區塊樹。 按前一區塊雜湊把每個候選連接到已知祖先,並區分完整區塊與只有區塊標頭的資料。核對 activevalid-forkvalid-headersheaders-onlyinvalid 狀態,資料可來自 getchaintips 等介面;不要把每個可見鏈尖都稱為有效競爭鏈。
  4. 重新計算累計工作量。 解碼每個區塊標頭的 nBits 目標,並按實作的整數規則計算其代表的工作量,概念式為 work = floor(2^256 / (target + 1))。沿祖先關係加總,並從共同祖先開始比較有效分支;高度、雜湊數估計和礦池標籤都不能替代鏈工作量。
  5. 追蹤選擇和重組。 重現節點對最大工作量候選的選擇、同工作量下的本地次序及到達狀態。若出現更優有效分支,找出分叉點,斷開舊後綴,連接新後綴,更新 UTXO set,並核對 mempool 與應用程式記錄中的交易。
  6. 制定基於風險的確認策略。 僅對目前活躍鏈上的區塊計算 confirmations = tip_height - block_height + 1。說明風險價值、可逆性、攻擊者份額、傳播、eclipse 暴露、觀察到的陳舊率、確認深度和應對方案;六次確認是一種慣例,不是協定最終性門檻。
  7. 對完整安全論證做壓力測試。 測試網路分割、延遲、區塊隱瞞、自私挖礦、eclipse 攻擊、礦池和硬體集中、算力突變、費用和補貼激勵、用戶端分歧、深度重組及恢復策略。僅在所引模型假設下,才把結論映射到共同前綴、鏈增長、鏈品質、持久性與活性。

最終結果應是一份針對特定觀察者、可重現的說明,解釋節點目前選擇哪段有效歷史以及原因。共識規則定義准入;工作量證明提高替代歷史的成本;傳播讓其他節點看到工作量;分叉選擇確定目前歷史;確認策略決定應用程式何時行動。把這些層全部壓縮成「網路批准」會掩蓋可能失效的條件。

計算範例

1. 無效工作量不會勝出

假設分支 A 報告 valid_A = falsechainwork_A = 1,200 units,分支 B 則為 valid_B = truechainwork_B = 1,000 units。節點拒絕 A 並選擇 B。工作量只在合格候選之間比較;工作量證明無法授權超額 coinbase、無效簽章或雙花。

如果一位觀察者只有 A 的區塊標頭,另一位已有 A 的完整區塊資料,在下載和驗證完成前,兩者報告的狀態可能不同。區塊標頭有效的分支並不證明其所有交易和狀態轉換都已通過完整驗證。

2. 高度不等於累計工作量

在一個簡化的可變目標範例中,分支 C 增加六個區塊,每個代表 100 個工作單位,即 6 * 100 = 600 units。分支 D 增加五個區塊,每個代表 130 個工作單位,即 5 * 130 = 650 units。若兩者均有效且起始工作量相同,D 雖少一個區塊,卻是最大工作量分支。

如果兩個有效鏈尖恰好都有 650 units,相等工作量不會強制每個節點立即看到同一鏈尖。到達順序與本地實作狀態可以不同,直到又一個有效區塊使某分支更重。不要把短暫的同工作量視圖描述成確定的全域最終性。

3. 確認可以被移除

一筆交易包含在高度 100 的區塊中,而活躍鏈尖高度為 105,其確認數是 tip_height - block_height + 1 = 105 - 100 + 1 = 6 confirmations。假設另一條有效分支從高度 99 後分叉,之後在不包含該交易的情況下於高度 106 成為最大工作量分支。重組會斷開舊區塊 100 through 105;該交易不再有六次活躍鏈確認,可能返回 mempool、與另一筆花費衝突或繼續缺席。

應用程式必須核對區塊雜湊和祖先關係,而不能只儲存數字六。交易所入帳、已交付商品、跨鏈訊息和衍生品結算在經濟上可能不可逆,即使來源鏈歷史仍可變化。

4. 追趕機率取決於模型

在 Bitcoin 白皮書的範例模型中,令攻擊者算力份額為 q = 0.10、誠實份額為 p = 0.90、誠實鏈領先為 z = 6。其 Poisson 近似給出 lambda = z * (q / p) = 0.6666667P(catch up) = 0.0002428027 = 0.02428027%。當 q = 0.30 且深度相同時,結果升至 P(catch up) = 0.1321111687 = 13.21111687%

這些數字不是即時 Bitcoin 保證。計算假設穩定、獨立的雜湊試驗以及該模型中的競速條件;它沒有包括 eclipse 隔離、傳播優勢、自私策略、價格和租賃回饋、實作錯誤及應用程式應對。策略應揭露所用模型並測試更差條件,而不是只引用六次確認。

風險與審查失敗

協定與測量錯誤

  • 在獨立驗證區塊標頭、區塊本體和祖先關係之前比較工作量。
  • 不計算累計鏈工作量,卻把最高或最先看到的分支稱為勝者。
  • 用區塊數、名義算力、礦池份額或瀏覽器標籤代理鏈工作量。
  • 混淆主網、測試網、signet、分叉、用戶端版本、檢查點或創世區塊身分。
  • 把只有區塊標頭、資料不可用或樂觀狀態當成已完整驗證的區塊歷史。
  • 忽視目標解碼、整數工作量算術、前一區塊雜湊連結或共同祖先。
  • 不記錄雜湊、高度、時間和對等節點脈絡,便把一個 RPC 或瀏覽器視為全域視圖。

網路、激勵與控制錯誤

  • 假設瞬時傳播,或假設每個節點看到相同的交易與區塊到達順序。
  • 把同工作量分叉視為一個全域確定狀態,而不是短暫的本地視圖。
  • 忽略陳舊區塊、延遲、隱瞞、自私挖礦與傳播優勢。
  • 從礦池名稱推斷獨立礦工,或從礦池份額推斷實體硬體所有權。
  • 忽略礦池、韌體、製造商、託管、能源、地域與網路集中。
  • 把獎勵當作誠實延伸永遠是每個參與者最優策略的證明。
  • 遺漏 eclipse、分割、Sybil、對等節點投毒、拒絕服務和時間操縱暴露。

結算與安全錯誤

  • 把確認稱為協定最終性,或承諾六次確認不可能被移除。
  • 對所有價值、對手方、可逆性與威脅模型採用同一確認數。
  • 把白皮書機率範例轉化為目前實測攻擊機率。
  • 聲稱多數算力可以偽造簽章、奪取任意硬幣或驗證通膨。
  • 聲稱少數算力不可能獲利偏離,也不可能造成任何重組或審查。
  • 把目前最大工作量鏈尖等同於正確的鏈外事實、合法所有權或應用程式結算。

常見誤解

  • 最長鏈總是區塊最多。 Bitcoin 節點選擇累計工作量最大的有效鏈;當目標不同時,高度本身可能不是合適代理。
  • 礦工決定哪些協定規則有效。 礦工提出區塊,而每個完整節點獨立執行其設定的共識規則。
  • 六次確認產生絕對最終性。 六是應用程式慣例;重組機率取決於模型、深度、對手、傳播和觀察完整性。
  • 擁有 51% 算力的攻擊者可以花費任何人的硬幣。 算力可以支援重組、雙花和審查策略,但不會提供其他使用者的私鑰簽章,也不能讓未修改的完整節點接受無效通膨。
  • 總算力高就證明去中心化且安全。 還要考慮實際控制、網路可見性、硬體取得、礦池協調、用戶端多樣性、激勵和攻擊持續時間。

相關主題

來源

導覽

搜尋知識庫...