From 40acc92b56ac126c80297b0b0e9375fdfdd68258 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 26 Aug 2025 15:28:09 +0530 Subject: [PATCH 01/19] add constantine --- .gitmodules | 3 +++ vendor/constantine | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/constantine diff --git a/.gitmodules b/.gitmodules index 289491594b..6ee0551bce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -226,3 +226,6 @@ path = vendor/nim-minilru url = https://github.com/status-im/nim-minilru.git branch = master +[submodule "vendor/constantine"] + path = vendor/constantine + url = https://github.com/mratsim/constantine diff --git a/vendor/constantine b/vendor/constantine new file mode 160000 index 0000000000..dc77132d4f --- /dev/null +++ b/vendor/constantine @@ -0,0 +1 @@ +Subproject commit dc77132d4fb2cc7b92142b5dedd7b972362db40c From 91643641ef9e1c663e513a35e3d11b32a5665a1d Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 26 Aug 2025 16:28:34 +0530 Subject: [PATCH 02/19] ecRecover shift to constantine --- execution_chain/evm/precompiles.nim | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 98ef8e6678..803faa4b9b 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -11,6 +11,7 @@ import std/[macros], results, + constantine/ethereum_evm_precompiles, "."/[types, blake2b_f, blscurve], ./interpreter/[gas_meter, gas_costs, utils/utils_numeric], eth/common/keys, @@ -217,13 +218,14 @@ func ecRecover(c: Computation): EvmResultVoid = GasECRecover, reason="ECRecover Precompile") - let - sig = ? c.getSignature() - pubkey = recover(sig.sig, SkMessage(sig.msgHash)).valueOr: - return err(prcErr(PrcInvalidSig)) + var pubkey: array[32, byte] + let res = pubkey.eth_evm_ecrecover(c.msg.data) + + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(32) - assign(c.output.toOpenArray(12, 31), pubkey.toCanonicalAddress().data) + assign(c.output, pubkey) ok() func sha256(c: Computation): EvmResultVoid = From 714333fc25de2fd50b5d59e22addd4b5e7f85790 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Wed, 27 Aug 2025 18:03:42 +0530 Subject: [PATCH 03/19] add ecAdd --- execution_chain/evm/precompiles.nim | 28 +++++++++++----------------- tests/config.nims | 4 ++-- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 803faa4b9b..a4bce99458 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -218,14 +218,13 @@ func ecRecover(c: Computation): EvmResultVoid = GasECRecover, reason="ECRecover Precompile") - var pubkey: array[32, byte] - let res = pubkey.eth_evm_ecrecover(c.msg.data) - - if res != cttEVM_Success: - return err(prcErr(PrcInvalidParam)) + let + sig = ? c.getSignature() + pubkey = recover(sig.sig, SkMessage(sig.msgHash)).valueOr: + return err(prcErr(PrcInvalidSig)) c.output.setLen(32) - assign(c.output, pubkey) + assign(c.output.toOpenArray(12, 31), pubkey.toCanonicalAddress().data) ok() func sha256(c: Computation): EvmResultVoid = @@ -386,19 +385,14 @@ func bn256ecAdd(c: Computation, fork: EVMFork = FkByzantium): EvmResultVoid = let gasFee = if fork < FkIstanbul: GasECAdd else: GasECAddIstanbul ? c.gasMeter.consumeGas(gasFee, reason = "ecAdd Precompile") - var - input: array[128, byte] - # Padding data - let len = min(c.msg.data.len, 128) - 1 - input[0..len] = c.msg.data[0..len] - var p1 = ? G1.getPoint(input.toOpenArray(0, 63)) - var p2 = ? G1.getPoint(input.toOpenArray(64, 127)) - var apo = (p1 + p2).toAffine() + var output: array[64, byte] + let res = output.eth_evm_bn254_g1add(c.msg.data) + + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(64) - if isSome(apo): - # we can discard here because we supply proper buffer - discard apo.get().toBytes(c.output) + assign(c.output, output) ok() diff --git a/tests/config.nims b/tests/config.nims index c681bd9a3f..1a2df96873 100644 --- a/tests/config.nims +++ b/tests/config.nims @@ -13,8 +13,8 @@ if not defined(windows): # available on some GCC versions but not all - run with `-d:limitStackUsage` # and look for .su files in "./build/", "./nimcache/" or $TMPDIR that list the # stack size of each function. - switch("passC", "-fstack-usage -Werror=stack-usage=1048576") - switch("passL", "-fstack-usage -Werror=stack-usage=1048576") + switch("passC", "-fstack-usage -Wstack-usage=1048576") + switch("passL", "-fstack-usage -Wstack-usage=1048576") switch("define", "chronicles_line_numbers") switch("define", "chronicles_sinks=textlines") From 76e11d70d39238f6cdac389867abea93e8af9d9d Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Wed, 27 Aug 2025 18:21:32 +0530 Subject: [PATCH 04/19] add ecMul --- execution_chain/evm/precompiles.nim | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index a4bce99458..4c6f37cf5d 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -400,20 +400,14 @@ func bn256ecMul(c: Computation, fork: EVMFork = FkByzantium): EvmResultVoid = let gasFee = if fork < FkIstanbul: GasECMul else: GasECMulIstanbul ? c.gasMeter.consumeGas(gasFee, reason="ecMul Precompile") - var - input: array[96, byte] + var output: array[64, byte] + let res = output.eth_evm_bn254_g1mul(c.msg.data) - # Padding data - let len = min(c.msg.data.len, 96) - 1 - assign(input.toOpenArray(0, len), c.msg.data.toOpenArray(0, len)) - var p1 = ? G1.getPoint(input.toOpenArray(0, 63)) - var fr = ? getFR(input.toOpenArray(64, 95)) - var apo = (p1 * fr).toAffine() + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(64) - if isSome(apo): - # we can discard here because we supply buffer of proper size - discard apo.get().toBytes(c.output) + assign(c.output, output) ok() From b398cf9fcc3da49344496a52696f8fe8a9d10cd5 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Thu, 28 Aug 2025 04:33:18 +0530 Subject: [PATCH 05/19] add ripemd160 --- execution_chain/evm/precompiles.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 4c6f37cf5d..e9185049ea 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -243,7 +243,10 @@ func ripemd160(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(gasFee, reason="RIPEMD160 Precompile") c.output.setLen(32) - assign(c.output.toOpenArray(12, 31), ripemd.ripemd160.digest(c.msg.data).data) + let res =c.output.eth_evm_ripemd160(c.msg.data) + + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) ok() func identity(c: Computation): EvmResultVoid = From 2a3b64a08b7522391fab0ca6be70c49a97b06f2c Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Thu, 28 Aug 2025 17:49:41 +0530 Subject: [PATCH 06/19] add sha256 --- execution_chain/evm/precompiles.nim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index e9185049ea..f5fa752608 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -233,7 +233,11 @@ func sha256(c: Computation): EvmResultVoid = gasFee = GasSHA256 + wordCount.GasInt * GasSHA256Word ? c.gasMeter.consumeGas(gasFee, reason="SHA256 Precompile") - assign(c.output, sha2.sha256.digest(c.msg.data).data) + c.output.setLen(32) + let res = c.output.eth_evm_sha256(c.msg.data) + + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) ok() func ripemd160(c: Computation): EvmResultVoid = From ca5d607272f2c6cb405f009d7462a2dbfe052f09 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Thu, 28 Aug 2025 19:21:53 +0530 Subject: [PATCH 07/19] add blsG1Add --- execution_chain/evm/precompiles.nim | 15 ++++++--------- tests/fixtures/PrecompileTests/blsG1Add.json | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index f5fa752608..62b6051551 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -481,18 +481,15 @@ func blsG1Add(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(Bls12381G1AddGas, reason="blsG1Add Precompile") - var a, b: BLS_G1 - if not a.decodePoint(input.toOpenArray(0, 127)): - return err(prcErr(PrcInvalidPoint)) - - if not b.decodePoint(input.toOpenArray(128, 255)): - return err(prcErr(PrcInvalidPoint)) + var output: array[128, byte] + let res = output.eth_evm_bls12381_g1add(c.msg.data) - a.add b + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(128) - if not encodePoint(a, c.output): - return err(prcErr(PrcInvalidPoint)) + assign(c.output, output) + ok() const diff --git a/tests/fixtures/PrecompileTests/blsG1Add.json b/tests/fixtures/PrecompileTests/blsG1Add.json index 13cac17c25..e0c55d0155 100644 --- a/tests/fixtures/PrecompileTests/blsG1Add.json +++ b/tests/fixtures/PrecompileTests/blsG1Add.json @@ -19,7 +19,7 @@ "Name": "bls_g1add_large_input" }, { - "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000108b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "Input": "1000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21", "ExpectedError": "invalid field element top bytes", "Name": "bls_g1add_violate_top_bytes" }, From a123bbe9e85f80d1d791c90c1dd025658f3361fc Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Mon, 1 Sep 2025 15:28:48 +0530 Subject: [PATCH 08/19] restore test vectors --- tests/fixtures/PrecompileTests/blsG1Add.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/PrecompileTests/blsG1Add.json b/tests/fixtures/PrecompileTests/blsG1Add.json index e0c55d0155..13cac17c25 100644 --- a/tests/fixtures/PrecompileTests/blsG1Add.json +++ b/tests/fixtures/PrecompileTests/blsG1Add.json @@ -19,7 +19,7 @@ "Name": "bls_g1add_large_input" }, { - "Input": "1000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21", + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000108b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", "ExpectedError": "invalid field element top bytes", "Name": "bls_g1add_violate_top_bytes" }, From 3ecf377d0c659880c5ec37a813fb131a47668684 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 2 Sep 2025 13:45:17 +0530 Subject: [PATCH 09/19] update constantine --- vendor/constantine | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/constantine b/vendor/constantine index dc77132d4f..498504a1df 160000 --- a/vendor/constantine +++ b/vendor/constantine @@ -1 +1 @@ -Subproject commit dc77132d4fb2cc7b92142b5dedd7b972362db40c +Subproject commit 498504a1dff407eaa863c30fd198ee445f361520 From 037b0fdfe3ab150f049ebb20e59dd88250673881 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 2 Sep 2025 14:29:00 +0530 Subject: [PATCH 10/19] add bls12381 g1msm --- execution_chain/evm/precompiles.nim | 34 +++++++---------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 62b6051551..87958c2147 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -8,6 +8,8 @@ # at your option. This file may not be copied, modified, or distributed except # according to those terms. +{.localPassC: "-fno-lto".} + import std/[macros], results, @@ -553,35 +555,15 @@ func blsG1MultiExp(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(gas, reason="blsG1MultiExp Precompile") - var - p: BLS_G1 - s: BLS_SCALAR - acc: BLS_G1 - - # Decode point scalar pairs - for i in 0.. Date: Tue, 2 Sep 2025 14:41:24 +0530 Subject: [PATCH 11/19] bls12381 g2add --- execution_chain/evm/precompiles.nim | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 87958c2147..a830f7a4f7 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -575,18 +575,15 @@ func blsG2Add(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(Bls12381G2AddGas, reason="blsG2Add Precompile") - var a, b: BLS_G2 - if not a.decodePoint(input.toOpenArray(0, 255)): - return err(prcErr(PrcInvalidPoint)) - - if not b.decodePoint(input.toOpenArray(256, 511)): - return err(prcErr(PrcInvalidPoint)) + var output: array[256, byte] + let res = output.eth_evm_bls12381_g2add(c.msg.data) - a.add b + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(256) - if not encodePoint(a, c.output): - return err(prcErr(PrcInvalidPoint)) + assign(c.output, output) + ok() func blsG2MultiExp(c: Computation): EvmResultVoid = From f973b85b35efd1becbe96a02a0bb4881e9f2ab67 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 2 Sep 2025 15:15:45 +0530 Subject: [PATCH 12/19] bls12381 g2msm --- execution_chain/evm/precompiles.nim | 32 ++++++----------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index a830f7a4f7..6aec65a287 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -600,35 +600,15 @@ func blsG2MultiExp(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(gas, reason="blsG2MultiExp Precompile") - var - p: BLS_G2 - s: BLS_SCALAR - acc: BLS_G2 - - # Decode point scalar pairs - for i in 0.. Date: Tue, 2 Sep 2025 15:16:32 +0530 Subject: [PATCH 13/19] remove file level lto --- execution_chain/evm/precompiles.nim | 2 -- 1 file changed, 2 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 6aec65a287..678ed7c3b2 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -8,8 +8,6 @@ # at your option. This file may not be copied, modified, or distributed except # according to those terms. -{.localPassC: "-fno-lto".} - import std/[macros], results, From 5c7fa341a9b4b37bd751c2fa78adbc6a1479b320 Mon Sep 17 00:00:00 2001 From: Advaita Saha Date: Tue, 2 Sep 2025 17:48:49 +0530 Subject: [PATCH 14/19] remove pairing check --- execution_chain/evm/precompiles.nim | 37 +++++------------------------ 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 678ed7c3b2..54203e9a10 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -623,40 +623,15 @@ func blsPairing(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(gas, reason="blsG2Pairing Precompile") - var - g1: BLS_G1P - g2: BLS_G2P - acc: BLS_ACC + var output: array[32, byte] + let res = output.eth_evm_bls12381_pairingcheck(input) - # Decode pairs - for i in 0.. Date: Wed, 3 Sep 2025 10:35:23 +0530 Subject: [PATCH 15/19] add bls --- execution_chain/evm/precompiles.nim | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 54203e9a10..232e660582 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -643,15 +643,15 @@ func blsMapG1(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(Bls12381MapG1Gas, reason="blsMapG1 Precompile") - var fe: BLS_FE - if not fe.decodeFE(input): - return err(prcErr(PrcInvalidPoint)) + var output: array[128, byte] + let res = output.eth_evm_bls12381_map_fp_to_g1(input) - let p = fe.mapFPToG1() + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(128) - if not encodePoint(p, c.output): - return err(prcErr(PrcInvalidPoint)) + assign(c.output, output) + ok() func blsMapG2(c: Computation): EvmResultVoid = @@ -663,15 +663,15 @@ func blsMapG2(c: Computation): EvmResultVoid = ? c.gasMeter.consumeGas(Bls12381MapG2Gas, reason="blsMapG2 Precompile") - var fe: BLS_FE2 - if not fe.decodeFE(input): - return err(prcErr(PrcInvalidPoint)) + var output: array[256, byte] + let res = output.eth_evm_bls12381_map_fp2_to_g2(input) - let p = fe.mapFPToG2() + if res != cttEVM_Success: + return err(prcErr(PrcInvalidParam)) c.output.setLen(256) - if not encodePoint(p, c.output): - return err(prcErr(PrcInvalidPoint)) + assign(c.output, output) + ok() proc pointEvaluation(c: Computation): EvmResultVoid = From 515fa012d6a6658ec51ee7d09c43f6ef91c43d38 Mon Sep 17 00:00:00 2001 From: advaita-saha Date: Sat, 6 Sep 2025 22:20:36 +0530 Subject: [PATCH 16/19] disable lto and update constantine --- config.nims | 24 ++++++++++++++++++++++++ tests/config.nims | 4 ++-- vendor/constantine | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/config.nims b/config.nims index 60e7f2cf3a..c11e7122ed 100644 --- a/config.nims +++ b/config.nims @@ -171,6 +171,9 @@ switch("warning", "Deprecated:off") # disable nim-kzg's blst switch("define", "kzgExternalBlst") +# Constantine missing operand zero assumed error suppression +switch("warning", "User:off") + # We lock down rocksdb to a particular version # TODO self-build rocksdb dll on windows when not defined(use_system_rocksdb) and not defined(windows): @@ -200,6 +203,27 @@ put("secp256k1.always", "-fno-lto -fomit-frame-pointer") # Unfortunately this is filename based instead of path-based # Assumes GCC +# Constantine +put("limbs_asm_bigint_arm64.always", "-fno-lto") +put("limbs_asm_bigint_x86.always", "-fno-lto") +put("limbs_asm_crandall_x86.always", "-fno-lto") +put("limbs_asm_crandall_x86_adx_bmi2.always", "-fno-lto") +put("limbs_asm_modular_arm64.always", "-fno-lto") +put("limbs_asm_modular_dbl_prec_x86.always", "-fno-lto") +put("limbs_asm_modular_x86.always", "-fno-lto") +put("limbs_asm_mul_arm64.always", "-fno-lto") +put("limbs_asm_mul_mont_arm64.always", "-fno-lto") +put("limbs_asm_mul_mont_x86.always", "-fno-lto") +put("limbs_asm_mul_mont_x86_adx_bmi2.always", "-fno-lto") +put("limbs_asm_mul_x86.always", "-fno-lto") +put("limbs_asm_mul_x86_adx_bmi2.always", "-fno-lto") +put("limbs_asm_redc_mont_arm64.always", "-fno-lto") +put("limbs_asm_redc_mont_x86.always", "-fno-lto") +put("limbs_asm_redc_mont_x86_adx_bmi2.always", "-fno-lto") + +put("bls12_381_pairings.always", "-fno-lto") +put("ec_multi_scalar_mul_scheduler.always", "-fno-lto") + # BLST put("server.always", "-fno-lto") put("assembly.always", "-fno-lto") diff --git a/tests/config.nims b/tests/config.nims index 1a2df96873..c681bd9a3f 100644 --- a/tests/config.nims +++ b/tests/config.nims @@ -13,8 +13,8 @@ if not defined(windows): # available on some GCC versions but not all - run with `-d:limitStackUsage` # and look for .su files in "./build/", "./nimcache/" or $TMPDIR that list the # stack size of each function. - switch("passC", "-fstack-usage -Wstack-usage=1048576") - switch("passL", "-fstack-usage -Wstack-usage=1048576") + switch("passC", "-fstack-usage -Werror=stack-usage=1048576") + switch("passL", "-fstack-usage -Werror=stack-usage=1048576") switch("define", "chronicles_line_numbers") switch("define", "chronicles_sinks=textlines") diff --git a/vendor/constantine b/vendor/constantine index 498504a1df..b3f4ebd56f 160000 --- a/vendor/constantine +++ b/vendor/constantine @@ -1 +1 @@ -Subproject commit 498504a1dff407eaa863c30fd198ee445f361520 +Subproject commit b3f4ebd56fc77f781cdd5d341737b88ad120c178 From 3048b46b25e90f2e3acb7703f08c3a6c4ab3dc8b Mon Sep 17 00:00:00 2001 From: advaita-saha Date: Mon, 8 Sep 2025 19:28:21 +0530 Subject: [PATCH 17/19] add bn254 ec pairing check --- execution_chain/evm/precompiles.nim | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 0b899f522f..0fefbe285d 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -430,29 +430,11 @@ func bn256ecPairing(c: Computation, fork: EVMFork = FkByzantium): EvmResultVoid GasECPairingBaseIstanbul + numPoints * GasECPairingPerPointIstanbul ? c.gasMeter.consumeGas(gasFee, reason="ecPairing Precompile") - if msglen == 0: - # we can discard here because we supply buffer of proper size - c.output.setLen(32) - discard BNU256.one().toBytesBE(c.output) - else: - # Calculate number of pairing pairs - let count = msglen div 192 - # Pairing accumulator - var acc = FQ12.one() - - for i in 0.. Date: Wed, 10 Sep 2025 13:41:37 +0530 Subject: [PATCH 18/19] remove ec pairing --- execution_chain/evm/precompiles.nim | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 0fefbe285d..b764655184 100644 --- a/execution_chain/evm/precompiles.nim +++ b/execution_chain/evm/precompiles.nim @@ -430,12 +430,30 @@ func bn256ecPairing(c: Computation, fork: EVMFork = FkByzantium): EvmResultVoid GasECPairingBaseIstanbul + numPoints * GasECPairingPerPointIstanbul ? c.gasMeter.consumeGas(gasFee, reason="ecPairing Precompile") - c.output.setLen(32) - let res = c.output.eth_evm_bn254_ecpairingcheck(c.msg.data) - - if res != cttEVM_Success: - return err(prcErr(PrcInvalidParam)) + if msglen == 0: + # we can discard here because we supply buffer of proper size + c.output.setLen(32) + discard BNU256.one().toBytesBE(c.output) + else: + # Calculate number of pairing pairs + let count = msglen div 192 + # Pairing accumulator + var acc = FQ12.one() + + for i in 0.. Date: Thu, 11 Sep 2025 16:47:45 +0530 Subject: [PATCH 19/19] enable -fomit-frame-pointer for windows --- config.nims | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.nims b/config.nims index c11e7122ed..53d0711957 100644 --- a/config.nims +++ b/config.nims @@ -57,6 +57,9 @@ if defined(release) and not defined(disableLTO): switch("passC", "-fvisibility=hidden") if defined(windows): + # Constantine + switch("passC", "-fomit-frame-pointer") + switch("passL", "-fomit-frame-pointer") # disable timestamps in Windows PE headers - https://wiki.debian.org/ReproducibleBuilds/TimestampsInPEBinaries switch("passL", "-Wl,--no-insert-timestamp") # increase stack size, unless something else is setting the stack size