5 #include <test/data/script_tests.json.h> 6 #include <test/data/bip341_wallet_vectors.json.h> 33 #include <boost/test/unit_test.hpp> 110 BOOST_ERROR(
"Unknown scripterror enumeration value, update script_errors in script_tests.cpp.");
119 BOOST_ERROR(
"Unknown scripterror \"" <<
name <<
"\" in test description");
138 for (
int i = 0; i < 256; ++i) {
144 BOOST_CHECK_MESSAGE(
VerifyScript(scriptSig, scriptPubKey, &scriptWitness, combined_flags,
MutableTransactionSignatureChecker(&tx, 0, txCredit.
vout[0].nValue,
MissingDataBehavior::ASSERT_FAIL), &err) ==
expect, message +
strprintf(
" (with flags %x)", combined_flags.as_int()));
151 std::vector<unsigned char> r,
s;
152 r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]);
153 s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]);
155 while (
s.size() < 33) {
156 s.insert(
s.begin(), 0x00);
171 vchSig.push_back(0x30);
172 vchSig.push_back(4 + r.size() +
s.size());
173 vchSig.push_back(0x02);
174 vchSig.push_back(r.size());
175 vchSig.insert(vchSig.end(), r.begin(), r.end());
176 vchSig.push_back(0x02);
177 vchSig.push_back(
s.size());
178 vchSig.insert(vchSig.end(),
s.begin(),
s.end());
183 const unsigned char vchKey0[32] = {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};
184 const unsigned char vchKey1[32] = {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,0};
185 const unsigned char vchKey2[32] = {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,0,0};
189 CKey key0, key0C, key1, key1C, key2, key2C;
190 CPubKey pubkey0, pubkey0C, pubkey0H;
196 key0.
Set(vchKey0, vchKey0 + 32,
false);
197 key0C.
Set(vchKey0, vchKey0 + 32,
true);
201 *
const_cast<unsigned char*
>(pubkey0H.
data()) = 0x06 | (pubkey0H[64] & 1);
203 key1.
Set(vchKey1, vchKey1 + 32,
false);
204 key1C.
Set(vchKey1, vchKey1 + 32,
true);
208 key2.
Set(vchKey2, vchKey2 + 32,
false);
209 key2C.
Set(vchKey2, vchKey2 + 32,
true);
233 bool havePush{
false};
234 std::vector<unsigned char> push;
243 spendTx.
vin[0].scriptSig << push;
248 void DoPush(
const std::vector<unsigned char>&
data)
259 if (wm == WitnessMode::PKH) {
264 }
else if (wm == WitnessMode::SH) {
265 witscript = scriptPubKey;
271 redeemscript = scriptPubKey;
287 spendTx.
vin[0].scriptSig << _op;
291 TestBuilder&
Num(
int num)
294 spendTx.
vin[0].scriptSig << num;
298 TestBuilder& Push(
const std::string& hex)
304 TestBuilder& Push(
const CScript& _script)
306 DoPush(std::vector<unsigned char>(_script.
begin(), _script.
end()));
313 std::vector<unsigned char> vchSig, r,
s;
316 key.
Sign(hash, vchSig,
false, iter++);
317 if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) {
320 r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]);
321 s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]);
322 }
while (lenR != r.size() || lenS !=
s.size());
323 vchSig.push_back(static_cast<unsigned char>(nHashType));
332 return PushSig(key, nHashType, lenR, lenS, sigversion, amount).AsWit();
335 TestBuilder& Push(
const CPubKey& pubkey)
337 DoPush(std::vector<unsigned char>(pubkey.
begin(), pubkey.
end()));
341 TestBuilder& PushRedeem()
343 DoPush(std::vector<unsigned char>(redeemscript.
begin(), redeemscript.
end()));
347 TestBuilder& PushWitRedeem()
349 DoPush(std::vector<unsigned char>(witscript.
begin(), witscript.
end()));
353 TestBuilder& EditPush(
unsigned int pos,
const std::string& hexin,
const std::string& hexout)
356 std::vector<unsigned char> datain =
ParseHex(hexin);
357 std::vector<unsigned char> dataout =
ParseHex(hexout);
358 assert(pos + datain.size() <= push.size());
359 BOOST_CHECK_MESSAGE(std::vector<unsigned char>(push.begin() + pos, push.begin() + pos + datain.size()) == datain, comment);
360 push.erase(push.begin() + pos, push.begin() + pos + datain.size());
361 push.insert(push.begin() + pos, dataout.begin(), dataout.end());
365 TestBuilder& DamagePush(
unsigned int pos)
368 assert(pos < push.size());
375 TestBuilder copy = *
this;
377 test.
DoTest(creditTx->vout[0].scriptPubKey, spendTx.
vin[0].scriptSig, scriptWitness,
flags, comment, scriptError, nValue);
385 scriptWitness.
stack.push_back(push);
394 if (!scriptWitness.
stack.empty()) {
396 for (
unsigned i = 0; i < scriptWitness.
stack.size(); i++) {
400 array.push_back(std::move(wit));
403 array.push_back(
FormatScript(creditTx->vout[0].scriptPubKey));
406 array.push_back(comment);
410 std::string GetComment()
const 416 std::string JSONPrettyPrint(
const UniValue& univalue)
418 std::string
ret = univalue.
write(4);
421 while ((pos =
ret.find(
" \n", pos)) != std::string::npos) {
422 ret.replace(pos, 2,
"\n");
435 std::vector<TestBuilder>
tests;
439 ).PushSig(keys.key0));
446 ).PushSig(keys.key1).Push(keys.pubkey1C));
448 "P2PKH, bad pubkey", 0
452 "P2PK anyonecanpay", 0
455 "P2PK anyonecanpay marked with normal hashtype", 0
460 ).PushSig(keys.key0).PushRedeem());
467 ).PushSig(keys.key0).Push(keys.pubkey0).PushRedeem());
469 "P2SH(P2PKH), bad sig but no VERIFY_P2SH", 0,
true 470 ).PushSig(keys.key0).DamagePush(10).PushRedeem());
477 ).Num(0).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
484 ).Num(0).PushSig(keys.key1).PushSig(keys.key2).PushRedeem());
490 "P2PK with too much R padding but no DERSIG", 0
491 ).PushSig(keys.key1,
SIGHASH_ALL, 31, 32).EditPush(1,
"43021F",
"44022000"));
496 "P2PK with too much S padding but no DERSIG", 0
497 ).PushSig(keys.key1,
SIGHASH_ALL).EditPush(1,
"44",
"45").EditPush(37,
"20",
"2100"));
502 "P2PK with too little R padding but no DERSIG", 0
503 ).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
508 "P2PK NOT with bad sig with too much R padding but no DERSIG", 0
509 ).PushSig(keys.key2,
SIGHASH_ALL, 31, 32).EditPush(1,
"43021F",
"44022000").DamagePush(10));
514 "P2PK NOT with too much R padding but no DERSIG", 0
521 "BIP66 example 1, without DERSIG", 0
522 ).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
527 "BIP66 example 2, without DERSIG", 0
533 "BIP66 example 3, without DERSIG", 0
539 "BIP66 example 4, without DERSIG", 0
545 "BIP66 example 5, without DERSIG", 0
551 "BIP66 example 6, without DERSIG", 0
557 "BIP66 example 7, without DERSIG", 0
558 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").PushSig(keys.key2));
563 "BIP66 example 8, without DERSIG", 0
569 "BIP66 example 9, without DERSIG", 0
575 "BIP66 example 10, without DERSIG", 0
576 ).Num(0).Num(0).PushSig(keys.key2,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
581 "BIP66 example 11, without DERSIG", 0
587 "BIP66 example 12, without DERSIG", 0
588 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").Num(0));
591 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").Num(0));
593 "P2PK with multi-byte hashtype, without DERSIG", 0
594 ).PushSig(keys.key2,
SIGHASH_ALL).EditPush(70,
"01",
"0101"));
600 "P2PK with high S but no LOW_S", 0
607 "P2PK with hybrid pubkey but no STRICTENC", 0
613 "P2PK NOT with hybrid pubkey but no STRICTENC", 0
619 "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0
625 "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", 0
635 "P2PK with undefined hashtype but no STRICTENC", 0
636 ).PushSig(keys.key1, 5));
641 "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", 0
642 ).PushSig(keys.key1, 5).DamagePush(10));
648 "3-of-3 with nonzero dummy but no NULLDUMMY", 0
649 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
654 "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY", 0
655 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10));
658 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10).ScriptError(
SCRIPT_ERR_SIG_NULLDUMMY));
661 "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY", 0
662 ).Num(0).PushSig(keys.key1).Opcode(
OP_DUP));
667 "P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY", 0,
true 668 ).PushSig(keys.key2).Opcode(
OP_NOP8).PushRedeem());
671 ).PushSig(keys.key2).Opcode(
OP_NOP8));
680 ).Num(0).PushSig(keys.key1).PushSig(keys.key1));
683 ).Num(11).PushSig(keys.key0));
689 ).Num(11).PushSig(keys.key0).PushRedeem());
695 ).PushSig(keys.key0).PushRedeem());
699 0, 1).PushWitSig(keys.key0).PushWitRedeem());
702 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit());
705 0, 1).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
708 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem());
722 "Basic P2WSH with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
false, WitnessMode::SH
723 ).PushWitSig(keys.key0).PushWitRedeem());
725 "Basic P2WPKH with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
false, WitnessMode::PKH
726 ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit());
728 "Basic P2SH(P2WSH) with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
true, WitnessMode::SH
729 ).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
731 "Basic P2SH(P2WPKH) with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
true, WitnessMode::PKH
732 ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem());
744 0, 0).PushWitSig(keys.key0, 1).Push(keys.pubkey0).AsWit().PushRedeem().ScriptError(
SCRIPT_ERR_EVAL_FALSE));
754 std::vector<unsigned char> hashBytes =
ToByteVector(hash);
755 hashBytes.pop_back();
765 tests.push_back(TestBuilder(witscript,
785 0, 1).PushWitSig(keys.key0C).PushWitRedeem());
788 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit());
791 0, 1).PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
794 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit().PushRedeem());
813 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
816 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
819 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
822 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
827 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem());
830 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
839 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
842 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
852 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
855 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
858 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
861 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
864 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem());
867 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem());
875 std::set<std::string> tests_set;
880 for (
unsigned int idx = 0; idx < json_tests.
size(); idx++) {
881 const UniValue& tv = json_tests[idx];
882 tests_set.insert(JSONPrettyPrint(tv.
get_array()));
886 #ifdef UPDATE_JSON_TESTS 889 for (TestBuilder& test :
tests) {
891 std::string str = JSONPrettyPrint(test.GetJSON());
892 #ifdef UPDATE_JSON_TESTS 893 strGen += str +
",\n";
895 if (!tests_set.contains(str)) {
896 BOOST_CHECK_MESSAGE(
false,
"Missing auto script_valid test: " + test.GetComment());
901 #ifdef UPDATE_JSON_TESTS 903 fputs(strGen.c_str(), file);
920 for (
unsigned int idx = 0; idx <
tests.size(); idx++) {
922 std::string strTest = test.
write();
926 unsigned int pos = 0;
929 for (i = 0; i < test[pos].
size()-1; i++) {
930 auto element = test[pos][i].
get_str();
933 static const std::string SCRIPT_FLAG{
"#SCRIPT#"};
934 if (element.starts_with(SCRIPT_FLAG)) {
937 }
else if (element ==
"#CONTROLBLOCK#") {
943 witness.
stack.push_back(*(controlblocks.begin()));
945 const auto witness_value{TryParseHex<unsigned char>(element)};
946 if (!witness_value.has_value()) {
947 BOOST_ERROR(
"Bad witness in test: " << strTest <<
" witness is not hex: " << element);
949 witness.
stack.push_back(witness_value.value());
955 if (test.
size() < 4 + pos)
957 if (test.
size() != 1) {
958 BOOST_ERROR(
"Bad test: " << strTest);
962 std::string scriptSigString = test[pos++].
get_str();
964 std::string scriptPubKeyString = test[pos++].
get_str();
967 if (scriptPubKeyString ==
"0x51 0x20 #TAPROOTOUTPUT#") {
968 BOOST_CHECK_MESSAGE(taprootBuilder.
IsComplete(),
"Failed to autogenerate Tapscript output key");
976 DoTest(scriptPubKey, scriptSig, witness, scriptflags, strTest, scriptError, nValue);
984 static const unsigned char direct[] = { 1, 0x5a };
985 static const unsigned char pushdata1[] = {
OP_PUSHDATA1, 1, 0x5a };
986 static const unsigned char pushdata2[] = {
OP_PUSHDATA2, 1, 0, 0x5a };
987 static const unsigned char pushdata4[] = {
OP_PUSHDATA4, 1, 0, 0, 0, 0x5a };
990 std::vector<std::vector<unsigned char> > directStack;
994 std::vector<std::vector<unsigned char> > pushdata1Stack;
999 std::vector<std::vector<unsigned char> > pushdata2Stack;
1004 std::vector<std::vector<unsigned char> > pushdata4Stack;
1009 const std::vector<unsigned char> pushdata1_trunc{
OP_PUSHDATA1, 1};
1010 const std::vector<unsigned char> pushdata2_trunc{
OP_PUSHDATA2, 1, 0};
1011 const std::vector<unsigned char> pushdata4_trunc{
OP_PUSHDATA4, 1, 0, 0, 0};
1013 std::vector<std::vector<unsigned char>> stack_ignore;
1026 std::vector<std::vector<unsigned char>> stack_ignore;
1047 for (
const CKey &key : keys)
1049 std::vector<unsigned char> vchSig;
1059 std::vector<CKey> keys;
1080 txTo12.
vout[0].nValue = 2;
1107 std::vector<CKey> keys;
1108 keys.push_back(key1); keys.push_back(key2);
1114 keys.push_back(key1); keys.push_back(key3);
1120 keys.push_back(key2); keys.push_back(key3);
1126 keys.push_back(key2); keys.push_back(key2);
1132 keys.push_back(key2); keys.push_back(key1);
1138 keys.push_back(key3); keys.push_back(key2);
1144 keys.push_back(key4); keys.push_back(key2);
1150 keys.push_back(key1); keys.push_back(key4);
1164 std::vector<std::vector<uint8_t>> unused;
1165 return Solver(output_script, unused);
1168 #define CHECK_SCRIPT_STATIC_SIZE(script, expected_size) \ 1170 BOOST_CHECK_EQUAL((script).size(), (expected_size)); \ 1171 BOOST_CHECK_EQUAL((script).capacity(), CScriptBase::STATIC_SIZE); \ 1172 BOOST_CHECK_EQUAL((script).allocated_memory(), 0); \ 1175 #define CHECK_SCRIPT_DYNAMIC_SIZE(script, expected_size, expected_extra) \ 1177 BOOST_CHECK_EQUAL((script).size(), (expected_size)); \ 1178 BOOST_CHECK_EQUAL((script).capacity(), (expected_extra)); \ 1179 BOOST_CHECK_EQUAL((script).allocated_memory(), (expected_extra)); \ 1196 const auto script{
CScript() << OP_RETURN << std::vector<uint8_t>(10, 0xaa)};
1245 CKey uncompressed_key;
1266 data.MergeSignatureData(scriptSig1);
1267 data.MergeSignatureData(scriptSig2);
1276 std::vector<CKey> keys;
1277 std::vector<CPubKey> pubkeys;
1278 for (
int i = 0; i < 3; i++)
1281 keys.push_back(key);
1288 CScript& scriptPubKey = txFrom.
vout[0].scriptPubKey;
1322 scriptSigCopy = scriptSig;
1341 std::vector<unsigned char> sig1;
1345 std::vector<unsigned char> sig2;
1349 std::vector<unsigned char> sig3;
1401 const auto invalid_pubkey{
"173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292"_hex_u8};
1403 builder.
Add(0, {invalid_pubkey}, 0xc0);
1429 for (
int i=0; i<67000; i++) {
1432 BOOST_CHECK_MESSAGE(
script.IsPushOnly(),
"Number " << i <<
" is not pure push.");
1438 std::vector<unsigned char>
data(i,
'\111');
1441 BOOST_CHECK_MESSAGE(
script.IsPushOnly(),
"Length " << i <<
" is not pure push.");
1454 static const unsigned char direct[] = { 1 };
1465 std::string derSig(
"304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090");
1466 std::string pubKey(
"03b0da749730dc9b4b1f4a14d6902877a92541f5368778853d9c4a0cb7802dcfb2");
1488 template <
typename T>
1492 return {span.begin(), span.end()};
1497 const CScript scriptPubKey1 =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex_v_u8 <<
OP_CHECKSIG;
1498 const CScript scriptPubKey2 =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
1615 script =
ToScript(
"76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex);
1617 script =
ToScript(
"76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex);
1628 tests.read(json_tests::bip341_wallet_vectors);
1630 const auto& vectors =
tests[
"keyPathSpending"];
1632 for (
const auto& vec : vectors.getValues()) {
1633 auto txhex =
ParseHex(vec[
"given"][
"rawUnsignedTx"].get_str());
1636 std::vector<CTxOut> utxos;
1637 for (
const auto& utxo_spent : vec[
"given"][
"utxosSpent"].getValues()) {
1638 auto script_bytes =
ParseHex(utxo_spent[
"scriptPubKey"].get_str());
1640 CAmount amount{utxo_spent[
"amountSats"].getInt<
int>()};
1641 utxos.emplace_back(amount,
script);
1645 txdata.
Init(tx, std::vector<CTxOut>{utxos},
true);
1654 for (
const auto& input : vec[
"inputSpending"].getValues()) {
1655 int txinpos = input[
"given"][
"txinIndex"].getInt<
int>();
1656 int hashtype = input[
"given"][
"hashType"].getInt<
int>();
1659 auto privkey =
ParseHex(input[
"given"][
"internalPrivkey"].get_str());
1661 key.
Set(privkey.begin(), privkey.end(),
true);
1665 if (!input[
"given"][
"merkleRoot"].isNull()) {
1666 merkle_root =
uint256{
ParseHex(input[
"given"][
"merkleRoot"].get_str())};
1677 std::vector<unsigned char> signature;
1682 BOOST_CHECK_EQUAL(
HexStr(pubkey.ComputeTapTweakHash(merkle_root.
IsNull() ? nullptr : &merkle_root)), input[
"intermediary"][
"tweak"].get_str());
1687 sed.m_annex_present =
false;
1700 constexpr
uint256 hash1{
"8ad69ec7cf41c2a4001fd1f738bf1e505ce2277acdcaa63fe4765192497f47a7"};
1701 constexpr
uint256 hash2{
"f224a923cd0021ab202ab139cc56802ddb92dcfc172b9212261a539df79a112a"};
1702 constexpr
uint256 result{
"a64c5b7b943315f9b805d7a7296bedfcfd08919270a1f7a1466e98f8693d8cd9"};
1708 constexpr uint8_t
script[6] = {
'f',
'o',
'o',
'b',
'a',
'r'};
1709 constexpr
uint256 tlc0{
"edbc10c272a1215dcdcc11d605b9027b5ad6ed97cd45521203f136767b5b9c06"};
1710 constexpr
uint256 tlc2{
"8b5c4f90ae6bf76e259dbef5d8a59df06359c391b59263741b25eca76451b27a"};
std::shared_ptr< const CTransaction > CTransactionRef
CMutableTransaction BuildCreditingTransaction(const CScript &scriptPubKey, int nValue)
Witness v0 (P2WPKH and P2WSH); see BIP 141.
CSHA256 & Write(const unsigned char *data, size_t len)
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
Generate a multisig script.
Witness v1 with 32-byte program, not BIP16 P2SH-wrapped, key path spending; see BIP 341...
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int32_t nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache, SigHashCache *sighash_cache)
bool SignatureHashSchnorr(uint256 &hash_out, ScriptExecutionData &execdata, const T &tx_to, uint32_t in_pos, uint8_t hash_type, SigVersion sigversion, const PrecomputedTransactionData &cache, MissingDataBehavior mdb)
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span
Like the std::span constructor, but for (const) unsigned char member types only.
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
FILE * fopen(const fs::path &p, const char *mode)
enum ScriptError_t ScriptError
UniValue ValueFromAmount(const CAmount amount)
CHash160 & Write(std::span< const unsigned char > input)
SECP256K1_API const secp256k1_context *const secp256k1_context_static
A built-in constant secp256k1 context object with static storage duration, to be used in conjunction ...
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
CPubKey GetPubKey() const
Compute the public key from a private key.
uint256 m_spent_amounts_single_hash
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format...
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
std::map< CKeyID, CKey > keys
script_verify_flags ParseScriptFlags(std::string strFlags)
virtual bool AddCScript(const CScript &redeemScript)
static const script_verify_flags gFlags
std::vector< std::vector< unsigned char > > stack
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_negate(const secp256k1_context *ctx, unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Negates a secret key in place.
CMutableTransaction BuildSpendingTransaction(const CScript &scriptSig, const CScriptWitness &scriptWitness, const CTransaction &txCredit)
static constexpr uint8_t TAPROOT_LEAF_TAPSCRIPT
static const XOnlyPubKey NUMS_H
Nothing Up My Sleeve point H Used as an internal key for provably disabling the key path spend see BI...
const std::string & get_str() const
const UniValue & get_array() const
Bare scripts and BIP16 P2SH-wrapped redeemscripts.
void DoTest(const CScript &scriptPubKey, const CScript &scriptSig, const CScriptWitness &scriptWitness, script_verify_flags flags, const std::string &message, int scriptError, CAmount nValue=0)
static constexpr int MAX_SCRIPT_VERIFY_FLAGS_BITS
UniValue read_json(std::string_view jsondata)
A signature creator for transactions.
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror)
const HashWriter HASHER_TAPSIGHASH
Hasher with tag "TapSighash" pre-fed to it.
std::string FormatScript(const CScript &script)
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
std::pair< opcodetype, std::vector< unsigned char > > Opcode
const unsigned char * begin() const
constexpr unsigned char * begin()
Minimal stream for reading from an existing byte array by std::span.
CKey GenerateRandomKey(bool compressed) noexcept
SignatureData CombineSignatures(const CTxOut &txout, const CMutableTransaction &tx, const SignatureData &scriptSig1, const SignatureData &scriptSig2)
constexpr std::array tests
int64_t CAmount
Amount in satoshis (Can be negative)
static void NegateSignatureS(std::vector< unsigned char > &vchSig)
bool Sign(const uint256 &hash, std::vector< unsigned char > &vchSig, bool grind=true, uint32_t test_case=0) const
Create a DER-serialized signature.
bool m_annex_init
Whether m_annex_present and (when needed) m_annex_hash are initialized.
void push_back(const T &value)
Abort execution through assertion failure (for consensus code)
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
static CAmount AmountFromValue(const UniValue &value)
std::map< std::pair< std::vector< unsigned char >, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > scripts
Map from (script, leaf_version) to (sets of) control blocks.
const unsigned char * end() const
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
static ScriptError_t ParseScriptError(const std::string &name)
const SigningProvider & DUMMY_SIGNING_PROVIDER
A writer stream (for serialization) that computes a 256-bit hash.
BOOST_AUTO_TEST_SUITE_END()
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
An encapsulated public key.
Fillable signing provider that keeps keys in an address->secret map.
uint256 ComputeTapbranchHash(std::span< const unsigned char > a, std::span< const unsigned char > b)
Compute the BIP341 tapbranch hash from two branches.
std::string ScriptErrorString(const ScriptError serror)
std::pair< CPubKey, std::vector< unsigned char > > SigPair
opcodetype
Script opcodes.
WitnessV1Taproot GetOutput()
Compute scriptPubKey (after Finalize()).
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
uint256 m_outputs_single_hash
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
Just act as if the signature was invalid.
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode)
Create the assembly string representation of a CScript object.
An output of a transaction.
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
GenericTransactionSignatureChecker< CMutableTransaction > MutableTransactionSignatureChecker
Txid GetHash() const
Compute the hash of this CMutableTransaction.
static std::string FormatScriptFlags(script_verify_flags flags)
An outpoint - a combination of a transaction hash and an index n into its vout.
bool m_bip341_taproot_ready
Whether the 5 fields above are initialized.
std::vector< CTxOut > vout
constexpr bool IsNull() const
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
A type to represent integers in the type system.
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).
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
CScript ParseScript(const std::string &s)
TaprootSpendData GetSpendData() const
Compute spending data (after Finalize()).
Utility class to construct Taproot outputs from internal key and script tree.
static ScriptErrorDesc script_errors[]
std::vector< unsigned char > ToByteVector(const T &in)
BOOST_AUTO_TEST_CASE(script_build)
TaprootBuilder & Add(int depth, std::span< const unsigned char > script, int leaf_version, bool track=true)
Add a new script at a certain depth in the tree.
static constexpr script_verify_flags from_int(value_type f)
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
#define CHECK_SCRIPT_STATIC_SIZE(script, expected_size)
#define BOOST_CHECK_EQUAL(v1, v2)
CScript ToScript(const T &byte_container)
Serialized script, used inside transaction inputs and outputs.
static bool GetPubKey(const SigningProvider &provider, const SignatureData &sigdata, const CKeyID &address, CPubKey &pubkey)
bool CreateSchnorrSig(const SigningProvider &provider, std::vector< unsigned char > &sig, const XOnlyPubKey &pubkey, const uint256 *leaf_hash, const uint256 *merkle_root, SigVersion sigversion) const override
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE
#define CHECK_SCRIPT_DYNAMIC_SIZE(script, expected_size, expected_extra)
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
A reference to a CScript: the Hash160 of its serialization.
A mutable version of CTransaction.
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
bool IsComplete() const
Return whether there were either no leaves, or the leaves form a Huffman tree.
static std::string FormatScriptError(ScriptError_t err)
const unsigned char * data() const
An encapsulated private key.
The basic transaction that is broadcasted on the network and contained in blocks. ...
uint256 m_spent_scripts_single_hash
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, script_verify_flags flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptExecutionData &execdata, ScriptError *serror)
uint256 m_sequences_single_hash
std::vector< std::string > GetScriptFlagNames(script_verify_flags flags)
uint256 m_prevouts_single_hash
A hasher class for SHA-256.
uint256 ComputeTapleafHash(uint8_t leaf_version, std::span< const unsigned char > script)
Compute the BIP341 tapleaf hash from leaf version & script.
int FindAndDelete(CScript &script, const CScript &b)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
virtual bool AddKey(const CKey &key)
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
static constexpr TransactionSerParams TX_WITH_WITNESS
#define BOOST_CHECK(expr)
static CScript sign_multisig(const CScript &scriptPubKey, const std::vector< CKey > &keys, const CTransaction &transaction)
static TxoutType GetTxoutType(const CScript &output_script)
Return the TxoutType of a script without exposing Solver details.
unspendable OP_RETURN script that carries data
TaprootSpendData tr_spenddata
Taproot spending data.