Class: Tapyrus::Message::NetworkAddr

Inherits:
Object
  • Object
show all
Defined in:
lib/tapyrus/message/network_addr.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ip: "127.0.0.1", port: Tapyrus.chain_params.default_port, services: DEFAULT_SERVICE_FLAGS, time: Time.now.to_i) ⇒ NetworkAddr

Returns a new instance of NetworkAddr.



21
22
23
24
25
26
27
28
29
30
31
# 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

Instance Attribute Details

#ip_addrObject

IPAddr



15
16
17
# File 'lib/tapyrus/message/network_addr.rb', line 15

def ip_addr
  @ip_addr
end

#portObject

Returns the value of attribute port.



17
18
19
# File 'lib/tapyrus/message/network_addr.rb', line 17

def port
  @port
end

#servicesObject

The services the node advertised in its version message.



13
14
15
# File 'lib/tapyrus/message/network_addr.rb', line 13

def services
  @services
end

#skip_timeObject (readonly)

Returns the value of attribute skip_time.



19
20
21
# File 'lib/tapyrus/message/network_addr.rb', line 19

def skip_time
  @skip_time
end

#timeObject

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.



10
11
12
# File 'lib/tapyrus/message/network_addr.rb', line 10

def time
  @time
end

Class Method Details

.local_addrObject



44
45
46
47
48
49
50
# 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

.parse_from_payload(payload) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# 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

Instance Method Details

#ipObject



52
53
54
# 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) ⇒ Object



56
57
58
59
60
61
# 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