tSend dummy merkleproof that configured Electrum can accept - electrum-personal-server - Maximally lightweight electrum server for a single user HTML git clone https://git.parazyd.org/electrum-personal-server DIR Log DIR Files DIR Refs DIR README --- DIR commit 6243c955e16be84893138c59a0bd642ada35a48b DIR parent c2d076c007bb5654856163f16f181b0371adee4c HTML Author: chris-belcher <chris-belcher@users.noreply.github.com> Date: Mon, 1 Apr 2019 21:06:15 +0100 Send dummy merkleproof that configured Electrum can accept Diffstat: M config.cfg_sample | 5 +++-- M electrumpersonalserver/server/comm… | 40 ++++++++++++++++++------------- 2 files changed, 26 insertions(+), 19 deletions(-) --- DIR diff --git a/config.cfg_sample b/config.cfg_sample t@@ -27,9 +27,10 @@ [bitcoin-rpc] host = 127.0.0.1 port = 8332 -#empty means look in the default location +#add the bitcoin datadir to search for the .cookie file created by the node, which avoids the +# need to configure rpc_user/pass, leave empty to have it look in the default location datadir = -#if you dont want to use the .cookie method, uncomment to config u/p here +#if you dont want to use the .cookie method with datadir, uncomment to config u/p here #rpc_user = #rpc_password = DIR diff --git a/electrumpersonalserver/server/common.py b/electrumpersonalserver/server/common.py t@@ -133,24 +133,30 @@ def handle_query(sock, line, rpc, txmonitor): txid = query["params"][0] try: tx = rpc.call("gettransaction", [txid]) - core_proof = rpc.call("gettxoutproof", [[txid], tx["blockhash"]]) - electrum_proof = merkleproof.convert_core_to_electrum_merkle_proof( - core_proof) - implied_merkle_root = hashes.hash_merkle_root( - electrum_proof["merkle"], txid, electrum_proof["pos"]) - if implied_merkle_root != electrum_proof["merkleroot"]: - raise ValueError txheader = get_block_header(rpc, tx["blockhash"], False) - reply = {"block_height": txheader["block_height"], "pos": - electrum_proof["pos"], "merkle": electrum_proof["merkle"]} - except (ValueError, JsonRpcError) as e: - logger.warning("merkle proof failed for " + txid + " err=" + - repr(e)) - #so reply with an invalid proof which electrum handles without - # disconnecting us - #https://github.com/spesmilo/electrum/blob/c8e67e2bd07efe042703bc1368d499c5e555f854/lib/verifier.py#L74 - reply = {"block_height": 1, "pos": 0, "merkle": [txid]} - send_response(sock, query, reply) + except JsonRpcError as e: + send_error(sock, query["id"], {"message": "txid not found"}) + else: + try: + core_proof = rpc.call("gettxoutproof", [[txid], + tx["blockhash"]]) + electrum_proof = merkleproof.\ + convert_core_to_electrum_merkle_proof(core_proof) + implied_merkle_root = hashes.hash_merkle_root( + electrum_proof["merkle"], txid, electrum_proof["pos"]) + if implied_merkle_root != electrum_proof["merkleroot"]: + raise ValueError + reply = {"block_height": txheader["block_height"], "pos": + electrum_proof["pos"], "merkle": electrum_proof["merkle"]} + except (ValueError, JsonRpcError) as e: + logger.notice("merkle proof not found for " + txid + " sending" + + " a dummy, Electrum client should be run with " + + "--skipmerklecheck") + #reply with a proof that the client with accept if + # its configured to not check the merkle proof + reply = {"block_height": txheader["block_height"], "pos": 0, + "merkle": [txid]} + send_response(sock, query, reply) elif method == "blockchain.scripthash.subscribe": scrhash = query["params"][0] if txmonitor.subscribe_address(scrhash):