コード例 #1
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #2
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #3
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #4
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #5
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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")
コード例 #6
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #7
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #8
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #9
0
ファイル: messages.py プロジェクト: lk16/skepticoin
    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)
コード例 #10
0
ファイル: messages.py プロジェクト: lk16/skepticoin
 def stream_deserialize(cls, f: BinaryIO) -> InventoryItem:
     data_type = safe_read(f, 2)
     hash = safe_read(f, 32)
     return cls(data_type, hash)
コード例 #11
0
ファイル: messages.py プロジェクト: lk16/skepticoin
 def stream_deserialize(cls, f: BinaryIO) -> SupportedVersion:
     (version, ) = struct.unpack(b"B", safe_read(f, 1))
     return cls(version)