示例#1
0
    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])
示例#2
0
    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])
示例#3
0
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
示例#4
0
    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_
示例#6
0
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