Class: Bitcoin::PSBT::Output
- Inherits:
-
Object
- Object
- Bitcoin::PSBT::Output
- Defined in:
- lib/bitcoin/psbt/output.rb
Overview
Class for PSBTs which contains per output information
Instance Attribute Summary collapse
-
#hd_key_paths ⇒ Object
Returns the value of attribute hd_key_paths.
-
#proprietaries ⇒ Object
Returns the value of attribute proprietaries.
-
#redeem_script ⇒ Object
Returns the value of attribute redeem_script.
-
#unknowns ⇒ Object
Returns the value of attribute unknowns.
-
#witness_script ⇒ Object
Returns the value of attribute witness_script.
Class Method Summary collapse
-
.parse_from_buf(buf) ⇒ Bitcoin::PSBTOutput
parse PSBT output data form buffer.
Instance Method Summary collapse
-
#initialize ⇒ Output
constructor
A new instance of Output.
-
#merge(psbo) ⇒ Bitcoin::PSBT::Output
merge two PSBT outputs to create one PSBT.
- #to_payload ⇒ Object
Constructor Details
#initialize ⇒ Output
Returns a new instance of Output.
13 14 15 16 17 |
# File 'lib/bitcoin/psbt/output.rb', line 13 def initialize @hd_key_paths = {} @proprietaries = [] @unknowns = {} end |
Instance Attribute Details
#hd_key_paths ⇒ Object
Returns the value of attribute hd_key_paths.
9 10 11 |
# File 'lib/bitcoin/psbt/output.rb', line 9 def hd_key_paths @hd_key_paths end |
#proprietaries ⇒ Object
Returns the value of attribute proprietaries.
10 11 12 |
# File 'lib/bitcoin/psbt/output.rb', line 10 def proprietaries @proprietaries end |
#redeem_script ⇒ Object
Returns the value of attribute redeem_script.
7 8 9 |
# File 'lib/bitcoin/psbt/output.rb', line 7 def redeem_script @redeem_script end |
#unknowns ⇒ Object
Returns the value of attribute unknowns.
11 12 13 |
# File 'lib/bitcoin/psbt/output.rb', line 11 def unknowns @unknowns end |
#witness_script ⇒ Object
Returns the value of attribute witness_script.
8 9 10 |
# File 'lib/bitcoin/psbt/output.rb', line 8 def witness_script @witness_script end |
Class Method Details
.parse_from_buf(buf) ⇒ Bitcoin::PSBTOutput
parse PSBT output data form buffer.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/bitcoin/psbt/output.rb', line 22 def self.parse_from_buf(buf) output = self.new found_sep = false until buf.eof? key_len = Bitcoin.unpack_var_int_from_io(buf) if key_len == 0 found_sep = true break end key_type = buf.read(1).unpack1('C') key = buf.read(key_len - 1) value = buf.read(Bitcoin.unpack_var_int_from_io(buf)) case key_type when PSBT_OUT_TYPES[:redeem_script] raise ArgumentError, 'Invalid output redeemScript typed key.' unless key_len == 1 raise ArgumentError, 'Duplicate Key, output redeemScript already provided' if output.redeem_script output.redeem_script = value when PSBT_OUT_TYPES[:witness_script] raise ArgumentError, 'Invalid output witnessScript typed key.' unless key_len == 1 raise ArgumentError, 'Duplicate Key, output witnessScript already provided' if output.witness_script output.witness_script = value when PSBT_OUT_TYPES[:bip32_derivation] raise ArgumentError, 'Duplicate Key, pubkey derivation path already provided' if output.hd_key_paths[key.bth] output.hd_key_paths[key.bth] = Bitcoin::PSBT::HDKeyPath.new(key, Bitcoin::PSBT::KeyOriginInfo.parse_from_payload(value)) when PSBT_OUT_TYPES[:proprietary] raise ArgumentError, 'Duplicate Key, key for proprietary value already provided.' if output.proprietaries.any?{|p| p.key == key} output.proprietaries << Proprietary.new(key, value) else unknown_key = ([key_type].pack('C') + key).bth raise ArgumentError, 'Duplicate Key, key for unknown value already provided' if output.unknowns[unknown_key] output.unknowns[unknown_key] = value end end raise ArgumentError, 'Separator is missing at the end of an output map.' unless found_sep output end |
Instance Method Details
#merge(psbo) ⇒ Bitcoin::PSBT::Output
merge two PSBT outputs to create one PSBT.
73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/bitcoin/psbt/output.rb', line 73 def merge(psbo) raise ArgumentError, 'The argument psbt must be an instance of Bitcoin::PSBT::Output.' unless psbo.is_a?(Bitcoin::PSBT::Output) raise ArgumentError, 'The Partially Signed Output\'s redeem_script are different.' unless redeem_script == psbo.redeem_script raise ArgumentError, 'The Partially Signed Output\'s witness_script are different.' unless witness_script == psbo.witness_script combined = Bitcoin::PSBT::Output.new combined.redeem_script = redeem_script combined.witness_script = witness_script combined.unknowns = Hash[unknowns.merge(psbo.unknowns).sort] combined.hd_key_paths = hd_key_paths.merge(psbo.hd_key_paths) combined end |
#to_payload ⇒ Object
59 60 61 62 63 64 65 66 67 68 |
# File 'lib/bitcoin/psbt/output.rb', line 59 def to_payload payload = '' payload << PSBT.serialize_to_vector(PSBT_OUT_TYPES[:redeem_script], value: redeem_script) if redeem_script payload << PSBT.serialize_to_vector(PSBT_OUT_TYPES[:witness_script], value: witness_script) if witness_script payload << hd_key_paths.values.map{|v|v.to_payload(PSBT_OUT_TYPES[:bip32_derivation])}.join payload << proprietaries.map(&:to_payload).join payload << unknowns.map {|k,v|Bitcoin.pack_var_int(k.htb.bytesize) << k.htb << Bitcoin.pack_var_int(v.bytesize) << v}.join payload << PSBT_SEPARATOR.itb payload end |