Signature

一步一步的範例來兌換所需的 P2SH 輸出

  • December 22, 2017

我一直在關注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:

  1. 創建所有 scriptSig 為空的未簽名交易
  2. 對於要簽名的每個輸入,將其 scriptSig 設置為redeemScript: 21039F53E45F8F18B8ED294378BDA342EFF69B2053DEBF27FBEDE7D2D6BD84BE6235AC,將其他 scriptSigs 保持為空。
  3. 序列化新的 tx 並在 little endian 4 字節中附加 SIGHASHALL 字節(0x01)
  4. 雙倍 Sha256 上面並簽署結果值。在簽名中添加一個字節 0x01 以指示 SIGHASH_ALL。讓sig成為結果值。
  5. 將 scriptSig 設置為:

[0x00] [{sigSize, sig}] [{pubKeySize, pubKey}] [OP_CHECKSIG]

我假設將使用以下 scriptPubKey:

[OP_HASH160] [{scriptHashSize, scriptHash}] [OP_EQUAL]

以下是每個輸入簽名的k,rs值:

輸入 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 步應該是:

  1. 設置redeemScript[{pubKeySize, pubKey}] [OP_CHECKSIG]
  2. 設置scriptSig[{sigSize, sig}] [{redeemScriptSize, redeemScript}]

問題是,scriptsig 包含實際的redeemScript 而不是序列化的腳本作為推送。第二個錯誤,redeemscript 包含一個 0x00不應該存在的無關值,因為這是一個簡單的CHECKSIG.

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