Skip to content

wallet_db: put 'genesis_blockhash' in DB, detect mainnet/testnet mixup. (db upgrade)#10592

Merged
SomberNight merged 2 commits intospesmilo:masterfrom
SomberNight:202604_testnet_mainnet_mixup2
Apr 24, 2026
Merged

wallet_db: put 'genesis_blockhash' in DB, detect mainnet/testnet mixup. (db upgrade)#10592
SomberNight merged 2 commits intospesmilo:masterfrom
SomberNight:202604_testnet_mainnet_mixup2

Conversation

@SomberNight
Copy link
Copy Markdown
Member

If the user tries to open a wallet for a different chain (mainnet vs testnet), try to show a reasonable error message.

See previous attempt at this: c13e057, which added wallet.test_addresses_sanity(). However there are many codepaths where "random" exceptions might get raised before the Wallet object is even instantiated.

See discussion there:

should we actually fix that?
if yes, it would be better to write the network type in storage

Indeed now I think we should do that. At the time I was concerned it would not help against altcoin forks if we put "mainnet" or "testnet" in the DB. Now I realise we should just put the genesis block hash in the DB instead.

If the user tries to open a wallet for a different chain (mainnet vs testnet), try to show a reasonable error message.

See previous attempt at this: spesmilo@c13e057, which added `wallet.test_addresses_sanity()`. However there are many codepaths where "random" exceptions might get raised before the Wallet object is even instantiated.
See [discussion there](spesmilo@c13e057#commitcomment-28017341):
> should we actually fix that?
> if yes, it would be better to write the network type in storage

Indeed now I think we should do that. At the time I was concerned it would not help against altcoin forks if we put "mainnet" or "testnet" in the DB. Now I realise we should just put the genesis block hash in the DB instead.

Many of the reports in spesmilo#6526 are likely due to users trying to open a mainnet wallet in testnet mode or vice-versa.

fixes spesmilo#9134
    same issue in wizard 2fa two-step wallet-creation flow
Comment thread electrum/wallet.py
self.up_to_date_changed_event = asyncio.Event()

self.test_addresses_sanity()
assert self.db.get('genesis_blockhash') == constants.net.GENESIS, self.db.get('genesis_blockhash')
Copy link
Copy Markdown
Member

@f321x f321x Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this AssertionError gets caught in ElectrumGui.start_new_window() and shown as warning dialog instead of being forwarded to the crash reporter.
We should probably modify start_new_window() for the regular wallet loading case similar to the change done here for wizard exceptions: 457a092

Edit: opened a PR for this: #10605

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I did not think it possible to trigger this assert -- in theory the same check in WalletDB.upgrade_wallet_db should raise before we get here.
Is that not the case?

Copy link
Copy Markdown
Member

@f321x f321x Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah i was just manually modifying the db for testing purposes. I just think that in general it would make sense to send unexpected exceptions coming from load_wallet to the crash reporter (though this is not directly related to this PR)

@f321x
Copy link
Copy Markdown
Member

f321x commented Apr 24, 2026

Tested/reviewed 68e6995, works as intended.

@SomberNight SomberNight merged commit e96b833 into spesmilo:master Apr 24, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment