mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
Merge 2534141e19 into merged_master (Elements PR ElementsProject/elements#1219)
This commit is contained in:
commit
d78604da4c
129 changed files with 52697 additions and 22 deletions
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
|
@ -105,6 +106,41 @@ static ScriptErrorDesc script_errors[]={
|
|||
{SCRIPT_ERR_WITNESS_PUBKEYTYPE, "WITNESS_PUBKEYTYPE"},
|
||||
{SCRIPT_ERR_OP_CODESEPARATOR, "OP_CODESEPARATOR"},
|
||||
{SCRIPT_ERR_SIG_FINDANDDELETE, "SIG_FINDANDDELETE"},
|
||||
// Elements
|
||||
{SCRIPT_ERR_RANGEPROOF, "RANGEPROOF"},
|
||||
{SCRIPT_ERR_PEDERSEN_TALLY, "PEDERSEN_TALLY"},
|
||||
{SCRIPT_ERR_SHA2_CONTEXT_LOAD, "SHA2_CONTEXT_LOAD"},
|
||||
{SCRIPT_ERR_SHA2_CONTEXT_WRITE, "SHA2_CONTEXT_WRITE"},
|
||||
{SCRIPT_ERR_INTROSPECT_CONTEXT_UNAVAILABLE, "INTROSPECT_CONTEXT_UNAVAILABLE"},
|
||||
{SCRIPT_ERR_INTROSPECT_INDEX_OUT_OF_BOUNDS, "INTROSPECT_INDEX_OUT_OF_BOUNDS"},
|
||||
{SCRIPT_ERR_EXPECTED_8BYTES, "EXPECTED_8BYTES"},
|
||||
{SCRIPT_ERR_ARITHMETIC64, "ARITHMETIC64"},
|
||||
{SCRIPT_ERR_ECMULTVERIFYFAIL, "ECMULTVERIFYFAIL"},
|
||||
{SCRIPT_ERR_SIMPLICITY_WRONG_LENGTH, "SIMPLICITY_WRONG_LENGTH"},
|
||||
{SCRIPT_ERR_SIMPLICITY_NOT_YET_IMPLEMENTED, "SIMPLICITY_NOT_YET_IMPLEMENTED"},
|
||||
{SCRIPT_ERR_SIMPLICITY_DATA_OUT_OF_RANGE, "SIMPLICITY_DATA_OUT_OF_RANGE"},
|
||||
{SCRIPT_ERR_SIMPLICITY_DATA_OUT_OF_ORDER, "SIMPLICITY_DATA_OUT_OF_ORDER"},
|
||||
{SCRIPT_ERR_SIMPLICITY_FAIL_CODE, "SIMPLICITY_FAIL_CODE"},
|
||||
{SCRIPT_ERR_SIMPLICITY_STOP_CODE, "SIMPLICITY_STOP_CODE"},
|
||||
{SCRIPT_ERR_SIMPLICITY_HIDDEN, "SIMPLICITY_HIDDEN"},
|
||||
{SCRIPT_ERR_SIMPLICITY_BITSTREAM_EOF, "SIMPLICITY_BITSTREAM_EOF"},
|
||||
{SCRIPT_ERR_SIMPLICITY_BITSTREAM_TRAILING_BYTES, "SIMPLICITY_BITSTREAM_TRAILING_BYTES"},
|
||||
{SCRIPT_ERR_SIMPLICITY_BITSTREAM_ILLEGAL_PADDING, "SIMPLICITY_BITSTREAM_ILLEGAL_PADDING"},
|
||||
{SCRIPT_ERR_SIMPLICITY_TYPE_INFERENCE_UNIFICATION, "SIMPLICITY_TYPE_INFERENCE_UNIFICATION"},
|
||||
{SCRIPT_ERR_SIMPLICITY_TYPE_INFERENCE_OCCURS_CHECK, "SIMPLICITY_TYPE_INFERENCE_OCCURS_CHECK"},
|
||||
{SCRIPT_ERR_SIMPLICITY_TYPE_INFERENCE_NOT_PROGRAM, "SIMPLICITY_TYPE_INFERENCE_NOT_PROGRAM"},
|
||||
{SCRIPT_ERR_SIMPLICITY_WITNESS_EOF, "SIMPLICITY_WITNESS_EOF"},
|
||||
{SCRIPT_ERR_SIMPLICITY_WITNESS_TRAILING_BYTES, "SIMPLICITY_WITNESS_TRAILING_BYTES"},
|
||||
{SCRIPT_ERR_SIMPLICITY_WITNESS_ILLEGAL_PADDING, "SIMPLICITY_WITNESS_ILLEGAL_PADDING"},
|
||||
{SCRIPT_ERR_SIMPLICITY_UNSHARED_SUBEXPRESSION, "SIMPLICITY_UNSHARED_SUBEXPRESSION"},
|
||||
{SCRIPT_ERR_SIMPLICITY_CMR, "SIMPLICITY_CMR"},
|
||||
{SCRIPT_ERR_SIMPLICITY_EXEC_BUDGET, "SIMPLICITY_EXEC_BUDGET"},
|
||||
{SCRIPT_ERR_SIMPLICITY_EXEC_MEMORY, "SIMPLICITY_EXEC_MEMORY"},
|
||||
{SCRIPT_ERR_SIMPLICITY_EXEC_JET, "SIMPLICITY_EXEC_JET"},
|
||||
{SCRIPT_ERR_SIMPLICITY_EXEC_ASSERT, "SIMPLICITY_EXEC_ASSERT"},
|
||||
{SCRIPT_ERR_SIMPLICITY_ANTIDOS, "SIMPLICITY_ANTIDOS"},
|
||||
{SCRIPT_ERR_SIMPLICITY_HIDDEN_ROOT, "SIMPLICITY_HIDDEN_ROOT"},
|
||||
{SCRIPT_ERR_SIMPLICITY_AMR, "SIMPLICITY_AMR"},
|
||||
};
|
||||
|
||||
static std::string FormatScriptError(ScriptError_t err)
|
||||
|
|
@ -1653,7 +1689,7 @@ static std::vector<unsigned int> AllConsensusFlags()
|
|||
{
|
||||
std::vector<unsigned int> ret;
|
||||
|
||||
for (unsigned int i = 0; i < 128; ++i) {
|
||||
for (unsigned int i = 0; i < 256; ++i) {
|
||||
unsigned int flag = 0;
|
||||
if (i & 1) flag |= SCRIPT_VERIFY_P2SH;
|
||||
if (i & 2) flag |= SCRIPT_VERIFY_DERSIG;
|
||||
|
|
@ -1662,11 +1698,14 @@ static std::vector<unsigned int> AllConsensusFlags()
|
|||
if (i & 16) flag |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY;
|
||||
if (i & 32) flag |= SCRIPT_VERIFY_WITNESS;
|
||||
if (i & 64) flag |= SCRIPT_VERIFY_TAPROOT;
|
||||
if (i & 128) flag |= SCRIPT_VERIFY_SIMPLICITY;
|
||||
|
||||
// SCRIPT_VERIFY_WITNESS requires SCRIPT_VERIFY_P2SH
|
||||
if (flag & SCRIPT_VERIFY_WITNESS && !(flag & SCRIPT_VERIFY_P2SH)) continue;
|
||||
// SCRIPT_VERIFY_TAPROOT requires SCRIPT_VERIFY_WITNESS
|
||||
if (flag & SCRIPT_VERIFY_TAPROOT && !(flag & SCRIPT_VERIFY_WITNESS)) continue;
|
||||
// SCRIPT_VERIFY_SIMPLICITY requires SCRIPT_VERIFY_TAPROOT
|
||||
if (flag & SCRIPT_VERIFY_SIMPLICITY && !(flag & SCRIPT_VERIFY_TAPROOT)) continue;
|
||||
|
||||
ret.push_back(flag);
|
||||
}
|
||||
|
|
@ -1702,8 +1741,10 @@ static void AssetTest(const UniValue& test)
|
|||
// "final": true tests are valid for all flags. Others are only valid with flags that are
|
||||
// a subset of test_flags.
|
||||
if (fin || ((flags & test_flags) == flags)) {
|
||||
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.witness.vtxinwit[idx].scriptWitness, flags, txcheck, nullptr);
|
||||
ScriptError serror;
|
||||
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.witness.vtxinwit[idx].scriptWitness, flags, txcheck, &serror);
|
||||
BOOST_CHECK(ret);
|
||||
BOOST_CHECK_EQUAL(serror, SCRIPT_ERR_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1715,11 +1756,22 @@ static void AssetTest(const UniValue& test)
|
|||
PrecomputedTransactionData txdata(hash_genesis_block);
|
||||
txdata.Init(tx, std::vector<CTxOut>(prevouts));
|
||||
CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, txdata);
|
||||
|
||||
std::optional<ScriptError> expected_error;
|
||||
if (test["failure"].exists("error")) {
|
||||
expected_error = ParseScriptError(test["failure"]["error"].get_str());
|
||||
}
|
||||
|
||||
for (const auto flags : ALL_CONSENSUS_FLAGS) {
|
||||
// If a test is supposed to fail with test_flags, it should also fail with any superset thereof.
|
||||
if ((flags & test_flags) == test_flags) {
|
||||
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.witness.vtxinwit[idx].scriptWitness, flags, txcheck, nullptr);
|
||||
ScriptError serror;
|
||||
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.witness.vtxinwit[idx].scriptWitness, flags, txcheck, &serror);
|
||||
BOOST_CHECK(!ret);
|
||||
|
||||
if (expected_error) {
|
||||
BOOST_CHECK_EQUAL(serror, *expected_error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue