diff --git a/.gitmodules b/.gitmodules index 5478a8f64a..4c3e8da3d8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -231,3 +231,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/execution_chain/evm/precompiles.nim b/execution_chain/evm/precompiles.nim index 6c7f1df90d..56f2b48bd6 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, @@ -134,8 +135,8 @@ func getPoint[T: G1|G2](_: typedesc[T], data: openArray[byte]): EvmResult[Point[ return err(prcErr(PrcInvalidPoint)) ok(ap.toJacobian()) -func getFR(data: openArray[byte]): EvmResult[FR] = - var res: FR +func getFR(data: openArray[byte]): EvmResult[fp.FR] = + var res: fp.FR if not res.fromBytes2(data): return err(prcErr(PrcInvalidPoint)) ok(res) @@ -312,19 +313,16 @@ 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() - c.output.setLen(64) - if isSome(apo): - # we can discard here because we supply proper buffer - discard apo.get().toBytes(c.output) + + let status = eth_evm_bn254_g1add(c.output, c.msg.data.toOpenArray(0, len)) + + if status == CttEVMStatus.cttEVM_PointNotOnCurve: + return err(EvmErrorObj(code: PrcInvalidPoint)) + elif status != CttEVMStatus.cttEVM_Success: + return err(EvmErrorObj(code: PrcInvalidParam)) ok() @@ -337,15 +335,14 @@ func bn256ecMul(c: Computation, fork: EVMFork = FkByzantium): EvmResultVoid = # 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() - c.output.setLen(64) - if isSome(apo): - # we can discard here because we supply buffer of proper size - discard apo.get().toBytes(c.output) + + let status = eth_evm_bn254_g1mul(c.output, c.msg.data.toOpenArray(0, len)) + + if status == CttEVMStatus.cttEVM_PointNotOnCurve: + return err(EvmErrorObj(code: PrcInvalidPoint)) + elif status != CttEVMStatus.cttEVM_Success: + return err(EvmErrorObj(code: PrcInvalidParam)) ok() diff --git a/nimbus.nimble b/nimbus.nimble index 8306149a9b..1d9fdfe68a 100644 --- a/nimbus.nimble +++ b/nimbus.nimble @@ -19,6 +19,7 @@ skipDirs = @["tests", "examples"] requires "nim >= 1.6.0", "bncurve", "chronicles", + "constantine", "chronos", "eth", "json_rpc", diff --git a/vendor/constantine b/vendor/constantine new file mode 160000 index 0000000000..782d838e7a --- /dev/null +++ b/vendor/constantine @@ -0,0 +1 @@ +Subproject commit 782d838e7a073262750eff593af6dfff3ff832dd