Script
與 mutisig 地址和腳本完全混淆
我使用了指南,如何從比特幣控制台進行託管。
我對 tx1 中的 ScriptPublicKey 感到困惑:
OP_HASH160 a7a62637430b44c922cbce4fc8bd53d11b7c4c25 OP_EQUAL
所以它只是計算頂部堆棧值的 Hash160,並將其與
a7a6...25
. 在 tx2 的 ScriptSig 中,我們可以看到 4 個值,這些值將被推送到堆棧進行驗證。但是 vout 腳本僅使用頂部堆棧值:5221020678adff50855b6748e93ab03667968817363fff84306d7ffc13276191fd7f542102bff39dce7ae4c6a06104ac4e49948eb7bac9d4a82e9e16df41b1436d31b76f0052ae
其他 2 個值是簽名:
304402205fdee0b00f5e2fa07324458fe06b47a41bb2ef4e73892343796e9f6456e378940220630b423ce14b0d5ed487da751c368d7fc0122efa21cac1a4afce7c3c017bf29f01 304502205edb6ce77a772346b21d60a775c81f52bec9e8957f795fce7ea4fab862bc656c022100fc1376399134348fae516d6e627b1f72c094affd3ba2f458685bdbe9b6a51f5e01
正如我們所看到的,這個簽名沒有被 vout 腳本驗證。
為什麼此功能不適用於 OP_CHECKMULTISIG?
看看BIP0016。
這種新的交易類型由標準 scriptSig 贖回:
...signatures... {serialized script}
和…
{serialized script} 從初始堆棧中彈出,並使用彈出的堆棧和反序列化腳本作為 scriptPubKey 再次驗證事務。
在這種情況下,
{serialized script}
是{m [pubkey1] [pubkey2] ... [pubkeyn] n OP_CHECKMULTISIG}
用於m-of-n
交易。當比特幣檢測到這些特殊交易之一時,序列化的腳本會在其雜湊被驗證後立即從堆棧中彈出(您正在驗證腳本雜湊!不是實際的公鑰!),然後在剩餘堆棧完好無損的情況下執行。您的付款腳本如下所示:
0 /* null element because a bug pops one-too-many items */ 304402205fdee0b00f5e2fa07324458fe06b47a41bb2ef4e73892343796e9f6456e378940220630b423ce14b0d5ed487da751c368d7fc0122efa21cac1a4afce7c3c017bf29f01 304502205edb6ce77a772346b21d60a775c81f52bec9e8957f795fce7ea4fab862bc656c022100fc1376399134348fae516d6e627b1f72c094affd3ba2f458685bdbe9b6a51f5e01 5221020678adff50855b6748e93ab03667968817363fff84306d7ffc13276191fd7f542102bff39dce7ae4c6a06104ac4e49948eb7bac9d4a82e9e16df41b1436d31b76f0052ae
最後一部分 (
5221020678...52ae
) 實際上是您的序列化腳本。如果你解碼它,你會得到:2 020678adff50855b6748e93ab03667968817363fff84306d7ffc13276191fd7f54 02bff39dce7ae4c6a06104ac4e49948eb7bac9d4a82e9e16df41b1436d31b76f00 2 OP_CHECKMULTISIG
這是 2-of-2 交易!
不包括 null 元素的前兩部分(看起來像 的部分
304...01
)只是您提供的簽名,它們將在執行時針對序列化的公鑰進行驗證OP_CHECKMULTISIG
。