Class: Bitcoin::Protocol::TxIn

Inherits:
Object
  • Object
show all
Defined in:
lib/bitcoin/protocol/txin.rb

Direct Known Subclasses

Storage::Models::TxIn

Constant Summary

DEFAULT_SEQUENCE =
"\xff\xff\xff\xff"
NULL_HASH =
"\x00"*32
COINBASE_INDEX =
0xffffffff

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (TxIn) initialize(*args)

Returns a new instance of TxIn



31
32
33
34
35
36
37
# File 'lib/bitcoin/protocol/txin.rb', line 31

def initialize *args
  @prev_out, @prev_out_index, @script_sig_length,
  @script_sig, @sequence = *args
  @script_sig_length ||= 0
  @script_sig ||= ''
  @sequence ||= DEFAULT_SEQUENCE
end

Instance Attribute Details

- (Object) prev_out

previous output hash



9
10
11
# File 'lib/bitcoin/protocol/txin.rb', line 9

def prev_out
  @prev_out
end

- (Object) prev_out_index

previous output index



12
13
14
# File 'lib/bitcoin/protocol/txin.rb', line 12

def prev_out_index
  @prev_out_index
end

- (Object) script_sig 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

- (Object) script_sig_length 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

- (Object) sequence

sequence



25
26
27
# File 'lib/bitcoin/protocol/txin.rb', line 25

def sequence
  @sequence
end

- (Object) sig_address

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

- (Object) sig_hash

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

+ (Object) from_hash(input)



80
81
82
83
84
85
86
87
88
89
# File 'lib/bitcoin/protocol/txin.rb', line 80

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

+ (Object) from_hex_hash(hash, index)



91
92
93
# File 'lib/bitcoin/protocol/txin.rb', line 91

def self.from_hex_hash(hash, index)
  TxIn.new([hash].pack("H*").reverse, index, 0)
end

+ (Object) from_io(buf)



54
55
56
# File 'lib/bitcoin/protocol/txin.rb', line 54

def self.from_io(buf)
  txin = new; txin.parse_data_from_io(buf); txin
end

Instance Method Details

- (Object) ==(other)

compare to another txout



40
41
42
43
44
45
# File 'lib/bitcoin/protocol/txin.rb', line 40

def ==(other)
  @prev_out == other.prev_out &&
    @prev_out_index == other.prev_out_index &&
    @script_sig == other.script_sig &&
    @sequence == other.sequence
end

- (Object) add_signature_pubkey_script(sig, pubkey_hex)



112
113
114
# File 'lib/bitcoin/protocol/txin.rb', line 112

def add_signature_pubkey_script(sig, pubkey_hex)
  self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack("H*"))
end

- (Boolean) coinbase?

check if input is coinbase

Returns:

  • (Boolean)


101
102
103
# File 'lib/bitcoin/protocol/txin.rb', line 101

def coinbase?
  (@prev_out_index == COINBASE_INDEX) && (@prev_out == NULL_HASH)
end

- (Object) parse_data(data)

parse raw binary data for transaction input



48
49
50
51
52
# File 'lib/bitcoin/protocol/txin.rb', line 48

def parse_data(data)
  buf = data.is_a?(String) ? StringIO.new(data) : data
  parse_data_from_io(buf)
  buf.pos
end

- (Object) parse_data_from_io(buf)



58
59
60
61
62
63
# File 'lib/bitcoin/protocol/txin.rb', line 58

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

- (Object) previous_output

previous output in hex



96
97
98
# File 'lib/bitcoin/protocol/txin.rb', line 96

def previous_output
  @prev_out.reverse_hth
end

- (Object) to_hash(options = {})



69
70
71
72
73
74
75
76
77
78
# File 'lib/bitcoin/protocol/txin.rb', line 69

def to_hash(options = {})
  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

- (Object) to_payload(script = @script_sig, sequence = @sequence)



65
66
67
# File 'lib/bitcoin/protocol/txin.rb', line 65

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