Beispiel #1
0
    def parseSegwit(self, payload, opts):
        if decodeVarLength(payload) == 0:
            return False

        self.is_segwit = True
        txInputCount = decodeVarLength(payload)
        for _i in range(0, txInputCount):
            prev_out = (payload.read(32)[::-1],
                        struct.unpack("<I", payload.read(4))[0])
            script_length = decodeVarLength(payload)
            script = payload.read(script_length)
            sequence, = struct.unpack("<I", payload.read(4))
            self.inputs.append((prev_out, script, sequence))

        txOutputCount = decodeVarLength(payload)
        for _i in range(0, txOutputCount):
            value, = struct.unpack("<Q", payload.read(8))
            script = decodeVarString(payload)
            self.outputs.append((value, script))

        for i in range(0, txInputCount):
            nelements = decodeVarLength(payload)
            self.witnesses.append(
                [decodeVarString(payload) for _ in range(nelements)])
        self.lock_time, = struct.unpack("<I", payload.read(4))
        return True
Beispiel #2
0
    def parseSegwit(self, payload, opts):
        if decodeVarLength(payload) == 0:
            return False

        self.is_segwit = True
        txInputCount = decodeVarLength(payload)
        for _i in range(0, txInputCount):
            prev_out = (
                payload.read(32)[::-1],
                struct.unpack("<I", payload.read(4))[0]
            )
            script_length = decodeVarLength(payload)
            script = payload.read(script_length)
            sequence, = struct.unpack("<I", payload.read(4))
            self.inputs.append((prev_out, script, sequence))

        txOutputCount = decodeVarLength(payload)
        for _i in range(0, txOutputCount):
            value, = struct.unpack("<Q", payload.read(8))
            script = decodeVarString(payload)
            self.outputs.append((value, script))

        for i in range(0, txInputCount):
            nelements = decodeVarLength(payload)
            self.witnesses.append([decodeVarString(payload) for _ in range(nelements)])
        self.lock_time, = struct.unpack("<I", payload.read(4))
        return True
Beispiel #3
0
    def parse(self, payload, opts):
        Packet.parse(self, payload, opts)

        self.version, = struct.unpack("<I", payload.read(4))
        txInputCount = decodeVarLength(payload)
        if txInputCount == 0:
            return self.parseSegwit(payload, opts)

        for _i in range(0, txInputCount):
            prev_out = (
                payload.read(32)[::-1],
                struct.unpack("<I", payload.read(4))[0]
            )
            script_length = decodeVarLength(payload)
            script = payload.read(script_length)
            sequence, = struct.unpack("<I", payload.read(4))
            self.inputs.append((prev_out, script, sequence))

        txOutputCount = decodeVarLength(payload)
        for _i in range(0, txOutputCount):
            value, = struct.unpack("<Q", payload.read(8))
            script = decodeVarString(payload)
            self.outputs.append((value, script))
        self.lock_time, = struct.unpack("<I", payload.read(4))
        return True
Beispiel #4
0
 def parse(self, payload, unused_version=None):
     Packet.parse(self, payload, unused_version)
     self.version, self.services, self.timestamp = struct.unpack(
         "<IQQ", payload.read(20))
     version = self.version
     if version >= 106:
         self.addr_recv = Address()
         self.addr_recv.parse(payload, False)
         self.addr_from = Address()
         self.addr_from.parse(payload, False)
         self.nonce = payload.read(8)
         self.user_agent = decodeVarString(payload)
         self.best_height, = struct.unpack("<I", payload.read(4))
     if version >= 70001:
         relay_flag, = struct.unpack('B', payload.read(1))
         self.relay = bool(relay_flag & 1)
Beispiel #5
0
    def parse(self, payload, opts=None):
        Packet.parse(self, payload, opts)
        self.version, self.services, self.timestamp = struct.unpack(
            "<IQQ", payload.read(20))

        if self.version >= 106:
            # Pretend to be version 0, this doesn't include timestamps yet.
            self.addr_recv = Address()
            self.addr_recv.parse(payload, {'version': 0})
            self.addr_from = Address()
            self.addr_from.parse(payload, {'version': 0})
            self.nonce = payload.read(8)
            self.user_agent = decodeVarString(payload)
            self.best_height, = struct.unpack("<I", payload.read(4))
        if self.version >= 70001:
            relay_flag = payload.read(1)
            # Some clients advertise 70001 but then do not include a relay_flag
            if len(relay_flag):
                self.relay = bool(struct.unpack('B', relay_flag)[0] & 1)
Beispiel #6
0
    def parse(self, payload, opts=None):
        Packet.parse(self, payload, opts)
        self.version, self.services, self.timestamp = struct.unpack(
            "<IQQ", payload.read(20))

        if self.version >= 106:
            # Pretend to be version 0, this doesn't include timestamps yet.
            self.addr_recv = Address()
            self.addr_recv.parse(payload, {'version': 0})
            self.addr_from = Address()
            self.addr_from.parse(payload, {'version': 0})
            self.nonce = payload.read(8)
            self.user_agent = decodeVarString(payload)
            self.best_height, = struct.unpack("<I", payload.read(4))
        if self.version >= 70001:
            relay_flag = payload.read(1)
            # Some clients advertise 70001 but then do not include a relay_flag
            if len(relay_flag):
                self.relay = bool(struct.unpack('B', relay_flag)[0] & 1)
Beispiel #7
0
    def parse(self, payload, opts):
        Packet.parse(self, payload, opts)
        self.bloom_filter_capacity, = struct.unpack('<I', payload.read(4))
        self.fpr, = struct.unpack('<I', payload.read(4))
        self.fpr /= self.fpr_mul
        self.bloom_filter = decodeVarString(payload)

        self.iblt_m, = struct.unpack('<I', payload.read(4))
        self.iblt_T = []
        for i in range(self.iblt_m):
            count, = struct.unpack('<I', payload.read(4))
            key_sum, = struct.unpack('<32s', payload.read(32))
            # value_sum, = struct.unpack('<32s', payload.read(32))
            value_sum = b''
            key_hash_sum, = struct.unpack('<10s', payload.read(10))
            self.iblt_T.append([
                count,
                self.to_bitarray(key_sum),
                self.to_bitarray(value_sum),
                self.to_bitarray(key_hash_sum)
            ])
Beispiel #8
0
    def parse(self, payload, opts):
        Packet.parse(self, payload, opts)

        self.version, = struct.unpack("<I", payload.read(4))
        txInputCount = decodeVarLength(payload)
        if txInputCount == 0:
            return self.parseSegwit(payload, opts)

        for _i in range(0, txInputCount):
            prev_out = (payload.read(32)[::-1],
                        struct.unpack("<I", payload.read(4))[0])
            script_length = decodeVarLength(payload)
            script = payload.read(script_length)
            sequence, = struct.unpack("<I", payload.read(4))
            self.inputs.append((prev_out, script, sequence))

        txOutputCount = decodeVarLength(payload)
        for _i in range(0, txOutputCount):
            value, = struct.unpack("<Q", payload.read(8))
            script = decodeVarString(payload)
            self.outputs.append((value, script))
        self.lock_time, = struct.unpack("<I", payload.read(4))
        return True