Exemplo n.º 1
0
    def stream_deserialize(cls, f: BinaryIO) -> HelloMessage:
        # type_indicator has been read already by the superclass at this point.

        # version is ignored... we parse everything as version 0, since that's the only thing we ourselves speak.
        # once other versions get introduced we should start paying attention to what's in here, and parse as much as we
        # know about.
        (version, ) = struct.unpack(b"B", safe_read(f, 1))

        your_ip_address = IPv6Address(safe_read(f, 16))
        (your_port, ) = struct.unpack(b">H", safe_read(f, 2))

        my_ip_address = IPv6Address(safe_read(f, 16))
        (my_port, ) = struct.unpack(b">H", safe_read(f, 2))

        (nonce, ) = struct.unpack(b">I", safe_read(f, 4))

        (ua_length, ) = struct.unpack(b"B", safe_read(f, 1))
        user_agent = safe_read(f, ua_length)

        supported_versions = stream_deserialize_list(f, SupportedVersion)

        safe_read(f, 256)  # reserved space for later versions

        return cls(supported_versions, your_ip_address, your_port,
                   my_ip_address, my_port, nonce, user_agent)
Exemplo n.º 2
0
    def stream_deserialize(cls, f: BinaryIO) -> GetDataMessage:
        # type_indicator has been read already by the superclass at this point.
        if safe_read(f, 1) != b'\x00':
            raise ValueError(
                "Current version supports only version 0 GetDataMessage")

        data_type = safe_read(f, 2)
        hash = safe_read(f, 32)

        return cls(data_type, hash)
Exemplo n.º 3
0
    def stream_deserialize(cls, f: BinaryIO) -> DataMessage:
        # type_indicator has been read already by the superclass at this point.
        if safe_read(f, 1) != b'\x00':
            raise ValueError(
                "Current version supports only version 0 DataMessage")

        data_type = safe_read(f, 2)

        clz = DATATYPES[data_type]
        data = clz.stream_deserialize(f)

        return cls(data_type, data)
Exemplo n.º 4
0
    def stream_deserialize(cls, f: BinaryIO) -> GetBlocksMessage:
        # type_indicator has been read already by the superclass at this point.
        if safe_read(f, 1) != b'\x00':
            raise ValueError(
                "Current version supports only version 0 GetBlocksMessage")

        potential_start_hashes = []
        length = stream_deserialize_vlq(f)
        for i in range(length):
            potential_start_hashes.append(safe_read(f, 32))

        stop_hash = safe_read(f, 32)
        return cls(potential_start_hashes, stop_hash)
Exemplo n.º 5
0
    def stream_deserialize(cls, f: BinaryIO) -> Message:
        type_indicator = safe_read(f, 2)

        if type_indicator == MSG_HELLO:
            return HelloMessage.stream_deserialize(f)

        if type_indicator == MSG_GET_BLOCKS:
            return GetBlocksMessage.stream_deserialize(f)

        if type_indicator == MSG_INVENTORY:
            return InventoryMessage.stream_deserialize(f)

        if type_indicator == MSG_GET_DATA:
            return GetDataMessage.stream_deserialize(f)

        if type_indicator == MSG_DATA:
            return DataMessage.stream_deserialize(f)

        if type_indicator == MSG_GET_PEERS:
            return GetPeersMessage.stream_deserialize(f)

        if type_indicator == MSG_PEERS:
            return PeersMessage.stream_deserialize(f)

        raise DeserializationError("Non-supported message type")
Exemplo n.º 6
0
    def stream_deserialize(cls, f: BinaryIO) -> InventoryMessage:
        # type_indicator has been read already by the superclass at this point.
        if safe_read(f, 1) != b'\x00':
            raise ValueError(
                "Current version supports only version 0 InventoryMessage")

        items = stream_deserialize_list(f, InventoryItem)
        return cls(items)
Exemplo n.º 7
0
    def stream_deserialize(cls, f: BinaryIO) -> PeersMessage:
        # type_indicator has been read already by the superclass at this point.
        if safe_read(f, 1) != b'\x00':
            raise ValueError(
                "Current version supports only version 0 GetPeersMessage")

        peers = stream_deserialize_list(f, Peer)

        return cls(peers)
Exemplo n.º 8
0
    def stream_deserialize(cls, f: BinaryIO) -> MessageHeader:
        # version is ignored... we parse everything as version 0, since that's the only thing we ourselves speak.
        # once other versions get introduced we should start paying attention to what's in here, and parse as much as we
        # know about
        (version, ) = struct.unpack(b"B", safe_read(f, 1))

        (timestamp, ) = struct.unpack(b">I", safe_read(f, 4))
        (id, ) = struct.unpack(b">I", safe_read(f, 4))
        (in_response_to, ) = struct.unpack(b">I", safe_read(f, 4))
        (context, ) = struct.unpack(b">Q", safe_read(f, 8))

        safe_read(f, 32)  # reserved space for later versions

        return cls(timestamp, id, in_response_to, context)
Exemplo n.º 9
0
    def stream_deserialize(cls, f: BinaryIO) -> Peer:
        (last_seen_at, ) = struct.unpack(b">I", safe_read(f, 4))
        ip_address = IPv6Address(safe_read(f, 16))
        (port, ) = struct.unpack(b">H", safe_read(f, 2))

        return cls(last_seen_at, ip_address, port)
Exemplo n.º 10
0
 def stream_deserialize(cls, f: BinaryIO) -> InventoryItem:
     data_type = safe_read(f, 2)
     hash = safe_read(f, 32)
     return cls(data_type, hash)
Exemplo n.º 11
0
 def stream_deserialize(cls, f: BinaryIO) -> SupportedVersion:
     (version, ) = struct.unpack(b"B", safe_read(f, 1))
     return cls(version)