Skip to content

Commit 66cca79

Browse files
committed
[qa] Autogeneration support for witness in script_tests
1 parent 06d3805 commit 66cca79

File tree

2 files changed

+227
-10
lines changed

2 files changed

+227
-10
lines changed

src/test/data/script_tests.json

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,6 +1834,138 @@
18341834
"OK",
18351835
"P2SH with CLEANSTACK"
18361836
],
1837+
[
1838+
[
1839+
"3044022039105b995a5f448639a997a5c90fda06f50b49df30c3bdb6663217bf79323db002206fecd54269dec569fcc517178880eb58bb40f381a282bb75766ff3637d5f4b4301",
1840+
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac"
1841+
],
1842+
"",
1843+
"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
1844+
"P2SH,WITNESS",
1845+
"OK",
1846+
"Basic P2WSH"
1847+
],
1848+
[
1849+
[
1850+
"304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101",
1851+
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
1852+
],
1853+
"",
1854+
"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
1855+
"P2SH,WITNESS",
1856+
"OK",
1857+
"Basic P2WPKH"
1858+
],
1859+
[
1860+
[
1861+
"3044022061fc1a144e221ec77a58a4281936eb6a1b715b9349e446e74d106ec26c8633ba022008064a0d112e8ad514440fcdfaa1006e48305d6844f50a65873fb4b2cf9c035f01",
1862+
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac"
1863+
],
1864+
"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
1865+
"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
1866+
"P2SH,WITNESS",
1867+
"OK",
1868+
"Basic P2SH(P2WSH)"
1869+
],
1870+
[
1871+
[
1872+
"3044022014e69768e174972f21d32d93002ca6fc26133cb9e819ceef7efb970798bde7b4022078b86849dbbec692ec9355aa2a763fce7ea11bf72fdd8ea5ea8083de6f8a77fe01",
1873+
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
1874+
],
1875+
"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
1876+
"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
1877+
"P2SH,WITNESS",
1878+
"OK",
1879+
"Basic P2SH(P2WPKH)"
1880+
],
1881+
[
1882+
[
1883+
"304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01",
1884+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1885+
],
1886+
"",
1887+
"0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1888+
"P2SH,WITNESS",
1889+
"EVAL_FALSE",
1890+
"Basic P2WSH with the wrong key"
1891+
],
1892+
[
1893+
[
1894+
"304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01",
1895+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1896+
],
1897+
"",
1898+
"0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1899+
"P2SH,WITNESS",
1900+
"EVAL_FALSE",
1901+
"Basic P2WPKH with the wrong key"
1902+
],
1903+
[
1904+
[
1905+
"30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01",
1906+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1907+
],
1908+
"0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1909+
"HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL",
1910+
"P2SH,WITNESS",
1911+
"EVAL_FALSE",
1912+
"Basic P2SH(P2WSH) with the wrong key"
1913+
],
1914+
[
1915+
[
1916+
"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
1917+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1918+
],
1919+
"0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1920+
"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
1921+
"P2SH,WITNESS",
1922+
"EVAL_FALSE",
1923+
"Basic P2SH(P2WPKH) with the wrong key"
1924+
],
1925+
[
1926+
[
1927+
"304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01",
1928+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1929+
],
1930+
"",
1931+
"0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1932+
"P2SH",
1933+
"OK",
1934+
"Basic P2WSH with the wrong key but no WITNESS"
1935+
],
1936+
[
1937+
[
1938+
"304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01",
1939+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1940+
],
1941+
"",
1942+
"0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1943+
"P2SH",
1944+
"OK",
1945+
"Basic P2WPKH with the wrong key but no WITNESS"
1946+
],
1947+
[
1948+
[
1949+
"30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01",
1950+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1951+
],
1952+
"0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1953+
"HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL",
1954+
"P2SH",
1955+
"OK",
1956+
"Basic P2SH(P2WSH) with the wrong key but no WITNESS"
1957+
],
1958+
[
1959+
[
1960+
"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
1961+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1962+
],
1963+
"0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1964+
"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
1965+
"P2SH",
1966+
"OK",
1967+
"Basic P2SH(P2WPKH) with the wrong key but no WITNESS"
1968+
],
18371969

18381970
["CHECKSEQUENCEVERIFY tests"],
18391971
["", "NOP3", "CHECKSEQUENCEVERIFY", "INVALID_STACK_OPERATION", "CSV automatically fails on a empty stack"],

src/test/script_tests.cpp

Lines changed: 95 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
167167
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), &err) == expect, message);
168168
BOOST_CHECK_MESSAGE(err == scriptError, std::string(FormatScriptError(err)) + " where " + std::string(FormatScriptError((ScriptError_t)scriptError)) + " expected: " + message);
169169
#if defined(HAVE_CONSENSUS_LIB)
170-
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_WITNESS);
170+
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
171171
stream << tx2;
172172
if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS) {
173173
BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script_with_amount(begin_ptr(scriptPubKey), scriptPubKey.size(), txCredit.vout[0].nValue, (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect, message);
@@ -253,11 +253,22 @@ struct KeyData
253253
}
254254
};
255255

256+
enum WitnessMode {
257+
WITNESS_NONE,
258+
WITNESS_PKH,
259+
WITNESS_SH
260+
};
256261

257262
class TestBuilder
258263
{
259264
private:
260-
CScript scriptPubKey;
265+
//! Actually executed script
266+
CScript script;
267+
//! The P2SH redeemscript
268+
CScript redeemscript;
269+
//! The Witness embedded script
270+
CScript witscript;
271+
CScriptWitness scriptWitness;
261272
CTransaction creditTx;
262273
CMutableTransaction spendTx;
263274
bool havePush;
@@ -282,13 +293,25 @@ class TestBuilder
282293
}
283294

284295
public:
285-
TestBuilder(const CScript& redeemScript, const std::string& comment_, int flags_, bool P2SH = false) : scriptPubKey(redeemScript), havePush(false), comment(comment_), flags(flags_), scriptError(SCRIPT_ERR_OK)
296+
TestBuilder(const CScript& script_, const std::string& comment_, int flags_, bool P2SH = false, WitnessMode wm = WITNESS_NONE) : script(script_), havePush(false), comment(comment_), flags(flags_), scriptError(SCRIPT_ERR_OK)
286297
{
298+
CScript scriptPubKey = script;
299+
if (wm == WITNESS_PKH) {
300+
uint160 hash;
301+
CHash160().Write(&script[1], script.size() - 1).Finalize(hash.begin());
302+
script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(hash) << OP_EQUALVERIFY << OP_CHECKSIG;
303+
scriptPubKey = CScript() << OP_0 << ToByteVector(hash);
304+
} else if (wm == WITNESS_SH) {
305+
witscript = scriptPubKey;
306+
uint256 hash;
307+
CSHA256().Write(&witscript[0], witscript.size()).Finalize(hash.begin());
308+
scriptPubKey = CScript() << OP_0 << ToByteVector(hash);
309+
}
287310
if (P2SH) {
288-
creditTx = BuildCreditingTransaction(CScript() << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL);
289-
} else {
290-
creditTx = BuildCreditingTransaction(redeemScript);
311+
redeemscript = scriptPubKey;
312+
scriptPubKey = CScript() << OP_HASH160 << ToByteVector(CScriptID(redeemscript)) << OP_EQUAL;
291313
}
314+
creditTx = BuildCreditingTransaction(scriptPubKey);
292315
spendTx = BuildSpendingTransaction(CScript(), CScriptWitness(), creditTx);
293316
}
294317

@@ -318,9 +341,9 @@ class TestBuilder
318341
return *this;
319342
}
320343

321-
TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32)
344+
TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32, SigVersion sigversion = SIGVERSION_BASE)
322345
{
323-
uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType, 0, SIGVERSION_BASE);
346+
uint256 hash = SignatureHash(script, spendTx, 0, nHashType, 0, sigversion);
324347
std::vector<unsigned char> vchSig, r, s;
325348
uint32_t iter = 0;
326349
do {
@@ -336,6 +359,11 @@ class TestBuilder
336359
return *this;
337360
}
338361

362+
TestBuilder& PushWitSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32, SigVersion sigversion = SIGVERSION_WITNESS_V0)
363+
{
364+
return PushSig(key, nHashType, lenR, lenS, sigversion).AsWit();
365+
}
366+
339367
TestBuilder& Push(const CPubKey& pubkey)
340368
{
341369
DoPush(std::vector<unsigned char>(pubkey.begin(), pubkey.end()));
@@ -344,10 +372,16 @@ class TestBuilder
344372

345373
TestBuilder& PushRedeem()
346374
{
347-
DoPush(std::vector<unsigned char>(scriptPubKey.begin(), scriptPubKey.end()));
375+
DoPush(std::vector<unsigned char>(redeemscript.begin(), redeemscript.end()));
348376
return *this;
349377
}
350378

379+
TestBuilder& PushWitRedeem()
380+
{
381+
DoPush(std::vector<unsigned char>(witscript.begin(), witscript.end()));
382+
return AsWit();
383+
}
384+
351385
TestBuilder& EditPush(unsigned int pos, const std::string& hexin, const std::string& hexout)
352386
{
353387
assert(havePush);
@@ -372,15 +406,30 @@ class TestBuilder
372406
{
373407
TestBuilder copy = *this; // Make a copy so we can rollback the push.
374408
DoPush();
375-
DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, CScriptWitness(), flags, comment, scriptError);
409+
DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError);
376410
*this = copy;
377411
return *this;
378412
}
379413

414+
TestBuilder& AsWit()
415+
{
416+
assert(havePush);
417+
scriptWitness.stack.push_back(push);
418+
havePush = false;
419+
return *this;
420+
}
421+
380422
UniValue GetJSON()
381423
{
382424
DoPush();
383425
UniValue array(UniValue::VARR);
426+
if (!scriptWitness.stack.empty()) {
427+
UniValue wit(UniValue::VARR);
428+
for (unsigned i = 0; i < scriptWitness.stack.size(); i++) {
429+
wit.push_back(HexStr(scriptWitness.stack[i]));
430+
}
431+
array.push_back(wit);
432+
}
384433
array.push_back(FormatScript(spendTx.vin[0].scriptSig));
385434
array.push_back(FormatScript(creditTx.vout[0].scriptPubKey));
386435
array.push_back(FormatScriptFlags(flags));
@@ -679,6 +728,42 @@ BOOST_AUTO_TEST_CASE(script_build)
679728
"P2SH with CLEANSTACK", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
680729
).PushSig(keys.key0).PushRedeem());
681730

731+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
732+
"Basic P2WSH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
733+
).PushWitSig(keys.key0).PushWitRedeem());
734+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
735+
"Basic P2WPKH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
736+
).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit());
737+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
738+
"Basic P2SH(P2WSH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH
739+
).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
740+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
741+
"Basic P2SH(P2WPKH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
742+
).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem());
743+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
744+
"Basic P2WSH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
745+
).PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
746+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
747+
"Basic P2WPKH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
748+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().ScriptError(SCRIPT_ERR_EVAL_FALSE));
749+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
750+
"Basic P2SH(P2WSH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH
751+
).PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
752+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
753+
"Basic P2SH(P2WPKH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
754+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
755+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
756+
"Basic P2WSH with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, false, WITNESS_SH
757+
).PushWitSig(keys.key0).PushWitRedeem());
758+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
759+
"Basic P2WPKH with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
760+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit());
761+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
762+
"Basic P2SH(P2WSH) with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, true, WITNESS_SH
763+
).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
764+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
765+
"Basic P2SH(P2WPKH) with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
766+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem());
682767

683768
std::set<std::string> tests_set;
684769

0 commit comments

Comments
 (0)