Auto merge of #2386 - str4d:2385-consensus-correction, r=str4d
Correct consensus logic in ContextualCheckInputs Closes #2385.
This commit is contained in:
commit
3440de74ee
|
@ -32,6 +32,7 @@ zcash_gtest_SOURCES += \
|
||||||
gtest/test_random.cpp \
|
gtest/test_random.cpp \
|
||||||
gtest/test_rpc.cpp \
|
gtest/test_rpc.cpp \
|
||||||
gtest/test_transaction.cpp \
|
gtest/test_transaction.cpp \
|
||||||
|
gtest/test_validation.cpp \
|
||||||
gtest/test_circuit.cpp \
|
gtest/test_circuit.cpp \
|
||||||
gtest/test_txid.cpp \
|
gtest/test_txid.cpp \
|
||||||
gtest/test_libzcash_utils.cpp \
|
gtest/test_libzcash_utils.cpp \
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "consensus/validation.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
// Fake an empty view
|
||||||
|
class FakeCoinsViewDB : public CCoinsView {
|
||||||
|
public:
|
||||||
|
FakeCoinsViewDB() {}
|
||||||
|
|
||||||
|
bool GetAnchorAt(const uint256 &rt, ZCIncrementalMerkleTree &tree) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetNullifier(const uint256 &nf) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetCoins(const uint256 &txid, CCoins &coins) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HaveCoins(const uint256 &txid) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 GetBestBlock() const {
|
||||||
|
uint256 a;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 GetBestAnchor() const {
|
||||||
|
uint256 a;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BatchWrite(CCoinsMap &mapCoins,
|
||||||
|
const uint256 &hashBlock,
|
||||||
|
const uint256 &hashAnchor,
|
||||||
|
CAnchorsMap &mapAnchors,
|
||||||
|
CNullifiersMap &mapNullifiers) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetStats(CCoinsStats &stats) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(Validation, ContextualCheckInputsPassesWithCoinbase) {
|
||||||
|
// Create fake coinbase transaction
|
||||||
|
CMutableTransaction mtx;
|
||||||
|
mtx.vin.resize(1);
|
||||||
|
CTransaction tx(mtx);
|
||||||
|
ASSERT_TRUE(tx.IsCoinBase());
|
||||||
|
|
||||||
|
// Fake an empty view
|
||||||
|
FakeCoinsViewDB fakeDB;
|
||||||
|
CCoinsViewCache view(&fakeDB);
|
||||||
|
|
||||||
|
CValidationState state;
|
||||||
|
EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, Params(CBaseChainParams::MAIN).GetConsensus()));
|
||||||
|
}
|
|
@ -1687,11 +1687,12 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins
|
||||||
|
|
||||||
bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector<CScriptCheck> *pvChecks)
|
bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector<CScriptCheck> *pvChecks)
|
||||||
{
|
{
|
||||||
if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs), consensusParams))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!tx.IsCoinBase())
|
if (!tx.IsCoinBase())
|
||||||
{
|
{
|
||||||
|
if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs), consensusParams)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (pvChecks)
|
if (pvChecks)
|
||||||
pvChecks->reserve(tx.vin.size());
|
pvChecks->reserve(tx.vin.size());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue