lib/bitcoin/protocol/version.rb in bitcoin-ruby-0.0.18 vs lib/bitcoin/protocol/version.rb in bitcoin-ruby-0.0.19

- old
+ new

@@ -1,88 +1,101 @@ # encoding: ascii-8bit module Bitcoin module Protocol - # https://en.bitcoin.it/wiki/Protocol_specification#version class Version # services bit constants NODE_NONE = 0 NODE_NETWORK = (1 << 0) attr_reader :fields - def initialize(opts={}) + def initialize(opts = {}) @fields = { - :version => Bitcoin.network[:protocol_version], - :services => NODE_NETWORK, - :time => Time.now.tv_sec, - :from => "127.0.0.1:8333", - :to => "127.0.0.1:8333", - :nonce => Bitcoin::Protocol::Uniq, - :user_agent => "/bitcoin-ruby:#{Bitcoin::VERSION}/", - :last_block => 0, # 188617 - :relay => true # BIP0037 - }.merge( opts.reject{|k,v| v == nil } ) + version: Bitcoin.network[:protocol_version], + services: NODE_NETWORK, + time: Time.now.tv_sec, + from: '127.0.0.1:8333', + to: '127.0.0.1:8333', + nonce: Bitcoin::Protocol::Uniq, + user_agent: "/bitcoin-ruby:#{Bitcoin::VERSION}/", + last_block: 0, # 188617 + relay: true # BIP0037 + }.merge(opts.reject { |_k, v| v.nil? }) end def to_payload [ - @fields.values_at(:version, :services, :time).pack("VQQ"), + @fields.values_at(:version, :services, :time).pack('VQQ'), pack_address_field(@fields[:from]), pack_address_field(@fields[:to]), - @fields.values_at(:nonce).pack("Q"), + @fields.values_at(:nonce).pack('Q'), Protocol.pack_var_string(@fields[:user_agent]), - @fields.values_at(:last_block).pack("V"), - Protocol.pack_boolean(@fields[:relay]) # Satoshi 0.8.6 doesn't send this but it does respect it + @fields.values_at(:last_block).pack('V'), + # Satoshi 0.8.6 doesn't send this but it does respect it + Protocol.pack_boolean(@fields[:relay]) ].join end def to_pkt - Bitcoin::Protocol.pkt("version", to_payload) + Bitcoin::Protocol.pkt('version', to_payload) end def parse(payload) - version, services, timestamp, to, from, nonce, payload = payload.unpack("VQQa26a26Qa*") - to, from = unpack_address_field(to), unpack_address_field(from) + version, services, timestamp, to, from, nonce, payload = payload.unpack('VQQa26a26Qa*') + to = unpack_address_field(to) + from = unpack_address_field(from) user_agent, payload = Protocol.unpack_var_string(payload) - last_block, payload = payload.unpack("Va*") - relay, payload = unpack_relay_field(version, payload) + last_block, payload = payload.unpack('Va*') + relay, = unpack_relay_field(version, payload) @fields = { - :version => version, :services => services, :time => timestamp, - :from => from, :to => to, :nonce => nonce, - :user_agent => user_agent.to_s, :last_block => last_block, :relay => relay + version: version, services: services, time: timestamp, + from: from, to: to, nonce: nonce, + user_agent: user_agent.to_s, last_block: last_block, relay: relay } self end def unpack_address_field(payload) - ip, port = payload.unpack("x8x12a4n") - "#{ip.unpack("C*").join(".")}:#{port}" + ip, port = payload.unpack('x8x12a4n') + "#{ip.unpack('C*').join('.')}:#{port}" end def pack_address_field(addr_str) - host, port = addr_str.split(":") + host, port = addr_str.split(':') port = port ? port.to_i : 8333 sockaddr = Socket.pack_sockaddr_in(port, host) - #raise "invalid IPv4 Address: #{addr}" unless sockaddr[0...2] == "\x02\x00" - port, host = sockaddr[2...4], sockaddr[4...8] - [[1].pack("Q"), "\x00"*10, "\xFF\xFF", host, port].join + # raise "invalid IPv4 Address: #{addr}" unless sockaddr[0...2] == "\x02\x00" + port = sockaddr[2...4] + host = sockaddr[4...8] + [[1].pack('Q'), "\x00" * 10, "\xFF\xFF", host, port].join end # BIP0037: this field starts with version 70001 and is allowed to be missing, defaults to true def unpack_relay_field(version, payload) - ( version >= 70001 and payload ) ? Protocol.unpack_boolean(payload) : [ true, nil ] + version >= 70_001 && payload ? Protocol.unpack_boolean(payload) : [true, nil] end def uptime @fields[:time] - Time.now.tv_sec end - def method_missing(*a); (@fields[a.first] rescue nil) or super(*a); end + def method_missing(*a) + @fields[a.first] + rescue StandardError + super + end - def self.parse(payload); new.parse(payload); end - end + def respond_to_missing?(*a) + @fields[a.first] + rescue StandardError + super + end + def self.parse(payload) + new.parse(payload) + end + end end end