def step_impl(context): from pyethereum.utils import big_endian_to_int as idec decoded_packet = context.packeter.load_packet(context.packet)[1][3] port = idec(decoded_packet[4]) node_id = decoded_packet[5] assert(context.peer.port == port) assert(context.peer.node_id == node_id)
def load_packet(cls, packet): ''' Though TCP provides a connection-oriented medium, Ethereum nodes communicate in terms of packets. These packets are formed as a 4-byte synchronisation token (0x22400891), a 4-byte "payload size", to be interpreted as a big-endian integer and finally an N-byte RLP-serialised data structure, where N is the aforementioned "payload size". To be clear, the payload size specifies the number of bytes in the packet ''following'' the first 8. :return: (success, result), where result should be None when fail, and (header, payload_len, cmd, data) when success ''' header = idec(packet[:4]) if header != cls.SYNCHRONIZATION_TOKEN: return False, 'check header failed, skipping message,'\ 'sync token was hex: %s' % hex(header) try: payload_len = idec(packet[4:8]) except Exception as e: return False, str(e) if len(packet) < payload_len + 8: return False, 'Packet is broken' try: payload = lrlp_decode(packet[8:8 + payload_len]) except Exception as e: return False, str(e) #logger.debug('load packet, cmd:%d %r', idec(payload[0]), Packeter.cmd_map.get(idec(payload[0]),'unknown')) if (not len(payload)) or (idec(payload[0]) not in cls.cmd_map): return False, 'check cmd %r failed' % idec(payload[0]) cmd = Packeter.cmd_map.get(idec(payload[0])) remain = packet[8 + payload_len:] return True, (header, payload_len, cmd, payload[1:], remain)
def packet_cmd(cls, packet): try: v = idec(rlp.descend(packet[8:200], 0)) except rlp.DecodingError: v = -1 return Packeter.cmd_map.get(v, 'invalid')
def packet_size(cls, packet): return idec(packet[4:8]) + 8
def packet_cmd(cls, packet): return Packeter.cmd_map.get(idec(rlp.descend(packet[8:200], 0)))
def packet_cmd(cls, packet): return Packeter.cmd_map.get(idec(rlp.descend(packet[8:200],0)))