mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-01 02:29:36 +01:00
Transaction hashes are cached, it may not be intuitive that their sizes are actually recalculated every time. This is done before the other refactors to clarify why we want to avoid calling this method; Co-authored-by: maflcko <6399679+maflcko@users.noreply.github.com>
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
// Copyright (c) 2011-present The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <bench/bench.h>
|
|
#include <chain.h>
|
|
#include <chainparams.h>
|
|
#include <consensus/consensus.h>
|
|
#include <consensus/merkle.h>
|
|
#include <consensus/validation.h>
|
|
#include <pow.h>
|
|
#include <primitives/block.h>
|
|
#include <primitives/transaction.h>
|
|
#include <random.h>
|
|
#include <script/script.h>
|
|
#include <sync.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <uint256.h>
|
|
#include <validation.h>
|
|
|
|
#include <cassert>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
|
|
static void DuplicateInputs(benchmark::Bench& bench)
|
|
{
|
|
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
|
|
|
|
const CScript SCRIPT_PUB{CScript(OP_TRUE)};
|
|
|
|
const CChainParams& chainparams = Params();
|
|
|
|
CBlock block{};
|
|
CMutableTransaction coinbaseTx{};
|
|
CMutableTransaction naughtyTx{};
|
|
|
|
LOCK(cs_main);
|
|
CBlockIndex* pindexPrev = testing_setup->m_node.chainman->ActiveChain().Tip();
|
|
assert(pindexPrev != nullptr);
|
|
block.nBits = GetNextWorkRequired(pindexPrev, &block, chainparams.GetConsensus());
|
|
block.nNonce = 0;
|
|
auto nHeight = pindexPrev->nHeight + 1;
|
|
|
|
// Make a coinbase TX
|
|
coinbaseTx.vin.resize(1);
|
|
coinbaseTx.vin[0].prevout.SetNull();
|
|
coinbaseTx.vout.resize(1);
|
|
coinbaseTx.vout[0].scriptPubKey = SCRIPT_PUB;
|
|
coinbaseTx.vout[0].nValue = GetBlockSubsidy(nHeight, chainparams.GetConsensus());
|
|
coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
|
|
|
|
|
|
naughtyTx.vout.resize(1);
|
|
naughtyTx.vout[0].nValue = 0;
|
|
naughtyTx.vout[0].scriptPubKey = SCRIPT_PUB;
|
|
|
|
uint64_t n_inputs = (((MAX_BLOCK_SERIALIZED_SIZE / WITNESS_SCALE_FACTOR) - (CTransaction(coinbaseTx).ComputeTotalSize() + CTransaction(naughtyTx).ComputeTotalSize())) / 41) - 100;
|
|
for (uint64_t x = 0; x < (n_inputs - 1); ++x) {
|
|
naughtyTx.vin.emplace_back(Txid::FromUint256(GetRandHash()), 0, CScript(), 0);
|
|
}
|
|
naughtyTx.vin.emplace_back(naughtyTx.vin.back());
|
|
|
|
block.vtx.push_back(MakeTransactionRef(std::move(coinbaseTx)));
|
|
block.vtx.push_back(MakeTransactionRef(std::move(naughtyTx)));
|
|
|
|
block.hashMerkleRoot = BlockMerkleRoot(block);
|
|
|
|
bench.run([&] {
|
|
BlockValidationState cvstate{};
|
|
assert(!CheckBlock(block, cvstate, chainparams.GetConsensus(), false, false));
|
|
assert(cvstate.GetRejectReason() == "bad-txns-inputs-duplicate");
|
|
});
|
|
}
|
|
|
|
BENCHMARK(DuplicateInputs);
|