Skip to content

Commit 0a0a69f

Browse files
Update Simplicity integeration
This Simplicity update has - renamed a few types - moved some files around - added a minCost parameter, currently set to 0 - added a new error code
1 parent f41af64 commit 0a0a69f

File tree

9 files changed

+44
-38
lines changed

9 files changed

+44
-38
lines changed

build_msvc/libelementssimplicity/libelementssimplicity.vcxproj

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
</PropertyGroup>
1010
<ItemGroup>
1111
<ClCompile Include="..\..\src\simplicity\bitstream.c" />
12-
<ClCompile Include="..\..\src\simplicity\cmr.c" />
1312
<ClCompile Include="..\..\src\simplicity\dag.c" />
1413
<ClCompile Include="..\..\src\simplicity\deserialize.c" />
1514
<ClCompile Include="..\..\src\simplicity\eval.c" />
@@ -20,11 +19,13 @@
2019
<ClCompile Include="..\..\src\simplicity\sha256.c" />
2120
<ClCompile Include="..\..\src\simplicity\type.c" />
2221
<ClCompile Include="..\..\src\simplicity\typeInference.c" />
23-
<ClCompile Include="..\..\src\simplicity\primitive\elements\env.c" />
24-
<ClCompile Include="..\..\src\simplicity\primitive\elements\exec.c" />
25-
<ClCompile Include="..\..\src\simplicity\primitive\elements\elementsJets.c" />
26-
<ClCompile Include="..\..\src\simplicity\primitive\elements\ops.c" />
27-
<ClCompile Include="..\..\src\simplicity\primitive\elements\primitive.c" />
22+
<ClCompile Include="..\..\src\simplicity\elements\cmr.c" />
23+
<ClCompile Include="..\..\src\simplicity\elements\env.c" />
24+
<ClCompile Include="..\..\src\simplicity\elements\exec.c" />
25+
<ClCompile Include="..\..\src\simplicity\elements\elementsJets.c" />
26+
<ClCompile Include="..\..\src\simplicity\elements\ops.c" />
27+
<ClCompile Include="..\..\src\simplicity\elements\primitive.c" />
28+
<ClCompile Include="..\..\src\simplicity\elements\txEnv.c" />
2829
</ItemGroup>
2930
<ItemDefinitionGroup>
3031
<ClCompile>

src/script/interpreter.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2601,8 +2601,8 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent
26012601
m_spent_output_spk_single_hashes = GetSpentScriptPubKeysSHA256(m_spent_outputs);
26022602
m_output_spk_single_hashes = GetOutputScriptPubKeysSHA256(txTo);
26032603

2604-
std::vector<rawBuffer> simplicityRawAnnex(txTo.witness.vtxinwit.size());
2605-
std::vector<rawInput> simplicityRawInput(txTo.vin.size());
2604+
std::vector<rawElementsBuffer> simplicityRawAnnex(txTo.witness.vtxinwit.size());
2605+
std::vector<rawElementsInput> simplicityRawInput(txTo.vin.size());
26062606
for (size_t i = 0; i < txTo.vin.size(); ++i) {
26072607
simplicityRawInput[i].prevTxid = txTo.vin[i].prevout.hash.begin();
26082608
simplicityRawInput[i].prevIx = txTo.vin[i].prevout.n;
@@ -2639,7 +2639,7 @@ void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent
26392639
}
26402640
}
26412641

2642-
std::vector<rawOutput> simplicityRawOutput(txTo.vout.size());
2642+
std::vector<rawElementsOutput> simplicityRawOutput(txTo.vout.size());
26432643
for (size_t i = 0; i < txTo.vout.size(); ++i) {
26442644
simplicityRawOutput[i].asset = txTo.vout[i].nAsset.vchCommitment.empty() ? NULL : txTo.vout[i].nAsset.vchCommitment.data();
26452645
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<CTxOut>&& spent
26592659
}
26602660
}
26612661

2662-
rawTransaction simplicityRawTx;
2662+
rawElementsTransaction simplicityRawTx;
26632663
uint256 rawHash = txTo.GetHash();
26642664
simplicityRawTx.txid = rawHash.begin();
26652665
simplicityRawTx.input = simplicityRawInput.data();
@@ -3114,14 +3114,14 @@ uint32_t GenericTransactionSignatureChecker<T>::GetnIn() const
31143114
}
31153115

31163116
template <class T>
3117-
bool GenericTransactionSignatureChecker<T>::CheckSimplicity(const valtype& program, const valtype& witness, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const
3117+
bool GenericTransactionSignatureChecker<T>::CheckSimplicity(const valtype& program, const valtype& witness, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const
31183118
{
31193119
simplicity_err error;
3120-
tapEnv* simplicityTapEnv = simplicity_elements_mallocTapEnv(&simplicityRawTap);
3120+
elementsTapEnv* simplicityTapEnv = simplicity_elements_mallocTapEnv(&simplicityRawTap);
31213121

31223122
assert(txdata->m_simplicity_tx_data);
31233123
assert(simplicityTapEnv);
3124-
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())) {
3124+
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())) {
31253125
assert(!"simplicity_elements_execSimplicity internal error");
31263126
}
31273127
simplicity_elements_freeTapEnv(simplicityTapEnv);
@@ -3154,6 +3154,7 @@ bool GenericTransactionSignatureChecker<T>::CheckSimplicity(const valtype& progr
31543154
case SIMPLICITY_ERR_ANTIDOS: return set_error(serror, SCRIPT_ERR_SIMPLICITY_ANTIDOS);
31553155
case SIMPLICITY_ERR_HIDDEN_ROOT: return set_error(serror, SCRIPT_ERR_SIMPLICITY_HIDDEN_ROOT);
31563156
case SIMPLICITY_ERR_AMR: return set_error(serror, SCRIPT_ERR_SIMPLICITY_AMR);
3157+
case SIMPLICITY_ERR_OVERWEIGHT: return set_error(serror, SCRIPT_ERR_SIMPLICITY_OVERWEIGHT);
31573158
default: return set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
31583159
}
31593160
}
@@ -3312,7 +3313,7 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion,
33123313
const valtype& simplicity_program = SpanPopBack(stack);
33133314
const valtype& simplicity_witness = SpanPopBack(stack);
33143315
const int64_t budget = ::GetSerializeSize(witness.stack, PROTOCOL_VERSION) + VALIDATION_WEIGHT_OFFSET;
3315-
rawTapEnv simplicityRawTap;
3316+
rawElementsTapEnv simplicityRawTap;
33163317
simplicityRawTap.controlBlock = control.data();
33173318
simplicityRawTap.pathLen = (control.size() - TAPROOT_CONTROL_BASE_SIZE) / TAPROOT_CONTROL_NODE_SIZE;
33183319
simplicityRawTap.scriptCMR = script_bytes.data();

src/script/interpreter.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,12 @@ bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned i
171171

172172
struct SimplicityTransactionDeleter
173173
{
174-
void operator()(transaction* ptr)
174+
void operator()(elementsTransaction* ptr)
175175
{
176176
simplicity_elements_freeTransaction(ptr);
177177
}
178178
};
179-
using SimplicityTransactionUniquePtr = std::unique_ptr<transaction, SimplicityTransactionDeleter>;
179+
using SimplicityTransactionUniquePtr = std::unique_ptr<elementsTransaction, SimplicityTransactionDeleter>;
180180

181181
struct PrecomputedTransactionData
182182
{
@@ -345,7 +345,7 @@ class BaseSignatureChecker
345345
return std::numeric_limits<uint32_t>::max();
346346
}
347347

348-
virtual bool CheckSimplicity(const std::vector<unsigned char>& witness, const std::vector<unsigned char>& program, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const
348+
virtual bool CheckSimplicity(const std::vector<unsigned char>& witness, const std::vector<unsigned char>& program, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const
349349
{
350350
return false;
351351
}
@@ -393,7 +393,7 @@ class GenericTransactionSignatureChecker : public BaseSignatureChecker
393393

394394
const PrecomputedTransactionData* GetPrecomputedTransactionData() const override;
395395
uint32_t GetnIn() const override;
396-
bool CheckSimplicity(const std::vector<unsigned char>& program, const std::vector<unsigned char>& witness, const rawTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const override;
396+
bool CheckSimplicity(const std::vector<unsigned char>& program, const std::vector<unsigned char>& witness, const rawElementsTapEnv& simplicityRawTap, int64_t budget, ScriptError* serror) const override;
397397
};
398398

399399
using TransactionSignatureChecker = GenericTransactionSignatureChecker<CTransaction>;

src/script/script_error.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ std::string ScriptErrorString(const ScriptError serror)
180180
return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_HIDDEN_ROOT);
181181
case SCRIPT_ERR_SIMPLICITY_AMR:
182182
return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_AMR);
183+
case SCRIPT_ERR_SIMPLICITY_OVERWEIGHT:
184+
return SIMPLICITY_ERR_MSG(SIMPLICITY_ERR_OVERWEIGHT);
183185
case SCRIPT_ERR_UNKNOWN_ERROR:
184186
case SCRIPT_ERR_ERROR_COUNT:
185187
default: break;

src/script/script_error.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ typedef enum ScriptError_t
122122
SCRIPT_ERR_SIMPLICITY_ANTIDOS,
123123
SCRIPT_ERR_SIMPLICITY_HIDDEN_ROOT,
124124
SCRIPT_ERR_SIMPLICITY_AMR,
125+
SCRIPT_ERR_SIMPLICITY_OVERWEIGHT,
125126

126127
/* Must go last */
127128
SCRIPT_ERR_ERROR_COUNT

src/test/fuzz/simplicity.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <cstdio>
66
#include <primitives/transaction.h>
77
extern "C" {
8-
#include <simplicity/cmr.h>
8+
#include <simplicity/elements/cmr.h>
99
#include <simplicity/elements/env.h>
1010
#include <simplicity/elements/exec.h>
1111
}
@@ -31,9 +31,9 @@ static std::vector<unsigned char> TAPROOT_ANNEX(99, 0x50);
3131

3232
// Defined in simplicity_compute_amr.c
3333
extern "C" {
34-
bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr
35-
, const unsigned char* program, size_t program_len
36-
, const unsigned char* witness, size_t witness_len);
34+
bool simplicity_elements_computeAmr( simplicity_err* error, unsigned char* amr
35+
, const unsigned char* program, size_t program_len
36+
, const unsigned char* witness, size_t witness_len);
3737
}
3838

3939
void initialize_simplicity()
@@ -149,8 +149,8 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity)
149149
simplicity_err error;
150150
unsigned char cmr[32];
151151
unsigned char amr[32];
152-
assert(simplicity_computeAmr(&error, amr, prog_data, prog_data_len, wit_data, wit_data_len));
153-
assert(simplicity_computeCmr(&error, cmr, prog_data, prog_data_len));
152+
assert(simplicity_elements_computeAmr(&error, amr, prog_data, prog_data_len, wit_data, wit_data_len));
153+
assert(simplicity_elements_computeCmr(&error, cmr, prog_data, prog_data_len));
154154

155155
// The remainder is just copy/pasted from the original fuzztest
156156

@@ -196,7 +196,7 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity)
196196
}
197197

198198
// 5. Set up Simplicity environment and tx environment
199-
rawTapEnv simplicityRawTap;
199+
rawElementsTapEnv simplicityRawTap;
200200
simplicityRawTap.controlBlock = TAPROOT_CONTROL.data();
201201
simplicityRawTap.pathLen = (TAPROOT_CONTROL.size() - TAPROOT_CONTROL_BASE_SIZE) / TAPROOT_CONTROL_NODE_SIZE;
202202
simplicityRawTap.scriptCMR = cmr;
@@ -210,15 +210,15 @@ FUZZ_TARGET_INIT(simplicity, initialize_simplicity)
210210
unsigned char imr_out[32];
211211
unsigned char *imr = mtx.vin[0].prevout.hash.data()[2] & 2 ? imr_out : NULL;
212212

213-
const transaction* tx = txdata.m_simplicity_tx_data.get();
214-
tapEnv* taproot = simplicity_elements_mallocTapEnv(&simplicityRawTap);
215-
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());
213+
const elementsTransaction* tx = txdata.m_simplicity_tx_data.get();
214+
elementsTapEnv* taproot = simplicity_elements_mallocTapEnv(&simplicityRawTap);
215+
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());
216216

217217
// 5. Secondary test -- try flipping a bunch of bits and check that this doesn't mess things up
218218
for (size_t j = 0; j < 8 * prog_bytes.size(); j++) {
219219
if (j > 32 && j % 23 != 0) continue; // skip most bits so this test doesn't overwhelm the fuzz time
220220
prog_bytes.data()[j / 8] ^= (1 << (j % 8));
221-
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());
221+
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());
222222
}
223223

224224
// 6. Cleanup

src/test/fuzz/simplicity_compute_amr.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22
// Distributed under the MIT software license, see the accompanying
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5-
#include <simplicity/cmr.h>
5+
#include <simplicity/elements/cmr.h>
66
#include <simplicity/dag.h>
77
#include <simplicity/deserialize.h> // simplicity_decodeMallocDag
88
#include <simplicity/limitations.h> // DAG_LEN_MAX
99
#include <simplicity/simplicity_alloc.h> // simplicity_free
1010
#include <simplicity/typeInference.h> // simplicity_mallocTypeInference
1111
#include <simplicity/elements/env.h>
1212
#include <simplicity/elements/exec.h>
13+
#include <simplicity/elements/primitive.h>
1314

1415
// Copy of computeCmr used for AMR
15-
bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr
16-
, const unsigned char* program, size_t program_len
17-
, const unsigned char* witness, size_t witness_len) {
16+
bool simplicity_elements_computeAmr( simplicity_err* error, unsigned char* amr
17+
, const unsigned char* program, size_t program_len
18+
, const unsigned char* witness, size_t witness_len) {
1819
simplicity_assert(NULL != error);
1920
simplicity_assert(NULL != amr);
2021
simplicity_assert(NULL != program || 0 == program_len);
@@ -23,7 +24,7 @@ bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr
2324
bitstream stream = initializeBitstream(program, program_len);
2425
dag_node* dag = NULL;
2526
combinator_counters census;
26-
int_fast32_t dag_len = simplicity_decodeMallocDag(&dag, &census, &stream);
27+
int_fast32_t dag_len = simplicity_decodeMallocDag(&dag, simplicity_elements_decodeJet, &census, &stream);
2728
if (dag_len <= 0) {
2829
simplicity_assert(dag_len < 0);
2930
*error = (simplicity_err)dag_len;
@@ -34,7 +35,7 @@ bool simplicity_computeAmr( simplicity_err* error, unsigned char* amr
3435

3536
type* type_dag = NULL;
3637
if (IS_OK(*error)) {
37-
*error = simplicity_mallocTypeInference(&type_dag, dag, (uint_fast32_t)dag_len, &census);
38+
*error = simplicity_mallocTypeInference(&type_dag, simplicity_elements_mallocBoundVars, dag, (uint_fast32_t)dag_len, &census);
3839
}
3940
bitstream witness_stream;
4041
if (IS_OK(*error)) {

src/test/fuzz/simplicity_tx.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <script/sigcache.h>
88
#include <validation.h>
99
extern "C" {
10-
#include <simplicity/cmr.h>
10+
#include <simplicity/elements/cmr.h>
1111
#include <simplicity/elements/env.h>
1212
#include <simplicity/elements/exec.h>
1313
}
@@ -151,7 +151,7 @@ FUZZ_TARGET_INIT(simplicity_tx, initialize_simplicity_tx)
151151
// valid transactions will work with this code).
152152
// Compute CMR and do some sanity checks on it (and the program)
153153
std::vector<unsigned char> cmr(32, 0);
154-
assert(simplicity_computeCmr(&error, cmr.data(), program.data(), program.size()));
154+
assert(simplicity_elements_computeCmr(&error, cmr.data(), program.data(), program.size()));
155155
if (error == SIMPLICITY_NO_ERROR) {
156156
if (memcmp(last_cmr, cmr.data(), sizeof(last_cmr)) == 0) {
157157
// If we have already seen this CMR this transaction, try mangling

test/sanitizer_suppressions/ubsan

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,4 @@ unsigned-integer-overflow:simplicity/secp256k1/group_impl.h
9999
# This one involves careful roconnor code
100100
shift-base:simplicity/frame.c
101101
# See comment in simplicity/primitive/elements/env.c line 303
102-
unsigned-integer-overflow:simplicity/primitive/elements/env.c
102+
unsigned-integer-overflow:simplicity/elements/env.c

0 commit comments

Comments
 (0)