class BitcoinNode::Protocol::Message

Attributes

command[R]

Public Class Methods

new(payload) click to toggle source
# File lib/bitcoin_node/protocol.rb, line 50
def initialize(payload)
  raise ArgumentError, 'Expected Payload type' unless Payload === payload
  @payload = payload
  @command = payload.name
end
validate(raw_message) click to toggle source
# File lib/bitcoin_node/protocol.rb, line 68
def self.validate(raw_message)
  network, command, expected_length, checksum = Header.unpack(raw_message)
  raw_payload = raw_message[Header::SIZE...(Header::SIZE + expected_length)]
  if (actual = raw_payload.bytesize) < expected_length
    raise BN::P::IncompleteMessageError.new("Incomplete message (missing #{expected_length - actual} bytes)")
  elsif checksum != BN::Protocol.digest(raw_payload)[0...4]
    raise BN::P::InvalidChecksumError.new("Invalid checksum on command #{command}")
  else
    [raw_payload, command]
  end
end

Public Instance Methods

bytesize() click to toggle source
# File lib/bitcoin_node/protocol.rb, line 64
def bytesize
  raw.bytesize
end
raw() click to toggle source
# File lib/bitcoin_node/protocol.rb, line 56
def raw
  @raw ||= begin
    [Header.build_from(@payload).raw, @payload.raw]
      .join
      .force_encoding('binary')
  end
end