mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
Cache transaction validation successes
This commit is contained in:
26
src/main.cpp
26
src/main.cpp
@@ -1277,6 +1277,9 @@ int GetSpendHeight(const CCoinsViewCache& inputs)
|
||||
return pindexPrev->nHeight + 1;
|
||||
}
|
||||
|
||||
static mrumap<uint256, unsigned int> cacheCheck(2 * MAX_BLOCK_SIZE / CTransaction().GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION));
|
||||
static boost::mutex cs_cacheCheck;
|
||||
|
||||
namespace Consensus {
|
||||
bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight)
|
||||
{
|
||||
@@ -1331,6 +1334,17 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
|
||||
{
|
||||
if (!tx.IsCoinBase())
|
||||
{
|
||||
if (fScriptChecks) {
|
||||
boost::unique_lock<boost::mutex> lock(cs_cacheCheck);
|
||||
mrumap<uint256, unsigned int>::const_iterator iter = cacheCheck.find(tx.GetHash());
|
||||
if (iter != cacheCheck.end()) {
|
||||
// The following test relies on the fact that all script validation flags are softforks (i.e. an extra bit set cannot cause a false result to become true).
|
||||
if ((iter->second & flags) == flags) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs)))
|
||||
return false;
|
||||
|
||||
@@ -1381,6 +1395,11 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
|
||||
}
|
||||
}
|
||||
|
||||
if (cacheStore && fScriptChecks && pvChecks == NULL) {
|
||||
boost::unique_lock<boost::mutex> lock(cs_cacheCheck);
|
||||
cacheCheck.insert(tx.GetHash(), flags);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2101,6 +2120,13 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
|
||||
BOOST_FOREACH(const CTransaction &tx, pblock->vtx) {
|
||||
SyncWithWallets(tx, pblock);
|
||||
}
|
||||
// Erase block's transactions from the validation cache
|
||||
{
|
||||
boost::unique_lock<boost::mutex> lock(cs_cacheCheck);
|
||||
BOOST_FOREACH(const CTransaction &tx, pblock->vtx) {
|
||||
cacheCheck.erase(tx.GetHash());
|
||||
}
|
||||
}
|
||||
|
||||
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1;
|
||||
LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001);
|
||||
|
||||
Reference in New Issue
Block a user