mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-10 23:27:54 +00:00
Get rid of CCoinsView's SetCoins and SetBestBlock.
All direct modifications are now done through ModifyCoins, and BatchWrite is used for pushing batches of queued modifications up, so we don't need the low-level SetCoins and SetBestBlock anymore in the top-level CCoinsView class.
This commit is contained in:
parent
f28aec014e
commit
c9d1a81ce7
@ -53,20 +53,16 @@ bool CCoins::Spend(int nPos) {
|
|||||||
|
|
||||||
|
|
||||||
bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) const { return false; }
|
bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) const { return false; }
|
||||||
bool CCoinsView::SetCoins(const uint256 &txid, const CCoins &coins) { return false; }
|
|
||||||
bool CCoinsView::HaveCoins(const uint256 &txid) const { return false; }
|
bool CCoinsView::HaveCoins(const uint256 &txid) const { return false; }
|
||||||
uint256 CCoinsView::GetBestBlock() const { return uint256(0); }
|
uint256 CCoinsView::GetBestBlock() const { return uint256(0); }
|
||||||
bool CCoinsView::SetBestBlock(const uint256 &hashBlock) { return false; }
|
|
||||||
bool CCoinsView::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return false; }
|
bool CCoinsView::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return false; }
|
||||||
bool CCoinsView::GetStats(CCoinsStats &stats) const { return false; }
|
bool CCoinsView::GetStats(CCoinsStats &stats) const { return false; }
|
||||||
|
|
||||||
|
|
||||||
CCoinsViewBacked::CCoinsViewBacked(CCoinsView &viewIn) : base(&viewIn) { }
|
CCoinsViewBacked::CCoinsViewBacked(CCoinsView &viewIn) : base(&viewIn) { }
|
||||||
bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) const { return base->GetCoins(txid, coins); }
|
bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) const { return base->GetCoins(txid, coins); }
|
||||||
bool CCoinsViewBacked::SetCoins(const uint256 &txid, const CCoins &coins) { return base->SetCoins(txid, coins); }
|
|
||||||
bool CCoinsViewBacked::HaveCoins(const uint256 &txid) const { return base->HaveCoins(txid); }
|
bool CCoinsViewBacked::HaveCoins(const uint256 &txid) const { return base->HaveCoins(txid); }
|
||||||
uint256 CCoinsViewBacked::GetBestBlock() const { return base->GetBestBlock(); }
|
uint256 CCoinsViewBacked::GetBestBlock() const { return base->GetBestBlock(); }
|
||||||
bool CCoinsViewBacked::SetBestBlock(const uint256 &hashBlock) { return base->SetBestBlock(hashBlock); }
|
|
||||||
void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
|
void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
|
||||||
bool CCoinsViewBacked::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return base->BatchWrite(mapCoins, hashBlock); }
|
bool CCoinsViewBacked::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return base->BatchWrite(mapCoins, hashBlock); }
|
||||||
bool CCoinsViewBacked::GetStats(CCoinsStats &stats) const { return base->GetStats(stats); }
|
bool CCoinsViewBacked::GetStats(CCoinsStats &stats) const { return base->GetStats(stats); }
|
||||||
@ -124,11 +120,6 @@ const CCoins* CCoinsViewCache::AccessCoins(const uint256 &txid) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCoinsViewCache::SetCoins(const uint256 &txid, const CCoins &coins) {
|
|
||||||
cacheCoins[txid] = coins;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsViewCache::HaveCoins(const uint256 &txid) const {
|
bool CCoinsViewCache::HaveCoins(const uint256 &txid) const {
|
||||||
CCoinsMap::const_iterator it = FetchCoins(txid);
|
CCoinsMap::const_iterator it = FetchCoins(txid);
|
||||||
// We're using vtx.empty() instead of IsPruned here for performance reasons,
|
// We're using vtx.empty() instead of IsPruned here for performance reasons,
|
||||||
@ -144,9 +135,8 @@ uint256 CCoinsViewCache::GetBestBlock() const {
|
|||||||
return hashBlock;
|
return hashBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCoinsViewCache::SetBestBlock(const uint256 &hashBlockIn) {
|
void CCoinsViewCache::SetBestBlock(const uint256 &hashBlockIn) {
|
||||||
hashBlock = hashBlockIn;
|
hashBlock = hashBlockIn;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn) {
|
bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn) {
|
||||||
|
13
src/coins.h
13
src/coins.h
@ -294,9 +294,6 @@ public:
|
|||||||
// Retrieve the CCoins (unspent transaction outputs) for a given txid
|
// Retrieve the CCoins (unspent transaction outputs) for a given txid
|
||||||
virtual bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
virtual bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
|
|
||||||
// Modify the CCoins for a given txid
|
|
||||||
virtual bool SetCoins(const uint256 &txid, const CCoins &coins);
|
|
||||||
|
|
||||||
// Just check whether we have data for a given txid.
|
// Just check whether we have data for a given txid.
|
||||||
// This may (but cannot always) return true for fully spent transactions
|
// This may (but cannot always) return true for fully spent transactions
|
||||||
virtual bool HaveCoins(const uint256 &txid) const;
|
virtual bool HaveCoins(const uint256 &txid) const;
|
||||||
@ -304,10 +301,7 @@ public:
|
|||||||
// Retrieve the block hash whose state this CCoinsView currently represents
|
// Retrieve the block hash whose state this CCoinsView currently represents
|
||||||
virtual uint256 GetBestBlock() const;
|
virtual uint256 GetBestBlock() const;
|
||||||
|
|
||||||
// Modify the currently active block hash
|
// Do a bulk modification (multiple CCoins changes + BestBlock change).
|
||||||
virtual bool SetBestBlock(const uint256 &hashBlock);
|
|
||||||
|
|
||||||
// Do a bulk modification (multiple SetCoins + one SetBestBlock).
|
|
||||||
// The passed mapCoins can be modified.
|
// The passed mapCoins can be modified.
|
||||||
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
||||||
|
|
||||||
@ -328,10 +322,8 @@ protected:
|
|||||||
public:
|
public:
|
||||||
CCoinsViewBacked(CCoinsView &viewIn);
|
CCoinsViewBacked(CCoinsView &viewIn);
|
||||||
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
bool SetCoins(const uint256 &txid, const CCoins &coins);
|
|
||||||
bool HaveCoins(const uint256 &txid) const;
|
bool HaveCoins(const uint256 &txid) const;
|
||||||
uint256 GetBestBlock() const;
|
uint256 GetBestBlock() const;
|
||||||
bool SetBestBlock(const uint256 &hashBlock);
|
|
||||||
void SetBackend(CCoinsView &viewIn);
|
void SetBackend(CCoinsView &viewIn);
|
||||||
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
||||||
bool GetStats(CCoinsStats &stats) const;
|
bool GetStats(CCoinsStats &stats) const;
|
||||||
@ -375,10 +367,9 @@ public:
|
|||||||
|
|
||||||
// Standard CCoinsView methods
|
// Standard CCoinsView methods
|
||||||
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
bool SetCoins(const uint256 &txid, const CCoins &coins);
|
|
||||||
bool HaveCoins(const uint256 &txid) const;
|
bool HaveCoins(const uint256 &txid) const;
|
||||||
uint256 GetBestBlock() const;
|
uint256 GetBestBlock() const;
|
||||||
bool SetBestBlock(const uint256 &hashBlock);
|
void SetBestBlock(const uint256 &hashBlock);
|
||||||
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
||||||
|
|
||||||
// Return a pointer to CCoins in the cache, or NULL if not found. This is
|
// Return a pointer to CCoins in the cache, or NULL if not found. This is
|
||||||
|
@ -1753,9 +1753,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
|
|||||||
return state.Abort(_("Failed to write transaction index"));
|
return state.Abort(_("Failed to write transaction index"));
|
||||||
|
|
||||||
// add this block to the view's block chain
|
// add this block to the view's block chain
|
||||||
bool ret;
|
view.SetBestBlock(pindex->GetBlockHash());
|
||||||
ret = view.SetBestBlock(pindex->GetBlockHash());
|
|
||||||
assert(ret);
|
|
||||||
|
|
||||||
int64_t nTime3 = GetTimeMicros(); nTimeIndex += nTime3 - nTime2;
|
int64_t nTime3 = GetTimeMicros(); nTimeIndex += nTime3 - nTime2;
|
||||||
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeIndex * 0.000001);
|
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeIndex * 0.000001);
|
||||||
|
@ -312,8 +312,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
|||||||
txFrom.vout[6].scriptPubKey = GetScriptForDestination(twentySigops.GetID());
|
txFrom.vout[6].scriptPubKey = GetScriptForDestination(twentySigops.GetID());
|
||||||
txFrom.vout[6].nValue = 6000;
|
txFrom.vout[6].nValue = 6000;
|
||||||
|
|
||||||
|
coins.ModifyCoins(txFrom.GetHash())->FromTx(txFrom, 0);
|
||||||
coins.SetCoins(txFrom.GetHash(), CCoins(txFrom, 0));
|
|
||||||
|
|
||||||
CMutableTransaction txTo;
|
CMutableTransaction txTo;
|
||||||
txTo.vout.resize(1);
|
txTo.vout.resize(1);
|
||||||
|
@ -225,7 +225,7 @@ BOOST_AUTO_TEST_CASE(basic_transaction_tests)
|
|||||||
// paid to a TX_PUBKEYHASH.
|
// paid to a TX_PUBKEYHASH.
|
||||||
//
|
//
|
||||||
static std::vector<CMutableTransaction>
|
static std::vector<CMutableTransaction>
|
||||||
SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsView & coinsRet)
|
SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsViewCache& coinsRet)
|
||||||
{
|
{
|
||||||
std::vector<CMutableTransaction> dummyTransactions;
|
std::vector<CMutableTransaction> dummyTransactions;
|
||||||
dummyTransactions.resize(2);
|
dummyTransactions.resize(2);
|
||||||
@ -244,14 +244,14 @@ SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsView & coinsRet)
|
|||||||
dummyTransactions[0].vout[0].scriptPubKey << key[0].GetPubKey() << OP_CHECKSIG;
|
dummyTransactions[0].vout[0].scriptPubKey << key[0].GetPubKey() << OP_CHECKSIG;
|
||||||
dummyTransactions[0].vout[1].nValue = 50*CENT;
|
dummyTransactions[0].vout[1].nValue = 50*CENT;
|
||||||
dummyTransactions[0].vout[1].scriptPubKey << key[1].GetPubKey() << OP_CHECKSIG;
|
dummyTransactions[0].vout[1].scriptPubKey << key[1].GetPubKey() << OP_CHECKSIG;
|
||||||
coinsRet.SetCoins(dummyTransactions[0].GetHash(), CCoins(dummyTransactions[0], 0));
|
coinsRet.ModifyCoins(dummyTransactions[0].GetHash())->FromTx(dummyTransactions[0], 0);
|
||||||
|
|
||||||
dummyTransactions[1].vout.resize(2);
|
dummyTransactions[1].vout.resize(2);
|
||||||
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
||||||
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
||||||
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
||||||
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
||||||
coinsRet.SetCoins(dummyTransactions[1].GetHash(), CCoins(dummyTransactions[1], 0));
|
coinsRet.ModifyCoins(dummyTransactions[1].GetHash())->FromTx(dummyTransactions[1], 0);
|
||||||
|
|
||||||
return dummyTransactions;
|
return dummyTransactions;
|
||||||
}
|
}
|
||||||
|
12
src/txdb.cpp
12
src/txdb.cpp
@ -33,12 +33,6 @@ bool CCoinsViewDB::GetCoins(const uint256 &txid, CCoins &coins) const {
|
|||||||
return db.Read(make_pair('c', txid), coins);
|
return db.Read(make_pair('c', txid), coins);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCoinsViewDB::SetCoins(const uint256 &txid, const CCoins &coins) {
|
|
||||||
CLevelDBBatch batch;
|
|
||||||
BatchWriteCoins(batch, txid, coins);
|
|
||||||
return db.WriteBatch(batch);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsViewDB::HaveCoins(const uint256 &txid) const {
|
bool CCoinsViewDB::HaveCoins(const uint256 &txid) const {
|
||||||
return db.Exists(make_pair('c', txid));
|
return db.Exists(make_pair('c', txid));
|
||||||
}
|
}
|
||||||
@ -50,12 +44,6 @@ uint256 CCoinsViewDB::GetBestBlock() const {
|
|||||||
return hashBestChain;
|
return hashBestChain;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCoinsViewDB::SetBestBlock(const uint256 &hashBlock) {
|
|
||||||
CLevelDBBatch batch;
|
|
||||||
BatchWriteHashBestChain(batch, hashBlock);
|
|
||||||
return db.WriteBatch(batch);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
|
bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
|
||||||
LogPrint("coindb", "Committing %u changed transactions to coin database...\n", (unsigned int)mapCoins.size());
|
LogPrint("coindb", "Committing %u changed transactions to coin database...\n", (unsigned int)mapCoins.size());
|
||||||
|
|
||||||
|
@ -33,10 +33,8 @@ public:
|
|||||||
CCoinsViewDB(size_t nCacheSize, bool fMemory = false, bool fWipe = false);
|
CCoinsViewDB(size_t nCacheSize, bool fMemory = false, bool fWipe = false);
|
||||||
|
|
||||||
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
bool GetCoins(const uint256 &txid, CCoins &coins) const;
|
||||||
bool SetCoins(const uint256 &txid, const CCoins &coins);
|
|
||||||
bool HaveCoins(const uint256 &txid) const;
|
bool HaveCoins(const uint256 &txid) const;
|
||||||
uint256 GetBestBlock() const;
|
uint256 GetBestBlock() const;
|
||||||
bool SetBestBlock(const uint256 &hashBlock);
|
|
||||||
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
|
||||||
bool GetStats(CCoinsStats &stats) const;
|
bool GetStats(CCoinsStats &stats) const;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user