def serialize(self, check_validity: bool = True) -> bytes: "Return the serialization of the Witness." if check_validity: self.assert_valid() out = var_int.serialize(len(self.stack)) return out + b"".join([var_bytes.serialize(w) for w in self.stack])
def serialize(self, include_witness: bool = True, check_validity: bool = True) -> bytes: if check_validity: self.assert_valid() out = self.header.serialize() out += var_int.serialize(len(self.transactions)) return out + b"".join( [t.serialize(include_witness) for t in self.transactions])
def deserialize_map(psbt_bin: bytes) -> Tuple[Dict[bytes, bytes], bytes]: if len(psbt_bin) == 0: raise BTClibValueError("malformed psbt: at least a map is missing") partial_map: Dict[bytes, bytes] = {} while True: if psbt_bin[0] == 0: psbt_bin = psbt_bin[1:] return partial_map, psbt_bin key_len = var_int.parse(psbt_bin) psbt_bin = psbt_bin[len(var_int.serialize(key_len)):] key = psbt_bin[:key_len] psbt_bin = psbt_bin[key_len:] value_len = var_int.parse(psbt_bin) psbt_bin = psbt_bin[len(var_int.serialize(value_len)):] value = psbt_bin[:value_len] psbt_bin = psbt_bin[value_len:] if key in partial_map: raise BTClibValueError( f"duplicated key in psbt map: 0x{key.hex()}") partial_map[key] = value
def serialize(self, include_witness: bool, check_validity: bool = True) -> bytes: if check_validity: self.assert_valid() segwit = include_witness and self.is_segwit() return b"".join([ self.version.to_bytes(4, byteorder="little", signed=False), _SEGWIT_MARKER if segwit else b"", var_int.serialize(len(self.vin)), b"".join(tx_in.serialize(check_validity) for tx_in in self.vin), var_int.serialize(len(self.vout)), b"".join(tx_out.serialize(check_validity) for tx_out in self.vout), b"".join( tx_in.script_witness.serialize(check_validity) for tx_in in self.vin) if segwit else b"", self.lock_time.to_bytes(4, byteorder="little", signed=False), ])
def serialize(octets: Octets) -> bytes: "Return the var_int(len(octets)) + octets serialization of octets." bytes_ = bytes_from_octets(octets) return var_int.serialize(len(bytes_)) + bytes_
def test_var_int_conversion() -> None: int_ = -1 with pytest.raises(BTClibValueError, match="negative integer: "): var_int.serialize(int_) int_ = 0x00 bytes_ = var_int.serialize(int_) assert len(bytes_) == 1 assert var_int.parse(bytes_) == int_ int_ += 1 bytes_ = var_int.serialize(int_) assert len(bytes_) == 1 assert var_int.parse(bytes_) == int_ int_ = 0xFC bytes_ = var_int.serialize(int_) assert len(bytes_) == 1 assert var_int.parse(bytes_) == int_ int_ += 1 bytes_ = var_int.serialize(int_) assert len(bytes_) == 3 assert var_int.parse(bytes_) == int_ int_ = 0xFFFF bytes_ = var_int.serialize(int_) assert len(bytes_) == 3 assert var_int.parse(bytes_) == int_ int_ += 1 bytes_ = var_int.serialize(int_) assert len(bytes_) == 5 assert var_int.parse(bytes_) == int_ int_ = 0xFFFFFFFF bytes_ = var_int.serialize(int_) assert len(bytes_) == 5 assert var_int.parse(bytes_) == int_ int_ += 1 bytes_ = var_int.serialize(int_) assert len(bytes_) == 9 assert var_int.parse(bytes_) == int_ int_ = 0xFFFFFFFFFFFFFFFF bytes_ = var_int.serialize(int_) assert len(bytes_) == 9 assert var_int.parse(bytes_) == int_ int_ += 1 with pytest.raises(BTClibValueError, match="integer too big for var_int encoding: "): var_int.serialize(int_) assert var_int.parse("6a") == 106 assert var_int.parse("fd2602") == 550 assert var_int.parse("fe703a0f00") == 998000