From 001ca775a98e58747cf13b945cc42309c2849127 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 26 Feb 2023 11:36:47 +0000 Subject: [PATCH] descriptor.py: speed-up DescriptorChecksum a bit --- electrum/descriptor.py | 15 +++++++++------ electrum/segwit_addr.py | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/electrum/descriptor.py b/electrum/descriptor.py index ca3ba9118..fa7aa1354 100644 --- a/electrum/descriptor.py +++ b/electrum/descriptor.py @@ -46,6 +46,11 @@ def PolyMod(c: int, val: int) -> int: c ^= 0x644d626ffd return c + +_INPUT_CHARSET = "0123456789()[],'/*abcdefgh@:$%{}IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~ijklmnopqrstuvwxyzABCDEFGH`#\"\\ " +_INPUT_CHARSET_INV = {c: i for (i, c) in enumerate(_INPUT_CHARSET)} +_CHECKSUM_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + def DescriptorChecksum(desc: str) -> str: """ Compute the checksum for a descriptor @@ -53,15 +58,13 @@ def DescriptorChecksum(desc: str) -> str: :param desc: The descriptor string to compute a checksum for :return: A checksum """ - INPUT_CHARSET = "0123456789()[],'/*abcdefgh@:$%{}IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~ijklmnopqrstuvwxyzABCDEFGH`#\"\\ " - CHECKSUM_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" - c = 1 cls = 0 clscount = 0 for ch in desc: - pos = INPUT_CHARSET.find(ch) - if pos == -1: + try: + pos = _INPUT_CHARSET_INV[ch] + except KeyError: return "" c = PolyMod(c, pos & 31) cls = cls * 3 + (pos >> 5) @@ -78,7 +81,7 @@ def DescriptorChecksum(desc: str) -> str: ret = [''] * 8 for j in range(0, 8): - ret[j] = CHECKSUM_CHARSET[(c >> (5 * (7 - j))) & 31] + ret[j] = _CHECKSUM_CHARSET[(c >> (5 * (7 - j))) & 31] return ''.join(ret) def AddChecksum(desc: str) -> str: diff --git a/electrum/segwit_addr.py b/electrum/segwit_addr.py index b13a9175e..9d121c3b9 100644 --- a/electrum/segwit_addr.py +++ b/electrum/segwit_addr.py @@ -25,7 +25,7 @@ from enum import Enum from typing import Tuple, Optional, Sequence, NamedTuple, List CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" -_CHARSET_INVERSE = {x: CHARSET.find(x) for x in CHARSET} +_CHARSET_INVERSE = {c: i for (i, c) in enumerate(CHARSET)} BECH32_CONST = 1 BECH32M_CONST = 0x2bc830a3