class Bitcoin::Message::HeaderAndShortIDs
BIP-152 Compact Block's data format. github.com/bitcoin/bips/blob/master/bip-0152.mediawiki#HeaderAndShortIDs
Attributes
header[RW]
nonce[RW]
prefilled_txn[RW]
short_ids[RW]
siphash_key[RW]
Public Class Methods
new(header, nonce, short_ids = [], prefilled_txn = [])
click to toggle source
# File lib/bitcoin/message/header_and_short_ids.rb, line 14 def initialize(header, nonce, short_ids = [], prefilled_txn = []) @header = header @nonce = nonce @short_ids = short_ids @prefilled_txn = prefilled_txn @siphash_key = Bitcoin.sha256(header.to_payload << [nonce].pack('q*'))[0...16] end
parse_from_payload(payload)
click to toggle source
# File lib/bitcoin/message/header_and_short_ids.rb, line 22 def self.parse_from_payload(payload) buf = StringIO.new(payload) header = Bitcoin::BlockHeader.parse_from_payload(buf.read(80)) nonce = buf.read(8).unpack1('q*') short_ids_len = Bitcoin.unpack_var_int_from_io(buf) short_ids = short_ids_len.times.map do buf.read(6).reverse.bth.to_i(16) end prefilled_txn_len = Bitcoin.unpack_var_int_from_io(buf) prefilled_txn = prefilled_txn_len.times.map do PrefilledTx.parse_from_io(buf) end self.new(header, nonce, short_ids, prefilled_txn) end
Public Instance Methods
short_id(txid)
click to toggle source
calculate short transaction id which specified by BIP-152. @param [String] txid a transaction id @return [Integer] 6 bytes short transaction id.
# File lib/bitcoin/message/header_and_short_ids.rb, line 50 def short_id(txid) hash = SipHash.digest(siphash_key, txid.htb.reverse).to_even_length_hex [hash].pack('H*')[2...8].bth.to_i(16) end
to_payload()
click to toggle source
# File lib/bitcoin/message/header_and_short_ids.rb, line 37 def to_payload p = header.to_payload p << [nonce].pack('q*') p << Bitcoin.pack_var_int(short_ids.size) p << short_ids.map{|id|sprintf('%12x', id).htb.reverse}.join p << Bitcoin.pack_var_int(prefilled_txn.size) p << prefilled_txn.map(&:to_payload).join p end