Guest User

Untitled

a guest
Jan 23rd, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. require 'btcruby'
  2. require 'bitcoin'
  3. require 'bech32'
  4. require './segwit_addr'
  5. require 'active_support'
  6. require 'active_support/core_ext'
  7. require 'ffi'
  8.  
  9. # Computation of P2SH-P2WPKH address
  10.  
  11. user_key = BTC::Key.new(public_key:BTC.from_hex("024fffe85607b555cf7697e4be0d3d34dc1868baa57c235d926e447e926c08d287"))
  12. p2pkh_address = BTC::PublicKeyAddress.new(public_key: user_key.compressed_public_key)
  13. redeem_script = BTC::Script.new << BTC::Script::OP_0 << p2pkh_address.hash
  14. p2sh_p2wpkh_address = BTC::ScriptHashAddress.new(redeem_script:redeem_script).to_s # exemple: 3Aatw8QQbi8aNThHT1oLH49aHxysBWNrSm
  15.  
  16. # Transaction spending from P2SH-P2WPKH address
  17.  
  18. include Bitcoin::Builder
  19. include Bitcoin::Protocol
  20. include Bitcoin::Secp256k1
  21.  
  22. prev_out="2c727aaaa8af6cdd06fae3f1e1d107a33ffc04c588d1a71fc1b5d5ac5523dfdc"
  23. prev_out_index = 0
  24. value = 1118994
  25. fee = 15000
  26. @destination_address = "1Bwyn5f5EvUPazh3H2rns6ENjTUYnK9ben"
  27.  
  28. @redeem_script = redeem_script.data
  29.  
  30. spend_tx = build_tx do |t|
  31. t.lock_time 0
  32. t.input do |i|
  33. i.prev_out prev_out, prev_out_index, @redeem_script, value
  34. i.sequence "ffffffff".htb
  35. end
  36. t.output do |o|
  37. o.value value-fee
  38. o.script {|s| s.recipient @destination_address }
  39. end
  40. end
  41.  
  42. tx = Tx.new(spend_tx.to_payload) # yet unsigned tx
  43.  
  44. tx.in[0].script_sig = Bitcoin::Script.new(Bitcoin::Script.pack_pushdata(@redeem_script)).to_payload
  45.  
  46. sig_hash = tx.signature_hash_for_witness_input(0, @redeem_script, value)
  47.  
  48. private_key_hex = "4b5d5ef7b85148cff9...13be6a88a267a9a84b890872d6975c"
  49. sig = Bitcoin::Secp256k1.sign(sig_hash, private_key_hex.htb) + [Tx::SIGHASH_TYPE[:all]].pack("C")
  50.  
  51. tx.in[0].script_witness.stack << sig
  52. tx.in[0].script_witness.stack << Bitcoin::Key.new(private_key_hex, nil, true).pub.htb
  53.  
  54. tx.to_witness_payload.bth # signed tx in hex
  55. # sample tx: 01000000000101dcdf2355acd5b5c11fa7d188c504fc3fa307d1e1f1e3fa06dd6cafa8aa7a722c0000000017160014b8e1a9c4599afc3faf3d39fc89e36c2b8769d855ffffffff017ad81000000000001976a91478171d72c99f8a780df2f67b2c0edf1cb5e15d7588ac02483045022100c1203556cf1a1c9cd1abf779db6a360b8b0263bdc8c8156ac3bf368736cfa33402202a2e5d91a49d0853db00536be11f36e5ffc93f4d920991a214131be3917c4b8c0121024fffe85607b555cf7697e4be0d3d34dc1868baa57c235d926e447e926c08d28700000000
  56. # sample tx id : 25305f1c4e59c1858e1c5b8fd7290cc26f9e8311b07991c07af65d194044635b
Add Comment
Please, Sign In to add comment