Skip to content

Commit

Permalink
Namecoin: Fix Merkle exception handling in Buy Names tab
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeremy Rand committed Sep 27, 2022
1 parent 95dd8f9 commit 76f6280
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 5 deletions.
7 changes: 7 additions & 0 deletions electrum_nmc/electrum/gui/qt/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
from electrum.bitcoin import COIN, is_address
from electrum.plugin import run_hook, BasePlugin
from electrum.i18n import _
from electrum.merkle import MerkleVerificationFailure
from electrum.names import format_name_identifier, get_wallet_name_count, name_new_mature_in
from electrum.util import (format_time,
UserCancelled, profiler,
Expand Down Expand Up @@ -3470,6 +3471,12 @@ def check_name_availability(self):
msg = repr(e)
self.show_error(msg)
return
except MerkleVerificationFailure:
# Merkle proof from ElectrumX was invalid
self.buy_names_register_button.hide()
self.buy_names_buy_button.hide()
self.buy_names_status_label.setText(_("Merkle verification failure while checking name availability. If this persists, try switching servers."))
return

if chain_syncing:
self.buy_names_register_button.hide()
Expand Down
7 changes: 4 additions & 3 deletions electrum_nmc/electrum/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
from . import blockchain
from .blockchain import Blockchain, HeaderChunk, HEADER_SIZE
from . import bitcoin
from .merkle import hash_merkle_root
from .merkle import hash_merkle_root, MerkleRootMismatch
from . import constants
from .i18n import _
from .logging import Logger
Expand Down Expand Up @@ -253,6 +253,7 @@ class ErrorSSLCertFingerprintMismatch(Exception): pass
class InvalidOptionCombination(Exception): pass
class ConnectError(NetworkException): pass

class CheckpointMerkleRootMismatch(MerkleRootMismatch): pass

class _RSClient(RSClient):
async def create_connection(self):
Expand Down Expand Up @@ -784,12 +785,12 @@ def validate_checkpoint_result(self, received_merkle_root, merkle_branch, header
expected_merkle_root = constants.net.CHECKPOINTS['merkle_root']

if received_merkle_root != expected_merkle_root:
raise Exception("Sent unexpected merkle root, expected: {}, got: {}".format(expected_merkle_root, received_merkle_root))
raise CheckpointMerkleRootMismatch("Sent unexpected merkle root, expected: {}, got: {}".format(expected_merkle_root, received_merkle_root))

header_hash = hash_encode(sha256d(bfh(header)))
proven_merkle_root = hash_merkle_root(merkle_branch, header_hash, header_height, reject_valid_tx=False)
if proven_merkle_root != expected_merkle_root:
raise Exception("Sent incorrect merkle branch, expected: {}, proved: {}".format(constants.net.CHECKPOINTS['merkle_root'], proven_merkle_root))
raise CheckpointMerkleRootMismatch("Sent incorrect merkle branch, expected: {}, proved: {}".format(constants.net.CHECKPOINTS['merkle_root'], proven_merkle_root))

def is_main_server(self) -> bool:
return self.network.default_server == self.server
Expand Down
1 change: 1 addition & 0 deletions electrum_nmc/electrum/merkle.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

class MerkleVerificationFailure(Exception): pass
class InnerNodeOfSpvProofIsValidTx(MerkleVerificationFailure): pass
class MerkleRootMismatch(MerkleVerificationFailure): pass

def hash_merkle_root(merkle_branch: Sequence[str], tx_hash: str, leaf_pos_in_tree: int, reject_valid_tx: bool=True):
"""Return calculated merkle root."""
Expand Down
3 changes: 1 addition & 2 deletions electrum_nmc/electrum/verifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from .blockchain import hash_header
from .interface import GracefulDisconnect
from .network import UntrustedServerReturnedError
from .merkle import hash_merkle_root, MerkleVerificationFailure
from .merkle import hash_merkle_root, MerkleVerificationFailure, MerkleRootMismatch
from . import constants

if TYPE_CHECKING:
Expand All @@ -43,7 +43,6 @@


class MissingBlockHeader(MerkleVerificationFailure): pass
class MerkleRootMismatch(MerkleVerificationFailure): pass


class SPV(NetworkJobOnDefaultServer):
Expand Down

0 comments on commit 76f6280

Please sign in to comment.