Browse Source

descriptor.py: add a dozen TODOs

master
SomberNight 3 years ago
parent
commit
8f8dd1506e
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 42
      electrum/descriptor.py

42
electrum/descriptor.py

@ -7,15 +7,28 @@
# Output Script Descriptors # Output Script Descriptors
# See https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md # See https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md
# #
# TODO allow xprv
# TODO allow WIF privkeys
# TODO impl ADDR descriptors
# TODO impl RAW descriptors
# TODO disable descs we cannot solve: TRDescriptor
#
# TODO tests
# - port https://github.com/bitcoin-core/HWI/blob/master/test/test_descriptor.py
# - ranged descriptors (that have a "*")
#
# TODO solver? integrate with transaction.py...
# Transaction.input_script/get_preimage_script/serialize_witness
from .bip32 import convert_bip32_path_to_list_of_uint32, BIP32Node, KeyOriginInfo from .bip32 import convert_bip32_path_to_list_of_uint32, BIP32Node, KeyOriginInfo
from .crypto import hash_160, sha256 from .crypto import hash_160, sha256
from binascii import unhexlify from binascii import unhexlify
from collections import namedtuple
from enum import Enum from enum import Enum
from typing import ( from typing import (
List, List,
NamedTuple,
Optional, Optional,
Tuple, Tuple,
) )
@ -24,7 +37,11 @@ from typing import (
MAX_TAPROOT_NODES = 128 MAX_TAPROOT_NODES = 128
ExpandedScripts = namedtuple("ExpandedScripts", ["output_script", "redeem_script", "witness_script"]) class ExpandedScripts(NamedTuple):
output_script: Optional[bytes] = None
redeem_script: Optional[bytes] = None
witness_script: Optional[bytes] = None
def PolyMod(c: int, val: int) -> int: def PolyMod(c: int, val: int) -> int:
""" """
@ -114,6 +131,7 @@ class PubkeyProvider(object):
self.origin = origin self.origin = origin
self.pubkey = pubkey self.pubkey = pubkey
self.deriv_path = deriv_path self.deriv_path = deriv_path
# TODO check that deriv_path only has a single "*" (and that it is in the last pos. but can end with e.g. "*h")
# Make ExtendedKey from pubkey if it isn't hex # Make ExtendedKey from pubkey if it isn't hex
self.extkey = None self.extkey = None
@ -270,6 +288,9 @@ class PKDescriptor(Descriptor):
""" """
super().__init__([pubkey], [], "pk") super().__init__([pubkey], [], "pk")
# TODO
# def expand(self, pos: int) -> "ExpandedScripts":
class PKHDescriptor(Descriptor): class PKHDescriptor(Descriptor):
""" """
@ -286,7 +307,7 @@ class PKHDescriptor(Descriptor):
def expand(self, pos: int) -> "ExpandedScripts": def expand(self, pos: int) -> "ExpandedScripts":
script = b"\x76\xa9\x14" + hash_160(self.pubkeys[0].get_pubkey_bytes(pos)) + b"\x88\xac" script = b"\x76\xa9\x14" + hash_160(self.pubkeys[0].get_pubkey_bytes(pos)) + b"\x88\xac"
return ExpandedScripts(script, None, None) return ExpandedScripts(output_script=script)
class WPKHDescriptor(Descriptor): class WPKHDescriptor(Descriptor):
@ -304,7 +325,7 @@ class WPKHDescriptor(Descriptor):
def expand(self, pos: int) -> "ExpandedScripts": def expand(self, pos: int) -> "ExpandedScripts":
script = b"\x00\x14" + hash_160(self.pubkeys[0].get_pubkey_bytes(pos)) script = b"\x00\x14" + hash_160(self.pubkeys[0].get_pubkey_bytes(pos))
return ExpandedScripts(script, None, None) return ExpandedScripts(output_script=script)
class MultisigDescriptor(Descriptor): class MultisigDescriptor(Descriptor):
@ -345,7 +366,7 @@ class MultisigDescriptor(Descriptor):
script += len(pk).to_bytes(1, "big") + pk script += len(pk).to_bytes(1, "big") + pk
script += n + b"\xae" script += n + b"\xae"
return ExpandedScripts(script, None, None) return ExpandedScripts(output_script=script)
class SHDescriptor(Descriptor): class SHDescriptor(Descriptor):
@ -365,7 +386,11 @@ class SHDescriptor(Descriptor):
assert len(self.subdescriptors) == 1 assert len(self.subdescriptors) == 1
redeem_script, _, witness_script = self.subdescriptors[0].expand(pos) redeem_script, _, witness_script = self.subdescriptors[0].expand(pos)
script = b"\xa9\x14" + hash_160(redeem_script) + b"\x87" script = b"\xa9\x14" + hash_160(redeem_script) + b"\x87"
return ExpandedScripts(script, redeem_script, witness_script) return ExpandedScripts(
output_script=script,
redeem_script=redeem_script,
witness_script=witness_script,
)
class WSHDescriptor(Descriptor): class WSHDescriptor(Descriptor):
@ -385,7 +410,10 @@ class WSHDescriptor(Descriptor):
assert len(self.subdescriptors) == 1 assert len(self.subdescriptors) == 1
witness_script, _, _ = self.subdescriptors[0].expand(pos) witness_script, _, _ = self.subdescriptors[0].expand(pos)
script = b"\x00\x20" + sha256(witness_script) script = b"\x00\x20" + sha256(witness_script)
return ExpandedScripts(script, None, witness_script) return ExpandedScripts(
output_script=script,
witness_script=witness_script,
)
class TRDescriptor(Descriptor): class TRDescriptor(Descriptor):

Loading…
Cancel
Save