1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2020 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_TXDB_H
7 #define BITCOIN_TXDB_H
8 
9 #include <coins.h>
10 #include <dbwrapper.h>
11 #include <chain.h>
12 #include <primitives/block.h>
13 
14 #include <memory>
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
19 class CBlockIndex;
20 class CCoinsViewDBCursor;
21 class uint256;
22 
23 //! -dbcache default (MiB)
24 static const int64_t nDefaultDbCache = 450;
25 //! -dbbatchsize default (bytes)
26 static const int64_t nDefaultDbBatchSize = 16 << 20;
27 //! max. -dbcache (MiB)
28 static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024;
29 //! min. -dbcache (MiB)
30 static const int64_t nMinDbCache = 4;
31 //! Max memory allocated to block tree DB specific cache, if no -txindex (MiB)
32 static const int64_t nMaxBlockDBCache = 2;
33 //! Max memory allocated to block tree DB specific cache, if -txindex (MiB)
34 // Unlike for the UTXO database, for the txindex scenario the leveldb cache make
35 // a meaningful difference: https://github.com/bitcoin/bitcoin/pull/8273#issuecomment-229601991
36 static const int64_t nMaxTxIndexCache = 1024;
37 //! Max memory allocated to all block filter index caches combined in MiB.
38 static const int64_t max_filter_index_cache = 1024;
39 //! Max memory allocated to coin DB specific cache (MiB)
40 static const int64_t nMaxCoinsDBCache = 8;
41 
42 // Actually declared in validation.cpp; can't include because of circular dependency.
43 extern RecursiveMutex cs_main;
44 
45 /** CCoinsView backed by the coin database (chainstate/) */
46 class CCoinsViewDB final : public CCoinsView
47 {
48 protected:
49     std::unique_ptr<CDBWrapper> m_db;
50     fs::path m_ldb_path;
51     bool m_is_memory;
52 public:
53     /**
54      * @param[in] ldb_path    Location in the filesystem where leveldb data will be stored.
55      */
56     explicit CCoinsViewDB(fs::path ldb_path, size_t nCacheSize, bool fMemory, bool fWipe);
57 
58     bool GetCoin(const COutPoint &outpoint, Coin &coin) const override;
59     bool HaveCoin(const COutPoint &outpoint) const override;
60     uint256 GetBestBlock() const override;
61     std::vector<uint256> GetHeadBlocks() const override;
62     bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) override;
63     std::unique_ptr<CCoinsViewCursor> Cursor() const override;
64 
65     //! Attempt to update from an older database format. Returns whether an error occurred.
66     bool Upgrade();
67     size_t EstimateSize() const override;
68 
69     //! Dynamically alter the underlying leveldb cache size.
70     void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
71 };
72 
73 /** Access to the block database (blocks/index/) */
74 class CBlockTreeDB : public CDBWrapper
75 {
76 public:
77     explicit CBlockTreeDB(size_t nCacheSize, bool fMemory = false, bool fWipe = false);
78 
79     bool WriteBatchSync(const std::vector<std::pair<int, const CBlockFileInfo*> >& fileInfo, int nLastFile, const std::vector<const CBlockIndex*>& blockinfo);
80     bool ReadBlockFileInfo(int nFile, CBlockFileInfo &info);
81     bool ReadLastBlockFile(int &nFile);
82     bool WriteReindexing(bool fReindexing);
83     void ReadReindexing(bool &fReindexing);
84     bool WriteFlag(const std::string &name, bool fValue);
85     bool ReadFlag(const std::string &name, bool &fValue);
86     bool LoadBlockIndexGuts(const Consensus::Params& consensusParams, std::function<CBlockIndex*(const uint256&)> insertBlockIndex);
87 };
88 
89 #endif // BITCOIN_TXDB_H
90