chaintope / bitcoinrb

The implementation of the bitcoin protocol for ruby.
MIT License
57 stars 20 forks source link

PSBT::Tx - p2sh-p2wsh - another signer create signature #48

Closed longhoangwkm closed 4 years ago

longhoangwkm commented 4 years ago

More of a question than an issue report.

My situation: I would like to spent BTC from P2WSH-P2SH 2-of-2 multisig address 2MzNSwkkgi75psa1GP5RJynM8sgCt5oeqgG.

1 private key from Client and 1 key from sever. When client sign a raw transaction by bitcoinjs-lib then i send that payload to server to let's server sign remaining sig and broadcast it

payload = '70736274ff010053020000000113a74a3fb29ebc282d3cbf0a8bee086188d7e533d71e976419c955215ff50d530000000000ffffffff01a8c8fa020000000017a914ffd0dbb44402d5f8f12d9ba5b484a2c1bb47da4287000000000001012030dcfa020000000017a9144e269b90bfdc52dbd46b13eaaefaa55dcffda15787220203c1917544fd6f2c832618d41eace312600d75da50005a467cc82b4ef81555097b47304402202eda814690158067e4822e963454a503814bbb5ae7450b0bdc7fa6b22d95945902204f1741cc533134a0a0137ad86ba8251ea4cd3aac9f3d500f74085284e8a7b2640101042200200fc49349c98ac78e320d9a0249af566fea3d22d801abc52884da5fddaf736f8d010547522103c1917544fd6f2c832618d41eace312600d75da50005a467cc82b4ef81555097b210397923a255b75bd469886fd1564de7372a54dc8fd348499c25ca88d8383edc26352ae0000'

psbt = Bitcoin::PSBT::Tx.parse_from_payload(payload.htb)

Followed this spec: https://github.com/chaintope/bitcoinrb/blob/7da100297a4fbbbbed132c007875b38e9a5691d2/spec/bitcoin/psbt_spec.rb#L218

I tried:

server_prkey =  Bitcoin::Key.from_wif('cQ158uqooksh6QkA3PzoctGSc4uu6Wc3y4bXkVsCkESEJJjnEPrW')
sighash = psbt.tx.sighash_for_input(0, psbt.signature_script(0), sig_version: :witness_v0, amount: psbt.inputs[0].witness_utxo.value)
sig = server_prkey.sign(sighash, false) + [Bitcoin::SIGHASH_TYPE[:all]].pack('C')
psbt.inputs[0].add_sig(server_prkey.pubkey, sig)
# ArgumentError: The sighash in signature is invalid.
# from /Users/tobi/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/bitcoinrb-0.2.9/lib/bitcoin/psbt/input.rb:159:in `add_sig'

Should i create new server psbt tx without signature from client then merge with client psbt tx. Is there anyway without using merge method. Many thanks

Expect result after signing from server # i got it by bitcoinjs-lib

70736274ff010053020000000113a74a3fb29ebc282d3cbf0a8bee086188d7e533d71e976419c955215ff50d530000000000ffffffff01a8c8fa020000000017a914ffd0dbb44402d5f8f12d9ba5b484a2c1bb47da4287000000000001012030dcfa020000000017a9144e269b90bfdc52dbd46b13eaaefaa55dcffda1578722020397923a255b75bd469886fd1564de7372a54dc8fd348499c25ca88d8383edc263483045022100c99d7abdbceb677006c10d1364b807485b591a34065fabb1db53582c7193a1ae022018fac19b51012575323aa350ff460bdc662a9989e77398625218d6d6dfd151d601220203c1917544fd6f2c832618d41eace312600d75da50005a467cc82b4ef81555097b47304402202eda814690158067e4822e963454a503814bbb5ae7450b0bdc7fa6b22d95945902204f1741cc533134a0a0137ad86ba8251ea4cd3aac9f3d500f74085284e8a7b2640101042200200fc49349c98ac78e320d9a0249af566fea3d22d801abc52884da5fddaf736f8d010547522103c1917544fd6f2c832618d41eace312600d75da50005a467cc82b4ef81555097b210397923a255b75bd469886fd1564de7372a54dc8fd348499c25ca88d8383edc26352ae0000
azuchi commented 4 years ago

Fixed an error that occurred when sighash type is undefined in f78792d. does this work?

longhoangwkm commented 4 years ago

It works well @azuchi san, Thank you so much. It seems that the sequence has been changed after signing so the tx hex was born different from bitcoinjs-lib