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