From 7f3036bf33a225bfd07040136adb1fa925408213 Mon Sep 17 00:00:00 2001 From: AlexandreBelling Date: Thu, 27 Jun 2024 20:49:54 +0200 Subject: [PATCH] make exp_mod work with parametric fields --- std/evmprecompiles/05-expmod.go | 5 ++--- std/math/emulated/emparams/emparams.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/std/evmprecompiles/05-expmod.go b/std/evmprecompiles/05-expmod.go index 442ba88095..f1fa11357f 100644 --- a/std/evmprecompiles/05-expmod.go +++ b/std/evmprecompiles/05-expmod.go @@ -5,7 +5,6 @@ import ( "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/std/math/emulated" - "github.com/consensys/gnark/std/math/emulated/emparams" ) // Expmod implements [MODEXP] precompile contract at address 0x05. @@ -15,10 +14,10 @@ import ( // the actual length of the inputs. // // [MODEXP]: https://ethereum.github.io/execution-specs/autoapi/ethereum/paris/vm/precompiled_contracts/expmod/index.html -func Expmod(api frontend.API, base, exp, modulus *emulated.Element[emparams.Mod1e4096]) *emulated.Element[emparams.Mod1e4096] { +func Expmod[P emulated.FieldParams](api frontend.API, base, exp, modulus *emulated.Element[P]) *emulated.Element[P] { // x^0 = 1 // x mod 0 = 0 - f, err := emulated.NewField[emparams.Mod1e4096](api) + f, err := emulated.NewField[P](api) if err != nil { panic(fmt.Sprintf("new field: %v", err)) } diff --git a/std/math/emulated/emparams/emparams.go b/std/math/emulated/emparams/emparams.go index bbee1afabf..22e7872203 100644 --- a/std/math/emulated/emparams/emparams.go +++ b/std/math/emulated/emparams/emparams.go @@ -319,3 +319,22 @@ func (Mod1e512) Modulus() *big.Int { val, _ := new(big.Int).SetString("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16) return val } + +// Mod1e256 provides type parametrization for emulated aritmetic: +// - limbs: 4 +// - limb width: 64 bits +// +// The modulus for type parametrisation is 2^256-1. +// +// This is non-prime modulus. It is mainly targeted for using variable-modulus +// operations (ModAdd, ModMul, ModExp, ModAssertIsEqual) for variable modulus +// arithmetic. +type Mod1e256 struct{} + +func (Mod1e256) NbLimbs() uint { return 4 } +func (Mod1e256) BitsPerLimb() uint { return 64 } +func (Mod1e256) IsPrime() bool { return false } +func (Mod1e256) Modulus() *big.Int { + val, _ := new(big.Int).SetString("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16) + return val +}