mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-09 15:37:00 -04:00

-BEGIN VERIFY SCRIPT- sed -i 's/enum DBErrors/enum class DBErrors/g' src/wallet/walletdb.h git grep -l DB_ | xargs sed -i 's/DB_\(LOAD_OK\|CORRUPT\|NONCRITICAL_ERROR\|TOO_NEW\|LOAD_FAIL\|NEED_REWRITE\)/DBErrors::\1/g' sed -i 's/^ DBErrors::/ /g' src/wallet/walletdb.h sed -i 's/enum VerifyResult/enum class VerifyResult/g' src/wallet/db.h sed -i 's/\(VERIFY_OK\|RECOVER_OK\|RECOVER_FAIL\)/VerifyResult::\1/g' src/wallet/db.cpp sed -i 's/enum ThresholdState/enum class ThresholdState/g' src/versionbits.h git grep -l THRESHOLD_ | xargs sed -i 's/THRESHOLD_\(DEFINED\|STARTED\|LOCKED_IN\|ACTIVE\|FAILED\)/ThresholdState::\1/g' sed -i 's/^ ThresholdState::/ /g' src/versionbits.h sed -i 's/enum SigVersion/enum class SigVersion/g' src/script/interpreter.h git grep -l SIGVERSION_ | xargs sed -i 's/SIGVERSION_\(BASE\|WITNESS_V0\)/SigVersion::\1/g' sed -i 's/^ SigVersion::/ /g' src/script/interpreter.h sed -i 's/enum RetFormat {/enum class RetFormat {/g' src/rest.cpp sed -i 's/RF_\(UNDEF\|BINARY\|HEX\|JSON\)/RetFormat::\1/g' src/rest.cpp sed -i 's/^ RetFormat::/ /g' src/rest.cpp sed -i 's/enum HelpMessageMode {/enum class HelpMessageMode {/g' src/init.h git grep -l HMM_ | xargs sed -i 's/HMM_BITCOIN/HelpMessageMode::BITCOIN/g' sed -i 's/^ HelpMessageMode::/ /g' src/init.h sed -i 's/enum FeeEstimateHorizon/enum class FeeEstimateHorizon/g' src/policy/fees.h sed -i 's/enum RBFTransactionState/enum class RBFTransactionState/g' src/policy/rbf.h git grep -l RBF_ | xargs sed -i 's/RBF_TRANSACTIONSTATE_\(UNKNOWN\|REPLACEABLE_BIP125\|FINAL\)/RBFTransactionState::\1/g' sed -i 's/^ RBFTransactionState::/ /g' src/policy/rbf.h sed -i 's/enum BlockSource {/enum class BlockSource {/g' src/qt/clientmodel.h git grep -l BLOCK_SOURCE_ | xargs sed -i 's/BLOCK_SOURCE_\(NONE\|REINDEX\|DISK\|NETWORK\)/BlockSource::\1/g' sed -i 's/^ BlockSource::/ /g' src/qt/clientmodel.h sed -i 's/enum FlushStateMode {/enum class FlushStateMode {/g' src/validation.cpp sed -i 's/FLUSH_STATE_\(NONE\|IF_NEEDED\|PERIODIC\|ALWAYS\)/FlushStateMode::\1/g' src/validation.cpp sed -i 's/^ FlushStateMode::/ /g' src/validation.cpp sed -i 's/enum WitnessMode {/enum class WitnessMode {/g' src/test/script_tests.cpp sed -i 's/WITNESS_\(NONE\|PKH\|SH\)/WitnessMode::\1/g' src/test/script_tests.cpp sed -i 's/^ WitnessMode::/ /g' src/test/script_tests.cpp -END VERIFY SCRIPT-
108 lines
3.9 KiB
C++
108 lines
3.9 KiB
C++
// Copyright (c) 2016-2017 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 <key.h>
|
|
#if defined(HAVE_CONSENSUS_LIB)
|
|
#include <script/bitcoinconsensus.h>
|
|
#endif
|
|
#include <script/script.h>
|
|
#include <script/sign.h>
|
|
#include <streams.h>
|
|
|
|
#include <array>
|
|
|
|
// FIXME: Dedup with BuildCreditingTransaction in test/script_tests.cpp.
|
|
static CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey)
|
|
{
|
|
CMutableTransaction txCredit;
|
|
txCredit.nVersion = 1;
|
|
txCredit.nLockTime = 0;
|
|
txCredit.vin.resize(1);
|
|
txCredit.vout.resize(1);
|
|
txCredit.vin[0].prevout.SetNull();
|
|
txCredit.vin[0].scriptSig = CScript() << CScriptNum(0) << CScriptNum(0);
|
|
txCredit.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
|
|
txCredit.vout[0].scriptPubKey = scriptPubKey;
|
|
txCredit.vout[0].nValue = 1;
|
|
|
|
return txCredit;
|
|
}
|
|
|
|
// FIXME: Dedup with BuildSpendingTransaction in test/script_tests.cpp.
|
|
static CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CMutableTransaction& txCredit)
|
|
{
|
|
CMutableTransaction txSpend;
|
|
txSpend.nVersion = 1;
|
|
txSpend.nLockTime = 0;
|
|
txSpend.vin.resize(1);
|
|
txSpend.vout.resize(1);
|
|
txSpend.vin[0].prevout.hash = txCredit.GetHash();
|
|
txSpend.vin[0].prevout.n = 0;
|
|
txSpend.vin[0].scriptSig = scriptSig;
|
|
txSpend.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
|
|
txSpend.vout[0].scriptPubKey = CScript();
|
|
txSpend.vout[0].nValue = txCredit.vout[0].nValue;
|
|
|
|
return txSpend;
|
|
}
|
|
|
|
// Microbenchmark for verification of a basic P2WPKH script. Can be easily
|
|
// modified to measure performance of other types of scripts.
|
|
static void VerifyScriptBench(benchmark::State& state)
|
|
{
|
|
const int flags = SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH;
|
|
const int witnessversion = 0;
|
|
|
|
// Keypair.
|
|
CKey key;
|
|
static const std::array<unsigned char, 32> vchKey = {
|
|
{
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
|
}
|
|
};
|
|
key.Set(vchKey.begin(), vchKey.end(), false);
|
|
CPubKey pubkey = key.GetPubKey();
|
|
uint160 pubkeyHash;
|
|
CHash160().Write(pubkey.begin(), pubkey.size()).Finalize(pubkeyHash.begin());
|
|
|
|
// Script.
|
|
CScript scriptPubKey = CScript() << witnessversion << ToByteVector(pubkeyHash);
|
|
CScript scriptSig;
|
|
CScript witScriptPubkey = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkeyHash) << OP_EQUALVERIFY << OP_CHECKSIG;
|
|
CTransaction txCredit = BuildCreditingTransaction(scriptPubKey);
|
|
CMutableTransaction txSpend = BuildSpendingTransaction(scriptSig, txCredit);
|
|
CScriptWitness& witness = txSpend.vin[0].scriptWitness;
|
|
witness.stack.emplace_back();
|
|
key.Sign(SignatureHash(witScriptPubkey, txSpend, 0, SIGHASH_ALL, txCredit.vout[0].nValue, SigVersion::WITNESS_V0), witness.stack.back(), 0);
|
|
witness.stack.back().push_back(static_cast<unsigned char>(SIGHASH_ALL));
|
|
witness.stack.push_back(ToByteVector(pubkey));
|
|
|
|
// Benchmark.
|
|
while (state.KeepRunning()) {
|
|
ScriptError err;
|
|
bool success = VerifyScript(
|
|
txSpend.vin[0].scriptSig,
|
|
txCredit.vout[0].scriptPubKey,
|
|
&txSpend.vin[0].scriptWitness,
|
|
flags,
|
|
MutableTransactionSignatureChecker(&txSpend, 0, txCredit.vout[0].nValue),
|
|
&err);
|
|
assert(err == SCRIPT_ERR_OK);
|
|
assert(success);
|
|
|
|
#if defined(HAVE_CONSENSUS_LIB)
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
|
|
stream << txSpend;
|
|
int csuccess = bitcoinconsensus_verify_script_with_amount(
|
|
txCredit.vout[0].scriptPubKey.data(),
|
|
txCredit.vout[0].scriptPubKey.size(),
|
|
txCredit.vout[0].nValue,
|
|
(const unsigned char*)stream.data(), stream.size(), 0, flags, nullptr);
|
|
assert(csuccess == 1);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
BENCHMARK(VerifyScriptBench, 6300);
|