Script

與 mutisig 地址和腳本完全混淆

  • January 15, 2014

我使用了指南,如何從比特幣控制台進行託管。

這是我在測試網中的交易:tx1 tx2

我對 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

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