ccoins_caching.cpp
1 // Copyright (c) 2016-present The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #include <bench/bench.h> 6 #include <coins.h> 7 #include <consensus/amount.h> 8 #include <key.h> 9 #include <policy/policy.h> 10 #include <primitives/transaction.h> 11 #include <script/script.h> 12 #include <script/signingprovider.h> 13 #include <test/util/transaction_utils.h> 14 15 #include <cassert> 16 #include <vector> 17 18 // Microbenchmark for simple accesses to a CCoinsViewCache database. Note from 19 // laanwj, "replicating the actual usage patterns of the client is hard though, 20 // many times micro-benchmarks of the database showed completely different 21 // characteristics than e.g. reindex timings. But that's not a requirement of 22 // every benchmark." 23 // (https://github.com/bitcoin/bitcoin/issues/7883#issuecomment-224807484) 24 static void CCoinsCaching(benchmark::Bench& bench) 25 { 26 ECC_Context ecc_context{}; 27 28 FillableSigningProvider keystore; 29 CCoinsViewCache coins{&CoinsViewEmpty::Get()}; 30 std::vector<CMutableTransaction> dummyTransactions = 31 SetupDummyInputs(keystore, coins, {11 * COIN, 50 * COIN, 21 * COIN, 22 * COIN}); 32 33 CMutableTransaction t1; 34 t1.vin.resize(3); 35 t1.vin[0].prevout.hash = dummyTransactions[0].GetHash(); 36 t1.vin[0].prevout.n = 1; 37 t1.vin[0].scriptSig << std::vector<unsigned char>(65, 0); 38 t1.vin[1].prevout.hash = dummyTransactions[1].GetHash(); 39 t1.vin[1].prevout.n = 0; 40 t1.vin[1].scriptSig << std::vector<unsigned char>(65, 0) << std::vector<unsigned char>(33, 4); 41 t1.vin[2].prevout.hash = dummyTransactions[1].GetHash(); 42 t1.vin[2].prevout.n = 1; 43 t1.vin[2].scriptSig << std::vector<unsigned char>(65, 0) << std::vector<unsigned char>(33, 4); 44 t1.vout.resize(2); 45 t1.vout[0].nValue = 90 * COIN; 46 t1.vout[0].scriptPubKey << OP_1; 47 48 // Benchmark. 49 const CTransaction tx_1(t1); 50 bench.run([&] { 51 assert(ValidateInputsStandardness(tx_1, coins).IsValid()); 52 }); 53 } 54 55 BENCHMARK(CCoinsCaching);