Script

在比特幣核心節點驗證腳本方面,政策和共識有什麼區別?

  • September 23, 2021

在比特幣核心節點驗證交易腳本方面,政策共識有什麼區別?你能舉一些被認為是政策的檢查和被認為是共識的檢查的例子嗎?

這個問題是在PR 19698的 Bitcoin Core PR 審查俱樂部會議期間提出的。

在這個比特幣核心公關評論俱樂部的PR 22871上有進一步的討論,在這個 Gloria Zhao 的要點中有一個關於政策的部分。

術語“共識檢查”是指確定區塊是否有效的規則;具體來說,如果對區塊(或區塊中包含的交易)的共識檢查失敗,則該區塊被視為無效。如果我們到達塊的末尾並且沒有一個共識檢查失敗,那麼該塊是有效的。

策略檢查是共識檢查的超集(意味著策略檢查是共識檢查的補充,因此通過策略檢查意味著通過共識檢查),並且策略檢查僅適用於正在考慮添加到記憶體池的交易。策略檢查的目的通常是 (a) 關閉 DoS 向量和 (b) 通過提前防止違反此類未來共識更改的交易中繼,使未來的共識更改部署更安全。

您特別詢問交易腳本檢查,但請注意,對僅腳本驗證之外發生的交易有許多策略(和共識)檢查。此外,您問題中的連結指向 Bitcoin Core 原始碼樹中的“policy/”和“consensus/”子目錄,但是在這些目錄之外發生了許多政策和共識檢查。

以下是腳本驗證中的一些策略檢查範例,它們不是(還)共識檢查。這些第一個來自 BIP62,它提出了一套限制交易延展性的規則。

以下是一些與將來確保軟分叉部署安全相關的政策檢查:

還有一些其他策略腳本檢查,例如要求對 segwit 腳本中的所有公鑰進行壓縮,或者對 OP_IF/OP_NOTIF 的輸入進行最低限度的編碼。當然,所有未來尚未在網路上啟動的共識更改(例如 Taproot 更改)也是策略檢查。當為記憶體池驗證交易時,作為策略檢查的一部分執行的交易腳本驗證檢查的(幾乎)完整列表可以在此處找到。(請注意,此列表也包括共識檢查。)

然而,這並不是一套完整的作為策略檢查強制執行的事務腳本驗證規則。在記憶體池接受期間,我們也會對交易執行其他檢查,其中一些檢查取決於交易的腳本。其中的一些例子包括:

  • 非 p2sh、非跟隨支出必須是 P2PKH、P2PK 或裸多重簽名
  • scriptSig 或見證必須不超過給定大小
  • 創建輸出的各種規則(不超過一個 OP_RETURN,必須是 P2SH/v0 segwit/P2PKH/P2PK/MULTISIG,值必須高於灰塵門檻值)
  • 限制交易執行的簽名檢查次數

有很多這些要列出,但是在 mempool 接受中跟踪程式碼(特別是這裡)並檢查函式,如CheckTransaction,IsStandardTxCheckTxInputs應該產生剩餘的策略腳本檢查,在腳本解釋器中強制執行的檢查之上。

交易腳本共識檢查是一個小得多的集合。現在是共識檢查的一些腳本標誌包括:

  • P2SH
  • 德西格
  • 零假人
  • CHECKLOCKTIMEVERIFY
  • 檢查序列驗證
  • 證人

完整列表(帶有啟用條件)可以在此處查看。請注意,由於共識規則在比特幣的歷史中發生了變化,並非該函式中提到的所有腳本標誌都在所有塊上都啟用。

大多數(全部?)對交易執行的剩餘共識檢查可以在ConnectBlock()CheckBlock()和中找到ContextualCheckBlock()

引用自:https://bitcoin.stackexchange.com/questions/100317