From e5beacc11e58174fc11468ea0b420fe365ec1a5c Mon Sep 17 00:00:00 2001 From: pythcoiner Date: Sat, 21 Dec 2024 19:25:51 +0100 Subject: [PATCH 1/3] tap_key_sig --- src/embit/psbt.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/embit/psbt.py b/src/embit/psbt.py index 54497c2..17db831 100644 --- a/src/embit/psbt.py +++ b/src/embit/psbt.py @@ -142,6 +142,7 @@ def __init__(self, unknown: dict = {}, vin=None, compress=CompressMode.KEEP_ALL) self.taproot_bip32_derivations = OrderedDict() self.taproot_internal_key = None self.taproot_merkle_root = None + self.taproot_key_sig = None self.taproot_sigs = OrderedDict() self.taproot_scripts = OrderedDict() @@ -434,6 +435,9 @@ def write_to(self, stream, skip_separator=False, version=None, **kwargs) -> int: r += ser_string(stream, b"\x10") r += ser_string(stream, self.sequence.to_bytes(4, "little")) + # PSBT_IN_TAP_KEY_SIG + r += ser_string(stream, b"\x13" + self.taproot_key_sig.serialize()) + # PSBT_IN_TAP_SCRIPT_SIG for pub, leaf in self.taproot_sigs: r += ser_string(stream, b"\x14" + pub.xonly() + leaf) @@ -884,7 +888,7 @@ def sign_input_with_tapkey( wit = sig.serialize() if sighash != SIGHASH.DEFAULT: wit += bytes([sighash]) - # TODO: maybe better to put into internal key sig field + inp.taproot_key_sig = sig inp.final_scriptwitness = Witness([wit]) # no need to sign anything else return 1 From 638a82466253fa08365c74a8fe9f579b84e224bf Mon Sep 17 00:00:00 2001 From: odudex Date: Sat, 21 Dec 2024 19:29:49 -0300 Subject: [PATCH 2/3] taproot_key_sig serialization adjust --- src/embit/psbt.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/embit/psbt.py b/src/embit/psbt.py index 17db831..b95c974 100644 --- a/src/embit/psbt.py +++ b/src/embit/psbt.py @@ -188,6 +188,7 @@ def update(self, other): self.taproot_bip32_derivations.update(other.taproot_bip32_derivations) self.taproot_internal_key = other.taproot_internal_key self.taproot_merkle_root = other.taproot_merkle_root or self.taproot_merkle_root + self.taproot_key_sig = other.taproot_key_sig or self.taproot_key_sig self.taproot_sigs.update(other.taproot_sigs) self.taproot_scripts.update(other.taproot_scripts) self.final_scriptsig = other.final_scriptsig or self.final_scriptsig @@ -436,8 +437,10 @@ def write_to(self, stream, skip_separator=False, version=None, **kwargs) -> int: r += ser_string(stream, self.sequence.to_bytes(4, "little")) # PSBT_IN_TAP_KEY_SIG - r += ser_string(stream, b"\x13" + self.taproot_key_sig.serialize()) - + if self.taproot_key_sig is not None: + r += ser_string(stream, b"\x13") + r += ser_string(stream, self.taproot_key_sig) + # PSBT_IN_TAP_SCRIPT_SIG for pub, leaf in self.taproot_sigs: r += ser_string(stream, b"\x14" + pub.xonly() + leaf) @@ -885,11 +888,11 @@ def sign_input_with_tapkey( sighash=sighash, ) sig = pk.schnorr_sign(h) - wit = sig.serialize() + sigdata = sig.serialize() if sighash != SIGHASH.DEFAULT: - wit += bytes([sighash]) - inp.taproot_key_sig = sig - inp.final_scriptwitness = Witness([wit]) + sigdata += bytes([sighash]) + inp.taproot_key_sig = sigdata + inp.final_scriptwitness = Witness([sigdata]) # no need to sign anything else return 1 counter = 0 From ef61cca5e9dfd42867bec0126473aad33c93cda3 Mon Sep 17 00:00:00 2001 From: odudex Date: Thu, 30 Jan 2025 10:58:58 -0300 Subject: [PATCH 3/3] Add PSBT_IN_TAP_KEY_SIG parsing to the InputScope read_value function --- src/embit/psbt.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/embit/psbt.py b/src/embit/psbt.py index b95c974..0d7b095 100644 --- a/src/embit/psbt.py +++ b/src/embit/psbt.py @@ -352,7 +352,15 @@ def read_value(self, stream, k): elif k == b"\x10": self.sequence = int.from_bytes(v, "little") - # TODO: 0x13 - tap key signature + # PSBT_IN_TAP_KEY_SIG + elif k[0] == 0x13: + # read the taproot key sig + if len(k) != 1: + raise PSBTError("Invalid taproot key signature key") + if self.taproot_key_sig is not None: + raise PSBTError("Duplicated taproot key signature") + self.taproot_key_sig = v + # PSBT_IN_TAP_SCRIPT_SIG elif k[0] == 0x14: if len(k) != 65: