tMerge pull request #3125 from SomberNight/sweep_p2pk - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 6f3c822867bd512e276ef63ad7b8c2af2fa40927 DIR parent 7dcd01356a10b632516742a86b9d8c6251e9f70a HTML Author: ThomasV <thomasv@electrum.org> Date: Fri, 27 Oct 2017 21:01:56 +0200 Merge pull request #3125 from SomberNight/sweep_p2pk ttry to sweep p2pk outputs from old type WIF privkeys Diffstat: M lib/bitcoin.py | 3 +++ M lib/wallet.py | 41 ++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 15 deletions(-) --- DIR diff --git a/lib/bitcoin.py b/lib/bitcoin.py t@@ -411,6 +411,9 @@ def address_to_script(addr): def address_to_scripthash(addr): script = address_to_script(addr) + return script_to_scripthash(script) + +def script_to_scripthash(script): h = sha256(bytes.fromhex(script))[0:32] return bh2u(bytes(reversed(h))) DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -870,27 +870,38 @@ class Abstract_Wallet(PrintError): self.sign_transaction(tx, password) return tx + def _append_utxos_to_inputs(self, inputs, network, pubkey, txin_type, imax): + address = None + if txin_type != 'p2pk': + address = bitcoin.pubkey_to_address(txin_type, pubkey) + sh = bitcoin.address_to_scripthash(address) + else: + script = bitcoin.public_key_to_p2pk_script(pubkey) + sh = bitcoin.script_to_scripthash(script) + u = network.synchronous_get(('blockchain.scripthash.listunspent', [sh])) + for item in u: + if len(inputs) >= imax: + break + if address is not None: + item['address'] = address + item['type'] = txin_type + item['prevout_hash'] = item['tx_hash'] + item['prevout_n'] = item['tx_pos'] + item['pubkeys'] = [pubkey] + item['x_pubkeys'] = [pubkey] + item['signatures'] = [None] + item['num_sig'] = 1 + inputs.append(item) + def sweep(self, privkeys, network, config, recipient, fee=None, imax=100): inputs = [] keypairs = {} for sec in privkeys: txin_type, privkey, compressed = bitcoin.deserialize_privkey(sec) pubkey = bitcoin.public_key_from_private_key(privkey, compressed) - address = bitcoin.pubkey_to_address(txin_type, pubkey) - sh = bitcoin.address_to_scripthash(address) - u = network.synchronous_get(('blockchain.scripthash.listunspent', [sh])) - for item in u: - if len(inputs) >= imax: - break - item['type'] = txin_type - item['address'] = address - item['prevout_hash'] = item['tx_hash'] - item['prevout_n'] = item['tx_pos'] - item['pubkeys'] = [pubkey] - item['x_pubkeys'] = [pubkey] - item['signatures'] = [None] - item['num_sig'] = 1 - inputs.append(item) + self._append_utxos_to_inputs(inputs, network, pubkey, txin_type, imax) + if txin_type == 'p2pkh': # WIF serialization is ambiguous :( + self._append_utxos_to_inputs(inputs, network, pubkey, 'p2pk', imax) keypairs[pubkey] = privkey, compressed if not inputs: