mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 22:50:59 +01:00
Make CTransaction actually immutable
This commit is contained in:
@@ -150,8 +150,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||
|
||||
string transaction = test[1].get_str();
|
||||
CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION);
|
||||
CTransaction tx;
|
||||
stream >> tx;
|
||||
CTransaction tx(deserialize, stream);
|
||||
|
||||
CValidationState state;
|
||||
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state), strTest);
|
||||
@@ -236,8 +235,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||
|
||||
string transaction = test[1].get_str();
|
||||
CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION );
|
||||
CTransaction tx;
|
||||
stream >> tx;
|
||||
CTransaction tx(deserialize, stream);
|
||||
|
||||
CValidationState state;
|
||||
fValid = CheckTransaction(tx, state) && state.IsValid();
|
||||
@@ -346,7 +344,7 @@ BOOST_AUTO_TEST_CASE(test_Get)
|
||||
BOOST_CHECK_EQUAL(coins.GetValueIn(t1), (50+21+22)*CENT);
|
||||
}
|
||||
|
||||
void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, CTransaction& output, CMutableTransaction& input, bool success = true)
|
||||
void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, CTransactionRef& output, CMutableTransaction& input, bool success = true)
|
||||
{
|
||||
CMutableTransaction outputm;
|
||||
outputm.nVersion = 1;
|
||||
@@ -360,22 +358,22 @@ void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, C
|
||||
CDataStream ssout(SER_NETWORK, PROTOCOL_VERSION);
|
||||
ssout << outputm;
|
||||
ssout >> output;
|
||||
assert(output.vin.size() == 1);
|
||||
assert(output.vin[0] == outputm.vin[0]);
|
||||
assert(output.vout.size() == 1);
|
||||
assert(output.vout[0] == outputm.vout[0]);
|
||||
assert(output.wit.vtxinwit.size() == 0);
|
||||
assert(output->vin.size() == 1);
|
||||
assert(output->vin[0] == outputm.vin[0]);
|
||||
assert(output->vout.size() == 1);
|
||||
assert(output->vout[0] == outputm.vout[0]);
|
||||
assert(output->wit.vtxinwit.size() == 0);
|
||||
|
||||
CMutableTransaction inputm;
|
||||
inputm.nVersion = 1;
|
||||
inputm.vin.resize(1);
|
||||
inputm.vin[0].prevout.hash = output.GetHash();
|
||||
inputm.vin[0].prevout.hash = output->GetHash();
|
||||
inputm.vin[0].prevout.n = 0;
|
||||
inputm.wit.vtxinwit.resize(1);
|
||||
inputm.vout.resize(1);
|
||||
inputm.vout[0].nValue = 1;
|
||||
inputm.vout[0].scriptPubKey = CScript();
|
||||
bool ret = SignSignature(keystore, output, inputm, 0, SIGHASH_ALL);
|
||||
bool ret = SignSignature(keystore, *output, inputm, 0, SIGHASH_ALL);
|
||||
assert(ret == success);
|
||||
CDataStream ssin(SER_NETWORK, PROTOCOL_VERSION);
|
||||
ssin << inputm;
|
||||
@@ -393,11 +391,11 @@ void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, C
|
||||
}
|
||||
}
|
||||
|
||||
void CheckWithFlag(const CTransaction& output, const CMutableTransaction& input, int flags, bool success)
|
||||
void CheckWithFlag(const CTransactionRef& output, const CMutableTransaction& input, int flags, bool success)
|
||||
{
|
||||
ScriptError error;
|
||||
CTransaction inputi(input);
|
||||
bool ret = VerifyScript(inputi.vin[0].scriptSig, output.vout[0].scriptPubKey, inputi.wit.vtxinwit.size() > 0 ? &inputi.wit.vtxinwit[0].scriptWitness : NULL, flags, TransactionSignatureChecker(&inputi, 0, output.vout[0].nValue), &error);
|
||||
bool ret = VerifyScript(inputi.vin[0].scriptSig, output->vout[0].scriptPubKey, inputi.wit.vtxinwit.size() > 0 ? &inputi.wit.vtxinwit[0].scriptWitness : NULL, flags, TransactionSignatureChecker(&inputi, 0, output->vout[0].nValue), &error);
|
||||
assert(ret == success);
|
||||
}
|
||||
|
||||
@@ -466,10 +464,10 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction) {
|
||||
assert(hashSigned);
|
||||
}
|
||||
|
||||
CTransaction tx;
|
||||
CDataStream ssout(SER_NETWORK, PROTOCOL_VERSION);
|
||||
WithOrVersion(&ssout, 0) << mtx;
|
||||
WithOrVersion(&ssout, 0) >> tx;
|
||||
auto vstream = WithOrVersion(&ssout, 0);
|
||||
vstream << mtx;
|
||||
CTransaction tx(deserialize, vstream);
|
||||
|
||||
// check all inputs concurrently, with the cache
|
||||
PrecomputedTransactionData txdata(tx);
|
||||
@@ -547,7 +545,7 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||
keystore2.AddCScript(GetScriptForWitness(scriptMulti));
|
||||
keystore2.AddKeyPubKey(key3, pubkey3);
|
||||
|
||||
CTransaction output1, output2;
|
||||
CTransactionRef output1, output2;
|
||||
CMutableTransaction input1, input2;
|
||||
SignatureData sigdata;
|
||||
|
||||
@@ -639,8 +637,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||
CheckWithFlag(output1, input1, 0, false);
|
||||
CreateCreditAndSpend(keystore2, scriptMulti, output2, input2, false);
|
||||
CheckWithFlag(output2, input2, 0, false);
|
||||
BOOST_CHECK(output1 == output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
BOOST_CHECK(*output1 == *output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||
|
||||
// P2SH 2-of-2 multisig
|
||||
@@ -650,8 +648,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||
CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(scriptMulti)), output2, input2, false);
|
||||
CheckWithFlag(output2, input2, 0, true);
|
||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
|
||||
BOOST_CHECK(output1 == output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
BOOST_CHECK(*output1 == *output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||
|
||||
@@ -662,8 +660,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||
CreateCreditAndSpend(keystore2, GetScriptForWitness(scriptMulti), output2, input2, false);
|
||||
CheckWithFlag(output2, input2, 0, true);
|
||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||
BOOST_CHECK(output1 == output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
BOOST_CHECK(*output1 == *output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||
|
||||
@@ -674,8 +672,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||
CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptMulti))), output2, input2, false);
|
||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
|
||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||
BOOST_CHECK(output1 == output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
BOOST_CHECK(*output1 == *output2);
|
||||
UpdateTransaction(input1, 0, CombineSignatures(output1->vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1->vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
|
||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
|
||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user