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