簽署具有多個輸入的原始交易
所以我正在創建一個簡單的 P2PKH 交易,在我對此進行研究後,在這裡發現了一些有用的文章和答案;我能夠成功地花費一個 P2PKH UTXO,但是當我嘗試花費多個輸入的交易時,它真的變得複雜了。我花了一天的時間在這上面。
所有交易都在比特幣測試網上。
我正在兌換的輸出:
- Tx 雜湊:9742ed783bfec215ec6484d82dae20fba582229e54c49e06d662a91ead3f6a54 索引:0 scriptPubKey:OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e OP
- Tx 雜湊:40dbd3c25073cb7222becead1eb9bb2195cf309cf5b24af559f3391168ec6318 索引:0 scriptPubKey:OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e OP_KELCHELCVER
現在我從這裡讀到一個答案,建議如果使用多個輸入,應該將其餘輸入(未簽名的輸入)替換為 scriptSig 為空;到目前為止,我已經嘗試了這些變化:
1.用“00”替換輸入的scriptSig
所以只有被簽名的輸入(UTXO)會有它的scriptPubKey,其他輸入應該有“00”。
串列輸入#1時簽署:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
19
76a91481F52D4061313B6F63549EFC03F3DF6CB6F0149E88ac
FFFFFFFF
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
00
FFFFFFFF
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000
和…
串列輸入#2時簽署:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
00
FFFFFFFF
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
19
76a914A17C43FE0E1F8E660B044C9538E2CEF4ABFDCED288ac
FFFFFFFF
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000
兩個輸入均已簽名的主交易:(沒有 01 雜湊碼類型後綴和公鑰的簽名為粗體)
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
6A
4730440220E4A366646391B3CFB06C0C4B0343E678B560BE8A2D20418233DEE863986105E502207245C5BA3DB516E59B95764C1716F5B39850E20429F08B91389C4780CE45430E 0121 025F69830D2BA35D04CA9EFB3EA46AA2645BBBDCB592A189A539480657C9696137
FFFFFFFF
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
6A
4730440220C41C498D0CA55E38FE85DD158FDE82BB451068124E2B3AA2391D861BA9281EDD0220165712ADF71B19DF525583D8F48B82DFF06B2E556C17A583F4D5C54E99412C6B 0121 039F9AF4A84A8D5C35DD7A5628F8C2DC1894C2B4BDD4815DAFFDCBC9102FE2BA26
FFFFFFFF
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
現在解碼原始交易可以工作,但是在嘗試廣播它時,bitcoind 會出現以下錯誤:
強制腳本驗證標誌失敗(對於失敗的 CHECK(MULTI)SIG 操作,簽名必須為零)(程式碼 16)
要麼
non-mandatory-script-verify-flag(非規範 DER 簽名)(程式碼 64)
我嘗試了不同的變體:
- 將未簽名的輸入的 scriptPubKey 替換為僅“00”
- 僅用“”替換未簽名的輸入的 scriptPubKey
- 從輸入“ffffff”中刪除序列號
但似乎沒有任何效果。我究竟做錯了什麼?您的幫助將不勝感激:)
和其他輸入應該有“00”。
請記住,您將“scriptsig”替換為“empty”,並且
0x00
是空腳本的大小。non-mandatory-script-verify-flag(非規範 DER 簽名)(程式碼 64)
這裡的問題是簽名中使用的 DER 編碼。
r
簽名中的值是正數,並且由於r
您擁有的每個值都設置了其最高有效位,因此它們需要一個前置0x00
來告訴 DER 解碼器這些數字是正數:0xE4 = 0b11100100 0xC4 = 0b11000100
每個簽名應更改為:
483045022100E4A3...