From 04c31c1295eb4ecd42afd54b8e353cbda93d83f0 Mon Sep 17 00:00:00 2001 From: Carl Dong Date: Tue, 1 Mar 2022 16:14:12 -0500 Subject: [PATCH] Add ChainstateManager::m_adjusted_time_callback This decouples validation.cpp from netaddress.cpp (transitively, timedata.cpp, and asmap.cpp). This is important for libbitcoinkernel as: - There is no reason for the consensus engine to be coupled with netaddress, timedata, and asmap - Users of libbitcoinkernel can now easily supply their own std::function that provides the adjusted time. See the src/Makefile.am changes for some satisfying removals. --- src/Makefile.am | 3 --- src/bitcoin-chainstate.cpp | 1 + src/init.cpp | 1 + src/kernel/chainstatemanager_opts.h | 1 + src/node/miner.cpp | 2 +- src/rpc/mining.cpp | 5 +++-- src/test/miner_tests.cpp | 1 + src/test/util/setup_common.cpp | 2 ++ src/test/validation_chainstate_tests.cpp | 8 +++++--- src/validation.cpp | 8 ++++---- src/validation.h | 6 +++++- 11 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index d421e8f89..a0e793e42 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -877,7 +877,6 @@ libbitcoinkernel_la_SOURCES = \ init/common.cpp \ key.cpp \ logging.cpp \ - netaddress.cpp \ node/blockstorage.cpp \ node/chainstate.cpp \ node/coinstats.cpp \ @@ -906,11 +905,9 @@ libbitcoinkernel_la_SOURCES = \ support/lockedpool.cpp \ sync.cpp \ threadinterrupt.cpp \ - timedata.cpp \ txdb.cpp \ txmempool.cpp \ uint256.cpp \ - util/asmap.cpp \ util/bytevectorhash.cpp \ util/check.cpp \ util/getuniquepath.cpp \ diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp index b66764196..99aa23fb0 100644 --- a/src/bitcoin-chainstate.cpp +++ b/src/bitcoin-chainstate.cpp @@ -72,6 +72,7 @@ int main(int argc, char* argv[]) // SETUP: Chainstate const ChainstateManager::Options chainman_opts{ chainparams, + static_cast(GetTime), }; ChainstateManager chainman{chainman_opts}; diff --git a/src/init.cpp b/src/init.cpp index ec94060e9..b1fe91518 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1423,6 +1423,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const ChainstateManager::Options chainman_opts{ chainparams, + GetAdjustedTime, }; node.chainman = std::make_unique(chainman_opts); ChainstateManager& chainman = *node.chainman; diff --git a/src/kernel/chainstatemanager_opts.h b/src/kernel/chainstatemanager_opts.h index f2646700a..575d94e2e 100644 --- a/src/kernel/chainstatemanager_opts.h +++ b/src/kernel/chainstatemanager_opts.h @@ -17,6 +17,7 @@ class CChainParams; */ struct ChainstateManagerOpts { const CChainParams& chainparams; + const std::function adjusted_time_callback{nullptr}; }; #endif // BITCOIN_KERNEL_CHAINSTATEMANAGER_OPTS_H diff --git a/src/node/miner.cpp b/src/node/miner.cpp index 48e50f371..2464579dd 100644 --- a/src/node/miner.cpp +++ b/src/node/miner.cpp @@ -167,7 +167,7 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR * GetLegacySigOpCount(*pblock->vtx[0]); BlockValidationState state; - if (!TestBlockValidity(state, chainparams, m_chainstate, *pblock, pindexPrev, false, false)) { + if (!TestBlockValidity(state, chainparams, m_chainstate, *pblock, pindexPrev, GetAdjustedTime, false, false)) { throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, state.ToString())); } int64_t nTime2 = GetTimeMicros(); diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index b2c25b60e..8fb6daf0c 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -27,6 +27,7 @@ #include