1
0

interface: check genesis hash on connection

Prevents the client from accidentally connecting to a server on a
different network.
I noticed its possible to connect to mainnet servers on a signet
instance causing the recent peers to get populated with mainnet peers
rendering the wallet instance barely usable. Doing this check should
prevent this and similar issues.
This commit is contained in:
f321x
2025-10-27 16:11:30 +01:00
parent 4bce545c26
commit ff2bbf159e
2 changed files with 21 additions and 0 deletions

View File

@@ -964,6 +964,14 @@ class Interface(Logger):
if not self.network.check_interface_against_healthy_spread_of_connected_servers(self):
raise GracefulDisconnect(f'too many connected servers already '
f'in bucket {self.bucket_based_on_ipaddress()}')
try:
features = await session.send_request('server.features')
server_genesis_hash = assert_dict_contains_field(features, field_name='genesis_hash')
except (aiorpcx.jsonrpc.RPCError, RequestCorrupted) as e:
raise GracefulDisconnect(e)
if server_genesis_hash != constants.net.GENESIS:
raise GracefulDisconnect(f'server on different chain: {server_genesis_hash=}. ours: {constants.net.GENESIS}')
self.logger.info(f"connection established. version: {ver}")
try:

View File

@@ -11,6 +11,7 @@ from electrum.util import OldTaskGroup, bfh
from electrum.logging import Logger
from electrum.simple_config import SimpleConfig
from electrum.transaction import Transaction
from electrum import constants
from . import ElectrumTestCase
@@ -130,6 +131,7 @@ class ServerSession(aiorpcx.RPCSession, Logger):
async def handle_request(self, request):
handlers = {
'server.version': self._handle_server_version,
'server.features': self._handle_server_features,
'blockchain.estimatefee': self._handle_estimatefee,
'blockchain.headers.subscribe': self._handle_headers_subscribe,
'blockchain.block.header': self._handle_block_header,
@@ -146,6 +148,17 @@ class ServerSession(aiorpcx.RPCSession, Logger):
async def _handle_server_version(self, client_name='', protocol_version=None):
return ['best_server_impl/0.1', '1.4']
async def _handle_server_features(self) -> dict:
return {
'genesis_hash': constants.net.GENESIS,
'hosts': {"14.3.140.101": {"tcp_port": 51001, "ssl_port": 51002}},
'protocol_max': '1.7.0',
'protocol_min': '1.4.3',
'pruning': None,
'server_version': 'ElectrumX 1.19.0',
'hash_function': 'sha256',
}
async def _handle_estimatefee(self, number, mode=None):
return 1000