Multi-Signature

為什麼 BIP-147(處理虛擬堆棧元素延展性,segwit 的一部分)是必要的?

  • June 22, 2017

鑑於 BIP-11(M-of-N 標準事務),尚不清楚為什麼需要 BIP-147(處理虛擬堆棧元素延展性)。

BIP-11指出:

OP_CHECKMULTISIG 交易使用標準 scriptSig 進行兌換:

OP_0 ...signatures...

(OP_0 是必需的,因為 OP_CHECKMULTISIG 中的一個錯誤;它從執行堆棧中彈出一個太多的項目,因此必須在堆棧上放置一個虛擬值)。

然而BIP-147聲稱:

OP_CHECKMULTISIG 和 OP_CHECKMULTISIGVERIFY 中的設計缺陷導致它們在簽名驗證後消耗額外的堆棧元素(“虛擬元素”)。虛擬元素不會以任何方式檢查,並且可以用任何值替換而不會使腳本無效。… [我的重點]

該聲明似乎與 BIP-11 相矛盾,後者顯然需要 OP_0 作為第一個驗證腳本元素。

我可以想到 BIP-147 的兩個原因:

  1. BIP-11 沒有明確要求檢查堆棧,而只是要求多重簽名驗證腳本以 OP_0 開頭;
  2. BIP-11 根本不適用於 OP_CHECKMULTISIGVERIFY。

這些確實是 BIP-147 的動機,還有其他動機嗎?

BIP 11 不是共識規則,而是關於如何在網路上使用多重簽名的建議。

BIP 147 在描述現有網路共識規則方面是正確的:OP_CHECKMULTISIG 和 OP_CHECKMULTISIGVERIFY 從堆棧中彈出一個元素,然後再需要,並忽略該元素。BIP 147 更改了規則,使這些操作碼不會忽略該元素,而是要求它為 0。為了符合 BIP 11,交易已經必須將 0 放在那裡,實際上每個人都可以這樣做。但是沒有要求交易遵循 BIP11——這只是為了更好的互操作性而提出的建議。使用 BIP147,每筆交易都需要有一個 0 才能有效。

改變這一點的原因是延展性:目前,任何人都可以使用任何這些操作碼進行有效交易,並將 0 替換為其他任何內容,而不會使交易無效。

理想情況下,我們希望完全修復該錯誤,並使 OP_CHECKMULTISIG 和 OP_CHECKMULTISIGVERIFY 不會彈出不需要的堆棧元素。但是,這將是向後不兼容的,因此僅適用於我們不想破壞現有軟體的新事務。BIP147 中的方法適用於所有多重簽名交易。

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