Script
CHECKSIGADD 操作碼是如何工作的?它與其前身 CHECKMULTISIG 相比如何?
CHECKSIGADD 操作碼(在 Tapscript BIP 中定義)BIP342是如何工作的?它與其前身 CHECKMULTISIG 相比如何?
CHECKSIGADD 的設計在此 StackExchange 問題中進行了討論。
James Chiang 在這個 Bitcoin Optech研討會中解釋了 CHECKSIGADD 操作碼是如何工作的。(比特幣核心程式碼庫中 CHECKSIGADD 的程式碼在這裡。)
正如您在左側看到的,我們有一個輸出腳本,它使用 CHECKSIGADD 和 CHECKSIG 操作碼來表示 n-of-n 多重簽名輸出。
pk0 checksig pk1 checksigadd pk2 checksigadd 3 equal
這是我們的初始堆棧,其中填充了 3 個簽名:
sig0 sig1 sig2
在第一步中,我們將把這個公鑰 (pk0) 壓入堆棧,並使用操作碼 CHECKSIG 對 sig0 進行評估。讓我們假設這評估為 TRUE。由於它的計算結果為 TRUE,我們現在將
1
在堆棧頂部有一個字節:1 sig1 sig2
我們將使用計數器。
2 sig2
當我們根據其他公鑰評估簽名時,如果該腳本評估成功,我們將
3
在堆棧上擁有一個計數器,然後可以將該計數器與輸出腳本中編碼的計數器進行比較。如果它們相等,我們就成功地使用了 3-of-3 的多重簽名輸出,該輸出使用 CHECKSIGADD 對該多重簽名進行編碼。3
它與其前身 CHECKMULTISIG 相比如何?
CHECKMULTISIG 不(它仍然用於 SegWit v0 支出)使用遞增計數器。使用 CHECKMULTISIG 的等效鎖定腳本將是:
3 pk0 pk1 pk2 3 checkmultisig
CHECKMULTISIG 還包含一個長期存在的錯誤,這意味著解鎖腳本需要
0
底部的 a 才能滿足鎖定腳本。sig0 sig1 sig2 0
這個 StackExchange question 解釋了 CHECKMULTISIG 的操作。