Signature
一步一步的範例來兌換所需的 P2SH 輸出
我一直在關注BIP16創建 P2SH 交易。我想創建一個簡單的(一個簽名)P2SH。嘗試廣播 tx 時出現錯誤。錯誤是
16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation)
需要明確的是,我沒有嘗試多重簽名。我正在做的最好的描述是
P2SH-P2PK
,雖然我沒有見過這個詞。這是 BIP16 中給出的唯一範例,因此應該可以。這是我嘗試過的(測試網):
private key: BB2AC60BC518C0E239D5AF9D8D051A6BDFD0D931268DCA70C59E5992 public key: 039f53e45f8f18b8ed294378bda342eff69b2053debf27fbede7d2d6bd84be6235 (compressed) redeemScript: [{pubKeySize,pubKey}] [OP_CHECKSIG] 21039F53E45F8F18B8ED294378BDA342EFF69B2053DEBF27FBEDE7D2D6BD84BE6235AC redeemScriptHash: RIPEMD160(SHA256(redeemScript)) 323D0E8A083E98010299109337850D05DD6157F7 p2shAddress: Base58Check(0xC4 + redeemScriptHash) (C4 for testnet) 2MwprvB9tUMtX4vK8zJK8K329fNu79CJgR7
上述地址在測試網上有兩個 UTOX:
UTXO1: e434a13cac79dc3d26e7279bff05c0f071a2df03e2ba6ca13c88f0e82dca9998:0 UTXO2: 9b4943e7ab5f4512e42c94254eb6aab4c6823ce06d4ff816b7ce4fda155a2571:0
我現在想使用兩個 UTXO 並保持以下輸出:
Out1: 2MwprvB9tUMtX4vK8zJK8K329fNu79CJgR7 34000000 Satoshis Out2: 2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF 100000000 Satoshis
我按如下方式創建了 tx:
- 創建所有 scriptSig 為空的未簽名交易
- 對於要簽名的每個輸入,將其 scriptSig 設置為redeemScript:
21039F53E45F8F18B8ED294378BDA342EFF69B2053DEBF27FBEDE7D2D6BD84BE6235AC
,將其他 scriptSigs 保持為空。- 序列化新的 tx 並在 little endian 4 字節中附加 SIGHASHALL 字節(0x01)
- 雙倍 Sha256 上面並簽署結果值。在簽名中添加一個字節 0x01 以指示 SIGHASH_ALL。讓
sig
成為結果值。- 將 scriptSig 設置為:
[0x00] [{sigSize, sig}] [{pubKeySize, pubKey}] [OP_CHECKSIG]
我假設將使用以下 scriptPubKey:
[OP_HASH160] [{scriptHashSize, scriptHash}] [OP_EQUAL]
以下是每個輸入簽名的
k
,r
和s
值:輸入 1:
k = 98790447509501799195296257240616657470656053786701275200434341714298778299820 r = 96398386359095408146340664941016369169423137684113382189227162443480418477689 s = 62903510511574365450545635776206168644738316078298063260649088246548574249129
輸入 2:
k = 109372172176680138721552873719725202562296645126925021083510279924852033069204 r = 105162394984132461723584277789901247831150698039237112243693144757926439529504 s = 62903510511574365450545635776206168644738316078298063260649088246548574249129
在此之後,我在發送 tx 的 bitcoind 中收到以下錯誤:
error code: -26 error message: 16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation)
我究竟做錯了什麼?
編輯:感謝 arubi 的回答,我發現上述步驟存在兩個問題。首先,我做錯了沒有將
redeemScript
堆棧數據編碼。第二件事,我做錯了就是把[0x00]
.scriptSig
修復之後,第 5 步應該是:
- 設置
redeemScript
為[{pubKeySize, pubKey}] [OP_CHECKSIG]
- 設置
scriptSig
為[{sigSize, sig}] [{redeemScriptSize, redeemScript}]
問題是,scriptsig 包含實際的redeemScript 而不是序列化的腳本作為推送。第二個錯誤,redeemscript 包含一個
0x00
不應該存在的無關值,因為這是一個簡單的CHECKSIG
.