diff --git a/build_msvc/libelementssimplicity/libelementssimplicity.vcxproj b/build_msvc/libelementssimplicity/libelementssimplicity.vcxproj index f975f8316d..068b9316ad 100644 --- a/build_msvc/libelementssimplicity/libelementssimplicity.vcxproj +++ b/build_msvc/libelementssimplicity/libelementssimplicity.vcxproj @@ -9,7 +9,6 @@ - @@ -20,11 +19,13 @@ - - - - - + + + + + + + diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 81b72882e4..d01d4a1a87 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -2601,8 +2601,8 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector&& spent m_spent_output_spk_single_hashes = GetSpentScriptPubKeysSHA256(m_spent_outputs); m_output_spk_single_hashes = GetOutputScriptPubKeysSHA256(txTo); - std::vector simplicityRawAnnex(txTo.witness.vtxinwit.size()); - std::vector simplicityRawInput(txTo.vin.size()); + std::vector simplicityRawAnnex(txTo.witness.vtxinwit.size()); + std::vector simplicityRawInput(txTo.vin.size()); for (size_t i = 0; i < txTo.vin.size(); ++i) { simplicityRawInput[i].prevTxid = txTo.vin[i].prevout.hash.begin(); simplicityRawInput[i].prevIx = txTo.vin[i].prevout.n; @@ -2639,7 +2639,7 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector&& spent } } - std::vector simplicityRawOutput(txTo.vout.size()); + std::vector simplicityRawOutput(txTo.vout.size()); for (size_t i = 0; i < txTo.vout.size(); ++i) { simplicityRawOutput[i].asset = txTo.vout[i].nAsset.vchCommitment.empty() ? NULL : txTo.vout[i].nAsset.vchCommitment.data(); simplicityRawOutput[i].value = txTo.vout[i].nValue.vchCommitment.empty() ? NULL : txTo.vout[i].nValue.vchCommitment.data(); @@ -2659,7 +2659,7 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector&& spent } } - rawTransaction simplicityRawTx; + rawElementsTransaction simplicityRawTx; uint256 rawHash = txTo.GetHash(); simplicityRawTx.txid = rawHash.begin(); simplicityRawTx.input = simplicityRawInput.data(); @@ -3114,14 +3114,14 @@ uint32_t GenericTransactionSignatureChecker::GetnIn() const } template -bool GenericTransactionSignatureChecker::CheckSimplicity(const valtype& program, const valtype& witness, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const +bool GenericTransactionSignatureChecker::CheckSimplicity(const valtype& program, const valtype& witness, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const { simplicity_err error; - tapEnv* simplicityTapEnv = simplicity_elements_mallocTapEnv(&simplicityRawTap); + elementsTapEnv* simplicityTapEnv = simplicity_elements_mallocTapEnv(&simplicityRawTap); assert(txdata->m_simplicity_tx_data); assert(simplicityTapEnv); - if (!simplicity_elements_execSimplicity(&error, 0, txdata->m_simplicity_tx_data.get(), nIn, simplicityTapEnv, txdata->m_hash_genesis_block.data(), budget, 0, program.data(), program.size(), witness.data(), witness.size())) { + if (!simplicity_elements_execSimplicity(&error, 0, txdata->m_simplicity_tx_data.get(), nIn, simplicityTapEnv, txdata->m_hash_genesis_block.data(), 0, budget, 0, program.data(), program.size(), witness.data(), witness.size())) { assert(!"simplicity_elements_execSimplicity internal error"); } simplicity_elements_freeTapEnv(simplicityTapEnv); @@ -3154,6 +3154,7 @@ bool GenericTransactionSignatureChecker::CheckSimplicity(const valtype& progr case SIMPLICITY_ERR_ANTIDOS: return set_error(serror, SCRIPT_ERR_SIMPLICITY_ANTIDOS); case SIMPLICITY_ERR_HIDDEN_ROOT: return set_error(serror, SCRIPT_ERR_SIMPLICITY_HIDDEN_ROOT); case SIMPLICITY_ERR_AMR: return set_error(serror, SCRIPT_ERR_SIMPLICITY_AMR); + case SIMPLICITY_ERR_OVERWEIGHT: return set_error(serror, SCRIPT_ERR_SIMPLICITY_OVERWEIGHT); default: return set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); } } @@ -3312,7 +3313,7 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const valtype& simplicity_program = SpanPopBack(stack); const valtype& simplicity_witness = SpanPopBack(stack); const int64_t budget = ::GetSerializeSize(witness.stack, PROTOCOL_VERSION) + VALIDATION_WEIGHT_OFFSET; - rawTapEnv simplicityRawTap; + rawElementsTapEnv simplicityRawTap; simplicityRawTap.controlBlock = control.data(); simplicityRawTap.pathLen = (control.size() - TAPROOT_CONTROL_BASE_SIZE) / TAPROOT_CONTROL_NODE_SIZE; simplicityRawTap.scriptCMR = script_bytes.data(); diff --git a/src/script/interpreter.h b/src/script/interpreter.h index e54e15678e..6ec8339d9c 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -171,12 +171,12 @@ bool CheckSignatureEncoding(const std::vector &vchSig, unsigned i struct SimplicityTransactionDeleter { - void operator()(transaction* ptr) + void operator()(elementsTransaction* ptr) { simplicity_elements_freeTransaction(ptr); } }; -using SimplicityTransactionUniquePtr = std::unique_ptr; +using SimplicityTransactionUniquePtr = std::unique_ptr; struct PrecomputedTransactionData { @@ -345,7 +345,7 @@ public: return std::numeric_limits::max(); } - virtual bool CheckSimplicity(const std::vector& witness, const std::vector& program, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const + virtual bool CheckSimplicity(const std::vector& witness, const std::vector& program, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const { return false; } @@ -393,7 +393,7 @@ public: const PrecomputedTransactionData* GetPrecomputedTransactionData() const override; uint32_t GetnIn() const override; - bool CheckSimplicity(const std::vector& program, const std::vector& witness, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const override; + bool CheckSimplicity(const std::vector& program, const std::vector& witness, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const override; }; using TransactionSignatureChecker = GenericTransactionSignatureChecker; diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp index a50888dd8f..b79c9e7b34 100644 --- a/src/script/script_error.cpp +++ b/src/script/script_error.cpp @@ -180,6 +180,8 @@ std::string ScriptErrorString(const ScriptError serror) return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_HIDDEN_ROOT); case SCRIPT_ERR_SIMPLICITY_AMR: return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_AMR); + case SCRIPT_ERR_SIMPLICITY_OVERWEIGHT: + return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_OVERWEIGHT); case SCRIPT_ERR_UNKNOWN_ERROR: case SCRIPT_ERR_ERROR_COUNT: default: break; diff --git a/src/script/script_error.h b/src/script/script_error.h index 8fac6496d0..0285255e1e 100644 --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -122,6 +122,7 @@ typedef enum ScriptError_t SCRIPT_ERR_SIMPLICITY_ANTIDOS, SCRIPT_ERR_SIMPLICITY_HIDDEN_ROOT, SCRIPT_ERR_SIMPLICITY_AMR, + SCRIPT_ERR_SIMPLICITY_OVERWEIGHT, /* Must go last */ SCRIPT_ERR_ERROR_COUNT diff --git a/src/test/fuzz/simplicity.cpp b/src/test/fuzz/simplicity.cpp index 25722a5f3c..363ee93ac5 100644 --- a/src/test/fuzz/simplicity.cpp +++ b/src/test/fuzz/simplicity.cpp @@ -5,7 +5,7 @@ #include #include extern "C" { -#include +#include #include #include } @@ -31,9 +31,9 @@ static std::vector TAPROOT_ANNEX(99, 0x50); // Defined in simplicity_compute_amr.c extern "C" { -bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr - , const unsigned char* program, size_t program_len - , const unsigned char* witness, size_t witness_len); +bool simplicity_elements_computeAmr( simplicity_err* error, unsigned char* amr + , const unsigned char* program, size_t program_len + , const unsigned char* witness, size_t witness_len); } void initialize_simplicity() @@ -149,8 +149,8 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity) simplicity_err error; unsigned char cmr[32]; unsigned char amr[32]; - assert(simplicity_computeAmr(&error, amr, prog_data, prog_data_len, wit_data, wit_data_len)); - assert(simplicity_computeCmr(&error, cmr, prog_data, prog_data_len)); + assert(simplicity_elements_computeAmr(&error, amr, prog_data, prog_data_len, wit_data, wit_data_len)); + assert(simplicity_elements_computeCmr(&error, cmr, prog_data, prog_data_len)); // The remainder is just copy/pasted from the original fuzztest @@ -196,7 +196,7 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity) } // 5. Set up Simplicity environment and tx environment - rawTapEnv simplicityRawTap; + rawElementsTapEnv simplicityRawTap; simplicityRawTap.controlBlock = TAPROOT_CONTROL.data(); simplicityRawTap.pathLen = (TAPROOT_CONTROL.size() - TAPROOT_CONTROL_BASE_SIZE) / TAPROOT_CONTROL_NODE_SIZE; simplicityRawTap.scriptCMR = cmr; @@ -210,15 +210,15 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity) unsigned char imr_out[32]; unsigned char *imr = mtx.vin[0].prevout.hash.data()[2] & 2 ? imr_out : NULL; - const transaction* tx = txdata.m_simplicity_tx_data.get(); - tapEnv* taproot = simplicity_elements_mallocTapEnv(&simplicityRawTap); - simplicity_elements_execSimplicity(&error, imr, tx, nIn, taproot, GENESIS_HASH.data(), budget, amr, prog_bytes.data(), prog_bytes.size(), wit_bytes.data(), wit_bytes.size()); + const elementsTransaction* tx = txdata.m_simplicity_tx_data.get(); + elementsTapEnv* taproot = simplicity_elements_mallocTapEnv(&simplicityRawTap); + simplicity_elements_execSimplicity(&error, imr, tx, nIn, taproot, GENESIS_HASH.data(), 0, budget, amr, prog_bytes.data(), prog_bytes.size(), wit_bytes.data(), wit_bytes.size()); // 5. Secondary test -- try flipping a bunch of bits and check that this doesn't mess things up for (size_t j = 0; j < 8 * prog_bytes.size(); j++) { if (j > 32 && j % 23 != 0) continue; // skip most bits so this test doesn't overwhelm the fuzz time prog_bytes.data()[j / 8] ^= (1 << (j % 8)); - simplicity_elements_execSimplicity(&error, imr, tx, nIn, taproot, GENESIS_HASH.data(), budget, amr, prog_bytes.data(), prog_bytes.size(), wit_bytes.data(), wit_bytes.size()); + simplicity_elements_execSimplicity(&error, imr, tx, nIn, taproot, GENESIS_HASH.data(), 0, budget, amr, prog_bytes.data(), prog_bytes.size(), wit_bytes.data(), wit_bytes.size()); } // 6. Cleanup diff --git a/src/test/fuzz/simplicity_compute_amr.c b/src/test/fuzz/simplicity_compute_amr.c index dfa0450e17..3e8d9f9381 100644 --- a/src/test/fuzz/simplicity_compute_amr.c +++ b/src/test/fuzz/simplicity_compute_amr.c @@ -2,7 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include +#include #include #include // simplicity_decodeMallocDag #include // DAG_LEN_MAX @@ -10,11 +10,12 @@ #include // simplicity_mallocTypeInference #include #include +#include // Copy of computeCmr used for AMR -bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr - , const unsigned char* program, size_t program_len - , const unsigned char* witness, size_t witness_len) { +bool simplicity_elements_computeAmr( simplicity_err* error, unsigned char* amr + , const unsigned char* program, size_t program_len + , const unsigned char* witness, size_t witness_len) { simplicity_assert(NULL != error); simplicity_assert(NULL != amr); simplicity_assert(NULL != program || 0 == program_len); @@ -23,7 +24,7 @@ bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr bitstream stream = initializeBitstream(program, program_len); dag_node* dag = NULL; combinator_counters census; - int_fast32_t dag_len = simplicity_decodeMallocDag(&dag, &census, &stream); + int_fast32_t dag_len = simplicity_decodeMallocDag(&dag, simplicity_elements_decodeJet, &census, &stream); if (dag_len <= 0) { simplicity_assert(dag_len < 0); *error = (simplicity_err)dag_len; @@ -34,7 +35,7 @@ bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr type* type_dag = NULL; if (IS_OK(*error)) { - *error = simplicity_mallocTypeInference(&type_dag, dag, (uint_fast32_t)dag_len, &census); + *error = simplicity_mallocTypeInference(&type_dag, simplicity_elements_mallocBoundVars, dag, (uint_fast32_t)dag_len, &census); } bitstream witness_stream; if (IS_OK(*error)) { diff --git a/src/test/fuzz/simplicity_tx.cpp b/src/test/fuzz/simplicity_tx.cpp index a5bf99552b..f5b8b4aa84 100644 --- a/src/test/fuzz/simplicity_tx.cpp +++ b/src/test/fuzz/simplicity_tx.cpp @@ -7,7 +7,7 @@ #include