Skip to content

Commit 1b904a5

Browse files
committed
Autogeneration support for witness in script_tests
1 parent 63f372a commit 1b904a5

File tree

2 files changed

+170
-9
lines changed

2 files changed

+170
-9
lines changed

src/test/data/script_tests.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,94 @@
18251825
"OK",
18261826
"P2SH with CLEANSTACK"
18271827
],
1828+
[
1829+
[
1830+
"3044022039105b995a5f448639a997a5c90fda06f50b49df30c3bdb6663217bf79323db002206fecd54269dec569fcc517178880eb58bb40f381a282bb75766ff3637d5f4b4301",
1831+
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac"
1832+
],
1833+
"",
1834+
"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
1835+
"P2SH,WITNESS",
1836+
"OK",
1837+
"Basic P2WSH"
1838+
],
1839+
[
1840+
[
1841+
"304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101",
1842+
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
1843+
],
1844+
"",
1845+
"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
1846+
"P2SH,WITNESS",
1847+
"OK",
1848+
"Basic P2WPKH"
1849+
],
1850+
[
1851+
[
1852+
"3044022061fc1a144e221ec77a58a4281936eb6a1b715b9349e446e74d106ec26c8633ba022008064a0d112e8ad514440fcdfaa1006e48305d6844f50a65873fb4b2cf9c035f01",
1853+
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac"
1854+
],
1855+
"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
1856+
"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
1857+
"P2SH,WITNESS",
1858+
"OK",
1859+
"Basic P2SH(P2WSH)"
1860+
],
1861+
[
1862+
[
1863+
"3044022014e69768e174972f21d32d93002ca6fc26133cb9e819ceef7efb970798bde7b4022078b86849dbbec692ec9355aa2a763fce7ea11bf72fdd8ea5ea8083de6f8a77fe01",
1864+
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
1865+
],
1866+
"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
1867+
"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
1868+
"P2SH,WITNESS",
1869+
"OK",
1870+
"Basic P2SH(P2WPKH)"
1871+
],
1872+
[
1873+
[
1874+
"304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01",
1875+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1876+
],
1877+
"",
1878+
"0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1879+
"P2SH,WITNESS",
1880+
"EVAL_FALSE",
1881+
"Basic P2WSH with the wrong key"
1882+
],
1883+
[
1884+
[
1885+
"304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01",
1886+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1887+
],
1888+
"",
1889+
"0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1890+
"P2SH,WITNESS",
1891+
"EVAL_FALSE",
1892+
"Basic P2WPKH with the wrong key"
1893+
],
1894+
[
1895+
[
1896+
"30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01",
1897+
"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac"
1898+
],
1899+
"0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
1900+
"HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL",
1901+
"P2SH,WITNESS",
1902+
"EVAL_FALSE",
1903+
"Basic P2SH(P2WSH) with the wrong key"
1904+
],
1905+
[
1906+
[
1907+
"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
1908+
"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
1909+
],
1910+
"0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
1911+
"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
1912+
"P2SH,WITNESS",
1913+
"EVAL_FALSE",
1914+
"Basic P2SH(P2WPKH) with the wrong key"
1915+
],
18281916

18291917
["The End"]
18301918
]

src/test/script_tests.cpp

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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, int sigversion = 0)
322345
{
323-
uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType, 0, 0);
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, int sigversion = 1)
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));
@@ -676,6 +725,30 @@ BOOST_AUTO_TEST_CASE(script_build)
676725
"P2SH with CLEANSTACK", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
677726
).PushSig(keys.key0).PushRedeem());
678727

728+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
729+
"Basic P2WSH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
730+
).PushWitSig(keys.key0).PushWitRedeem());
731+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
732+
"Basic P2WPKH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
733+
).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit());
734+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
735+
"Basic P2SH(P2WSH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH
736+
).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
737+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
738+
"Basic P2SH(P2WPKH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
739+
).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem());
740+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
741+
"Basic P2WSH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
742+
).PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
743+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
744+
"Basic P2WPKH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
745+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().ScriptError(SCRIPT_ERR_EVAL_FALSE));
746+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
747+
"Basic P2SH(P2WSH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH
748+
).PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
749+
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
750+
"Basic P2SH(P2WPKH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
751+
).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
679752

680753
std::set<std::string> tests_set;
681754

0 commit comments

Comments
 (0)