Removed implicit CTransaction constructor from tests
This commit is contained in:
parent
f65bce858f
commit
ed61abedb2
11 changed files with 116 additions and 116 deletions
|
@ -377,7 +377,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
|
||||||
|
|
||||||
// Call UpdateCoins on the top cache
|
// Call UpdateCoins on the top cache
|
||||||
CTxUndo undo;
|
CTxUndo undo;
|
||||||
UpdateCoins(tx, *(stack.back()), undo, height);
|
UpdateCoins(CTransaction(tx), *(stack.back()), undo, height);
|
||||||
|
|
||||||
// Update the utxo set for future spends
|
// Update the utxo set for future spends
|
||||||
utxoset.insert(outpoint);
|
utxoset.insert(outpoint);
|
||||||
|
|
|
@ -59,13 +59,13 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
|
||||||
|
|
||||||
// Nothing in pool, remove should do nothing:
|
// Nothing in pool, remove should do nothing:
|
||||||
unsigned int poolSize = testPool.size();
|
unsigned int poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txParent);
|
testPool.removeRecursive(CTransaction(txParent));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
||||||
|
|
||||||
// Just the parent:
|
// Just the parent:
|
||||||
testPool.addUnchecked(entry.FromTx(txParent));
|
testPool.addUnchecked(entry.FromTx(txParent));
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txParent);
|
testPool.removeRecursive(CTransaction(txParent));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 1);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 1);
|
||||||
|
|
||||||
// Parent, children, grandchildren:
|
// Parent, children, grandchildren:
|
||||||
|
@ -77,18 +77,18 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
|
||||||
}
|
}
|
||||||
// Remove Child[0], GrandChild[0] should be removed:
|
// Remove Child[0], GrandChild[0] should be removed:
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txChild[0]);
|
testPool.removeRecursive(CTransaction(txChild[0]));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 2);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 2);
|
||||||
// ... make sure grandchild and child are gone:
|
// ... make sure grandchild and child are gone:
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txGrandChild[0]);
|
testPool.removeRecursive(CTransaction(txGrandChild[0]));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txChild[0]);
|
testPool.removeRecursive(CTransaction(txChild[0]));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize);
|
||||||
// Remove parent, all children/grandchildren should go:
|
// Remove parent, all children/grandchildren should go:
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txParent);
|
testPool.removeRecursive(CTransaction(txParent));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 5);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 5);
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), 0U);
|
BOOST_CHECK_EQUAL(testPool.size(), 0U);
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
|
||||||
// Now remove the parent, as might happen if a block-re-org occurs but the parent cannot be
|
// Now remove the parent, as might happen if a block-re-org occurs but the parent cannot be
|
||||||
// put into the mempool (maybe because it is non-standard):
|
// put into the mempool (maybe because it is non-standard):
|
||||||
poolSize = testPool.size();
|
poolSize = testPool.size();
|
||||||
testPool.removeRecursive(txParent);
|
testPool.removeRecursive(CTransaction(txParent));
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 6);
|
BOOST_CHECK_EQUAL(testPool.size(), poolSize - 6);
|
||||||
BOOST_CHECK_EQUAL(testPool.size(), 0U);
|
BOOST_CHECK_EQUAL(testPool.size(), 0U);
|
||||||
}
|
}
|
||||||
|
@ -309,7 +309,7 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
|
||||||
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
||||||
tx2.vout[0].nValue = 2 * COIN;
|
tx2.vout[0].nValue = 2 * COIN;
|
||||||
pool.addUnchecked(entry.Fee(20000LL).FromTx(tx2));
|
pool.addUnchecked(entry.Fee(20000LL).FromTx(tx2));
|
||||||
uint64_t tx2Size = GetVirtualTransactionSize(tx2);
|
uint64_t tx2Size = GetVirtualTransactionSize(CTransaction(tx2));
|
||||||
|
|
||||||
/* lowest fee */
|
/* lowest fee */
|
||||||
CMutableTransaction tx3 = CMutableTransaction();
|
CMutableTransaction tx3 = CMutableTransaction();
|
||||||
|
@ -357,7 +357,7 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
|
||||||
tx6.vout.resize(1);
|
tx6.vout.resize(1);
|
||||||
tx6.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
tx6.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
||||||
tx6.vout[0].nValue = 20 * COIN;
|
tx6.vout[0].nValue = 20 * COIN;
|
||||||
uint64_t tx6Size = GetVirtualTransactionSize(tx6);
|
uint64_t tx6Size = GetVirtualTransactionSize(CTransaction(tx6));
|
||||||
|
|
||||||
pool.addUnchecked(entry.Fee(0LL).FromTx(tx6));
|
pool.addUnchecked(entry.Fee(0LL).FromTx(tx6));
|
||||||
BOOST_CHECK_EQUAL(pool.size(), 6U);
|
BOOST_CHECK_EQUAL(pool.size(), 6U);
|
||||||
|
@ -376,7 +376,7 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
|
||||||
tx7.vout.resize(1);
|
tx7.vout.resize(1);
|
||||||
tx7.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
tx7.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
|
||||||
tx7.vout[0].nValue = 10 * COIN;
|
tx7.vout[0].nValue = 10 * COIN;
|
||||||
uint64_t tx7Size = GetVirtualTransactionSize(tx7);
|
uint64_t tx7Size = GetVirtualTransactionSize(CTransaction(tx7));
|
||||||
|
|
||||||
/* set the fee to just below tx2's feerate when including ancestor */
|
/* set the fee to just below tx2's feerate when including ancestor */
|
||||||
CAmount fee = (20000/tx2Size)*(tx7Size + tx6Size) - 1;
|
CAmount fee = (20000/tx2Size)*(tx7Size + tx6Size) - 1;
|
||||||
|
@ -464,12 +464,12 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
|
||||||
BOOST_CHECK(pool.exists(tx2.GetHash()));
|
BOOST_CHECK(pool.exists(tx2.GetHash()));
|
||||||
BOOST_CHECK(pool.exists(tx3.GetHash()));
|
BOOST_CHECK(pool.exists(tx3.GetHash()));
|
||||||
|
|
||||||
pool.TrimToSize(GetVirtualTransactionSize(tx1)); // mempool is limited to tx1's size in memory usage, so nothing fits
|
pool.TrimToSize(GetVirtualTransactionSize(CTransaction(tx1))); // mempool is limited to tx1's size in memory usage, so nothing fits
|
||||||
BOOST_CHECK(!pool.exists(tx1.GetHash()));
|
BOOST_CHECK(!pool.exists(tx1.GetHash()));
|
||||||
BOOST_CHECK(!pool.exists(tx2.GetHash()));
|
BOOST_CHECK(!pool.exists(tx2.GetHash()));
|
||||||
BOOST_CHECK(!pool.exists(tx3.GetHash()));
|
BOOST_CHECK(!pool.exists(tx3.GetHash()));
|
||||||
|
|
||||||
CFeeRate maxFeeRateRemoved(25000, GetVirtualTransactionSize(tx3) + GetVirtualTransactionSize(tx2));
|
CFeeRate maxFeeRateRemoved(25000, GetVirtualTransactionSize(CTransaction(tx3)) + GetVirtualTransactionSize(CTransaction(tx2)));
|
||||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + 1000);
|
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + 1000);
|
||||||
|
|
||||||
CMutableTransaction tx4 = CMutableTransaction();
|
CMutableTransaction tx4 = CMutableTransaction();
|
||||||
|
|
|
@ -159,7 +159,7 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript&
|
||||||
// Test that packages above the min relay fee do get included, even if one
|
// Test that packages above the min relay fee do get included, even if one
|
||||||
// of the transactions is below the min relay fee
|
// of the transactions is below the min relay fee
|
||||||
// Remove the low fee transaction and replace with a higher fee transaction
|
// Remove the low fee transaction and replace with a higher fee transaction
|
||||||
mempool.removeRecursive(tx);
|
mempool.removeRecursive(CTransaction(tx));
|
||||||
tx.vout[0].nValue -= 2; // Now we should be just over the min relay fee
|
tx.vout[0].nValue -= 2; // Now we should be just over the min relay fee
|
||||||
hashLowFeeTx = tx.GetHash();
|
hashLowFeeTx = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Fee(feeToUse+2).FromTx(tx));
|
mempool.addUnchecked(entry.Fee(feeToUse+2).FromTx(tx));
|
||||||
|
@ -441,9 +441,9 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
tx.nLockTime = 0;
|
tx.nLockTime = 0;
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
mempool.addUnchecked(entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
||||||
BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
|
BOOST_CHECK(CheckFinalTx(CTransaction(tx), flags)); // Locktime passes
|
||||||
BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
|
BOOST_CHECK(!TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks fail
|
||||||
BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 2))); // Sequence locks pass on 2nd block
|
BOOST_CHECK(SequenceLocks(CTransaction(tx), flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 2))); // Sequence locks pass on 2nd block
|
||||||
|
|
||||||
// relative time locked
|
// relative time locked
|
||||||
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
|
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
|
||||||
|
@ -451,12 +451,12 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
prevheights[0] = baseheight + 2;
|
prevheights[0] = baseheight + 2;
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
||||||
BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
|
BOOST_CHECK(CheckFinalTx(CTransaction(tx), flags)); // Locktime passes
|
||||||
BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
|
BOOST_CHECK(!TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks fail
|
||||||
|
|
||||||
for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
|
for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
|
||||||
chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast
|
chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast
|
||||||
BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 1))); // Sequence locks pass 512 seconds later
|
BOOST_CHECK(SequenceLocks(CTransaction(tx), flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 1))); // Sequence locks pass 512 seconds later
|
||||||
for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
|
for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
|
||||||
chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime -= 512; //undo tricked MTP
|
chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime -= 512; //undo tricked MTP
|
||||||
|
|
||||||
|
@ -467,9 +467,9 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
tx.nLockTime = chainActive.Tip()->nHeight + 1;
|
tx.nLockTime = chainActive.Tip()->nHeight + 1;
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
||||||
BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails
|
BOOST_CHECK(!CheckFinalTx(CTransaction(tx), flags)); // Locktime fails
|
||||||
BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
|
BOOST_CHECK(TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks pass
|
||||||
BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast())); // Locktime passes on 2nd block
|
BOOST_CHECK(IsFinalTx(CTransaction(tx), chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast())); // Locktime passes on 2nd block
|
||||||
|
|
||||||
// absolute time locked
|
// absolute time locked
|
||||||
tx.vin[0].prevout.hash = txFirst[3]->GetHash();
|
tx.vin[0].prevout.hash = txFirst[3]->GetHash();
|
||||||
|
@ -478,23 +478,23 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
prevheights[0] = baseheight + 4;
|
prevheights[0] = baseheight + 4;
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
mempool.addUnchecked(entry.Time(GetTime()).FromTx(tx));
|
||||||
BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails
|
BOOST_CHECK(!CheckFinalTx(CTransaction(tx), flags)); // Locktime fails
|
||||||
BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
|
BOOST_CHECK(TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks pass
|
||||||
BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast() + 1)); // Locktime passes 1 second later
|
BOOST_CHECK(IsFinalTx(CTransaction(tx), chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast() + 1)); // Locktime passes 1 second later
|
||||||
|
|
||||||
// mempool-dependent transactions (not added)
|
// mempool-dependent transactions (not added)
|
||||||
tx.vin[0].prevout.hash = hash;
|
tx.vin[0].prevout.hash = hash;
|
||||||
prevheights[0] = chainActive.Tip()->nHeight + 1;
|
prevheights[0] = chainActive.Tip()->nHeight + 1;
|
||||||
tx.nLockTime = 0;
|
tx.nLockTime = 0;
|
||||||
tx.vin[0].nSequence = 0;
|
tx.vin[0].nSequence = 0;
|
||||||
BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
|
BOOST_CHECK(CheckFinalTx(CTransaction(tx), flags)); // Locktime passes
|
||||||
BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
|
BOOST_CHECK(TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks pass
|
||||||
tx.vin[0].nSequence = 1;
|
tx.vin[0].nSequence = 1;
|
||||||
BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
|
BOOST_CHECK(!TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks fail
|
||||||
tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG;
|
tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG;
|
||||||
BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
|
BOOST_CHECK(TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks pass
|
||||||
tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | 1;
|
tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | 1;
|
||||||
BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
|
BOOST_CHECK(!TestSequenceLocks(CTransaction(tx), flags)); // Sequence locks fail
|
||||||
|
|
||||||
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
||||||
|
|
||||||
|
|
|
@ -76,20 +76,20 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||||
// Test a AND b:
|
// Test a AND b:
|
||||||
keys.assign(1,key[0]);
|
keys.assign(1,key[0]);
|
||||||
keys.push_back(key[1]);
|
keys.push_back(key[1]);
|
||||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
s = sign_multisig(a_and_b, keys, CTransaction(txTo[0]), 0);
|
||||||
BOOST_CHECK(VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err));
|
BOOST_CHECK(VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
keys.assign(1,key[i]);
|
keys.assign(1,key[i]);
|
||||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
s = sign_multisig(a_and_b, keys, CTransaction(txTo[0]), 0);
|
||||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i));
|
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.assign(1,key[1]);
|
keys.assign(1,key[1]);
|
||||||
keys.push_back(key[i]);
|
keys.push_back(key[i]);
|
||||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
s = sign_multisig(a_and_b, keys, CTransaction(txTo[0]), 0);
|
||||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i));
|
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
keys.assign(1,key[i]);
|
keys.assign(1,key[i]);
|
||||||
s = sign_multisig(a_or_b, keys, txTo[1], 0);
|
s = sign_multisig(a_or_b, keys, CTransaction(txTo[1]), 0);
|
||||||
if (i == 0 || i == 1)
|
if (i == 0 || i == 1)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i));
|
BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, nullptr, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i));
|
||||||
|
@ -121,7 +121,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||||
{
|
{
|
||||||
keys.assign(1,key[i]);
|
keys.assign(1,key[i]);
|
||||||
keys.push_back(key[j]);
|
keys.push_back(key[j]);
|
||||||
s = sign_multisig(escrow, keys, txTo[2], 0);
|
s = sign_multisig(escrow, keys, CTransaction(txTo[2]), 0);
|
||||||
if (i < j && i < 3 && j < 3)
|
if (i < j && i < 3 && j < 3)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, nullptr, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j));
|
BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, nullptr, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j));
|
||||||
|
@ -209,7 +209,7 @@ BOOST_AUTO_TEST_CASE(multisig_Sign)
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
BOOST_CHECK_MESSAGE(SignSignature(keystore, CTransaction(txFrom), txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
|
||||||
tx.vin[0].scriptSig = garbage;
|
tx.vin[0].scriptSig = garbage;
|
||||||
tx.vout.resize(1);
|
tx.vout.resize(1);
|
||||||
tx.vout[0].nValue=0LL;
|
tx.vout[0].nValue=0LL;
|
||||||
CFeeRate baseRate(basefee, GetVirtualTransactionSize(tx));
|
CFeeRate baseRate(basefee, GetVirtualTransactionSize(CTransaction(tx)));
|
||||||
|
|
||||||
// Create a fake block
|
// Create a fake block
|
||||||
std::vector<CTransactionRef> block;
|
std::vector<CTransactionRef> block;
|
||||||
|
|
|
@ -88,7 +88,7 @@ BOOST_AUTO_TEST_CASE(sign)
|
||||||
txFrom.vout[i+4].scriptPubKey = standardScripts[i];
|
txFrom.vout[i+4].scriptPubKey = standardScripts[i];
|
||||||
txFrom.vout[i+4].nValue = COIN;
|
txFrom.vout[i+4].nValue = COIN;
|
||||||
}
|
}
|
||||||
BOOST_CHECK(IsStandardTx(txFrom, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(txFrom), reason));
|
||||||
|
|
||||||
CMutableTransaction txTo[8]; // Spending transactions
|
CMutableTransaction txTo[8]; // Spending transactions
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
|
@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(sign)
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
BOOST_CHECK_MESSAGE(SignSignature(keystore, CTransaction(txFrom), txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
||||||
}
|
}
|
||||||
// All of the above should be OK, and the txTos have valid signatures
|
// All of the above should be OK, and the txTos have valid signatures
|
||||||
// Check to make sure signature verification fails if we use the wrong ScriptSig:
|
// Check to make sure signature verification fails if we use the wrong ScriptSig:
|
||||||
|
@ -112,7 +112,7 @@ BOOST_AUTO_TEST_CASE(sign)
|
||||||
{
|
{
|
||||||
CScript sigSave = txTo[i].vin[0].scriptSig;
|
CScript sigSave = txTo[i].vin[0].scriptSig;
|
||||||
txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig;
|
txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig;
|
||||||
bool sigOK = CScriptCheck(txFrom.vout[txTo[i].vin[0].prevout.n], txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)();
|
bool sigOK = CScriptCheck(txFrom.vout[txTo[i].vin[0].prevout.n], CTransaction(txTo[i]), 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)();
|
||||||
if (i == j)
|
if (i == j)
|
||||||
BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j));
|
BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j));
|
||||||
else
|
else
|
||||||
|
@ -184,7 +184,7 @@ BOOST_AUTO_TEST_CASE(set)
|
||||||
txFrom.vout[i].scriptPubKey = outer[i];
|
txFrom.vout[i].scriptPubKey = outer[i];
|
||||||
txFrom.vout[i].nValue = CENT;
|
txFrom.vout[i].nValue = CENT;
|
||||||
}
|
}
|
||||||
BOOST_CHECK(IsStandardTx(txFrom, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(txFrom), reason));
|
||||||
|
|
||||||
CMutableTransaction txTo[4]; // Spending transactions
|
CMutableTransaction txTo[4]; // Spending transactions
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
|
@ -199,8 +199,8 @@ BOOST_AUTO_TEST_CASE(set)
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
BOOST_CHECK_MESSAGE(SignSignature(keystore, CTransaction(txFrom), txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
|
||||||
BOOST_CHECK_MESSAGE(IsStandardTx(txTo[i], reason), strprintf("txTo[%d].IsStandard", i));
|
BOOST_CHECK_MESSAGE(IsStandardTx(CTransaction(txTo[i]), reason), strprintf("txTo[%d].IsStandard", i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,7 +316,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
txFrom.vout[6].scriptPubKey = GetScriptForDestination(CScriptID(twentySigops));
|
txFrom.vout[6].scriptPubKey = GetScriptForDestination(CScriptID(twentySigops));
|
||||||
txFrom.vout[6].nValue = 6000;
|
txFrom.vout[6].nValue = 6000;
|
||||||
|
|
||||||
AddCoins(coins, txFrom, 0);
|
AddCoins(coins, CTransaction(txFrom), 0);
|
||||||
|
|
||||||
CMutableTransaction txTo;
|
CMutableTransaction txTo;
|
||||||
txTo.vout.resize(1);
|
txTo.vout.resize(1);
|
||||||
|
@ -328,18 +328,18 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
txTo.vin[i].prevout.n = i;
|
txTo.vin[i].prevout.n = i;
|
||||||
txTo.vin[i].prevout.hash = txFrom.GetHash();
|
txTo.vin[i].prevout.hash = txFrom.GetHash();
|
||||||
}
|
}
|
||||||
BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL));
|
BOOST_CHECK(SignSignature(keystore, CTransaction(txFrom), txTo, 0, SIGHASH_ALL));
|
||||||
BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1, SIGHASH_ALL));
|
BOOST_CHECK(SignSignature(keystore, CTransaction(txFrom), txTo, 1, SIGHASH_ALL));
|
||||||
BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2, SIGHASH_ALL));
|
BOOST_CHECK(SignSignature(keystore, CTransaction(txFrom), txTo, 2, SIGHASH_ALL));
|
||||||
// SignSignature doesn't know how to sign these. We're
|
// SignSignature doesn't know how to sign these. We're
|
||||||
// not testing validating signatures, so just create
|
// not testing validating signatures, so just create
|
||||||
// dummy signatures that DO include the correct P2SH scripts:
|
// dummy signatures that DO include the correct P2SH scripts:
|
||||||
txTo.vin[3].scriptSig << OP_11 << OP_11 << std::vector<unsigned char>(oneAndTwo.begin(), oneAndTwo.end());
|
txTo.vin[3].scriptSig << OP_11 << OP_11 << std::vector<unsigned char>(oneAndTwo.begin(), oneAndTwo.end());
|
||||||
txTo.vin[4].scriptSig << std::vector<unsigned char>(fifteenSigops.begin(), fifteenSigops.end());
|
txTo.vin[4].scriptSig << std::vector<unsigned char>(fifteenSigops.begin(), fifteenSigops.end());
|
||||||
|
|
||||||
BOOST_CHECK(::AreInputsStandard(txTo, coins));
|
BOOST_CHECK(::AreInputsStandard(CTransaction(txTo), coins));
|
||||||
// 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4]
|
// 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4]
|
||||||
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txTo, coins), 22U);
|
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(txTo), coins), 22U);
|
||||||
|
|
||||||
CMutableTransaction txToNonStd1;
|
CMutableTransaction txToNonStd1;
|
||||||
txToNonStd1.vout.resize(1);
|
txToNonStd1.vout.resize(1);
|
||||||
|
@ -350,8 +350,8 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
txToNonStd1.vin[0].prevout.hash = txFrom.GetHash();
|
txToNonStd1.vin[0].prevout.hash = txFrom.GetHash();
|
||||||
txToNonStd1.vin[0].scriptSig << std::vector<unsigned char>(sixteenSigops.begin(), sixteenSigops.end());
|
txToNonStd1.vin[0].scriptSig << std::vector<unsigned char>(sixteenSigops.begin(), sixteenSigops.end());
|
||||||
|
|
||||||
BOOST_CHECK(!::AreInputsStandard(txToNonStd1, coins));
|
BOOST_CHECK(!::AreInputsStandard(CTransaction(txToNonStd1), coins));
|
||||||
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd1, coins), 16U);
|
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(txToNonStd1), coins), 16U);
|
||||||
|
|
||||||
CMutableTransaction txToNonStd2;
|
CMutableTransaction txToNonStd2;
|
||||||
txToNonStd2.vout.resize(1);
|
txToNonStd2.vout.resize(1);
|
||||||
|
@ -362,8 +362,8 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
txToNonStd2.vin[0].prevout.hash = txFrom.GetHash();
|
txToNonStd2.vin[0].prevout.hash = txFrom.GetHash();
|
||||||
txToNonStd2.vin[0].scriptSig << std::vector<unsigned char>(twentySigops.begin(), twentySigops.end());
|
txToNonStd2.vin[0].scriptSig << std::vector<unsigned char>(twentySigops.begin(), twentySigops.end());
|
||||||
|
|
||||||
BOOST_CHECK(!::AreInputsStandard(txToNonStd2, coins));
|
BOOST_CHECK(!::AreInputsStandard(CTransaction(txToNonStd2), coins));
|
||||||
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd2, coins), 20U);
|
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(txToNonStd2), coins), 20U);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -1078,18 +1078,18 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
|
||||||
const CTransaction txFrom12{BuildCreditingTransaction(scriptPubKey12)};
|
const CTransaction txFrom12{BuildCreditingTransaction(scriptPubKey12)};
|
||||||
CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom12);
|
CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom12);
|
||||||
|
|
||||||
CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12);
|
CScript goodsig1 = sign_multisig(scriptPubKey12, key1, CTransaction(txTo12));
|
||||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
txTo12.vout[0].nValue = 2;
|
txTo12.vout[0].nValue = 2;
|
||||||
BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12);
|
CScript goodsig2 = sign_multisig(scriptPubKey12, key2, CTransaction(txTo12));
|
||||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
|
|
||||||
CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12);
|
CScript badsig1 = sign_multisig(scriptPubKey12, key3, CTransaction(txTo12));
|
||||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
}
|
}
|
||||||
|
@ -1111,54 +1111,54 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
|
||||||
|
|
||||||
std::vector<CKey> keys;
|
std::vector<CKey> keys;
|
||||||
keys.push_back(key1); keys.push_back(key2);
|
keys.push_back(key1); keys.push_back(key2);
|
||||||
CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript goodsig1 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key1); keys.push_back(key3);
|
keys.push_back(key1); keys.push_back(key3);
|
||||||
CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript goodsig2 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key2); keys.push_back(key3);
|
keys.push_back(key2); keys.push_back(key3);
|
||||||
CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript goodsig3 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key2); keys.push_back(key2); // Can't re-use sig
|
keys.push_back(key2); keys.push_back(key2); // Can't re-use sig
|
||||||
CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig1 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order
|
keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order
|
||||||
CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig2 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order
|
keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order
|
||||||
CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig3 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys
|
keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys
|
||||||
CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig4 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys
|
keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys
|
||||||
CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig5 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||||
|
|
||||||
keys.clear(); // Must have signatures
|
keys.clear(); // Must have signatures
|
||||||
CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23);
|
CScript badsig6 = sign_multisig(scriptPubKey23, keys, CTransaction(txTo23));
|
||||||
BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, nullptr, gFlags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
||||||
}
|
}
|
||||||
|
@ -1189,7 +1189,7 @@ 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(), CTransaction(txFrom));
|
||||||
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
||||||
SignatureData scriptSig;
|
SignatureData scriptSig;
|
||||||
|
|
||||||
|
@ -1198,7 +1198,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
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, CTransaction(txFrom), txTo, 0, SIGHASH_ALL); // changes scriptSig
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
@ -1206,7 +1206,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
SignatureData scriptSigCopy = 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, CTransaction(txFrom), txTo, 0, SIGHASH_ALL);
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
@ -1215,14 +1215,14 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
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, CTransaction(txFrom), txTo, 0, SIGHASH_ALL);
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, empty, scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
scriptSigCopy = scriptSig;
|
scriptSigCopy = scriptSig;
|
||||||
SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
|
SignSignature(keystore, CTransaction(txFrom), txTo, 0, SIGHASH_ALL);
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSigCopy, scriptSig);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSigCopy.scriptSig || combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
@ -1230,7 +1230,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
// 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, CTransaction(txFrom), txTo, 0, SIGHASH_ALL);
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
BOOST_CHECK(combined.scriptSig == scriptSig.scriptSig);
|
||||||
|
|
|
@ -137,7 +137,7 @@ BOOST_AUTO_TEST_CASE(sighash_test)
|
||||||
int nIn = InsecureRandRange(txTo.vin.size());
|
int nIn = InsecureRandRange(txTo.vin.size());
|
||||||
|
|
||||||
uint256 sh, sho;
|
uint256 sh, sho;
|
||||||
sho = SignatureHashOld(scriptCode, txTo, nIn, nHashType);
|
sho = SignatureHashOld(scriptCode, CTransaction(txTo), nIn, nHashType);
|
||||||
sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, SigVersion::BASE);
|
sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, SigVersion::BASE);
|
||||||
#if defined(PRINT_SIGHASH_JSON)
|
#if defined(PRINT_SIGHASH_JSON)
|
||||||
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
|
|
@ -102,7 +102,7 @@ static void BuildTxs(CMutableTransaction& spendingTx, CCoinsViewCache& coins, CM
|
||||||
spendingTx.vout[0].nValue = 1;
|
spendingTx.vout[0].nValue = 1;
|
||||||
spendingTx.vout[0].scriptPubKey = CScript();
|
spendingTx.vout[0].scriptPubKey = CScript();
|
||||||
|
|
||||||
AddCoins(coins, creationTx, 0);
|
AddCoins(coins, CTransaction(creationTx), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
|
@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
// is not accurate.
|
// is not accurate.
|
||||||
assert(GetTransactionSigOpCost(CTransaction(creationTx), coins, flags) == MAX_PUBKEYS_PER_MULTISIG * WITNESS_SCALE_FACTOR);
|
assert(GetTransactionSigOpCost(CTransaction(creationTx), coins, flags) == MAX_PUBKEYS_PER_MULTISIG * WITNESS_SCALE_FACTOR);
|
||||||
// Sanity check: script verification fails because of an invalid signature.
|
// Sanity check: script verification fails because of an invalid signature.
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multisig nested in P2SH
|
// Multisig nested in P2SH
|
||||||
|
@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
|
|
||||||
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CScriptWitness());
|
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CScriptWitness());
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2 * WITNESS_SCALE_FACTOR);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2 * WITNESS_SCALE_FACTOR);
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// P2WPKH witness program
|
// P2WPKH witness program
|
||||||
|
@ -166,7 +166,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
|
||||||
// No signature operations if we don't verify the witness.
|
// No signature operations if we don't verify the witness.
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
|
||||||
|
|
||||||
// The sig op cost for witness version != 0 is zero.
|
// The sig op cost for witness version != 0 is zero.
|
||||||
assert(scriptPubKey[0] == 0x00);
|
assert(scriptPubKey[0] == 0x00);
|
||||||
|
@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
|
|
||||||
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// P2WSH witness program
|
// P2WSH witness program
|
||||||
|
@ -209,7 +209,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// P2WSH nested in P2SH
|
// P2WSH nested in P2SH
|
||||||
|
@ -225,7 +225,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
|
|
||||||
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, scriptWitness);
|
||||||
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
|
assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
|
||||||
assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
assert(VerifyWithFlag(CTransaction(creationTx), spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -273,11 +273,11 @@ BOOST_AUTO_TEST_CASE(basic_transaction_tests)
|
||||||
CMutableTransaction tx;
|
CMutableTransaction tx;
|
||||||
stream >> tx;
|
stream >> tx;
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state) && state.IsValid(), "Simple deserialized transaction should be valid.");
|
BOOST_CHECK_MESSAGE(CheckTransaction(CTransaction(tx), state) && state.IsValid(), "Simple deserialized transaction should be valid.");
|
||||||
|
|
||||||
// Check that duplicate txins fail
|
// Check that duplicate txins fail
|
||||||
tx.vin.push_back(tx.vin[0]);
|
tx.vin.push_back(tx.vin[0]);
|
||||||
BOOST_CHECK_MESSAGE(!CheckTransaction(tx, state) || !state.IsValid(), "Transaction with duplicate txins should be invalid.");
|
BOOST_CHECK_MESSAGE(!CheckTransaction(CTransaction(tx), state) || !state.IsValid(), "Transaction with duplicate txins should be invalid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -306,14 +306,14 @@ SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsViewCache& coinsRet)
|
||||||
dummyTransactions[0].vout[0].scriptPubKey << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG;
|
dummyTransactions[0].vout[0].scriptPubKey << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG;
|
||||||
dummyTransactions[0].vout[1].nValue = 50*CENT;
|
dummyTransactions[0].vout[1].nValue = 50*CENT;
|
||||||
dummyTransactions[0].vout[1].scriptPubKey << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG;
|
dummyTransactions[0].vout[1].scriptPubKey << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG;
|
||||||
AddCoins(coinsRet, dummyTransactions[0], 0);
|
AddCoins(coinsRet, CTransaction(dummyTransactions[0]), 0);
|
||||||
|
|
||||||
dummyTransactions[1].vout.resize(2);
|
dummyTransactions[1].vout.resize(2);
|
||||||
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
||||||
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
||||||
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
||||||
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
||||||
AddCoins(coinsRet, dummyTransactions[1], 0);
|
AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
|
||||||
|
|
||||||
return dummyTransactions;
|
return dummyTransactions;
|
||||||
}
|
}
|
||||||
|
@ -340,8 +340,8 @@ BOOST_AUTO_TEST_CASE(test_Get)
|
||||||
t1.vout[0].nValue = 90*CENT;
|
t1.vout[0].nValue = 90*CENT;
|
||||||
t1.vout[0].scriptPubKey << OP_1;
|
t1.vout[0].scriptPubKey << OP_1;
|
||||||
|
|
||||||
BOOST_CHECK(AreInputsStandard(t1, coins));
|
BOOST_CHECK(AreInputsStandard(CTransaction(t1), coins));
|
||||||
BOOST_CHECK_EQUAL(coins.GetValueIn(t1), (50+21+22)*CENT);
|
BOOST_CHECK_EQUAL(coins.GetValueIn(CTransaction(t1)), (50+21+22)*CENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, CTransactionRef& output, CMutableTransaction& input, bool success = true)
|
static void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, CTransactionRef& output, CMutableTransaction& input, bool success = true)
|
||||||
|
@ -697,75 +697,75 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
|
||||||
t.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
t.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
||||||
|
|
||||||
std::string reason;
|
std::string reason;
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// Check dust with default relay fee:
|
// Check dust with default relay fee:
|
||||||
CAmount nDustThreshold = 182 * dustRelayFee.GetFeePerK()/1000;
|
CAmount nDustThreshold = 182 * dustRelayFee.GetFeePerK()/1000;
|
||||||
BOOST_CHECK_EQUAL(nDustThreshold, 546);
|
BOOST_CHECK_EQUAL(nDustThreshold, 546);
|
||||||
// dust:
|
// dust:
|
||||||
t.vout[0].nValue = nDustThreshold - 1;
|
t.vout[0].nValue = nDustThreshold - 1;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
// not dust:
|
// not dust:
|
||||||
t.vout[0].nValue = nDustThreshold;
|
t.vout[0].nValue = nDustThreshold;
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// Check dust with odd relay fee to verify rounding:
|
// Check dust with odd relay fee to verify rounding:
|
||||||
// nDustThreshold = 182 * 3702 / 1000
|
// nDustThreshold = 182 * 3702 / 1000
|
||||||
dustRelayFee = CFeeRate(3702);
|
dustRelayFee = CFeeRate(3702);
|
||||||
// dust:
|
// dust:
|
||||||
t.vout[0].nValue = 673 - 1;
|
t.vout[0].nValue = 673 - 1;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
// not dust:
|
// not dust:
|
||||||
t.vout[0].nValue = 673;
|
t.vout[0].nValue = 673;
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
dustRelayFee = CFeeRate(DUST_RELAY_TX_FEE);
|
dustRelayFee = CFeeRate(DUST_RELAY_TX_FEE);
|
||||||
|
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_1;
|
t.vout[0].scriptPubKey = CScript() << OP_1;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// MAX_OP_RETURN_RELAY-byte TX_NULL_DATA (standard)
|
// MAX_OP_RETURN_RELAY-byte TX_NULL_DATA (standard)
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
||||||
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY, t.vout[0].scriptPubKey.size());
|
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY, t.vout[0].scriptPubKey.size());
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// MAX_OP_RETURN_RELAY+1-byte TX_NULL_DATA (non-standard)
|
// MAX_OP_RETURN_RELAY+1-byte TX_NULL_DATA (non-standard)
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800");
|
||||||
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY + 1, t.vout[0].scriptPubKey.size());
|
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY + 1, t.vout[0].scriptPubKey.size());
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// Data payload can be encoded in any way...
|
// Data payload can be encoded in any way...
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("");
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("00") << ParseHex("01");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("00") << ParseHex("01");
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
// OP_RESERVED *is* considered to be a PUSHDATA type opcode by IsPushOnly()!
|
// OP_RESERVED *is* considered to be a PUSHDATA type opcode by IsPushOnly()!
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << ParseHex("01") << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << ParseHex("01") << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << ParseHex("01") << 2 << ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << ParseHex("01") << 2 << ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// ...so long as it only contains PUSHDATA's
|
// ...so long as it only contains PUSHDATA's
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RETURN;
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RETURN;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// TX_NULL_DATA w/o PUSHDATA
|
// TX_NULL_DATA w/o PUSHDATA
|
||||||
t.vout.resize(1);
|
t.vout.resize(1);
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN;
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN;
|
||||||
BOOST_CHECK(IsStandardTx(t, reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
// Only one TX_NULL_DATA permitted in all cases
|
// Only one TX_NULL_DATA permitted in all cases
|
||||||
t.vout.resize(2);
|
t.vout.resize(2);
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
||||||
t.vout[1].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
t.vout[1].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
|
||||||
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
|
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
||||||
t.vout[0].scriptPubKey = CScript() << OP_RETURN;
|
t.vout[0].scriptPubKey = CScript() << OP_RETURN;
|
||||||
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
|
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
|
||||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -198,20 +198,20 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
PrecomputedTransactionData ptd_spend_tx(spend_tx);
|
PrecomputedTransactionData ptd_spend_tx(spend_tx);
|
||||||
|
|
||||||
BOOST_CHECK(!CheckInputs(spend_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, nullptr));
|
BOOST_CHECK(!CheckInputs(CTransaction(spend_tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, nullptr));
|
||||||
|
|
||||||
// If we call again asking for scriptchecks (as happens in
|
// If we call again asking for scriptchecks (as happens in
|
||||||
// ConnectBlock), we should add a script check object for this -- we're
|
// ConnectBlock), we should add a script check object for this -- we're
|
||||||
// not caching invalidity (if that changes, delete this test case).
|
// not caching invalidity (if that changes, delete this test case).
|
||||||
std::vector<CScriptCheck> scriptchecks;
|
std::vector<CScriptCheck> scriptchecks;
|
||||||
BOOST_CHECK(CheckInputs(spend_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, &scriptchecks));
|
BOOST_CHECK(CheckInputs(CTransaction(spend_tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, &scriptchecks));
|
||||||
BOOST_CHECK_EQUAL(scriptchecks.size(), 1U);
|
BOOST_CHECK_EQUAL(scriptchecks.size(), 1U);
|
||||||
|
|
||||||
// Test that CheckInputs returns true iff DERSIG-enforcing flags are
|
// Test that CheckInputs returns true iff DERSIG-enforcing flags are
|
||||||
// not present. Don't add these checks to the cache, so that we can
|
// not present. Don't add these checks to the cache, so that we can
|
||||||
// test later that block validation works fine in the absence of cached
|
// test later that block validation works fine in the absence of cached
|
||||||
// successes.
|
// successes.
|
||||||
ValidateCheckInputsForAllFlags(spend_tx, SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false);
|
ValidateCheckInputsForAllFlags(CTransaction(spend_tx), SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// And if we produce a block with this tx, it should be valid (DERSIG not
|
// And if we produce a block with this tx, it should be valid (DERSIG not
|
||||||
|
@ -238,7 +238,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
std::vector<unsigned char> vchSig2(p2pk_scriptPubKey.begin(), p2pk_scriptPubKey.end());
|
std::vector<unsigned char> vchSig2(p2pk_scriptPubKey.begin(), p2pk_scriptPubKey.end());
|
||||||
invalid_under_p2sh_tx.vin[0].scriptSig << vchSig2;
|
invalid_under_p2sh_tx.vin[0].scriptSig << vchSig2;
|
||||||
|
|
||||||
ValidateCheckInputsForAllFlags(invalid_under_p2sh_tx, SCRIPT_VERIFY_P2SH, true);
|
ValidateCheckInputsForAllFlags(CTransaction(invalid_under_p2sh_tx), SCRIPT_VERIFY_P2SH, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test CHECKLOCKTIMEVERIFY
|
// Test CHECKLOCKTIMEVERIFY
|
||||||
|
@ -261,13 +261,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
vchSig.push_back((unsigned char)SIGHASH_ALL);
|
vchSig.push_back((unsigned char)SIGHASH_ALL);
|
||||||
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
|
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
|
||||||
|
|
||||||
ValidateCheckInputsForAllFlags(invalid_with_cltv_tx, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true);
|
ValidateCheckInputsForAllFlags(CTransaction(invalid_with_cltv_tx), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true);
|
||||||
|
|
||||||
// Make it valid, and check again
|
// Make it valid, and check again
|
||||||
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
|
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
PrecomputedTransactionData txdata(invalid_with_cltv_tx);
|
PrecomputedTransactionData txdata(invalid_with_cltv_tx);
|
||||||
BOOST_CHECK(CheckInputs(invalid_with_cltv_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, nullptr));
|
BOOST_CHECK(CheckInputs(CTransaction(invalid_with_cltv_tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TEST CHECKSEQUENCEVERIFY
|
// TEST CHECKSEQUENCEVERIFY
|
||||||
|
@ -289,13 +289,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
vchSig.push_back((unsigned char)SIGHASH_ALL);
|
vchSig.push_back((unsigned char)SIGHASH_ALL);
|
||||||
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
|
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
|
||||||
|
|
||||||
ValidateCheckInputsForAllFlags(invalid_with_csv_tx, SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true);
|
ValidateCheckInputsForAllFlags(CTransaction(invalid_with_csv_tx), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true);
|
||||||
|
|
||||||
// Make it valid, and check again
|
// Make it valid, and check again
|
||||||
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
|
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
PrecomputedTransactionData txdata(invalid_with_csv_tx);
|
PrecomputedTransactionData txdata(invalid_with_csv_tx);
|
||||||
BOOST_CHECK(CheckInputs(invalid_with_csv_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, nullptr));
|
BOOST_CHECK(CheckInputs(CTransaction(invalid_with_csv_tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add tests for remaining script flags
|
// TODO: add tests for remaining script flags
|
||||||
|
@ -318,11 +318,11 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
UpdateInput(valid_with_witness_tx.vin[0], sigdata);
|
UpdateInput(valid_with_witness_tx.vin[0], sigdata);
|
||||||
|
|
||||||
// This should be valid under all script flags.
|
// This should be valid under all script flags.
|
||||||
ValidateCheckInputsForAllFlags(valid_with_witness_tx, 0, true);
|
ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), 0, true);
|
||||||
|
|
||||||
// Remove the witness, and check that it is now invalid.
|
// Remove the witness, and check that it is now invalid.
|
||||||
valid_with_witness_tx.vin[0].scriptWitness.SetNull();
|
valid_with_witness_tx.vin[0].scriptWitness.SetNull();
|
||||||
ValidateCheckInputsForAllFlags(valid_with_witness_tx, SCRIPT_VERIFY_WITNESS, true);
|
ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), SCRIPT_VERIFY_WITNESS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -347,7 +347,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This should be valid under all script flags
|
// This should be valid under all script flags
|
||||||
ValidateCheckInputsForAllFlags(tx, 0, true);
|
ValidateCheckInputsForAllFlags(CTransaction(tx), 0, true);
|
||||||
|
|
||||||
// Check that if the second input is invalid, but the first input is
|
// Check that if the second input is invalid, but the first input is
|
||||||
// valid, the transaction is not cached.
|
// valid, the transaction is not cached.
|
||||||
|
@ -357,12 +357,12 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
PrecomputedTransactionData txdata(tx);
|
PrecomputedTransactionData txdata(tx);
|
||||||
// This transaction is now invalid under segwit, because of the second input.
|
// This transaction is now invalid under segwit, because of the second input.
|
||||||
BOOST_CHECK(!CheckInputs(tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, nullptr));
|
BOOST_CHECK(!CheckInputs(CTransaction(tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, nullptr));
|
||||||
|
|
||||||
std::vector<CScriptCheck> scriptchecks;
|
std::vector<CScriptCheck> scriptchecks;
|
||||||
// Make sure this transaction was not cached (ie because the first
|
// Make sure this transaction was not cached (ie because the first
|
||||||
// input was valid)
|
// input was valid)
|
||||||
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, &scriptchecks));
|
BOOST_CHECK(CheckInputs(CTransaction(tx), state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, &scriptchecks));
|
||||||
// Should get 2 script checks back -- caching is on a whole-transaction basis.
|
// Should get 2 script checks back -- caching is on a whole-transaction basis.
|
||||||
BOOST_CHECK_EQUAL(scriptchecks.size(), 2U);
|
BOOST_CHECK_EQUAL(scriptchecks.size(), 2U);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue