26 #if defined(HAVE_CONSENSUS_LIB) 35 #include <boost/test/unit_test.hpp> 104 BOOST_ERROR(
"Unknown scripterror enumeration value, update script_errors in script_tests.cpp.");
113 BOOST_ERROR(
"Unknown scripterror \"" <<
name <<
"\" in test description");
134 for (
int i = 0; i < 16; ++i) {
136 uint32_t combined_flags{
expect ? (
flags & ~extra_flags) : (
flags | extra_flags)};
140 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));
143 #if defined(HAVE_CONSENSUS_LIB) 147 if (libconsensus_flags ==
flags) {
148 int expectedSuccessCode =
expect ? 1 : 0;
161 std::vector<unsigned char> r, s;
162 r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]);
163 s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]);
166 static const unsigned char order[33] = {
168 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
169 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
170 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,
171 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41
173 while (s.size() < 33) {
174 s.insert(s.begin(), 0x00);
177 for (
int p = 32; p >= 1; p--) {
178 int n = (int)order[p] - s[p] - carry;
179 s[p] = (n + 256) & 0xFF;
183 if (s.size() > 1 && s[0] == 0 && s[1] < 0x80) {
189 vchSig.push_back(0x30);
190 vchSig.push_back(4 + r.size() + s.size());
191 vchSig.push_back(0x02);
192 vchSig.push_back(r.size());
193 vchSig.insert(vchSig.end(), r.begin(), r.end());
194 vchSig.push_back(0x02);
195 vchSig.push_back(s.size());
196 vchSig.insert(vchSig.end(), s.begin(), s.end());
201 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};
202 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};
203 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};
207 CKey key0, key0C, key1, key1C, key2, key2C;
208 CPubKey pubkey0, pubkey0C, pubkey0H;
214 key0.
Set(vchKey0, vchKey0 + 32,
false);
215 key0C.
Set(vchKey0, vchKey0 + 32,
true);
219 *
const_cast<unsigned char*
>(pubkey0H.
data()) = 0x06 | (pubkey0H[64] & 1);
221 key1.
Set(vchKey1, vchKey1 + 32,
false);
222 key1C.
Set(vchKey1, vchKey1 + 32,
true);
226 key2.
Set(vchKey2, vchKey2 + 32,
false);
227 key2C.
Set(vchKey2, vchKey2 + 32,
true);
251 bool havePush{
false};
252 std::vector<unsigned char> push;
261 spendTx.
vin[0].scriptSig << push;
266 void DoPush(
const std::vector<unsigned char>& data)
274 TestBuilder(
const CScript& script_,
const std::string& comment_, uint32_t flags_,
bool P2SH =
false,
WitnessMode wm =
WitnessMode::NONE,
int witnessversion = 0,
CAmount nValue_ = 0) : script(script_), comment(comment_),
flags(flags_), nValue(nValue_)
277 if (wm == WitnessMode::PKH) {
282 }
else if (wm == WitnessMode::SH) {
283 witscript = scriptPubKey;
289 redeemscript = scriptPubKey;
305 spendTx.
vin[0].scriptSig << _op;
309 TestBuilder&
Num(
int num)
312 spendTx.
vin[0].scriptSig << num;
316 TestBuilder& Push(
const std::string& hex)
322 TestBuilder& Push(
const CScript& _script)
324 DoPush(std::vector<unsigned char>(_script.
begin(), _script.
end()));
331 std::vector<unsigned char> vchSig, r, s;
334 key.
Sign(hash, vchSig,
false, iter++);
335 if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) {
338 r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]);
339 s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]);
340 }
while (lenR != r.size() || lenS != s.size());
341 vchSig.push_back(static_cast<unsigned char>(nHashType));
350 return PushSig(key, nHashType, lenR, lenS, sigversion, amount).AsWit();
353 TestBuilder& Push(
const CPubKey& pubkey)
355 DoPush(std::vector<unsigned char>(pubkey.
begin(), pubkey.
end()));
359 TestBuilder& PushRedeem()
361 DoPush(std::vector<unsigned char>(redeemscript.
begin(), redeemscript.
end()));
365 TestBuilder& PushWitRedeem()
367 DoPush(std::vector<unsigned char>(witscript.
begin(), witscript.
end()));
371 TestBuilder& EditPush(
unsigned int pos,
const std::string& hexin,
const std::string& hexout)
374 std::vector<unsigned char> datain =
ParseHex(hexin);
375 std::vector<unsigned char> dataout =
ParseHex(hexout);
376 assert(pos + datain.size() <= push.size());
377 BOOST_CHECK_MESSAGE(std::vector<unsigned char>(push.begin() + pos, push.begin() + pos + datain.size()) == datain, comment);
378 push.erase(push.begin() + pos, push.begin() + pos + datain.size());
379 push.insert(push.begin() + pos, dataout.begin(), dataout.end());
383 TestBuilder& DamagePush(
unsigned int pos)
386 assert(pos < push.size());
393 TestBuilder copy = *
this;
395 DoTest(creditTx->vout[0].scriptPubKey, spendTx.
vin[0].scriptSig, scriptWitness,
flags, comment, scriptError, nValue);
403 scriptWitness.
stack.push_back(push);
412 if (!scriptWitness.
stack.empty()) {
414 for (
unsigned i = 0; i < scriptWitness.
stack.size(); i++) {
418 array.push_back(wit);
421 array.push_back(
FormatScript(creditTx->vout[0].scriptPubKey));
424 array.push_back(comment);
428 std::string GetComment()
const 434 std::string JSONPrettyPrint(
const UniValue& univalue)
436 std::string
ret = univalue.
write(4);
439 while ((pos =
ret.find(
" \n", pos)) != std::string::npos) {
440 ret.replace(pos, 2,
"\n");
451 std::vector<TestBuilder> tests;
455 ).PushSig(keys.key0));
462 ).PushSig(keys.key1).Push(keys.pubkey1C));
464 "P2PKH, bad pubkey", 0
468 "P2PK anyonecanpay", 0
471 "P2PK anyonecanpay marked with normal hashtype", 0
476 ).PushSig(keys.key0).PushRedeem());
483 ).PushSig(keys.key0).Push(keys.pubkey0).PushRedeem());
485 "P2SH(P2PKH), bad sig but no VERIFY_P2SH", 0,
true 486 ).PushSig(keys.key0).DamagePush(10).PushRedeem());
493 ).Num(0).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
500 ).Num(0).PushSig(keys.key1).PushSig(keys.key2).PushRedeem());
506 "P2PK with too much R padding but no DERSIG", 0
507 ).PushSig(keys.key1,
SIGHASH_ALL, 31, 32).EditPush(1,
"43021F",
"44022000"));
512 "P2PK with too much S padding but no DERSIG", 0
513 ).PushSig(keys.key1,
SIGHASH_ALL).EditPush(1,
"44",
"45").EditPush(37,
"20",
"2100"));
518 "P2PK with too little R padding but no DERSIG", 0
519 ).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
524 "P2PK NOT with bad sig with too much R padding but no DERSIG", 0
525 ).PushSig(keys.key2,
SIGHASH_ALL, 31, 32).EditPush(1,
"43021F",
"44022000").DamagePush(10));
530 "P2PK NOT with too much R padding but no DERSIG", 0
537 "BIP66 example 1, without DERSIG", 0
538 ).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
543 "BIP66 example 2, without DERSIG", 0
549 "BIP66 example 3, without DERSIG", 0
555 "BIP66 example 4, without DERSIG", 0
561 "BIP66 example 5, without DERSIG", 0
567 "BIP66 example 6, without DERSIG", 0
573 "BIP66 example 7, without DERSIG", 0
574 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").PushSig(keys.key2));
579 "BIP66 example 8, without DERSIG", 0
585 "BIP66 example 9, without DERSIG", 0
591 "BIP66 example 10, without DERSIG", 0
592 ).Num(0).Num(0).PushSig(keys.key2,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220"));
597 "BIP66 example 11, without DERSIG", 0
603 "BIP66 example 12, without DERSIG", 0
604 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").Num(0));
607 ).Num(0).PushSig(keys.key1,
SIGHASH_ALL, 33, 32).EditPush(1,
"45022100",
"440220").Num(0));
609 "P2PK with multi-byte hashtype, without DERSIG", 0
610 ).PushSig(keys.key2,
SIGHASH_ALL).EditPush(70,
"01",
"0101"));
616 "P2PK with high S but no LOW_S", 0
623 "P2PK with hybrid pubkey but no STRICTENC", 0
629 "P2PK NOT with hybrid pubkey but no STRICTENC", 0
635 "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0
641 "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", 0
651 "P2PK with undefined hashtype but no STRICTENC", 0
652 ).PushSig(keys.key1, 5));
657 "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", 0
658 ).PushSig(keys.key1, 5).DamagePush(10));
664 "3-of-3 with nonzero dummy but no NULLDUMMY", 0
665 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
670 "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY", 0
671 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10));
674 ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10).ScriptError(
SCRIPT_ERR_SIG_NULLDUMMY));
677 "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY", 0
678 ).Num(0).PushSig(keys.key1).Opcode(
OP_DUP));
683 "P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY", 0,
true 684 ).PushSig(keys.key2).Opcode(
OP_NOP8).PushRedeem());
686 "P2PK with non-push scriptSig but with P2SH validation", 0
687 ).PushSig(keys.key2).Opcode(
OP_NOP8));
696 ).Num(0).PushSig(keys.key1).PushSig(keys.key1));
699 ).Num(11).PushSig(keys.key0));
705 ).Num(11).PushSig(keys.key0).PushRedeem());
711 ).PushSig(keys.key0).PushRedeem());
715 0, 1).PushWitSig(keys.key0).PushWitRedeem());
718 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit());
721 0, 1).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
724 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem());
738 "Basic P2WSH with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
false, WitnessMode::SH
739 ).PushWitSig(keys.key0).PushWitRedeem());
741 "Basic P2WPKH with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
false, WitnessMode::PKH
742 ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit());
744 "Basic P2SH(P2WSH) with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
true, WitnessMode::SH
745 ).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
747 "Basic P2SH(P2WPKH) with the wrong key but no WITNESS",
SCRIPT_VERIFY_P2SH,
true, WitnessMode::PKH
748 ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem());
760 0, 0).PushWitSig(keys.key0, 1).Push(keys.pubkey0).AsWit().PushRedeem().ScriptError(
SCRIPT_ERR_EVAL_FALSE));
770 std::vector<unsigned char> hashBytes =
ToByteVector(hash);
771 hashBytes.pop_back();
772 tests.push_back(TestBuilder(
CScript() <<
OP_0 << hashBytes,
781 tests.push_back(TestBuilder(witscript,
801 0, 1).PushWitSig(keys.key0C).PushWitRedeem());
804 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit());
807 0, 1).PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
810 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit().PushRedeem());
829 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
832 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
835 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
838 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
843 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem());
846 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
855 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
858 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
868 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
871 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
874 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
877 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
880 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem());
883 0, 1).Push(
CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem());
891 std::set<std::string> tests_set;
896 for (
unsigned int idx = 0; idx <
json_tests.size(); idx++) {
898 tests_set.insert(JSONPrettyPrint(tv.
get_array()));
902 #ifdef UPDATE_JSON_TESTS 905 for (TestBuilder& test : tests) {
907 std::string str = JSONPrettyPrint(test.GetJSON());
908 #ifdef UPDATE_JSON_TESTS 909 strGen += str +
",\n";
911 if (tests_set.count(str) == 0) {
912 BOOST_CHECK_MESSAGE(
false,
"Missing auto script_valid test: " + test.GetComment());
917 #ifdef UPDATE_JSON_TESTS 919 fputs(strGen.c_str(), file);
935 for (
unsigned int idx = 0; idx < tests.
size(); idx++) {
937 std::string strTest = test.
write();
940 unsigned int pos = 0;
943 for (i = 0; i < test[pos].
size()-1; i++) {
949 if (test.
size() < 4 + pos)
951 if (test.
size() != 1) {
952 BOOST_ERROR(
"Bad test: " << strTest);
956 std::string scriptSigString = test[pos++].
get_str();
958 std::string scriptPubKeyString = test[pos++].
get_str();
963 DoTest(scriptPubKey, scriptSig, witness, scriptflags, strTest, scriptError, nValue);
971 static const unsigned char direct[] = { 1, 0x5a };
972 static const unsigned char pushdata1[] = {
OP_PUSHDATA1, 1, 0x5a };
973 static const unsigned char pushdata2[] = {
OP_PUSHDATA2, 1, 0, 0x5a };
974 static const unsigned char pushdata4[] = {
OP_PUSHDATA4, 1, 0, 0, 0, 0x5a };
977 std::vector<std::vector<unsigned char> > directStack;
981 std::vector<std::vector<unsigned char> > pushdata1Stack;
986 std::vector<std::vector<unsigned char> > pushdata2Stack;
991 std::vector<std::vector<unsigned char> > pushdata4Stack;
996 const std::vector<unsigned char> pushdata1_trunc{
OP_PUSHDATA1, 1};
997 const std::vector<unsigned char> pushdata2_trunc{
OP_PUSHDATA2, 1, 0};
998 const std::vector<unsigned char> pushdata4_trunc{
OP_PUSHDATA4, 1, 0, 0, 0};
1000 std::vector<std::vector<unsigned char>> stack_ignore;
1013 std::vector<std::vector<unsigned char>> stack_ignore;
1034 for (
const CKey &key : keys)
1036 std::vector<unsigned char> vchSig;
1046 std::vector<CKey> keys;
1054 CKey key1, key2, key3;
1068 txTo12.
vout[0].nValue = 2;
1084 CKey key1, key2, key3, key4;
1096 std::vector<CKey> keys;
1097 keys.push_back(key1); keys.push_back(key2);
1103 keys.push_back(key1); keys.push_back(key3);
1109 keys.push_back(key2); keys.push_back(key3);
1115 keys.push_back(key2); keys.push_back(key2);
1121 keys.push_back(key2); keys.push_back(key1);
1127 keys.push_back(key3); keys.push_back(key2);
1133 keys.push_back(key4); keys.push_back(key2);
1139 keys.push_back(key1); keys.push_back(key4);
1164 std::vector<CKey> keys;
1165 std::vector<CPubKey> pubkeys;
1166 for (
int i = 0; i < 3; i++)
1170 keys.push_back(key);
1177 CScript& scriptPubKey = txFrom.
vout[0].scriptPubKey;
1211 scriptSigCopy = scriptSig;
1230 std::vector<unsigned char> sig1;
1234 std::vector<unsigned char> sig2;
1238 std::vector<unsigned char> sig3;
1282 for (
int i=0; i<67000; i++) {
1285 BOOST_CHECK_MESSAGE(script.
IsPushOnly(),
"Number " << i <<
" is not pure push.");
1291 std::vector<unsigned char> data(i,
'\111');
1294 BOOST_CHECK_MESSAGE(script.
IsPushOnly(),
"Length " << i <<
" is not pure push.");
1307 static const unsigned char direct[] = { 1 };
1318 std::string derSig(
"304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090");
1319 std::string pubKey(
"03b0da749730dc9b4b1f4a14d6902877a92541f5368778853d9c4a0cb7802dcfb2");
1343 std::vector<unsigned char> data =
ParseHex(str);
1344 return CScript(data.begin(), data.end());
1460 script =
ScriptFromHex(
"76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
1462 script =
ScriptFromHex(
"76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
1480 std::vector<CTxOut> prevouts;
1481 for (
size_t i = 0; i < univalue.
size(); ++i) {
1484 prevouts.push_back(std::move(txout));
1493 for (
size_t i = 0; i < univalue.
size(); ++i) {
1494 auto bytes =
ParseHex(univalue[i].get_str());
1495 scriptwitness.stack.push_back(std::move(bytes));
1497 return scriptwitness;
1500 #if defined(HAVE_CONSENSUS_LIB) 1505 unsigned int libconsensus_flags = 0;
1512 scriptPubKey <<
OP_1;
1528 unsigned int libconsensus_flags = 0;
1551 unsigned int libconsensus_flags = 0;
1574 unsigned int libconsensus_flags = 0;
1586 stream << 0xffffffff;
1620 unsigned int libconsensus_flags = 1 << 3;
1671 #endif // defined(HAVE_CONSENSUS_LIB) 1675 std::vector<unsigned int>
ret;
1677 for (
unsigned int i = 0; i < 128; ++i) {
1678 unsigned int flag = 0;
1692 ret.push_back(flag);
1706 const std::vector<CTxOut> prevouts =
TxOutsFromJSON(test[
"prevouts"]);
1708 size_t idx = test[
"index"].
getInt<int64_t>();
1712 if (test.
exists(
"success")) {
1713 mtx.vin[idx].scriptSig =
ScriptFromHex(test[
"success"][
"scriptSig"].get_str());
1717 txdata.
Init(tx, std::vector<CTxOut>(prevouts));
1720 #if defined(HAVE_CONSENSUS_LIB) 1723 std::vector<UTXO> utxos;
1724 utxos.resize(prevouts.size());
1725 for (
size_t i = 0; i < prevouts.size(); i++) {
1726 utxos[i].scriptPubKey = prevouts[i].scriptPubKey.data();
1727 utxos[i].scriptPubKeySize = prevouts[i].scriptPubKey.size();
1728 utxos[i].value = prevouts[i].nValue;
1735 if (fin || ((
flags & test_flags) ==
flags)) {
1736 bool ret =
VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.vin[idx].scriptWitness,
flags, txcheck,
nullptr);
1738 #if defined(HAVE_CONSENSUS_LIB) 1746 if (test.
exists(
"failure")) {
1747 mtx.vin[idx].scriptSig =
ScriptFromHex(test[
"failure"][
"scriptSig"].get_str());
1751 txdata.
Init(tx, std::vector<CTxOut>(prevouts));
1754 #if defined(HAVE_CONSENSUS_LIB) 1757 std::vector<UTXO> utxos;
1758 utxos.resize(prevouts.size());
1759 for (
size_t i = 0; i < prevouts.size(); i++) {
1760 utxos[i].scriptPubKey = prevouts[i].scriptPubKey.data();
1761 utxos[i].scriptPubKeySize = prevouts[i].scriptPubKey.size();
1762 utxos[i].value = prevouts[i].nValue;
1768 if ((
flags & test_flags) == test_flags) {
1769 bool ret =
VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.vin[idx].scriptWitness,
flags, txcheck,
nullptr);
1771 #if defined(HAVE_CONSENSUS_LIB) 1785 const char* dir = std::getenv(
"DIR_UNIT_TEST_DATA");
1786 BOOST_WARN_MESSAGE(dir !=
nullptr,
"Variable DIR_UNIT_TEST_DATA unset, skipping script_assets_test");
1787 if (dir ==
nullptr)
return;
1788 auto path =
fs::path(dir) /
"script_assets_test.json";
1790 BOOST_WARN_MESSAGE(
exists,
"File $DIR_UNIT_TEST_DATA/script_assets_test.json not found, skipping script_assets_test");
1792 std::ifstream file{path};
1794 file.seekg(0, std::ios::end);
1795 size_t length = file.tellg();
1796 file.seekg(0, std::ios::beg);
1797 std::string data(length,
'\0');
1798 file.read(data.data(), data.size());
1803 for (
size_t i = 0; i < tests.
size(); i++) {
1814 const auto& vectors = tests[
"keyPathSpending"];
1816 for (
const auto& vec : vectors.getValues()) {
1817 auto txhex =
ParseHex(vec[
"given"][
"rawUnsignedTx"].get_str());
1820 std::vector<CTxOut> utxos;
1821 for (
const auto& utxo_spent : vec[
"given"][
"utxosSpent"].getValues()) {
1822 auto script_bytes =
ParseHex(utxo_spent[
"scriptPubKey"].get_str());
1823 CScript script{script_bytes.
begin(), script_bytes.end()};
1824 CAmount amount{utxo_spent[
"amountSats"].getInt<
int>()};
1825 utxos.emplace_back(amount, script);
1829 txdata.
Init(tx, std::vector<CTxOut>{utxos},
true);
1838 for (
const auto& input : vec[
"inputSpending"].getValues()) {
1839 int txinpos = input[
"given"][
"txinIndex"].getInt<
int>();
1840 int hashtype = input[
"given"][
"hashType"].getInt<
int>();
1843 auto privkey =
ParseHex(input[
"given"][
"internalPrivkey"].get_str());
1845 key.
Set(privkey.begin(), privkey.end(),
true);
1849 if (!input[
"given"][
"merkleRoot"].isNull()) {
1850 merkle_root =
uint256{
ParseHex(input[
"given"][
"merkleRoot"].get_str())};
1861 std::vector<unsigned char> signature;
1866 BOOST_CHECK_EQUAL(
HexStr(pubkey.ComputeTapTweakHash(merkle_root.
IsNull() ? nullptr : &merkle_root)), input[
"intermediary"][
"tweak"].get_str());
1871 sed.m_annex_present =
false;
1885 uint256 hash1 =
uint256S(
"8ad69ec7cf41c2a4001fd1f738bf1e505ce2277acdcaa63fe4765192497f47a7");
1886 uint256 hash2 =
uint256S(
"f224a923cd0021ab202ab139cc56802ddb92dcfc172b9212261a539df79a112a");
1887 uint256 result =
uint256S(
"a64c5b7b943315f9b805d7a7296bedfcfd08919270a1f7a1466e98f8693d8cd9");
1893 const uint8_t script[6] = {
'f',
'o',
'o',
'b',
'a',
'r'};
1894 uint256 tlc0 =
uint256S(
"edbc10c272a1215dcdcc11d605b9027b5ad6ed97cd45521203f136767b5b9c06");
1895 uint256 tlc2 =
uint256S(
"8b5c4f90ae6bf76e259dbef5d8a59df06359c391b59263741b25eca76451b27a");
std::shared_ptr< const CTransaction > CTransactionRef
CMutableTransaction BuildCreditingTransaction(const CScript &scriptPubKey, int nValue)
static const std::string sighash
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.
static const std::string bip341_wallet_vectors
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 int SERIALIZE_TRANSACTION_NO_WITNESS
A flag that is ORed into the protocol version to designate that a transaction should be (un)serialize...
Witness v1 with 32-byte program, not BIP16 P2SH-wrapped, key path spending; see BIP 341...
std::string FormatScript(const CScript &script)
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)
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
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)
uint256 m_spent_amounts_single_hash
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format...
static const std::string script_tests
std::map< CKeyID, CKey > keys
bool read(std::string_view raw)
virtual bool AddCScript(const CScript &redeemScript)
static CMutableTransaction TxFromHex(const std::string &str)
std::vector< std::vector< unsigned char > > stack
CMutableTransaction BuildSpendingTransaction(const CScript &scriptSig, const CScriptWitness &scriptWitness, const CTransaction &txCredit)
const std::string & get_str() const
const UniValue & get_array() const
Bare scripts and BIP16 P2SH-wrapped redeemscripts.
bool HasValidOps() const
Check if the script contains valid OP_CODES.
unsigned int ParseScriptFlags(std::string strFlags)
A signature creator for transactions.
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, const unsigned char *txTo, unsigned int txToLen, unsigned int nIn, unsigned int flags, bitcoinconsensus_error *err)
Returns 1 if the input nIn of the serialized transaction pointed to by txTo correctly spends the scri...
const HashWriter HASHER_TAPSIGHASH
Hasher with tag "TapSighash" pre-fed to it.
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()
static const unsigned int gFlags
Minimal stream for reading from an existing byte array by Span.
int bitcoinconsensus_verify_script_with_spent_outputs(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount, const unsigned char *txTo, unsigned int txToLen, const UTXO *spentOutputs, unsigned int spentOutputsLen, unsigned int nIn, unsigned int flags, bitcoinconsensus_error *err)
SignatureData CombineSignatures(const CTxOut &txout, const CMutableTransaction &tx, const SignatureData &scriptSig1, const SignatureData &scriptSig2)
int64_t CAmount
Amount in satoshis (Can be negative)
static void NegateSignatureS(std::vector< unsigned char > &vchSig)
static CScript ScriptFromHex(const std::string &str)
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.
static CScriptWitness ScriptWitnessFromJSON(const UniValue &univalue)
void push_back(const T &value)
enum bitcoinconsensus_error_t bitcoinconsensus_error
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.
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode=false)
Create the assembly string representation of a CScript object.
static CAmount AmountFromValue(const UniValue &value)
UniValue read_json(const std::string &jsondata)
const unsigned char * end() const
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
bool IsPushOnly(const_iterator pc) const
Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical).
static ScriptError_t ParseScriptError(const std::string &name)
bool exists(const std::string &key) const
const SigningProvider & DUMMY_SIGNING_PROVIDER
A writer stream (for serialization) that computes a 256-bit hash.
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::pair< CPubKey, std::vector< unsigned char > > SigPair
opcodetype
Script opcodes.
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.
An output of a transaction.
GenericTransactionSignatureChecker< CMutableTransaction > MutableTransactionSignatureChecker
void MergeSignatureData(SignatureData sigdata)
bool m_bip341_taproot_ready
Whether the 5 fields above are initialized.
std::vector< CTxOut > vout
constexpr bool IsNull() const
static void AssetTest(const UniValue &test)
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.
uint256 ComputeTapleafHash(uint8_t leaf_version, Span< const unsigned char > script)
Compute the BIP341 tapleaf hash from leaf version & script.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
static ScriptErrorDesc script_errors[]
std::vector< unsigned char > ToByteVector(const T &in)
BOOST_AUTO_TEST_CASE(script_build)
int bitcoinconsensus_verify_script_with_amount(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount, const unsigned char *txTo, unsigned int txToLen, unsigned int nIn, unsigned int flags, bitcoinconsensus_error *err)
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)
Serialized script, used inside transaction inputs and outputs.
void DoTest(const CScript &scriptPubKey, const CScript &scriptSig, const CScriptWitness &scriptWitness, uint32_t flags, const std::string &message, int scriptError, CAmount nValue=0)
static bool GetPubKey(const SigningProvider &provider, const SignatureData &sigdata, const CKeyID &address, CPubKey &pubkey)
static const int PROTOCOL_VERSION
network protocol versioning
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 std::vector< CTxOut > TxOutsFromJSON(const UniValue &univalue)
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache)
UniValue ValueFromAmount(const CAmount amount)
uint256 ComputeTapbranchHash(Span< const unsigned char > a, Span< const unsigned char > b)
Compute the BIP341 tapbranch hash from two branches.
static std::vector< unsigned int > AllConsensusFlags()
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
std::string FormatScriptFlags(unsigned int flags)
static const std::vector< unsigned int > ALL_CONSENSUS_FLAGS
Precomputed list of all valid combinations of consensus-relevant script validation flags...
static uint64_t InsecureRandBits(int bits)
A reference to a CScript: the Hash160 of its serialization.
A mutable version of CTransaction.
unsigned char * UCharCast(char *c)
static std::string FormatScriptError(ScriptError_t err)
const unsigned char * data() const
An encapsulated private key.
A Span is an object that can refer to a contiguous sequence of objects.
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).
uint256 m_sequences_single_hash
static bool exists(const path &p)
uint256 m_prevouts_single_hash
A hasher class for SHA-256.
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)
int FindAndDelete(CScript &script, const CScript &b)
Span(T *, EndOrSize) -> Span< T >
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
CHash160 & Write(Span< const unsigned char > input)
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 ...
#define BOOST_CHECK(expr)
static CScript sign_multisig(const CScript &scriptPubKey, const std::vector< CKey > &keys, const CTransaction &transaction)