ttransaction.py: more flexible sign() method - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 05e5ef16eb0b11f580ded5ad5501316888f97d26 (DIR) parent 5d7157451fb47ffda8704d253e941a29a82cefcd (HTM) Author: SomberNight <somber.night@protonmail.com> Date: Thu, 14 Jun 2018 15:11:20 +0200 ttransaction.py: more flexible sign() method handles both x_pubkeys and pubkeys in keypairs Diffstat: M lib/transaction.py | 37 +++++++++++++++++-------------- M lib/wallet.py | 5 ++--- 2 files changed, 22 insertions(+), 20 deletions(-) --- (DIR) diff --git a/lib/transaction.py b/lib/transaction.py t@@ -1090,29 +1090,32 @@ class Transaction: s, r = self.signature_count() return r == s - def sign(self, keypairs): + def sign(self, keypairs) -> None: + # keypairs: (x_)pubkey -> secret_bytes for i, txin in enumerate(self.inputs()): - num = txin['num_sig'] pubkeys, x_pubkeys = self.get_sorted_pubkeys(txin) - for j, x_pubkey in enumerate(x_pubkeys): - signatures = list(filter(None, txin['signatures'])) - if len(signatures) == num: - # txin is complete + for j, (pubkey, x_pubkey) in enumerate(zip(pubkeys, x_pubkeys)): + if self.is_txin_complete(txin): break - if x_pubkey in keypairs.keys(): - print_error("adding signature for", x_pubkey) - sec, compressed = keypairs.get(x_pubkey) - pubkey = ecc.ECPrivkey(sec).get_public_key_hex(compressed=compressed) - # add signature - sig = self.sign_txin(i, sec) - self.add_signature_to_txin(txin, j, sig) - #txin['x_pubkeys'][j] = pubkey - txin['pubkeys'][j] = pubkey # needed for fd keys - self._inputs[i] = txin + if pubkey in keypairs: + _pubkey = pubkey + elif x_pubkey in keypairs: + _pubkey = x_pubkey + else: + continue + print_error("adding signature for", _pubkey) + sec, compressed = keypairs.get(_pubkey) + # pubkey might not actually be a 02-04 pubkey for fd keys; so: + pubkey = ecc.ECPrivkey(sec).get_public_key_hex(compressed=compressed) + # add signature + sig = self.sign_txin(i, sec) + self.add_signature_to_txin(txin, j, sig) + txin['pubkeys'][j] = pubkey # needed for fd keys + self._inputs[i] = txin print_error("is_complete", self.is_complete()) self.raw = self.serialize() - def sign_txin(self, txin_index, privkey_bytes): + def sign_txin(self, txin_index, privkey_bytes) -> str: pre_hash = Hash(bfh(self.serialize_preimage(txin_index))) privkey = ecc.ECPrivkey(privkey_bytes) sig = privkey.sign_transaction(pre_hash) (DIR) diff --git a/lib/wallet.py b/lib/wallet.py t@@ -1220,9 +1220,8 @@ class Abstract_Wallet(PrintError): if fixed_fee is None and config.fee_per_kb() is None: raise NoDynamicFeeEstimates() - if not is_sweep: - for item in inputs: - self.add_input_info(item) + for item in inputs: + self.add_input_info(item) # change address if change_addr: