class Tapyrus::Message::NetworkAddr

Attributes

ip_addr[RW]
port[RW]
services[RW]

The services the node advertised in its version message.

skip_time[R]
time[RW]

unix time. Nodes advertising their own IP address set this to the current time. Nodes advertising IP addresses they’ve connected to set this to the last time they connected to that node. Other nodes just relaying the IP address should not change the time. Nodes can use the time field to avoid relaying old addr messages.

Public Class Methods

local_addr() click to toggle source
# File lib/tapyrus/message/network_addr.rb, line 44
def self.local_addr
  addr = new
  addr.ip_addr = IPAddr.new('127.0.0.1')
  addr.port = Tapyrus.chain_params.default_port
  addr.services = DEFAULT_SERVICE_FLAGS
  addr
end
new( ip: '127.0.0.1', port: Tapyrus.chain_params.default_port, services: DEFAULT_SERVICE_FLAGS, time: Time.now.to_i ) click to toggle source
# File lib/tapyrus/message/network_addr.rb, line 21
def initialize(
  ip: '127.0.0.1',
  port: Tapyrus.chain_params.default_port,
  services: DEFAULT_SERVICE_FLAGS,
  time: Time.now.to_i
)
  @time = time
  @ip_addr = IPAddr.new(ip)
  @port = port
  @services = services
end
parse_from_payload(payload) click to toggle source
# File lib/tapyrus/message/network_addr.rb, line 33
def self.parse_from_payload(payload)
  buf = payload.is_a?(String) ? StringIO.new(payload) : payload
  has_time = buf.size > 26
  addr = new(time: nil)
  addr.time = buf.read(4).unpack('V').first if has_time
  addr.services = buf.read(8).unpack('Q').first
  addr.ip_addr = IPAddr.new_ntoh(buf.read(16))
  addr.port = buf.read(2).unpack('n').first
  addr
end

Public Instance Methods

ip() click to toggle source
# File lib/tapyrus/message/network_addr.rb, line 52
def ip
  ip_addr.ipv4_mapped? ? ip_addr.native : ip_addr.to_s
end
to_payload(skip_time = false) click to toggle source
# File lib/tapyrus/message/network_addr.rb, line 56
def to_payload(skip_time = false)
  p = ''
  p << [time].pack('V') unless skip_time
  addr = ip_addr.ipv4? ? ip_addr.ipv4_mapped : ip_addr
  p << [services].pack('Q') << addr.hton << [port].pack('n')
end