Class: Bitcoin::Protocol::Tx
Overview
extension for Bitcoin::Protocol::Tx to support segwit
Instance Attribute Summary collapse
-
#witness ⇒ Object
readonly
Returns the value of attribute witness.
Instance Method Summary collapse
-
#initialize(data = nil) ⇒ Tx
constructor
A new instance of Tx.
-
#parse_witness_data_from_io(data) ⇒ Object
parse raw data which include witness data serialization format is defined by github.com/bitcoin/bips/blob/master/bip-0144.mediawiki.
-
#to_witness_payload ⇒ Object
output transaction in raw binary format with witness.
-
#witness_hash ⇒ Object
get witness hash.
Constructor Details
#initialize(data = nil) ⇒ Tx
Returns a new instance of Tx.
7 8 9 10 11 12 13 14 15 16 17 |
# File 'lib/segwit/tx.rb', line 7 def initialize(data=nil) @ver, @lock_time, @in, @out, @scripts, @witness = 1, 0, [], [], [], Bitcoin::Protocol::TxWitness.new @enable_bitcoinconsensus = !!ENV['USE_BITCOINCONSENSUS'] if data begin parse_witness_data_from_io(data) unless parse_data_from_io(data).is_a?(TrueClass) rescue Exception parse_witness_data_from_io(data) end end end |
Instance Attribute Details
#witness ⇒ Object (readonly)
Returns the value of attribute witness.
5 6 7 |
# File 'lib/segwit/tx.rb', line 5 def witness @witness end |
Instance Method Details
#parse_witness_data_from_io(data) ⇒ Object
parse raw data which include witness data serialization format is defined by github.com/bitcoin/bips/blob/master/bip-0144.mediawiki
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 58 59 60 61 62 63 |
# File 'lib/segwit/tx.rb', line 26 def parse_witness_data_from_io(data) buf = data.is_a?(String) ? StringIO.new(data) : data @ver = buf.read(4).unpack("V").first @marker = buf.read(1).unpack("c").first @flag = buf.read(1).unpack("c").first in_size = Bitcoin::Protocol.unpack_var_int_from_io(buf) @in = [] in_size.times{ break if buf.eof? @in << Bitcoin::Protocol::TxIn.from_io(buf) } out_size = Bitcoin::Protocol.unpack_var_int_from_io(buf) @out = [] out_size.times{ break if buf.eof? @out << Bitcoin::Protocol::TxOut.from_io(buf) } @witness = Bitcoin::Protocol::TxWitness.new in_size.times{ witness_count = Bitcoin::Protocol.unpack_var_int_from_io(buf) in_witness = Bitcoin::Protocol::TxInWitness.new witness_count.times{ length = Bitcoin::Protocol.unpack_var_int_from_io(buf) in_witness.add_stack(buf.read(length).unpack("H*").first) } @witness.add_witness(in_witness) } @lock_time = buf.read(4).unpack("V").first @hash = hash_from_payload(to_payload) end |
#to_witness_payload ⇒ Object
output transaction in raw binary format with witness
66 67 68 69 70 71 72 73 74 |
# File 'lib/segwit/tx.rb', line 66 def to_witness_payload pin = "" @in.each{|input| pin << input.to_payload } pout = "" @out.each{|output| pout << output.to_payload } payload = [@ver].pack("V") << [0].pack("c") << [1].pack("c") << Bitcoin::Protocol.pack_var_int(@in.size) << pin << Bitcoin::Protocol.pack_var_int(@out.size) << pout << @witness.to_payload << [@lock_time].pack("V") payload end |
#witness_hash ⇒ Object
get witness hash
20 21 22 |
# File 'lib/segwit/tx.rb', line 20 def witness_hash hash_from_payload(to_witness_payload) end |