mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-26 22:04:07 +02:00
bench, wallet: Make WalletMigration's setup WalletBatch scoped
WalletBatch needs to be in a scope so that it is destroyed before the database is closed during migration.
This commit is contained in:
@@ -29,40 +29,42 @@ static void WalletMigration(benchmark::Bench& bench)
|
||||
|
||||
// Setup legacy wallet
|
||||
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(test_setup->m_node.chain.get(), "", CreateMockableWalletDatabase());
|
||||
LegacyDataSPKM* legacy_spkm = wallet->GetOrCreateLegacyDataSPKM();
|
||||
WalletBatch batch{wallet->GetDatabase()};
|
||||
{
|
||||
LegacyDataSPKM* legacy_spkm = wallet->GetOrCreateLegacyDataSPKM();
|
||||
WalletBatch batch{wallet->GetDatabase()};
|
||||
|
||||
// Write a best block record as migration expects one to exist
|
||||
CBlockLocator loc;
|
||||
batch.WriteBestBlock(loc);
|
||||
// Write a best block record as migration expects one to exist
|
||||
CBlockLocator loc;
|
||||
batch.WriteBestBlock(loc);
|
||||
|
||||
// Add watch-only addresses
|
||||
std::vector<CScript> scripts_watch_only;
|
||||
for (int w = 0; w < NUM_WATCH_ONLY_ADDR; ++w) {
|
||||
CKey key = GenerateRandomKey();
|
||||
LOCK(wallet->cs_wallet);
|
||||
const PKHash dest{key.GetPubKey()};
|
||||
const CScript& script = scripts_watch_only.emplace_back(GetScriptForDestination(dest));
|
||||
assert(legacy_spkm->LoadWatchOnly(script));
|
||||
assert(wallet->SetAddressBook(dest, strprintf("watch_%d", w), /*purpose=*/std::nullopt));
|
||||
batch.WriteWatchOnly(script, CKeyMetadata());
|
||||
}
|
||||
// Add watch-only addresses
|
||||
std::vector<CScript> scripts_watch_only;
|
||||
for (int w = 0; w < NUM_WATCH_ONLY_ADDR; ++w) {
|
||||
CKey key = GenerateRandomKey();
|
||||
LOCK(wallet->cs_wallet);
|
||||
const PKHash dest{key.GetPubKey()};
|
||||
const CScript& script = scripts_watch_only.emplace_back(GetScriptForDestination(dest));
|
||||
assert(legacy_spkm->LoadWatchOnly(script));
|
||||
assert(wallet->SetAddressBook(dest, strprintf("watch_%d", w), /*purpose=*/std::nullopt));
|
||||
batch.WriteWatchOnly(script, CKeyMetadata());
|
||||
}
|
||||
|
||||
// Generate transactions and local addresses
|
||||
for (int j = 0; j < 500; ++j) {
|
||||
CKey key = GenerateRandomKey();
|
||||
CPubKey pubkey = key.GetPubKey();
|
||||
// Load key, scripts and create address book record
|
||||
Assert(legacy_spkm->LoadKey(key, pubkey));
|
||||
CTxDestination dest{PKHash(pubkey)};
|
||||
Assert(wallet->SetAddressBook(dest, strprintf("legacy_%d", j), /*purpose=*/std::nullopt));
|
||||
// Generate transactions and local addresses
|
||||
for (int j = 0; j < 500; ++j) {
|
||||
CKey key = GenerateRandomKey();
|
||||
CPubKey pubkey = key.GetPubKey();
|
||||
// Load key, scripts and create address book record
|
||||
Assert(legacy_spkm->LoadKey(key, pubkey));
|
||||
CTxDestination dest{PKHash(pubkey)};
|
||||
Assert(wallet->SetAddressBook(dest, strprintf("legacy_%d", j), /*purpose=*/std::nullopt));
|
||||
|
||||
CMutableTransaction mtx;
|
||||
mtx.vout.emplace_back(COIN, GetScriptForDestination(dest));
|
||||
mtx.vout.emplace_back(COIN, scripts_watch_only.at(j % NUM_WATCH_ONLY_ADDR));
|
||||
mtx.vin.resize(2);
|
||||
wallet->AddToWallet(MakeTransactionRef(mtx), TxStateInactive{}, /*update_wtx=*/nullptr, /*rescanning_old_block=*/true);
|
||||
batch.WriteKey(pubkey, key.GetPrivKey(), CKeyMetadata());
|
||||
CMutableTransaction mtx;
|
||||
mtx.vout.emplace_back(COIN, GetScriptForDestination(dest));
|
||||
mtx.vout.emplace_back(COIN, scripts_watch_only.at(j % NUM_WATCH_ONLY_ADDR));
|
||||
mtx.vin.resize(2);
|
||||
wallet->AddToWallet(MakeTransactionRef(mtx), TxStateInactive{}, /*update_wtx=*/nullptr, /*rescanning_old_block=*/true);
|
||||
batch.WriteKey(pubkey, key.GetPrivKey(), CKeyMetadata());
|
||||
}
|
||||
}
|
||||
|
||||
bench.epochs(/*numEpochs=*/1).epochIterations(/*numIters=*/1) // run the migration exactly once
|
||||
|
||||
Reference in New Issue
Block a user