mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
test: assert CScript allocation characteristics
Verifies that script types are correctly allocated using prevector's direct or indirect storage based on their size: Direct allocated script types (size ≤ 28 bytes): * OP_RETURN (small) * P2WPKH * P2SH * P2PKH Indirect allocated script types (size > 28 bytes): * P2WSH * P2TR * P2PK * MULTISIG (small) This test provides a baseline for verifying changes to prevector's inline capacity.
This commit is contained in:
parent
a5f2ffa951
commit
ecc6c07e58
1 changed files with 85 additions and 0 deletions
|
@ -1158,6 +1158,91 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(script_size_and_capacity_test)
|
||||||
|
{
|
||||||
|
BOOST_CHECK_EQUAL(sizeof(prevector<PREVECTOR_SIZE, unsigned char>), 32);
|
||||||
|
BOOST_CHECK_EQUAL(sizeof(CScriptBase), 32);
|
||||||
|
BOOST_CHECK_EQUAL(sizeof(CScript), 32);
|
||||||
|
BOOST_CHECK_EQUAL(sizeof(CTxOut), 40);
|
||||||
|
|
||||||
|
CKey dummyKey;
|
||||||
|
dummyKey.MakeNewKey(true);
|
||||||
|
|
||||||
|
std::vector<std::vector<uint8_t>> dummyVSolutions;
|
||||||
|
|
||||||
|
// Small OP_RETURN has direct allocation
|
||||||
|
{
|
||||||
|
const auto scriptSmallOpReturn{CScript() << OP_RETURN << std::vector<uint8_t>(10, 0xaa)};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptSmallOpReturn, dummyVSolutions), TxoutType::NULL_DATA);
|
||||||
|
BOOST_CHECK_EQUAL(scriptSmallOpReturn.size(), 12);
|
||||||
|
BOOST_CHECK_EQUAL(scriptSmallOpReturn.capacity(), PREVECTOR_SIZE);
|
||||||
|
BOOST_CHECK_EQUAL(scriptSmallOpReturn.allocated_memory(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2WPKH has direct allocation
|
||||||
|
{
|
||||||
|
const auto scriptP2WPKH{GetScriptForDestination(WitnessV0KeyHash{PKHash{CKeyID{CPubKey{dummyKey.GetPubKey()}.GetID()}}})};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptP2WPKH, dummyVSolutions), TxoutType::WITNESS_V0_KEYHASH);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WPKH.size(), 22);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WPKH.capacity(), PREVECTOR_SIZE);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WPKH.allocated_memory(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2SH has direct allocation
|
||||||
|
{
|
||||||
|
const auto scriptP2SH{GetScriptForDestination(ScriptHash{CScript{} << OP_TRUE})};
|
||||||
|
BOOST_CHECK(scriptP2SH.IsPayToScriptHash());
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2SH.size(), 23);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2SH.capacity(), PREVECTOR_SIZE);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2SH.allocated_memory(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2PKH has direct allocation
|
||||||
|
{
|
||||||
|
const auto scriptP2PKH{GetScriptForDestination(PKHash{CKeyID{CPubKey{dummyKey.GetPubKey()}.GetID()}})};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptP2PKH, dummyVSolutions), TxoutType::PUBKEYHASH);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2PKH.size(), 25);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2PKH.capacity(), PREVECTOR_SIZE);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2PKH.allocated_memory(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2WSH needs extra allocation
|
||||||
|
{
|
||||||
|
const auto scriptP2WSH{GetScriptForDestination(WitnessV0ScriptHash{CScript{} << OP_TRUE})};
|
||||||
|
BOOST_CHECK(scriptP2WSH.IsPayToWitnessScriptHash());
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WSH.size(), 34);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WSH.capacity(), 34);
|
||||||
|
BOOST_CHECK_EQUAL(scriptP2WSH.allocated_memory(), 34);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2TR needs extra allocation
|
||||||
|
{
|
||||||
|
const auto scriptTaproot{GetScriptForDestination(WitnessV1Taproot{XOnlyPubKey{CPubKey{dummyKey.GetPubKey()}}})};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptTaproot, dummyVSolutions), TxoutType::WITNESS_V1_TAPROOT);
|
||||||
|
BOOST_CHECK_EQUAL(scriptTaproot.size(), 34);
|
||||||
|
BOOST_CHECK_EQUAL(scriptTaproot.capacity(), 34);
|
||||||
|
BOOST_CHECK_EQUAL(scriptTaproot.allocated_memory(), 34);
|
||||||
|
}
|
||||||
|
|
||||||
|
// P2PK needs extra allocation
|
||||||
|
{
|
||||||
|
const auto scriptPubKey{GetScriptForRawPubKey(CPubKey{dummyKey.GetPubKey()})};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptPubKey, dummyVSolutions), TxoutType::PUBKEY);
|
||||||
|
BOOST_CHECK_EQUAL(scriptPubKey.size(), 35);
|
||||||
|
BOOST_CHECK_EQUAL(scriptPubKey.capacity(), 35);
|
||||||
|
BOOST_CHECK_EQUAL(scriptPubKey.allocated_memory(), 35);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MULTISIG needs extra allocation
|
||||||
|
{
|
||||||
|
const auto scriptMultisig{GetScriptForMultisig(1, std::vector{2, CPubKey{dummyKey.GetPubKey()}})};
|
||||||
|
BOOST_CHECK_EQUAL(Solver(scriptMultisig, dummyVSolutions), TxoutType::MULTISIG);
|
||||||
|
BOOST_CHECK_EQUAL(scriptMultisig.size(), 71);
|
||||||
|
BOOST_CHECK_EQUAL(scriptMultisig.capacity(), 103);
|
||||||
|
BOOST_CHECK_EQUAL(scriptMultisig.allocated_memory(), 103);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Wrapper around ProduceSignature to combine two scriptsigs */
|
/* Wrapper around ProduceSignature to combine two scriptsigs */
|
||||||
SignatureData CombineSignatures(const CTxOut& txout, const CMutableTransaction& tx, const SignatureData& scriptSig1, const SignatureData& scriptSig2)
|
SignatureData CombineSignatures(const CTxOut& txout, const CMutableTransaction& tx, const SignatureData& scriptSig1, const SignatureData& scriptSig2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue