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
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
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
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)
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)
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) ])
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