lib/bitcoin/protocol/txin.rb in bitcoin-ruby-0.0.18 vs lib/bitcoin/protocol/txin.rb in bitcoin-ruby-0.0.19
- old
+ new
@@ -1,41 +1,43 @@
# encoding: ascii-8bit
module Bitcoin
module Protocol
-
+ # TxIn section of https://en.bitcoin.it/wiki/Protocol_documentation#tx
class TxIn
-
# previous output hash
attr_accessor :prev_out_hash
- alias :prev_out :prev_out_hash
- def prev_out=(hash); @prev_out_hash = hash; end
+ alias prev_out prev_out_hash
+ def prev_out=(hash)
+ @prev_out_hash = hash
+ end
# previous output index
attr_accessor :prev_out_index
# script_sig input Script (signature)
- attr_accessor :script_sig, :script_sig_length
+ attr_reader :script_sig
+ attr_accessor :script_sig_length
# signature hash and the address of the key that needs to sign it
# (used when dealing with unsigned or partly signed tx)
attr_accessor :sig_hash, :sig_address
# segregated witness
attr_accessor :script_witness
- alias :script :script_sig
- alias :script_length :script_sig_length
+ alias script script_sig
+ alias script_length script_sig_length
# sequence
attr_accessor :sequence
- DEFAULT_SEQUENCE = "\xff\xff\xff\xff"
- NULL_HASH = "\x00"*32
+ DEFAULT_SEQUENCE = "\xff\xff\xff\xff".freeze
+ NULL_HASH = "\x00" * 32
COINBASE_INDEX = 0xffffffff
- def initialize *args
+ def initialize(*args)
@prev_out_hash, @prev_out_index, @script_sig_length,
@script_sig, @sequence = *args
@script_sig_length ||= 0
@script_sig ||= ''
@sequence ||= DEFAULT_SEQUENCE
@@ -46,75 +48,81 @@
def ==(other)
@prev_out_hash == other.prev_out_hash &&
@prev_out_index == other.prev_out_index &&
@script_sig == other.script_sig &&
@sequence == other.sequence
- rescue
+ rescue StandardError
false
end
-
+
+ def is_final? # rubocop:disable Naming/PredicateName
+ warn '[DEPRECATION] `TxIn.is_final?` is deprecated. Use `final?` instead.'
+ final?
+ end
+
# returns true if the sequence number is final (DEFAULT_SEQUENCE)
- def is_final?
- self.sequence == DEFAULT_SEQUENCE
+ def final?
+ sequence == DEFAULT_SEQUENCE
end
# parse raw binary data for transaction input
def parse_data(data)
buf = data.is_a?(String) ? StringIO.new(data) : data
parse_data_from_io(buf)
buf.pos
end
def self.from_io(buf)
- txin = new; txin.parse_data_from_io(buf); txin
+ txin = new
+ txin.parse_data_from_io(buf)
+ txin
end
def parse_data_from_io(buf)
- @prev_out_hash, @prev_out_index = buf.read(36).unpack("a32V")
+ @prev_out_hash, @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
def parsed_script
@parsed_script ||= Bitcoin::Script.new(script_sig)
end
- def to_payload(script=@script_sig, sequence=@sequence)
- [@prev_out_hash, @prev_out_index].pack("a32V") << Protocol.pack_var_int(script.bytesize) << script << (sequence || DEFAULT_SEQUENCE)
+ def to_payload(script = @script_sig, sequence = @sequence)
+ [@prev_out_hash, @prev_out_index].pack('a32V') << Protocol.pack_var_int(script.bytesize) \
+ << script << (sequence || DEFAULT_SEQUENCE)
end
- def to_hash(options = {})
- t = { 'prev_out' => { 'hash' => @prev_out_hash.reverse_hth, 'n' => @prev_out_index } }
+ def to_hash(_options = {})
+ t = { 'prev_out' => { 'hash' => @prev_out_hash.reverse_hth, 'n' => @prev_out_index } }
if coinbase?
- t['coinbase'] = @script_sig.unpack("H*")[0]
+ 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['witness'] = @script_witness.stack.map{|s|s.bth} unless @script_witness.empty?
+ t['sequence'] = @sequence.unpack('V')[0] unless @sequence == "\xff\xff\xff\xff"
+ t['witness'] = @script_witness.stack.map(&:bth) unless @script_witness.empty?
t
end
def self.from_hash(input)
previous_hash = input['previous_transaction_hash'] || input['prev_out']['hash']
previous_output_index = input['output_index'] || input['prev_out']['n']
- txin = TxIn.new([ previous_hash ].pack('H*').reverse, previous_output_index)
- if input['coinbase']
- txin.script_sig = [ input['coinbase'] ].pack("H*")
- else
- txin.script_sig = Script.binary_from_string(input['scriptSig'] || input['script'])
- end
- if input['witness']
- input['witness'].each {|w| txin.script_witness.stack << w.htb}
- end
- txin.sequence = [ input['sequence'] || 0xffffffff ].pack("V")
+ txin = TxIn.new([previous_hash].pack('H*').reverse, previous_output_index)
+ txin.script_sig = if input['coinbase']
+ [input['coinbase']].pack('H*')
+ else
+ Script.binary_from_string(input['scriptSig'] || input['script'])
+ end
+ input['witness'].each { |w| txin.script_witness.stack << w.htb } if input['witness']
+ txin.sequence = [input['sequence'] || 0xffffffff].pack('V')
txin
end
def self.from_hex_hash(hash, index)
- TxIn.new([hash].pack("H*").reverse, index, 0)
+ TxIn.new([hash].pack('H*').reverse, index, 0)
end
# previous output in hex
def previous_output
@prev_out_hash.reverse_hth
@@ -128,15 +136,13 @@
# set script_sig and script_sig_length
def script_sig=(script_sig)
@script_sig_length = script_sig.bytesize
@script_sig = script_sig
end
- alias :script= :script_sig=
+ alias script= script_sig=
def add_signature_pubkey_script(sig, pubkey_hex)
- self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack("H*"))
+ self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack('H*'))
end
-
end
-
end
end