// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2022 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_TXDB_H #define BITCOIN_TXDB_H #include <coins.h> #include <dbwrapper.h> #include <kernel/cs_main.h> #include <sync.h> #include <util/fs.h> #include <cstddef> #include <cstdint> #include <memory> #include <optional> #include <vector> class COutPoint; class uint256; //! -dbcache default (MiB) static const int64_t nDefaultDbCache = 450; //! -dbbatchsize default (bytes) static const int64_t nDefaultDbBatchSize = 16 << 20; //! min. -dbcache (MiB) static const int64_t nMinDbCache = 4; //! Max memory allocated to block tree DB specific cache, if no -txindex (MiB) static const int64_t nMaxBlockDBCache = 2; //! Max memory allocated to block tree DB specific cache, if -txindex (MiB) // Unlike for the UTXO database, for the txindex scenario the leveldb cache make // a meaningful difference: https://github.com/bitcoin/bitcoin/pull/8273#issuecomment-229601991 static const int64_t nMaxTxIndexCache = 1024; //! Max memory allocated to all block filter index caches combined in MiB. static const int64_t max_filter_index_cache = 1024; //! Max memory allocated to coin DB specific cache (MiB) static const int64_t nMaxCoinsDBCache = 8; //! User-controlled performance and debug options. struct CoinsViewOptions { //! Maximum database write batch size in bytes. size_t batch_write_bytes = nDefaultDbBatchSize; //! If non-zero, randomly exit when the database is flushed with (1/ratio) //! probability. int simulate_crash_ratio = 0; }; /** CCoinsView backed by the coin database (chainstate/) */ class CCoinsViewDB final : public CCoinsView { protected: DBParams m_db_params; CoinsViewOptions m_options; std::unique_ptr<CDBWrapper> m_db; public: explicit CCoinsViewDB(DBParams db_params, CoinsViewOptions options); std::optional<Coin> GetCoin(const COutPoint& outpoint) const override; bool HaveCoin(const COutPoint &outpoint) const override; uint256 GetBestBlock() const override; std::vector<uint256> GetHeadBlocks() const override; bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) override; std::unique_ptr<CCoinsViewCursor> Cursor() const override; //! Whether an unsupported database format is used. bool NeedsUpgrade(); size_t EstimateSize() const override; //! Dynamically alter the underlying leveldb cache size. void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main); //! @returns filesystem path to on-disk storage or std::nullopt if in memory. std::optional<fs::path> StoragePath() { return m_db->StoragePath(); } }; #endif // BITCOIN_TXDB_H