Class: Bitcoin::Protocol::TxIn
- Inherits:
-
Object
- Object
- Bitcoin::Protocol::TxIn
- Defined in:
- lib/bitcoin/protocol/txin.rb
Direct Known Subclasses
Constant Summary collapse
- DEFAULT_SEQUENCE =
"\xff\xff\xff\xff"- NULL_HASH =
"\x00"*32
- COINBASE_INDEX =
0xffffffff
Instance Attribute Summary collapse
-
#prev_out ⇒ Object
previous output hash.
-
#prev_out_index ⇒ Object
previous output index.
-
#script_sig ⇒ Object
(also: #script)
script_sig input Script (signature).
-
#script_sig_length ⇒ Object
(also: #script_length)
script_sig input Script (signature).
-
#sequence ⇒ Object
sequence.
-
#sig_address ⇒ Object
signature hash and the address of the key that needs to sign it (used when dealing with unsigned or partly signed tx).
-
#sig_hash ⇒ Object
signature hash and the address of the key that needs to sign it (used when dealing with unsigned or partly signed tx).
Class Method Summary collapse
Instance Method Summary collapse
-
#==(other) ⇒ Object
compare to another txout.
- #add_signature_pubkey_script(sig, pubkey_hex) ⇒ Object
-
#coinbase? ⇒ Boolean
check if input is coinbase.
-
#initialize(*args) ⇒ TxIn
constructor
A new instance of TxIn.
-
#parse_data(data) ⇒ Object
parse raw binary data for transaction input.
- #parse_data_from_io(buf) ⇒ Object
-
#previous_output ⇒ Object
previous output in hex.
- #to_hash(options = {}) ⇒ Object
- #to_payload(script = @script_sig, sequence = @sequence) ⇒ Object
Constructor Details
#initialize(*args) ⇒ TxIn
Returns a new instance of TxIn.
31 32 33 34 35 |
# File 'lib/bitcoin/protocol/txin.rb', line 31 def initialize *args @prev_out, @prev_out_index, @script_sig_length, @script_sig, @sequence = *args @sequence ||= DEFAULT_SEQUENCE end |
Instance Attribute Details
#prev_out ⇒ Object
previous output hash
9 10 11 |
# File 'lib/bitcoin/protocol/txin.rb', line 9 def prev_out @prev_out end |
#prev_out_index ⇒ Object
previous output index
12 13 14 |
# File 'lib/bitcoin/protocol/txin.rb', line 12 def prev_out_index @prev_out_index end |
#script_sig ⇒ Object Also known as: script
script_sig input Script (signature)
15 16 17 |
# File 'lib/bitcoin/protocol/txin.rb', line 15 def script_sig @script_sig end |
#script_sig_length ⇒ Object Also known as: script_length
script_sig input Script (signature)
15 16 17 |
# File 'lib/bitcoin/protocol/txin.rb', line 15 def script_sig_length @script_sig_length end |
#sequence ⇒ Object
sequence
25 26 27 |
# File 'lib/bitcoin/protocol/txin.rb', line 25 def sequence @sequence end |
#sig_address ⇒ Object
signature hash and the address of the key that needs to sign it (used when dealing with unsigned or partly signed tx)
19 20 21 |
# File 'lib/bitcoin/protocol/txin.rb', line 19 def sig_address @sig_address end |
#sig_hash ⇒ Object
signature hash and the address of the key that needs to sign it (used when dealing with unsigned or partly signed tx)
19 20 21 |
# File 'lib/bitcoin/protocol/txin.rb', line 19 def sig_hash @sig_hash end |
Class Method Details
.from_hash(input) ⇒ Object
78 79 80 81 82 83 84 85 86 87 |
# File 'lib/bitcoin/protocol/txin.rb', line 78 def self.from_hash(input) txin = TxIn.new([ input['prev_out']['hash'] ].pack('H*').reverse, input['prev_out']['n']) if input['coinbase'] txin.script_sig = [ input['coinbase'] ].pack("H*") else txin.script_sig = Script.binary_from_string(input['scriptSig']) end txin.sequence = [ input['sequence'] || 0xffffffff ].pack("V") txin end |
.from_hex_hash(hash, index) ⇒ Object
89 90 91 |
# File 'lib/bitcoin/protocol/txin.rb', line 89 def self.from_hex_hash(hash, index) TxIn.new([hash].pack("H*").reverse, index, 0) end |
.from_io(buf) ⇒ Object
52 53 54 |
# File 'lib/bitcoin/protocol/txin.rb', line 52 def self.from_io(buf) txin = new; txin.parse_data_from_io(buf); txin end |
Instance Method Details
#==(other) ⇒ Object
compare to another txout
38 39 40 41 42 43 |
# File 'lib/bitcoin/protocol/txin.rb', line 38 def ==(other) @prev_out == other.prev_out && @prev_out_index == other.prev_out_index && @script_sig == other.script_sig && @sequence == other.sequence end |
#add_signature_pubkey_script(sig, pubkey_hex) ⇒ Object
110 111 112 |
# File 'lib/bitcoin/protocol/txin.rb', line 110 def add_signature_pubkey_script(sig, pubkey_hex) self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack("H*")) end |
#coinbase? ⇒ Boolean
check if input is coinbase
99 100 101 |
# File 'lib/bitcoin/protocol/txin.rb', line 99 def coinbase? (@prev_out_index == COINBASE_INDEX) && (@prev_out == NULL_HASH) end |
#parse_data(data) ⇒ Object
parse raw binary data for transaction input
46 47 48 49 50 |
# File 'lib/bitcoin/protocol/txin.rb', line 46 def parse_data(data) buf = data.is_a?(String) ? StringIO.new(data) : data parse_data_from_io(buf) buf.pos end |
#parse_data_from_io(buf) ⇒ Object
56 57 58 59 60 61 |
# File 'lib/bitcoin/protocol/txin.rb', line 56 def parse_data_from_io(buf) @prev_out, @prev_out_index = buf.read(36).unpack("a32V") @script_sig_length = Protocol.unpack_var_int_from_io(buf) @script_sig = buf.read(@script_sig_length) @sequence = buf.read(4) end |
#previous_output ⇒ Object
previous output in hex
94 95 96 |
# File 'lib/bitcoin/protocol/txin.rb', line 94 def previous_output @prev_out.reverse_hth end |
#to_hash(options = {}) ⇒ Object
67 68 69 70 71 72 73 74 75 76 |
# File 'lib/bitcoin/protocol/txin.rb', line 67 def to_hash( = {}) t = { 'prev_out' => { 'hash' => @prev_out.reverse_hth, 'n' => @prev_out_index } } if coinbase? t['coinbase'] = @script_sig.unpack("H*")[0] else # coinbase tx t['scriptSig'] = Bitcoin::Script.new(@script_sig).to_string end t['sequence'] = @sequence.unpack("V")[0] unless @sequence == "\xff\xff\xff\xff" t end |
#to_payload(script = @script_sig, sequence = @sequence) ⇒ Object
63 64 65 |
# File 'lib/bitcoin/protocol/txin.rb', line 63 def to_payload(script=@script_sig, sequence=@sequence) [@prev_out, @prev_out_index].pack("a32V") << Protocol.pack_var_int(script.bytesize) << script << (sequence || DEFAULT_SEQUENCE) end |