class BitcoinNode::P2p::Server
Public Class Methods
new(port = 3333, probe = LoggingProbe.new('server'))
click to toggle source
# File lib/bitcoin_node/p2p/server.rb, line 10 def initialize(port = 3333, probe = LoggingProbe.new('server')) @server = TCPServer.new('localhost', port) @probe = probe async.run end
Public Instance Methods
run()
click to toggle source
# File lib/bitcoin_node/p2p/server.rb, line 16 def run loop { async.accept_connection @server.accept } end
shutdown()
click to toggle source
# File lib/bitcoin_node/p2p/server.rb, line 20 def shutdown @server.close if @server end
Private Instance Methods
accept_connection(socket)
click to toggle source
# File lib/bitcoin_node/p2p/server.rb, line 26 def accept_connection(socket) _, port, host = socket.peeraddr @probe << { connection: "#{host}:#{port}" } loop { handle_messages(socket) } end
handle_messages(socket)
click to toggle source
# File lib/bitcoin_node/p2p/server.rb, line 33 def handle_messages(socket) _, port, host = socket.peeraddr response = socket.readpartial(1024) network, command, length, checksum = response.unpack('a4A12Va4') payload = response[24...(24 + length)] @probe << { receiving: command } if command == 'version' payload = BN::Protocol::Version.new(addr_recv: ['127.0.0.1', port]) message = BN::Protocol::Message.new(payload) @probe << { sending: 'version' } socket.write(message.raw) end if command == 'verack' verack = BN::Protocol::Messages.verack @probe << { sending: 'verack' } socket.write(verack.raw) end if command == 'ping' ping_nonce = BN::Protocol::Ping.parse(payload).nonce.value pong = BN::Protocol::Messages.pong(ping_nonce) @probe << { sending: 'pong' } socket.write(pong.raw) end end