在比特幣核心節點驗證腳本方面,政策和共識有什麼區別?
在比特幣核心節點驗證交易腳本方面,政策和共識有什麼區別?你能舉一些被認為是政策的檢查和被認為是共識的檢查的例子嗎?
這個問題是在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
,IsStandardTx
和CheckTxInputs
應該產生剩餘的策略腳本檢查,在腳本解釋器中強制執行的檢查之上。交易腳本共識檢查是一個小得多的集合。現在是共識檢查的一些腳本標誌包括:
- P2SH
- 德西格
- 零假人
- CHECKLOCKTIMEVERIFY
- 檢查序列驗證
- 證人
完整列表(帶有啟用條件)可以在此處查看。請注意,由於共識規則在比特幣的歷史中發生了變化,並非該函式中提到的所有腳本標誌都在所有塊上都啟用。
大多數(全部?)對交易執行的剩餘共識檢查可以在
ConnectBlock()
、CheckBlock()
和中找到ContextualCheckBlock()
。