Example #1
0
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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
 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')
Example #5
0
 def packet_size(cls, packet):
     return idec(packet[4:8]) + 8
Example #6
0
 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')
Example #7
0
 def packet_size(cls, packet):
     return idec(packet[4:8]) + 8
Example #8
0
 def packet_cmd(cls, packet):
     return Packeter.cmd_map.get(idec(rlp.descend(packet[8:200], 0)))
Example #9
0
 def packet_cmd(cls, packet):
     return Packeter.cmd_map.get(idec(rlp.descend(packet[8:200],0)))