Transactions

簽署具有多個輸入的原始交易

  • December 7, 2019

所以我正在創建一個簡單的 P2PKH 交易,在我對此進行研究後,在這裡發現了一些有用的文章和答案;我能夠成功地花費一個 P2PKH UTXO,但是當我嘗試花費多個輸入的交易時,它真的變得複雜了。我花了一天的時間在這上面。

所有交易都在比特幣測試網上。

我正在兌換的輸出:

  1. Tx 雜湊:9742ed783bfec215ec6484d82dae20fba582229e54c49e06d662a91ead3f6a54 索引:0 scriptPubKey:OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e OP
  2. 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)

我嘗試了不同的變體:

  1. 將未簽名的輸入的 scriptPubKey 替換為僅“00”
  2. 僅用“”替換未簽名的輸入的 scriptPubKey
  3. 從輸入“ffffff”中刪除序列號

但似乎沒有任何效果。我究竟做錯了什麼?您的幫助將不勝感激:)

和其他輸入應該有“00”。

請記住,您將“scriptsig”替換為“empty”,並且0x00是空腳本的大小。

non-mandatory-script-verify-flag(非規範 DER 簽名)(程式碼 64)

這裡的問題是簽名中使用的 DER 編碼。r簽名中的值是正數,並且由於r您擁有的每個值都設置了其最高有效位,因此它們需要一個前置0x00來告訴 DER 解碼器這些數字是正數:

0xE4 = 0b11100100 
0xC4 = 0b11000100 

每個簽名應更改為:483045022100E4A3...

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