Remove CombineSignatures and replace tests
Removes CombineSignatures and replaces its use in tests with ProduceSignature to test the same behavior for ProduceSignature.
This commit is contained in:
parent
ed94c8b556
commit
b815600295
4 changed files with 62 additions and 182 deletions
|
@ -377,146 +377,6 @@ bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom,
|
||||||
return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
|
return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
|
||||||
const std::vector<valtype>& vSolutions,
|
|
||||||
const std::vector<valtype>& sigs1, const std::vector<valtype>& sigs2, SigVersion sigversion)
|
|
||||||
{
|
|
||||||
// Combine all the signatures we've got:
|
|
||||||
std::set<valtype> allsigs;
|
|
||||||
for (const valtype& v : sigs1)
|
|
||||||
{
|
|
||||||
if (!v.empty())
|
|
||||||
allsigs.insert(v);
|
|
||||||
}
|
|
||||||
for (const valtype& v : sigs2)
|
|
||||||
{
|
|
||||||
if (!v.empty())
|
|
||||||
allsigs.insert(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build a map of pubkey -> signature by matching sigs to pubkeys:
|
|
||||||
assert(vSolutions.size() > 1);
|
|
||||||
unsigned int nSigsRequired = vSolutions.front()[0];
|
|
||||||
unsigned int nPubKeys = vSolutions.size()-2;
|
|
||||||
std::map<valtype, valtype> sigs;
|
|
||||||
for (const valtype& sig : allsigs)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < nPubKeys; i++)
|
|
||||||
{
|
|
||||||
const valtype& pubkey = vSolutions[i+1];
|
|
||||||
if (sigs.count(pubkey))
|
|
||||||
continue; // Already got a sig for this pubkey
|
|
||||||
|
|
||||||
if (checker.CheckSig(sig, pubkey, scriptPubKey, sigversion))
|
|
||||||
{
|
|
||||||
sigs[pubkey] = sig;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Now build a merged CScript:
|
|
||||||
unsigned int nSigsHave = 0;
|
|
||||||
std::vector<valtype> result; result.push_back(valtype()); // pop-one-too-many workaround
|
|
||||||
for (unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++)
|
|
||||||
{
|
|
||||||
if (sigs.count(vSolutions[i+1]))
|
|
||||||
{
|
|
||||||
result.push_back(sigs[vSolutions[i+1]]);
|
|
||||||
++nSigsHave;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Fill any missing with OP_0:
|
|
||||||
for (unsigned int i = nSigsHave; i < nSigsRequired; i++)
|
|
||||||
result.push_back(valtype());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
|
||||||
const txnouttype txType, const std::vector<valtype>& vSolutions,
|
|
||||||
Stacks sigs1, Stacks sigs2, SigVersion sigversion)
|
|
||||||
{
|
|
||||||
switch (txType)
|
|
||||||
{
|
|
||||||
case TX_NONSTANDARD:
|
|
||||||
case TX_NULL_DATA:
|
|
||||||
case TX_WITNESS_UNKNOWN:
|
|
||||||
// Don't know anything about this, assume bigger one is correct:
|
|
||||||
if (sigs1.script.size() >= sigs2.script.size())
|
|
||||||
return sigs1;
|
|
||||||
return sigs2;
|
|
||||||
case TX_PUBKEY:
|
|
||||||
case TX_PUBKEYHASH:
|
|
||||||
// Signatures are bigger than placeholders or empty scripts:
|
|
||||||
if (sigs1.script.empty() || sigs1.script[0].empty())
|
|
||||||
return sigs2;
|
|
||||||
return sigs1;
|
|
||||||
case TX_WITNESS_V0_KEYHASH:
|
|
||||||
// Signatures are bigger than placeholders or empty scripts:
|
|
||||||
if (sigs1.witness.empty() || sigs1.witness[0].empty())
|
|
||||||
return sigs2;
|
|
||||||
return sigs1;
|
|
||||||
case TX_SCRIPTHASH:
|
|
||||||
if (sigs1.script.empty() || sigs1.script.back().empty())
|
|
||||||
return sigs2;
|
|
||||||
else if (sigs2.script.empty() || sigs2.script.back().empty())
|
|
||||||
return sigs1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Recur to combine:
|
|
||||||
valtype spk = sigs1.script.back();
|
|
||||||
CScript pubKey2(spk.begin(), spk.end());
|
|
||||||
|
|
||||||
txnouttype txType2;
|
|
||||||
std::vector<std::vector<unsigned char> > vSolutions2;
|
|
||||||
Solver(pubKey2, txType2, vSolutions2);
|
|
||||||
sigs1.script.pop_back();
|
|
||||||
sigs2.script.pop_back();
|
|
||||||
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion);
|
|
||||||
result.script.push_back(spk);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
case TX_MULTISIG:
|
|
||||||
return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion));
|
|
||||||
case TX_WITNESS_V0_SCRIPTHASH:
|
|
||||||
if (sigs1.witness.empty() || sigs1.witness.back().empty())
|
|
||||||
return sigs2;
|
|
||||||
else if (sigs2.witness.empty() || sigs2.witness.back().empty())
|
|
||||||
return sigs1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Recur to combine:
|
|
||||||
CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end());
|
|
||||||
txnouttype txType2;
|
|
||||||
std::vector<valtype> vSolutions2;
|
|
||||||
Solver(pubKey2, txType2, vSolutions2);
|
|
||||||
sigs1.witness.pop_back();
|
|
||||||
sigs1.script = sigs1.witness;
|
|
||||||
sigs1.witness.clear();
|
|
||||||
sigs2.witness.pop_back();
|
|
||||||
sigs2.script = sigs2.witness;
|
|
||||||
sigs2.witness.clear();
|
|
||||||
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SigVersion::WITNESS_V0);
|
|
||||||
result.witness = result.script;
|
|
||||||
result.script.clear();
|
|
||||||
result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end()));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return Stacks();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
|
||||||
const SignatureData& scriptSig1, const SignatureData& scriptSig2)
|
|
||||||
{
|
|
||||||
txnouttype txType;
|
|
||||||
std::vector<std::vector<unsigned char> > vSolutions;
|
|
||||||
Solver(scriptPubKey, txType, vSolutions);
|
|
||||||
|
|
||||||
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SigVersion::BASE).Output();
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/** Dummy signature checker which accepts all signatures. */
|
/** Dummy signature checker which accepts all signatures. */
|
||||||
class DummySignatureChecker final : public BaseSignatureChecker
|
class DummySignatureChecker final : public BaseSignatureChecker
|
||||||
|
|
|
@ -80,9 +80,6 @@ bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreato
|
||||||
bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType);
|
bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType);
|
||||||
bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType);
|
bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType);
|
||||||
|
|
||||||
/** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */
|
|
||||||
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2);
|
|
||||||
|
|
||||||
/** Extract signature data from a transaction input, and insert it. */
|
/** Extract signature data from a transaction input, and insert it. */
|
||||||
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
|
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
|
||||||
void UpdateInput(CTxIn& input, const SignatureData& data);
|
void UpdateInput(CTxIn& input, const SignatureData& data);
|
||||||
|
|
|
@ -1161,10 +1161,19 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wrapper around ProduceSignature to combine two scriptsigs */
|
||||||
|
SignatureData CombineSignatures(const CTxOut& txout, const CMutableTransaction& tx, const SignatureData& scriptSig1, const SignatureData& scriptSig2)
|
||||||
|
{
|
||||||
|
SignatureData data;
|
||||||
|
data.MergeSignatureData(scriptSig1);
|
||||||
|
data.MergeSignatureData(scriptSig2);
|
||||||
|
ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(&tx, 0, txout.nValue), txout.scriptPubKey, data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(script_combineSigs)
|
BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
{
|
{
|
||||||
// Test the CombineSignatures function
|
// Test the ProduceSignature's ability to combine signatures function
|
||||||
CAmount amount = 0;
|
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
std::vector<CKey> keys;
|
std::vector<CKey> keys;
|
||||||
std::vector<CPubKey> pubkeys;
|
std::vector<CPubKey> pubkeys;
|
||||||
|
@ -1180,52 +1189,51 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(keys[0].GetPubKey().GetID()));
|
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(keys[0].GetPubKey().GetID()));
|
||||||
CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom);
|
CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom);
|
||||||
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
||||||
CScript& scriptSig = txTo.vin[0].scriptSig;
|
SignatureData scriptSig;
|
||||||
|
|
||||||
SignatureData empty;
|
SignatureData empty;
|
||||||
SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty);
|
SignatureData combined = CombineSignatures(txFrom.vout[0], txTo, empty, empty);
|
||||||
BOOST_CHECK(combined.scriptSig.empty());
|
BOOST_CHECK(combined.scriptSig.empty());
|
||||||
|
|
||||||
// Single signature case:
|
// Single signature case:
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig
|
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
|
||||||
CScript scriptSigCopy = scriptSig;
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
SignatureData scriptSigCopy = scriptSig;
|
||||||
// Signing again will give a different, valid signature:
|
// Signing again will give a different, valid signature:
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
||||||
|
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
|
||||||
// P2SH, single-signature case:
|
// P2SH, single-signature case:
|
||||||
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
|
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
|
||||||
keystore.AddCScript(pkSingle);
|
keystore.AddCScript(pkSingle);
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(pkSingle));
|
scriptPubKey = GetScriptForDestination(CScriptID(pkSingle));
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
|
||||||
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
scriptSigCopy = scriptSig;
|
scriptSigCopy = scriptSig;
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
||||||
// dummy scriptSigCopy with placeholder, should always choose non-placeholder:
|
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
||||||
scriptSigCopy = CScript() << OP_0 << std::vector<unsigned char>(pkSingle.begin(), pkSingle.end());
|
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
|
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy));
|
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
|
||||||
|
|
||||||
// Hardest case: Multisig 2-of-3
|
// Hardest case: Multisig 2-of-3
|
||||||
scriptPubKey = GetScriptForMultisig(2, pubkeys);
|
scriptPubKey = GetScriptForMultisig(2, pubkeys);
|
||||||
keystore.AddCScript(scriptPubKey);
|
keystore.AddCScript(scriptPubKey);
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
|
||||||
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
|
||||||
// A couple of partially-signed versions:
|
// A couple of partially-signed versions:
|
||||||
std::vector<unsigned char> sig1;
|
std::vector<unsigned char> sig1;
|
||||||
|
@ -1252,22 +1260,28 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
CScript complete12 = CScript() << OP_0 << sig1 << sig2;
|
CScript complete12 = CScript() << OP_0 << sig1 << sig2;
|
||||||
CScript complete13 = CScript() << OP_0 << sig1 << sig3;
|
CScript complete13 = CScript() << OP_0 << sig1 << sig3;
|
||||||
CScript complete23 = CScript() << OP_0 << sig2 << sig3;
|
CScript complete23 = CScript() << OP_0 << sig2 << sig3;
|
||||||
|
SignatureData partial1_sigs;
|
||||||
|
partial1_sigs.signatures.emplace(keys[0].GetPubKey().GetID(), SigPair(keys[0].GetPubKey(), sig1));
|
||||||
|
SignatureData partial2_sigs;
|
||||||
|
partial2_sigs.signatures.emplace(keys[1].GetPubKey().GetID(), SigPair(keys[1].GetPubKey(), sig2));
|
||||||
|
SignatureData partial3_sigs;
|
||||||
|
partial3_sigs.signatures.emplace(keys[2].GetPubKey().GetID(), SigPair(keys[2].GetPubKey(), sig3));
|
||||||
|
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial1_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == partial1a);
|
BOOST_CHECK(combined.scriptSig == partial1a);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial2_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete12);
|
BOOST_CHECK(combined.scriptSig == complete12);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial2_sigs, partial1_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete12);
|
BOOST_CHECK(combined.scriptSig == complete12);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial1_sigs, partial2_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete12);
|
BOOST_CHECK(combined.scriptSig == complete12);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial1_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete13);
|
BOOST_CHECK(combined.scriptSig == complete13);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial2_sigs, partial3_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete23);
|
BOOST_CHECK(combined.scriptSig == complete23);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial2_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == complete23);
|
BOOST_CHECK(combined.scriptSig == complete23);
|
||||||
combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a));
|
combined = CombineSignatures(txFrom.vout[0], txTo, partial3_sigs, partial3_sigs);
|
||||||
BOOST_CHECK(combined.scriptSig == partial3c);
|
BOOST_CHECK(combined.scriptSig == partial3c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -494,6 +494,15 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction) {
|
||||||
threadGroup.join_all();
|
threadGroup.join_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SignatureData CombineSignatures(const CMutableTransaction& input1, const CMutableTransaction& input2, const CTransactionRef tx)
|
||||||
|
{
|
||||||
|
SignatureData sigdata;
|
||||||
|
sigdata = DataFromTransaction(input1, 0, tx->vout[0]);
|
||||||
|
sigdata.MergeSignatureData(DataFromTransaction(input2, 0, tx->vout[0]));
|
||||||
|
ProduceSignature(DUMMY_SIGNING_PROVIDER, MutableTransactionSignatureCreator(&input1, 0, tx->vout[0].nValue), tx->vout[0].scriptPubKey, sigdata);
|
||||||
|
return sigdata;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_witness)
|
BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore, keystore2;
|
CBasicKeyStore keystore, keystore2;
|
||||||
|
@ -629,7 +638,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CreateCreditAndSpend(keystore2, scriptMulti, output2, input2, false);
|
CreateCreditAndSpend(keystore2, scriptMulti, output2, input2, false);
|
||||||
CheckWithFlag(output2, input2, 0, false);
|
CheckWithFlag(output2, input2, 0, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
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])));
|
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
|
|
||||||
// P2SH 2-of-2 multisig
|
// P2SH 2-of-2 multisig
|
||||||
|
@ -640,7 +649,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output2, input2, 0, true);
|
CheckWithFlag(output2, input2, 0, true);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
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])));
|
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
|
|
||||||
|
@ -652,7 +661,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output2, input2, 0, true);
|
CheckWithFlag(output2, input2, 0, true);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
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])));
|
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
|
|
||||||
|
@ -664,7 +673,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
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])));
|
UpdateInput(input1.vin[0], CombineSignatures(input1, input2, output1));
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue