36 #include <boost/test/unit_test.hpp> 40 typedef std::vector<unsigned char>
valtype;
71 if (strFlags.empty() || strFlags ==
"NONE")
return 0;
72 unsigned int flags = 0;
73 std::vector<std::string> words =
SplitString(strFlags,
',');
75 for (
const std::string& word : words)
78 BOOST_ERROR(
"Bad test: unknown verification flag '" << word <<
"'");
90 standard_flags_missing &= ~(pair.second);
92 return standard_flags_missing == 0;
101 std::map<std::string, unsigned int>::const_iterator it =
mapFlagNames.begin();
103 if (
flags & it->second) {
104 ret += it->first +
",";
108 return ret.substr(0,
ret.size() - 1);
115 const std::map<COutPoint, int64_t>& map_prevout_values,
unsigned int flags,
120 for (
unsigned int i = 0; i < tx.
vin.size() &&
tx_valid; ++i) {
122 const CAmount amount = map_prevout_values.count(input.
prevout) ? map_prevout_values.at(input.
prevout) : 0;
127 BOOST_ERROR(
"Bad test: " << strTest);
131 BOOST_CHECK_MESSAGE(
tx_valid, strTest);
137 BOOST_CHECK_MESSAGE(!
tx_valid, strTest);
177 std::set<unsigned int> flags_combos;
179 const unsigned int flags_excluding_one =
TrimFlags(
flags & ~(pair.second));
180 if (
flags != flags_excluding_one) {
181 flags_combos.insert(flags_excluding_one);
191 BOOST_CHECK_MESSAGE(
CheckMapFlagNames(),
"mapFlagNames is missing a script verification flag");
195 for (
unsigned int idx = 0; idx < tests.
size(); idx++) {
197 std::string strTest = test.
write();
198 if (test[0].isArray())
202 BOOST_ERROR(
"Bad test: " << strTest);
206 std::map<COutPoint, CScript> mapprevOutScriptPubKeys;
207 std::map<COutPoint, int64_t> mapprevOutValues;
210 for (
unsigned int inpIdx = 0; inpIdx < inputs.
size(); inpIdx++) {
211 const UniValue& input = inputs[inpIdx];
217 if (vinput.
size() < 3 || vinput.
size() > 4)
222 COutPoint outpoint{
uint256S(vinput[0].get_str()), uint32_t(vinput[1].getInt<int>())};
223 mapprevOutScriptPubKeys[outpoint] =
ParseScript(vinput[2].get_str());
224 if (vinput.
size() >= 4)
226 mapprevOutValues[outpoint] = vinput[3].
getInt<int64_t>();
231 BOOST_ERROR(
"Bad test: " << strTest);
235 std::string transaction = test[1].
get_str();
248 BOOST_ERROR(
"Bad test flags: " << strTest);
252 "Tx unexpectedly failed: " << strTest);
258 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues,
flags, txdata, strTest,
true)) {
259 BOOST_ERROR(
"Tx unexpectedly failed with flag " <<
name <<
" unset: " << strTest);
263 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues,
flags, txdata, strTest,
true)) {
264 BOOST_ERROR(
"Tx unexpectedly failed with random flags " <<
ToString(
flags) <<
": " << strTest);
270 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, ~flags_excluding_one, txdata, strTest,
false)) {
271 BOOST_ERROR(
"Too many flags unset: " << strTest);
283 for (
unsigned int idx = 0; idx < tests.
size(); idx++) {
285 std::string strTest = test.
write();
286 if (test[0].isArray())
290 BOOST_ERROR(
"Bad test: " << strTest);
294 std::map<COutPoint, CScript> mapprevOutScriptPubKeys;
295 std::map<COutPoint, int64_t> mapprevOutValues;
298 for (
unsigned int inpIdx = 0; inpIdx < inputs.
size(); inpIdx++) {
299 const UniValue& input = inputs[inpIdx];
305 if (vinput.
size() < 3 || vinput.
size() > 4)
310 COutPoint outpoint{
uint256S(vinput[0].get_str()), uint32_t(vinput[1].getInt<int>())};
311 mapprevOutScriptPubKeys[outpoint] =
ParseScript(vinput[2].get_str());
312 if (vinput.
size() >= 4)
314 mapprevOutValues[outpoint] = vinput[3].
getInt<int64_t>();
319 BOOST_ERROR(
"Bad test: " << strTest);
323 std::string transaction = test[1].
get_str();
329 BOOST_CHECK_MESSAGE(test[2].get_str() ==
"BADTX", strTest);
338 BOOST_ERROR(
"Bad test flags: " << strTest);
343 "Tx unexpectedly passed: " << strTest);
349 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues,
flags, txdata, strTest,
false)) {
350 BOOST_ERROR(
"Tx unexpectedly passed with flag " <<
name <<
" set: " << strTest);
354 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues,
flags, txdata, strTest,
false)) {
355 BOOST_ERROR(
"Tx unexpectedly passed with random flags " <<
name <<
": " << strTest);
361 if (!
CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, flags_excluding_one, txdata, strTest,
true)) {
362 BOOST_ERROR(
"Too many flags set: " << strTest);
372 unsigned char ch[] = {0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0x7f, 0xcd, 0x4f, 0x85, 0x65, 0xef, 0x40, 0x6d, 0xd5, 0xd6, 0x3d, 0x4f, 0xf9, 0x4f, 0x31, 0x8f, 0xe8, 0x20, 0x27, 0xfd, 0x4d, 0xc4, 0x51, 0xb0, 0x44, 0x74, 0x01, 0x9f, 0x74, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x49, 0x30, 0x46, 0x02, 0x21, 0x00, 0xda, 0x0d, 0xc6, 0xae, 0xce, 0xfe, 0x1e, 0x06, 0xef, 0xdf, 0x05, 0x77, 0x37, 0x57, 0xde, 0xb1, 0x68, 0x82, 0x09, 0x30, 0xe3, 0xb0, 0xd0, 0x3f, 0x46, 0xf5, 0xfc, 0xf1, 0x50, 0xbf, 0x99, 0x0c, 0x02, 0x21, 0x00, 0xd2, 0x5b, 0x5c, 0x87, 0x04, 0x00, 0x76, 0xe4, 0xf2, 0x53, 0xf8, 0x26, 0x2e, 0x76, 0x3e, 0x2d, 0xd5, 0x1e, 0x7f, 0xf0, 0xbe, 0x15, 0x77, 0x27, 0xc4, 0xbc, 0x42, 0x80, 0x7f, 0x17, 0xbd, 0x39, 0x01, 0x41, 0x04, 0xe6, 0xc2, 0x6e, 0xf6, 0x7d, 0xc6, 0x10, 0xd2, 0xcd, 0x19, 0x24, 0x84, 0x78, 0x9a, 0x6c, 0xf9, 0xae, 0xa9, 0x93, 0x0b, 0x94, 0x4b, 0x7e, 0x2d, 0xb5, 0x34, 0x2b, 0x9d, 0x9e, 0x5b, 0x9f, 0xf7, 0x9a, 0xff, 0x9a, 0x2e, 0xe1, 0x97, 0x8d, 0xd7, 0xfd, 0x01, 0xdf, 0xc5, 0x22, 0xee, 0x02, 0x28, 0x3d, 0x3b, 0x06, 0xa9, 0xd0, 0x3a, 0xcf, 0x80, 0x96, 0x96, 0x8d, 0x7d, 0xbb, 0x0f, 0x91, 0x78, 0xff, 0xff, 0xff, 0xff, 0x02, 0x8b, 0xa7, 0x94, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xba, 0xde, 0xec, 0xfd, 0xef, 0x05, 0x07, 0x24, 0x7f, 0xc8, 0xf7, 0x42, 0x41, 0xd7, 0x3b, 0xc0, 0x39, 0x97, 0x2d, 0x7b, 0x88, 0xac, 0x40, 0x94, 0xa8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xc1, 0x09, 0x32, 0x48, 0x3f, 0xec, 0x93, 0xed, 0x51, 0xf5, 0xfe, 0x95, 0xe7, 0x25, 0x59, 0xf2, 0xcc, 0x70, 0x43, 0xf9, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00};
373 std::vector<unsigned char> vch(ch, ch +
sizeof(ch) -1);
381 tx.vin.push_back(tx.vin[0]);
390 std::vector<CMutableTransaction> dummyTransactions =
395 t1.vin[0].prevout.hash = dummyTransactions[0].GetHash();
396 t1.vin[0].prevout.n = 1;
397 t1.vin[0].scriptSig << std::vector<unsigned char>(65, 0);
398 t1.vin[1].prevout.hash = dummyTransactions[1].GetHash();
399 t1.vin[1].prevout.n = 0;
400 t1.vin[1].scriptSig << std::vector<unsigned char>(65, 0) << std::vector<unsigned char>(33, 4);
401 t1.vin[2].prevout.hash = dummyTransactions[1].GetHash();
402 t1.vin[2].prevout.n = 1;
403 t1.vin[2].scriptSig << std::vector<unsigned char>(65, 0) << std::vector<unsigned char>(33, 4);
405 t1.vout[0].nValue = 90*
CENT;
406 t1.vout[0].scriptPubKey <<
OP_1;
415 outputm.
vin.resize(1);
416 outputm.
vin[0].prevout.SetNull();
418 outputm.
vout.resize(1);
419 outputm.
vout[0].nValue = 1;
420 outputm.
vout[0].scriptPubKey = outscript;
424 assert(output->vin.size() == 1);
425 assert(output->vin[0] == outputm.vin[0]);
426 assert(output->vout.size() == 1);
427 assert(output->vout[0] == outputm.vout[0]);
431 inputm.
vin.resize(1);
432 inputm.
vin[0].prevout.hash = output->GetHash();
433 inputm.
vin[0].prevout.n = 0;
434 inputm.
vout.resize(1);
435 inputm.
vout[0].nValue = 1;
443 assert(input.vin.size() == 1);
444 assert(input.vin[0] == inputm.vin[0]);
445 assert(input.vout.size() == 1);
446 assert(input.vout[0] == inputm.vout[0]);
447 assert(input.vin[0].scriptWitness.stack == inputm.vin[0].scriptWitness.stack);
464 }
else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
466 }
else if (v.size() == 1 && v[0] == 0x81) {
477 std::vector<valtype> stack;
480 stack.back() = std::vector<unsigned char>(redeemScript.
begin(), redeemScript.
end());
496 std::vector<int> sigHashes;
505 for(uint32_t ij = 0; ij < 4500; ij++) {
506 uint32_t i = mtx.
vin.size();
508 prevId.
SetHex(
"0000000000000000000000000000000000000000000000000000000000000100");
511 mtx.
vin.resize(mtx.
vin.size() + 1);
512 mtx.
vin[i].prevout = outpoint;
515 mtx.
vout.resize(mtx.
vout.size() + 1);
516 mtx.
vout[i].nValue = 1000;
521 for(uint32_t i = 0; i < mtx.
vin.size(); i++) {
523 bool hashSigned =
SignSignature(keystore, scriptPubKey, mtx, i, 1000, sigHashes.at(i % sigHashes.size()), empty);
538 std::vector<Coin> coins;
539 for(uint32_t i = 0; i < mtx.vin.size(); i++) {
548 for(uint32_t i = 0; i < mtx.vin.size(); i++) {
549 std::vector<CScriptCheck> vChecks;
551 control.
Add(std::move(vChecks));
554 bool controlCheck = control.
Wait();
571 CKey key1, key2, key3, key1L, key2L;
572 CPubKey pubkey1, pubkey2, pubkey3, pubkey1L, pubkey2L;
587 CScript scriptPubkey1, scriptPubkey2, scriptPubkey1L, scriptPubkey2L, scriptMulti;
592 std::vector<CPubKey> oneandthree;
593 oneandthree.push_back(pubkey1);
594 oneandthree.push_back(pubkey3);
601 CScript destination_script_1, destination_script_2, destination_script_1L, destination_script_2L, destination_script_multi;
753 std::vector<CMutableTransaction> dummyTransactions =
758 t.vin[0].prevout.hash = dummyTransactions[0].GetHash();
759 t.vin[0].prevout.n = 1;
760 t.vin[0].scriptSig << std::vector<unsigned char>(65, 0);
762 t.vout[0].nValue = 90*
CENT;
767 constexpr
auto CheckIsStandard = [](
const auto&
t) {
772 constexpr
auto CheckIsNotStandard = [](
const auto&
t,
const std::string& reason_in) {
784 t.vout[0].nValue = nDustThreshold - 1;
785 CheckIsNotStandard(
t,
"dust");
787 t.vout[0].nValue = nDustThreshold;
792 CheckIsNotStandard(
t,
"version");
795 CheckIsNotStandard(
t,
"version");
798 CheckIsNotStandard(
t,
"version");
811 t.vout[0].nValue = 674 - 1;
812 CheckIsNotStandard(
t,
"dust");
814 t.vout[0].nValue = 674;
819 CheckIsNotStandard(
t,
"scriptpubkey");
822 t.vout[0].scriptPubKey =
CScript() <<
OP_RETURN <<
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
827 t.vout[0].scriptPubKey =
CScript() <<
OP_RETURN <<
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800");
829 CheckIsNotStandard(
t,
"scriptpubkey");
839 t.vout[0].scriptPubKey =
CScript() <<
OP_RETURN << 0 <<
ParseHex(
"01") << 2 <<
ParseHex(
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
844 CheckIsNotStandard(
t,
"scriptpubkey");
853 t.vout[0].scriptPubKey =
CScript() <<
OP_RETURN <<
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
854 t.vout[0].nValue = 0;
855 t.vout[1].scriptPubKey =
CScript() <<
OP_RETURN <<
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
856 t.vout[1].nValue = 0;
857 CheckIsNotStandard(
t,
"multi-op-return");
859 t.vout[0].scriptPubKey =
CScript() <<
OP_RETURN <<
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
861 CheckIsNotStandard(
t,
"multi-op-return");
865 CheckIsNotStandard(
t,
"multi-op-return");
872 t.vin[0].scriptSig =
CScript() << std::vector<unsigned char>(1647, 0);
875 t.vin[0].scriptSig =
CScript() << std::vector<unsigned char>(1648, 0);
876 CheckIsNotStandard(
t,
"scriptsig-size");
881 << std::vector<unsigned char>(75, 0)
882 << std::vector<unsigned char>(235, 0)
883 << std::vector<unsigned char>(1234, 0)
887 const std::vector<unsigned char> non_push_ops = {
892 while (pc <
t.vin[0].scriptSig.end()) {
895 t.vin[0].scriptSig.GetOp(pc, opcode);
900 int index = prev_pc -
t.vin[0].scriptSig.begin();
901 unsigned char orig_op = *prev_pc;
903 for (
auto op : non_push_ops) {
904 t.vin[0].scriptSig[index] = op;
905 CheckIsNotStandard(
t,
"scriptsig-not-pushonly");
907 t.vin[0].scriptSig[index] = orig_op;
914 t.vout[0].scriptPubKey =
CScript() << OP_RETURN << std::vector<unsigned char>(19, 0);
924 t.vout[0].scriptPubKey =
CScript() << OP_RETURN << std::vector<unsigned char>(20, 0);
926 CheckIsNotStandard(
t,
"tx-size");
932 t.vin[0].scriptSig =
CScript() << std::vector<unsigned char>(65, 0);
936 CheckIsNotStandard(
t,
"bare-multisig");
941 t.vout[0].nValue = 576;
943 t.vout[0].nValue = 575;
944 CheckIsNotStandard(
t,
"dust");
948 t.vout[0].nValue = 672;
950 t.vout[0].nValue = 671;
951 CheckIsNotStandard(
t,
"dust");
955 t.vout[0].nValue = 546;
957 t.vout[0].nValue = 545;
958 CheckIsNotStandard(
t,
"dust");
961 t.vout[0].scriptPubKey =
CScript() << OP_HASH160 << std::vector<unsigned char>(20, 0) <<
OP_EQUAL;
962 t.vout[0].nValue = 540;
964 t.vout[0].nValue = 539;
965 CheckIsNotStandard(
t,
"dust");
968 t.vout[0].scriptPubKey =
CScript() << OP_0 << std::vector<unsigned char>(20, 0);
969 t.vout[0].nValue = 294;
971 t.vout[0].nValue = 293;
972 CheckIsNotStandard(
t,
"dust");
975 t.vout[0].scriptPubKey =
CScript() << OP_0 << std::vector<unsigned char>(32, 0);
976 t.vout[0].nValue = 330;
978 t.vout[0].nValue = 329;
979 CheckIsNotStandard(
t,
"dust");
982 t.vout[0].scriptPubKey =
CScript() << OP_1 << std::vector<unsigned char>(32, 0);
983 t.vout[0].nValue = 330;
985 t.vout[0].nValue = 329;
986 CheckIsNotStandard(
t,
"dust");
989 for (
int op =
OP_1; op <=
OP_16; op += 1) {
990 t.vout[0].scriptPubKey =
CScript() << (
opcodetype)op << std::vector<unsigned char>(2, 0);
991 t.vout[0].nValue = 240;
994 t.vout[0].nValue = 239;
995 CheckIsNotStandard(
t,
"dust");
std::shared_ptr< const CTransaction > CTransactionRef
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
Generate a multisig script.
bool SignSignature(const SigningProvider &provider, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, const CAmount &amount, int nHashType, SignatureData &sig_data)
Produce a satisfying script (scriptSig or witness).
static const std::string tx_invalid
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
bool IsStandardTx(const CTransaction &tx, const std::optional< unsigned > &max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate &dust_relay_fee, std::string &reason)
Check for standard transaction types.
enum ScriptError_t ScriptError
static const unsigned int MAX_OP_RETURN_RELAY
Default setting for -datacarriersize.
CPubKey GetPubKey() const
Compute the public key from a private key.
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
CScriptWitness scriptWitness
Only serialized through CTransaction.
virtual bool AddCScript(const CScript &redeemScript)
constexpr deserialize_type deserialize
CTxOut out
unspent transaction output
bool CheckTxScripts(const CTransaction &tx, const std::map< COutPoint, CScript > &map_prevout_scriptPubKeys, const std::map< COutPoint, int64_t > &map_prevout_values, unsigned int flags, const PrecomputedTransactionData &txdata, const std::string &strTest, bool expect_valid)
unsigned int fCoinBase
whether containing transaction was a coinbase
const std::string & get_str() const
const UniValue & get_array() const
Bare scripts and BIP16 P2SH-wrapped redeemscripts.
static const int64_t values[]
A selection of numbers that do not trigger int64_t overflow when added/subtracted.
RAII-style controller object for a CCheckQueue that guarantees the passed queue is finished before co...
static constexpr bool DEFAULT_PERMIT_BAREMULTISIG
Default for -permitbaremultisig.
A signature creator for transactions.
std::string FormatScriptFlags(unsigned int flags)
std::vector< std::string > SplitString(std::string_view str, char sep)
static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS
Standard script verification flags that standard transactions will comply with.
static int32_t GetTransactionWeight(const CTransaction &tx)
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
const std::vector< CTxIn > vin
std::vector< unsigned char > valtype
constexpr unsigned char * begin()
unsigned int FillFlags(unsigned int flags)
int64_t CAmount
Amount in satoshis (Can be negative)
bool AreInputsStandard(const CTransaction &tx, const CCoinsViewCache &mapInputs)
Check transaction inputs to mitigate two potential denial-of-service attacks:
uint32_t nHeight
at which height this containing transaction was included in the active block chain ...
std::string ToString(const T &t)
Locale-independent version of std::to_string.
void push_back(const T &value)
Abort execution through assertion failure (for consensus code)
UniValue read_json(const std::string &jsondata)
Abstract view on the open txout dataset.
An input of a transaction.
static CCheckQueue< CScriptCheck > scriptcheckqueue(128)
const SigningProvider & DUMMY_SIGNING_PROVIDER
BOOST_AUTO_TEST_SUITE_END()
uint256 uint256S(const char *str)
An encapsulated public key.
Fillable signing provider that keeps keys in an address->secret map.
std::string ScriptErrorString(const ScriptError serror)
std::vector< CMutableTransaction > SetupDummyInputs(FillableSigningProvider &keystoreRet, CCoinsViewCache &coinsRet, const std::array< CAmount, 4 > &nValues)
opcodetype
Script opcodes.
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
const std::vector< CTxOut > vout
static void CreateCreditAndSpend(const FillableSigningProvider &keystore, const CScript &outscript, CTransactionRef &output, CMutableTransaction &input, bool success=true)
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
void MergeSignatureData(SignatureData sigdata)
SignatureData CombineSignatures(const CMutableTransaction &input1, const CMutableTransaction &input2, const CTransactionRef tx)
Queue for verifications that have to be performed.
An outpoint - a combination of a transaction hash and an index n into its vout.
std::vector< CTxOut > vout
BOOST_AUTO_TEST_CASE(tx_valid)
static CScript PushAll(const std::vector< valtype > &values)
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::vector< unsigned char > valtype
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
std::vector< unsigned char > ToByteVector(const T &in)
static void ReplaceRedeemScript(CScript &script, const CScript &redeemScript)
static opcodetype EncodeOP_N(int n)
bool IsValidFlagCombination(unsigned flags)
Flags that are not forbidden by an assert in script validation.
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
#define BOOST_CHECK_EQUAL(v1, v2)
bool error(const char *fmt, const Args &... args)
Serialized script, used inside transaction inputs and outputs.
static const int PROTOCOL_VERSION
network protocol versioning
constexpr unsigned char * end()
std::set< unsigned int > ExcludeIndividualFlags(unsigned int flags)
A reference to a CKey: the Hash160 of its serialized public key.
void UpdateInput(CTxIn &input, const SignatureData &data)
GenericTransactionSignatureChecker< CTransaction > TransactionSignatureChecker
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
static uint64_t InsecureRandBits(int bits)
A mutable version of CTransaction.
virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey)
static constexpr CAmount CENT
unsigned int ParseScriptFlags(std::string strFlags)
An encapsulated private key.
The basic transaction that is broadcasted on the network and contained in blocks. ...
CCoinsView that adds a memory cache for transactions to another CCoinsView.
CScript ParseScript(const std::string &s)
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, unsigned int flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptExecutionData &execdata, ScriptError *serror)
void SetHex(const char *psz)
static const int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
bool CheckTransaction(const CTransaction &tx, TxValidationState &state)
CAmount GetFeePerK() const
Return the fee in satoshis for a vsize of 1000 vbytes.
static void CheckWithFlag(const CTransactionRef &output, const CMutableTransaction &input, uint32_t flags, bool success)
unsigned int TrimFlags(unsigned int flags)
void Add(std::vector< T > &&vChecks)
static std::map< std::string, unsigned int > mapFlagNames
#define Assert(val)
Identity function.
static const std::string tx_valid
void emplace_back(Args &&... args)
static bool verify_flags(unsigned int flags)
Check that all specified flags are part of the libconsensus interface.
#define BOOST_CHECK(expr)