Skip to content

Commit b815600

Browse files
committed
Remove CombineSignatures and replace tests
Removes CombineSignatures and replaces its use in tests with ProduceSignature to test the same behavior for ProduceSignature.
1 parent ed94c8b commit b815600

File tree

4 files changed

+63
-183
lines changed

4 files changed

+63
-183
lines changed

src/script/sign.cpp

Lines changed: 0 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -377,146 +377,6 @@ bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom,
377377
return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
378378
}
379379

380-
static std::vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
381-
const std::vector<valtype>& vSolutions,
382-
const std::vector<valtype>& sigs1, const std::vector<valtype>& sigs2, SigVersion sigversion)
383-
{
384-
// Combine all the signatures we've got:
385-
std::set<valtype> allsigs;
386-
for (const valtype& v : sigs1)
387-
{
388-
if (!v.empty())
389-
allsigs.insert(v);
390-
}
391-
for (const valtype& v : sigs2)
392-
{
393-
if (!v.empty())
394-
allsigs.insert(v);
395-
}
396-
397-
// Build a map of pubkey -> signature by matching sigs to pubkeys:
398-
assert(vSolutions.size() > 1);
399-
unsigned int nSigsRequired = vSolutions.front()[0];
400-
unsigned int nPubKeys = vSolutions.size()-2;
401-
std::map<valtype, valtype> sigs;
402-
for (const valtype& sig : allsigs)
403-
{
404-
for (unsigned int i = 0; i < nPubKeys; i++)
405-
{
406-
const valtype& pubkey = vSolutions[i+1];
407-
if (sigs.count(pubkey))
408-
continue; // Already got a sig for this pubkey
409-
410-
if (checker.CheckSig(sig, pubkey, scriptPubKey, sigversion))
411-
{
412-
sigs[pubkey] = sig;
413-
break;
414-
}
415-
}
416-
}
417-
// Now build a merged CScript:
418-
unsigned int nSigsHave = 0;
419-
std::vector<valtype> result; result.push_back(valtype()); // pop-one-too-many workaround
420-
for (unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++)
421-
{
422-
if (sigs.count(vSolutions[i+1]))
423-
{
424-
result.push_back(sigs[vSolutions[i+1]]);
425-
++nSigsHave;
426-
}
427-
}
428-
// Fill any missing with OP_0:
429-
for (unsigned int i = nSigsHave; i < nSigsRequired; i++)
430-
result.push_back(valtype());
431-
432-
return result;
433-
}
434-
435-
static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
436-
const txnouttype txType, const std::vector<valtype>& vSolutions,
437-
Stacks sigs1, Stacks sigs2, SigVersion sigversion)
438-
{
439-
switch (txType)
440-
{
441-
case TX_NONSTANDARD:
442-
case TX_NULL_DATA:
443-
case TX_WITNESS_UNKNOWN:
444-
// Don't know anything about this, assume bigger one is correct:
445-
if (sigs1.script.size() >= sigs2.script.size())
446-
return sigs1;
447-
return sigs2;
448-
case TX_PUBKEY:
449-
case TX_PUBKEYHASH:
450-
// Signatures are bigger than placeholders or empty scripts:
451-
if (sigs1.script.empty() || sigs1.script[0].empty())
452-
return sigs2;
453-
return sigs1;
454-
case TX_WITNESS_V0_KEYHASH:
455-
// Signatures are bigger than placeholders or empty scripts:
456-
if (sigs1.witness.empty() || sigs1.witness[0].empty())
457-
return sigs2;
458-
return sigs1;
459-
case TX_SCRIPTHASH:
460-
if (sigs1.script.empty() || sigs1.script.back().empty())
461-
return sigs2;
462-
else if (sigs2.script.empty() || sigs2.script.back().empty())
463-
return sigs1;
464-
else
465-
{
466-
// Recur to combine:
467-
valtype spk = sigs1.script.back();
468-
CScript pubKey2(spk.begin(), spk.end());
469-
470-
txnouttype txType2;
471-
std::vector<std::vector<unsigned char> > vSolutions2;
472-
Solver(pubKey2, txType2, vSolutions2);
473-
sigs1.script.pop_back();
474-
sigs2.script.pop_back();
475-
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion);
476-
result.script.push_back(spk);
477-
return result;
478-
}
479-
case TX_MULTISIG:
480-
return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion));
481-
case TX_WITNESS_V0_SCRIPTHASH:
482-
if (sigs1.witness.empty() || sigs1.witness.back().empty())
483-
return sigs2;
484-
else if (sigs2.witness.empty() || sigs2.witness.back().empty())
485-
return sigs1;
486-
else
487-
{
488-
// Recur to combine:
489-
CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end());
490-
txnouttype txType2;
491-
std::vector<valtype> vSolutions2;
492-
Solver(pubKey2, txType2, vSolutions2);
493-
sigs1.witness.pop_back();
494-
sigs1.script = sigs1.witness;
495-
sigs1.witness.clear();
496-
sigs2.witness.pop_back();
497-
sigs2.script = sigs2.witness;
498-
sigs2.witness.clear();
499-
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SigVersion::WITNESS_V0);
500-
result.witness = result.script;
501-
result.script.clear();
502-
result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end()));
503-
return result;
504-
}
505-
default:
506-
return Stacks();
507-
}
508-
}
509-
510-
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
511-
const SignatureData& scriptSig1, const SignatureData& scriptSig2)
512-
{
513-
txnouttype txType;
514-
std::vector<std::vector<unsigned char> > vSolutions;
515-
Solver(scriptPubKey, txType, vSolutions);
516-
517-
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SigVersion::BASE).Output();
518-
}
519-
520380
namespace {
521381
/** Dummy signature checker which accepts all signatures. */
522382
class DummySignatureChecker final : public BaseSignatureChecker

src/script/sign.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreato
8080
bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType);
8181
bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType);
8282

83-
/** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */
84-
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2);
85-
8683
/** Extract signature data from a transaction input, and insert it. */
8784
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
8885
void UpdateInput(CTxIn& input, const SignatureData& data);

src/test/script_tests.cpp

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,10 +1161,19 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
11611161
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
11621162
}
11631163

1164+
/* Wrapper around ProduceSignature to combine two scriptsigs */
1165+
SignatureData CombineSignatures(const CTxOut& txout, const CMutableTransaction& tx, const SignatureData& scriptSig1, const SignatureData& scriptSig2)
1166+
{
1167+
SignatureData data;
1168+
data.MergeSignatureData(scriptSig1);
1169+
data.MergeSignatureData(scriptSig2);
1170+
ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(&tx, 0, txout.nValue), txout.scriptPubKey, data);
1171+
return data;
1172+
}
1173+
11641174
BOOST_AUTO_TEST_CASE(script_combineSigs)
11651175
{
1166-
// Test the CombineSignatures function
1167-
CAmount amount = 0;
1176+
// Test the ProduceSignature's ability to combine signatures function
11681177
CBasicKeyStore keystore;
11691178
std::vector<CKey> keys;
11701179
std::vector<CPubKey> pubkeys;
@@ -1180,52 +1189,51 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
11801189
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(keys[0].GetPubKey().GetID()));
11811190
CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom);
11821191
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
1183-
CScript& scriptSig = txTo.vin[0].scriptSig;
1192+
SignatureData scriptSig;
11841193

11851194
SignatureData empty;
1186-
SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty);
1195+
SignatureData combined = CombineSignatures(txFrom.vout[0], txTo, empty, empty);
11871196
BOOST_CHECK(combined.scriptSig.empty());
11881197

11891198
// Single signature case:
11901199
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig
1191-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
1192-
BOOST_CHECK(combined.scriptSig == scriptSig);
1193-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
1194-
BOOST_CHECK(combined.scriptSig == scriptSig);
1195-
CScript scriptSigCopy = scriptSig;
1200+
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
1201+
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
1202+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
1203+
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
1204+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
1205+
SignatureData scriptSigCopy = scriptSig;
11961206
// Signing again will give a different, valid signature:
11971207
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
1198-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
1199-
BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
1208+
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
1209+
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
1210+
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
12001211

12011212
// P2SH, single-signature case:
12021213
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
12031214
keystore.AddCScript(pkSingle);
12041215
scriptPubKey = GetScriptForDestination(CScriptID(pkSingle));
12051216
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
1206-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
1207-
BOOST_CHECK(combined.scriptSig == scriptSig);
1208-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
1209-
BOOST_CHECK(combined.scriptSig == scriptSig);
1217+
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
1218+
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
1219+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
1220+
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
1221+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
12101222
scriptSigCopy = scriptSig;
12111223
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
1212-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
1213-
BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
1214-
// dummy scriptSigCopy with placeholder, should always choose non-placeholder:
1215-
scriptSigCopy = CScript() << OP_0 << std::vector<unsigned char>(pkSingle.begin(), pkSingle.end());
1216-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
1217-
BOOST_CHECK(combined.scriptSig == scriptSig);
1218-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy));
1219-
BOOST_CHECK(combined.scriptSig == scriptSig);
1224+
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
1225+
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
1226+
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
12201227

12211228
// Hardest case: Multisig 2-of-3
12221229
scriptPubKey = GetScriptForMultisig(2, pubkeys);
12231230
keystore.AddCScript(scriptPubKey);
12241231
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
1225-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
1226-
BOOST_CHECK(combined.scriptSig == scriptSig);
1227-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
1228-
BOOST_CHECK(combined.scriptSig == scriptSig);
1232+
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
1233+
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
1234+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
1235+
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
1236+
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
12291237

12301238
// A couple of partially-signed versions:
12311239
std::vector<unsigned char> sig1;
@@ -1252,22 +1260,28 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
12521260
CScript complete12 = CScript() << OP_0 << sig1 << sig2;
12531261
CScript complete13 = CScript() << OP_0 << sig1 << sig3;
12541262
CScript complete23 = CScript() << OP_0 << sig2 << sig3;
1255-
1256-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b));
1263+
SignatureData partial1_sigs;
1264+
partial1_sigs.signatures.emplace(keys[0].GetPubKey().GetID(), SigPair(keys[0].GetPubKey(), sig1));
1265+
SignatureData partial2_sigs;
1266+
partial2_sigs.signatures.emplace(keys[1].GetPubKey().GetID(), SigPair(keys[1].GetPubKey(), sig2));
1267+
SignatureData partial3_sigs;
1268+
partial3_sigs.signatures.emplace(keys[2].GetPubKey().GetID(), SigPair(keys[2].GetPubKey(), sig3));
1269+
1270+
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial1_sigs);
12571271
BOOST_CHECK(combined.scriptSig == partial1a);
1258-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a));
1272+
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial2_sigs);
12591273
BOOST_CHECK(combined.scriptSig == complete12);
1260-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a));
1274+
combined = CombineSignatures(txFrom.vout[0], txTo, partial2_sigs, partial1_sigs);
12611275
BOOST_CHECK(combined.scriptSig == complete12);
1262-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b));
1276+
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial2_sigs);
12631277
BOOST_CHECK(combined.scriptSig == complete12);
1264-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b));
1278+
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial1_sigs);
12651279
BOOST_CHECK(combined.scriptSig == complete13);
1266-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a));
1280+
combined = CombineSignatures(txFrom.vout[0], txTo, partial2_sigs, partial3_sigs);
12671281
BOOST_CHECK(combined.scriptSig == complete23);
1268-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b));
1282+
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial2_sigs);
12691283
BOOST_CHECK(combined.scriptSig == complete23);
1270-
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a));
1284+
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial3_sigs);
12711285
BOOST_CHECK(combined.scriptSig == partial3c);
12721286
}
12731287

src/test/transaction_tests.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,15 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction) {
494494
threadGroup.join_all();
495495
}
496496

497+
SignatureData CombineSignatures(const CMutableTransaction& input1, const CMutableTransaction& input2, const CTransactionRef tx)
498+
{
499+
SignatureData sigdata;
500+
sigdata = DataFromTransaction(input1, 0, tx->vout[0]);
501+
sigdata.MergeSignatureData(DataFromTransaction(input2, 0, tx->vout[0]));
502+
ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(&input1, 0, tx->vout[0].nValue), tx->vout[0].scriptPubKey, sigdata);
503+
return sigdata;
504+
}
505+
497506
BOOST_AUTO_TEST_CASE(test_witness)
498507
{
499508
CBasicKeyStore keystore, keystore2;
@@ -629,7 +638,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
629638
CreateCreditAndSpend(keystore2, scriptMulti, output2, input2, false);
630639
CheckWithFlag(output2, input2, 0, false);
631640
BOOST_CHECK(*output1 == *output2);
632-
UpdateInput(input1.vin[0], CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0, output1->vout[0]), DataFromTransaction(input2, 0, output1->vout[0])));
641+
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
633642
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
634643

635644
// P2SH 2-of-2 multisig
@@ -640,7 +649,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
640649
CheckWithFlag(output2, input2, 0, true);
641650
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
642651
BOOST_CHECK(*output1 == *output2);
643-
UpdateInput(input1.vin[0], CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0, output1->vout[0]), DataFromTransaction(input2, 0, output1->vout[0])));
652+
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
644653
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
645654
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
646655

@@ -652,7 +661,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
652661
CheckWithFlag(output2, input2, 0, true);
653662
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
654663
BOOST_CHECK(*output1 == *output2);
655-
UpdateInput(input1.vin[0], CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0, output1->vout[0]), DataFromTransaction(input2, 0, output1->vout[0])));
664+
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
656665
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
657666
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
658667

@@ -664,7 +673,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
664673
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
665674
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
666675
BOOST_CHECK(*output1 == *output2);
667-
UpdateInput(input1.vin[0], CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0, output1->vout[0]), DataFromTransaction(input2, 0, output1->vout[0])));
676+
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
668677
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
669678
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
670679
}

0 commit comments

Comments
 (0)