示例#1
0
    def stream_deserialize(cls, f, protover=PROTO_VERSION):
        recvbuf = ser_read(f, 4 + 12 + 4 + 4)

        # check magic
        if recvbuf[:4] != bitcoin.params.MESSAGE_START:
            raise ValueError("Invalid message start '%s', expected '%s'" %
                             (b2x(recvbuf[:4]), b2x(bitcoin.params.MESSAGE_START)))

        # remaining header fields: command, msg length, checksum
        command = recvbuf[4:4+12].split(b"\x00", 1)[0]
        msglen = struct.unpack(b"<i", recvbuf[4+12:4+12+4])[0]
        checksum = recvbuf[4+12+4:4+12+4+4]

        # read message body
        recvbuf += ser_read(f, msglen)

        msg = recvbuf[4+12+4+4:4+12+4+4+msglen]
        th = hashlib.sha256(msg).digest()
        h = hashlib.sha256(th).digest()
        if checksum != h[:4]:
            raise ValueError("got bad checksum %s" % repr(recvbuf))

        if command in messagemap:
            cls_map = messagemap[command]
            #        print("Going to deserialize '%s'" % msg)
            return cls_map.msg_deser(_BytesIO(msg))
        else:
            print("Command '%s' not in messagemap" % repr(command))
            return None
示例#2
0
    def stream_deserialize(cls, f, protover=PROTO_VERSION):
        recvbuf = ser_read(f, 4 + 12 + 4 + 4)

        # check magic
        if recvbuf[:4] != bitcoin.params.MESSAGE_START:
            raise ValueError(
                "Invalid message start '%s', expected '%s'" % (b2x(recvbuf[:4]), b2x(bitcoin.params.MESSAGE_START))
            )

        # remaining header fields: command, msg length, checksum
        command = recvbuf[4 : 4 + 12].split(b"\x00", 1)[0]
        msglen = struct.unpack(b"<i", recvbuf[4 + 12 : 4 + 12 + 4])[0]
        checksum = recvbuf[4 + 12 + 4 : 4 + 12 + 4 + 4]

        # read message body
        recvbuf += ser_read(f, msglen)

        msg = recvbuf[4 + 12 + 4 + 4 : 4 + 12 + 4 + 4 + msglen]
        th = hashlib.sha256(msg).digest()
        h = hashlib.sha256(th).digest()
        if checksum != h[:4]:
            raise ValueError("got bad checksum %s" % repr(recvbuf))

        if command in messagemap:
            cls_map = messagemap[command]
            #        print("Going to deserialize '%s'" % msg)
            return cls_map.msg_deser(_BytesIO(msg))
        else:
            print("Command '%s' not in messagemap" % repr(command))
            return None
示例#3
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.nVersion = struct.unpack(b"<i", ser_read(f, 4))[0]
     if c.nVersion == 10300:
         c.nVersion = 300
     c.nServices = struct.unpack(b"<Q", ser_read(f, 8))[0]
     c.nTime = struct.unpack(b"<q", ser_read(f, 8))[0]
     c.addrTo = CAddress.stream_deserialize(f, True)
     if c.nVersion >= 106:
         c.addrFrom = CAddress.stream_deserialize(f, True)
         c.nNonce = struct.unpack(b"<Q", ser_read(f, 8))[0]
         c.strSubVer = VarStringSerializer.stream_deserialize(f)
         if c.nVersion >= 209:
             c.nStartingHeight = struct.unpack(b"<i", ser_read(f,4))[0]
         else:
             c.nStartingHeight = None
     else:
         c.addrFrom = None
         c.nNonce = None
         c.strSubVer = None
         c.nStartingHeight = None
     return c
示例#4
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.nVersion = struct.unpack(b"<i", ser_read(f, 4))[0]
     if c.nVersion == 10300:
         c.nVersion = 300
     c.nServices = struct.unpack(b"<Q", ser_read(f, 8))[0]
     c.nTime = struct.unpack(b"<q", ser_read(f, 8))[0]
     c.addrTo = CAddress.stream_deserialize(f, True)
     if c.nVersion >= 106:
         c.addrFrom = CAddress.stream_deserialize(f, True)
         c.nNonce = struct.unpack(b"<Q", ser_read(f, 8))[0]
         c.strSubVer = VarStringSerializer.stream_deserialize(f)
         if c.nVersion >= 209:
             c.nStartingHeight = struct.unpack(b"<i", ser_read(f, 4))[0]
         else:
             c.nStartingHeight = None
     else:
         c.addrFrom = None
         c.nNonce = None
         c.strSubVer = None
         c.nStartingHeight = None
     return c
示例#5
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.message = VarStringSerializer.stream_deserialize(f)
     c.ccode = struct.unpack(b"<c", ser_read(f,1))[0]
     c.reason = VarStringSerializer.stream_deserialize(f)
     return c
示例#6
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.nonce = struct.unpack(b"<Q", ser_read(f,8))[0]
     return c
示例#7
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.locator = CBlockLocator.stream_deserialize(f)
     c.hashstop = ser_read(f, 32)
     return c
示例#8
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.message = VarStringSerializer.stream_deserialize(f)
     c.ccode = struct.unpack(b"<c", ser_read(f, 1))[0]
     c.reason = VarStringSerializer.stream_deserialize(f)
     return c
示例#9
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.nonce = struct.unpack(b"<Q", ser_read(f, 8))[0]
     return c
示例#10
0
 def msg_deser(cls, f, protover=PROTO_VERSION):
     c = cls()
     c.locator = CBlockLocator.stream_deserialize(f)
     c.hashstop = ser_read(f, 32)
     return c