diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp --- a/src/bench/coin_selection.cpp +++ b/src/bench/coin_selection.cpp @@ -35,7 +35,7 @@ SelectParams(CBaseChainParams::REGTEST); NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); const CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); std::vector> wtxs; @@ -108,7 +108,7 @@ SelectParams(CBaseChainParams::REGTEST); NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); const CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); diff --git a/src/bench/wallet_balance.cpp b/src/bench/wallet_balance.cpp --- a/src/bench/wallet_balance.cpp +++ b/src/bench/wallet_balance.cpp @@ -18,7 +18,8 @@ const Config &config = GetConfig(); NodeContext node; - std::unique_ptr chain = interfaces::MakeChain(node); + std::unique_ptr chain = + interfaces::MakeChain(node, GetConfig().GetChainParams()); CWallet wallet{config.GetChainParams(), chain.get(), WalletLocation(), WalletDatabase::CreateMock()}; { diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -67,9 +67,6 @@ RPCServer rpcServer; HTTPRPCRequestProcessor httpRPCRequestProcessor(config, rpcServer); - NodeContext node; - node.chain = interfaces::MakeChain(node); - bool fRet = false; util::ThreadSetInternalName("init"); @@ -104,6 +101,8 @@ return true; } + NodeContext node; + try { if (!CheckDataDirOption()) { return InitError( @@ -187,6 +186,8 @@ #endif // HAVE_DECL_DAEMON } + node.chain = interfaces::MakeChain(node, config.GetChainParams()); + // Lock data directory after daemonization if (!AppInitLockDataDirectory()) { // If locking the data directory failed, exit immediately diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -298,7 +298,7 @@ }; //! Return implementation of Chain interface. -std::unique_ptr MakeChain(NodeContext &node); +std::unique_ptr MakeChain(NodeContext &node, const CChainParams ¶ms); //! Return implementation of ChainClient interface for a wallet client. This //! function will be undefined in builds where ENABLE_WALLET is false. diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -246,7 +246,8 @@ class ChainImpl : public Chain { public: - explicit ChainImpl(NodeContext &node) : m_node(node) {} + explicit ChainImpl(NodeContext &node, const CChainParams ¶ms) + : m_node(node), m_params(params) {} std::unique_ptr lock(bool try_lock) override { auto lock = std::make_unique( ::cs_main, "cs_main", __FILE__, __LINE__, try_lock); @@ -405,12 +406,14 @@ } } NodeContext &m_node; + const CChainParams &m_params; }; } // namespace -std::unique_ptr MakeChain(NodeContext &node) { - return std::make_unique(node); +std::unique_ptr MakeChain(NodeContext &node, + const CChainParams ¶ms) { + return std::make_unique(node, params); } } // namespace interfaces diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp --- a/src/interfaces/node.cpp +++ b/src/interfaces/node.cpp @@ -93,7 +93,7 @@ bool appInitMain(Config &config, RPCServer &rpcServer, HTTPRPCRequestProcessor &httpRPCRequestProcessor) override { - m_context.chain = MakeChain(m_context); + m_context.chain = MakeChain(m_context, config.GetChainParams()); return AppInitMain(config, rpcServer, httpRPCRequestProcessor, m_context); } diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -138,7 +138,7 @@ std::string privkey2 = "\"Kyhdf5LuKTRx4ge69ybABsiUAWjVRK4XGxAKk2FQLp2HjGMy87Z4\""; NodeContext node; - node.chain = interfaces::MakeChain(node); + node.chain = interfaces::MakeChain(node, GetConfig().GetChainParams()); g_rpc_node = &node; r = CallRPC(std::string("signrawtransactionwithkey ") + notsigned + " [] " + prevout); @@ -178,7 +178,7 @@ errorWasMissingAmount = false; NodeContext node; - node.chain = interfaces::MakeChain(node); + node.chain = interfaces::MakeChain(node, GetConfig().GetChainParams()); g_rpc_node = &node; try { diff --git a/src/test/util/setup_common.h b/src/test/util/setup_common.h --- a/src/test/util/setup_common.h +++ b/src/test/util/setup_common.h @@ -95,6 +95,7 @@ */ struct TestingSetup : public BasicTestingSetup { boost::thread_group threadGroup; + std::unique_ptr m_chain; explicit TestingSetup( const std::string &chainName = CBaseChainParams::MAIN); diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,8 @@ g_rpc_node = &m_node; const CChainParams &chainparams = config.GetChainParams(); + m_chain = interfaces::MakeChain(m_node, chainparams); + // Ideally we'd move all the RPC tests to the functional testing framework // instead of unit tests, but for now we need these here. RPCServer rpcServer; diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp --- a/src/wallet/test/coinselector_tests.cpp +++ b/src/wallet/test/coinselector_tests.cpp @@ -35,8 +35,6 @@ typedef std::set CoinSet; static std::vector vCoins; -static NodeContext testNode; -static auto testChain = interfaces::MakeChain(testNode); static Amount balance = Amount::zero(); CoinEligibilityFilter filter_standard(1, 6, 0); @@ -304,7 +302,7 @@ } BOOST_AUTO_TEST_CASE(knapsack_solver_test) { - CWallet testWallet(Params(), testChain.get(), WalletLocation(), + CWallet testWallet(Params(), this->m_chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); CoinSet setCoinsRet, setCoinsRet2; @@ -732,7 +730,7 @@ // Tests that with the ideal conditions, the coin selector will always be able // to find a solution that can pay the target value BOOST_AUTO_TEST_CASE(SelectCoins_test) { - CWallet testWallet(Params(), testChain.get(), WalletLocation(), + CWallet testWallet(Params(), this->m_chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); // Random generator stuff diff --git a/src/wallet/test/init_test_fixture.h b/src/wallet/test/init_test_fixture.h --- a/src/wallet/test/init_test_fixture.h +++ b/src/wallet/test/init_test_fixture.h @@ -20,7 +20,7 @@ fs::path m_cwd; std::map m_walletdir_path_cases; NodeContext m_node; - std::unique_ptr m_chain = interfaces::MakeChain(m_node); + std::unique_ptr m_chain; std::unique_ptr m_chain_client; }; diff --git a/src/wallet/test/init_test_fixture.cpp b/src/wallet/test/init_test_fixture.cpp --- a/src/wallet/test/init_test_fixture.cpp +++ b/src/wallet/test/init_test_fixture.cpp @@ -4,12 +4,14 @@ #include +#include #include #include InitWalletDirTestingSetup::InitWalletDirTestingSetup( const std::string &chainName) : BasicTestingSetup(chainName) { + m_chain = interfaces::MakeChain(m_node, Params()); m_chain_client = MakeWalletClient(*m_chain, {}); std::string sep; diff --git a/src/wallet/test/ismine_tests.cpp b/src/wallet/test/ismine_tests.cpp --- a/src/wallet/test/ismine_tests.cpp +++ b/src/wallet/test/ismine_tests.cpp @@ -29,7 +29,8 @@ uncompressedKey.MakeNewKey(false); CPubKey uncompressedPubkey = uncompressedKey.GetPubKey(); NodeContext node; - std::unique_ptr chain = interfaces::MakeChain(node); + std::unique_ptr chain = + interfaces::MakeChain(node, Params()); CScript scriptPubKey; isminetype result; diff --git a/src/wallet/test/wallet_test_fixture.h b/src/wallet/test/wallet_test_fixture.h --- a/src/wallet/test/wallet_test_fixture.h +++ b/src/wallet/test/wallet_test_fixture.h @@ -21,8 +21,6 @@ explicit WalletTestingSetup( const std::string &chainName = CBaseChainParams::MAIN); - NodeContext m_node; - std::unique_ptr m_chain = interfaces::MakeChain(m_node); std::unique_ptr m_chain_client = interfaces::MakeWalletClient(*m_chain, {}); CWallet m_wallet; diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -41,7 +41,7 @@ CBlockIndex *newTip = ::ChainActive().Tip(); NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); auto locked_chain = chain->lock(); LockAssertion lock(::cs_main); @@ -128,7 +128,7 @@ CBlockIndex *newTip = ::ChainActive().Tip(); NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); auto locked_chain = chain->lock(); LockAssertion lock(::cs_main); @@ -214,7 +214,7 @@ .vtx[0]); NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); auto locked_chain = chain->lock(); LockAssertion lock(::cs_main); @@ -271,7 +271,7 @@ // debit functions. BOOST_FIXTURE_TEST_CASE(coin_mark_dirty_immature_credit, TestChain100Setup) { NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); CWalletTx wtx(&wallet, m_coinbase_txns.back()); @@ -421,7 +421,8 @@ } NodeContext m_node; - std::unique_ptr m_chain = interfaces::MakeChain(m_node); + std::unique_ptr m_chain = + interfaces::MakeChain(m_node, Params()); std::unique_ptr wallet; }; @@ -496,7 +497,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup) { NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); std::shared_ptr wallet = std::make_shared( Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); wallet->SetMinVersion(FEATURE_LATEST); diff --git a/src/wallet/test/walletdb_tests.cpp b/src/wallet/test/walletdb_tests.cpp --- a/src/wallet/test/walletdb_tests.cpp +++ b/src/wallet/test/walletdb_tests.cpp @@ -19,7 +19,7 @@ namespace { static std::unique_ptr LoadWallet(WalletBatch &batch) { NodeContext node; - auto chain = interfaces::MakeChain(node); + auto chain = interfaces::MakeChain(node, Params()); std::unique_ptr wallet = std::make_unique( Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); DBErrors res = batch.LoadWallet(wallet.get());