From 932aa2b48f611f7ea958c980be487869238f8424 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 00:19:12 -0700 Subject: [PATCH 01/20] add eip-x --- EIPS/eip-x.md | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 EIPS/eip-x.md diff --git a/EIPS/eip-x.md b/EIPS/eip-x.md new file mode 100644 index 0000000000000..aca702fc23443 --- /dev/null +++ b/EIPS/eip-x.md @@ -0,0 +1,213 @@ +--- +eip: ? +title: EVM Modular Arithmetic Extensions +status: Draft +type: standards track +author: Jared Wasinger <@jwasinger>, Alex Beregszaszi (@axic) +discussions-to: +category: Core +created: 2023-03-15 +requires: EOF +--- + +## Abstract +This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. + +## Motivation + +Current opcodes for modular arithmetic only support values up to 256 bits wide. In addition, they are permissive and accept any representable value for the inputs. + +Many cryptographic operations are heavily-bottlenecked by modular arithmetic over prime fields. To expand the range of primitives that can be implemented efficiently in the EVM, we propose new modular arithmetic opcodes designed for this case: + +* They specify inputs/outputs as opcode immediate data containing offsets that point to values in a memory space. This avoids stack overhead and enables expanded-width operations beyond 256 bits. +* They perform operations on values located within a call-frame-scoped memory space separate from EVM memory, and only accessible via new load/store opcodes. This allows to internally express values in an optimized representation while keeping the details opaque to the EVM. + +## Specification + +### Conventions + +The use of "assert" implies that if the assertion fails, the call frame will consume all gas and terminate execution in an exceptional state. + +### Constants + +| Name | Value | Description | +| ---- | ---- | ---- | +| `MAX_FIELD_ALLOC_MEM` | ? | The maximum size of memory in bytes allocated by field contexts for the current call frame. TBD, see the relevant section under security considerations. | +| `MAX_BIT_WIDTH` | 768 bits | maximum modulus width that can be used | + +### Overview + +The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. + +An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. + +New arithmetic opcodes perform modular addition, subtraction and multiplication with inputs/outputs from the value space of the active field context. + +New load/store opcodes copy values to and from EVM memory and the value space of the active field context. + +Note: None of the new opcodes return stack items. + +### New Opcodes + +`SETMODX(0xc0)` +**Input**: ` id modulus_offset modulus_size alloc_count`. +**Output**: none + +##### Execution + +Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. + +Otherwise: + +* Assert `modulus_size < MAX_BIT_WIDTH // 8`. +* Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. +* Load the byte range interpreting it as a big endian `modulus`. +* Assert `modulus` is odd. +* Assert `modulus > 1`. +* Assert that the most significant byte of the modulus is non-zero. +* Assert `0 < alloc_count <= 256`. +* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). +* Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. +* Allocate the new field context with zeroed value space in the current call scope. Associate it with `id` in the mapping. +* The new field context is set as active. + +#### Arithmetic Opcodes + +Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediate interpreted as 3 values `out`, `x`, `y`. These are indices which correspond to individual values from the space of the active field context (0 corresponds to the first value in the space, 1 to the second, etc.). + +Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. + +Then, compute the given operation with inputs from slot `x`/`y`: +* `ADDMODX`: `value_space[x] + value_space[y] % modulus` +* `SUBMODX`: `value_space[x] - value_space[y] % modulus` +* `MULMODX`: `value_space[x] * value_space[y] % modulus` + +Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. + +Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): +``` +# element_size64bit \in [1, 12] + +def gas_mulmodx(element_size64bit: int) -> int: + coef_a = 2.3 + coef_b = -2 + coef_c = 32 + return math.ceil(coef_a * element_size64bit ** 2 + \ + coef_b * element_size64bit + coef_c) + +def gas_addmodx(element_size64bit: int) -> int: + coef_a = 0.1111 + coef_b = 1.111 + return math.ceil(coef_a * element_size64bit + coef_b) + +def gas_setmod(element_size64bit: int) -> int: + coef_a = 110 + coef_b = 730 + return math.ceil(coef_a * element_size64bit + coef_b) +``` +`SUBMODX` uses the same cost model as `ADDMODX`. + +##### Cost table: +| Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | +| ---- | ---- | ---- | ---- | +|1 - 64 bits|2|2|32| +|65 - 128 bits|2|2|36| +|129 - 192 bits|2|2|40| +|193 - 256 bits|3|2|44| +|257 - 320 bits|3|2|48| +|321 - 384 bits|4|2|52| +|385 - 448 bits|5|2|56| +|449 - 512 bits|7|2|60| +|513 - 576 bits|8|3|64| +|577 - 640 bits|9|3|68| +|641 - 704 bits|11|3|72| +|705 - 768 bits|13|3|76| + +--- + +#### Data Transfer + +`LOADX(0xc1)` +**Stack in**: `(top of stack) dest source count` +**Stack out**: none +**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. + +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert that the range `[source, source + count]` falls within the active field context value space. +* Assert that the destination of the copy falls entirely within EVM memory. +* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. + +`STOREX(0xc2)` +**Stack in**: `dest source count` +**Stack out**: none +**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert `dest + count` is less than or equal to the active context's value space size. +* Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. + +#### EVM Memory Expansion Cost Modification + +When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. + +### Rationale + +By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: +* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. +* Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. + +#### EOF Dependency + +EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. + +#### Montgomery Modular Multiplication + +For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater than `M`, chosen as a power of two for efficient performance), the Montgomery representation is `A * R % M`. + +Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. + +##### Conversion of Canonical to Montgomery Representation +`mulmont(canon_val, R**2 % M, M) = mont_val` +##### Conversion from Montgomery to Canonical representation +`mulmont(mont_val, 1, M) = canon_val` + +Note that normal modular addition and subtraction algorithms work for Montgomery form values. + +#### Gas Model Justification with Benchmarks + +Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. + +For each arithmetic operation and `value_size` combination, two benchmarks were measured: +* arithmetic-only benchmarks +* standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space + +In the graphs below, benchmark execution time is expressed in gas via scaling by the target gas rate. + +##### `ADDMODX`/`SUBMODX`/`MULMODX` + +The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. + +###### `ADDMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) +###### `SUBMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) +###### `MULMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) +--- + +##### `SETMODX` + +`SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. + +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) + +--- + +### Security Considerations + +#### Memory Attacks via forcing cache-misses + +An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. + +To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. From a67fe2c90546ea7fe613b7e878f08871ac214b1c Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 00:25:24 -0700 Subject: [PATCH 02/20] try to fix github markdown formatting error --- EIPS/eip-8743.md | 216 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 EIPS/eip-8743.md diff --git a/EIPS/eip-8743.md b/EIPS/eip-8743.md new file mode 100644 index 0000000000000..2bcaaeafbcdb1 --- /dev/null +++ b/EIPS/eip-8743.md @@ -0,0 +1,216 @@ +--- +eip: ? +title: EVM Modular Arithmetic Extensions +status: Draft +type: standards track +author: Jared Wasinger <@jwasinger>, Alex Beregszaszi (@axic) +discussions-to: +category: Core +created: 2023-03-15 +requires: EOF +--- + +## Abstract +This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. + +## Motivation + +Current opcodes for modular arithmetic only support values up to 256 bits wide. In addition, they are permissive and accept any representable value for the inputs. + +Many cryptographic operations are heavily-bottlenecked by modular arithmetic over prime fields. To expand the range of primitives that can be implemented efficiently in the EVM, we propose new modular arithmetic opcodes designed for this case: + +* They specify inputs/outputs as opcode immediate data containing offsets that point to values in a memory space. This avoids stack overhead and enables expanded-width operations beyond 256 bits. +* They perform operations on values located within a call-frame-scoped memory space separate from EVM memory, and only accessible via new load/store opcodes. This allows to internally express values in an optimized representation while keeping the details opaque to the EVM. + +## Specification + +### Conventions + +The use of "assert" implies that if the assertion fails, the call frame will consume all gas and terminate execution in an exceptional state. + +### Constants + +| Name | Value | Description | +| ---- | ---- | ---- | +| `MAX_FIELD_ALLOC_MEM` | ? | The maximum size of memory in bytes allocated by field contexts for the current call frame. TBD, see the relevant section under security considerations. | +| `MAX_BIT_WIDTH` | 768 bits | maximum modulus width that can be used | + +### Overview + +The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. + +An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. + +New arithmetic opcodes perform modular addition, subtraction and multiplication with inputs/outputs from the value space of the active field context. + +New load/store opcodes copy values to and from EVM memory and the value space of the active field context. + +Note: None of the new opcodes return stack items. + +### New Opcodes + +`SETMODX(0xc0)` +**Input**: ` id modulus_offset modulus_size alloc_count`. +**Output**: none + +##### Execution + +Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. + +Otherwise: + +* Assert `modulus_size < MAX_BIT_WIDTH // 8`. +* Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. +* Load the byte range interpreting it as a big endian `modulus`. +* Assert `modulus` is odd. +* Assert `modulus > 1`. +* Assert that the most significant byte of the modulus is non-zero. +* Assert `0 < alloc_count <= 256`. +* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). +* Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. +* Allocate the new field context with zeroed value space in the current call scope. Associate it with `id` in the mapping. +* The new field context is set as active. + +#### Arithmetic Opcodes + +Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediate interpreted as 3 values `out`, `x`, `y`. These are indices which correspond to individual values from the space of the active field context (0 corresponds to the first value in the space, 1 to the second, etc.). + +Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. + +Then, compute the given operation with inputs from slot `x`/`y`: +* `ADDMODX`: `value_space[x] + value_space[y] % modulus` +* `SUBMODX`: `value_space[x] - value_space[y] % modulus` +* `MULMODX`: `value_space[x] * value_space[y] % modulus` + +Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. + +Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): +``` +# element_size64bit \in [1, 12] + +def gas_mulmodx(element_size64bit: int) -> int: + coef_a = 2.3 + coef_b = -2 + coef_c = 32 + return math.ceil(coef_a * element_size64bit ** 2 + \ + coef_b * element_size64bit + coef_c) + +def gas_addmodx(element_size64bit: int) -> int: + coef_a = 0.1111 + coef_b = 1.111 + return math.ceil(coef_a * element_size64bit + coef_b) + +def gas_setmod(element_size64bit: int) -> int: + coef_a = 110 + coef_b = 730 + return math.ceil(coef_a * element_size64bit + coef_b) +``` +`SUBMODX` uses the same cost model as `ADDMODX`. + +##### Cost table: +| Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | +| ---- | ---- | ---- | ---- | +|1 - 64 bits|2|2|32| +|65 - 128 bits|2|2|36| +|129 - 192 bits|2|2|40| +|193 - 256 bits|3|2|44| +|257 - 320 bits|3|2|48| +|321 - 384 bits|4|2|52| +|385 - 448 bits|5|2|56| +|449 - 512 bits|7|2|60| +|513 - 576 bits|8|3|64| +|577 - 640 bits|9|3|68| +|641 - 704 bits|11|3|72| +|705 - 768 bits|13|3|76| + +--- + +#### Data Transfer + +`LOADX(0xc1)` + +**Stack in**: `(top of stack) dest source count` + +**Stack out**: none + +**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. + +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert that the range `[source, source + count]` falls within the active field context value space. +* Assert that the destination of the copy falls entirely within EVM memory. +* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. + +`STOREX(0xc2)` +**Stack in**: `dest source count` +**Stack out**: none +**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert `dest + count` is less than or equal to the active context's value space size. +* Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. + +#### EVM Memory Expansion Cost Modification + +When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. + +### Rationale + +By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: +* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. +* Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. + +#### EOF Dependency + +EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. + +#### Montgomery Modular Multiplication + +For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater than `M`, chosen as a power of two for efficient performance), the Montgomery representation is `A * R % M`. + +Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. + +##### Conversion of Canonical to Montgomery Representation +`mulmont(canon_val, R**2 % M, M) = mont_val` +##### Conversion from Montgomery to Canonical representation +`mulmont(mont_val, 1, M) = canon_val` + +Note that normal modular addition and subtraction algorithms work for Montgomery form values. + +#### Gas Model Justification with Benchmarks + +Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. + +For each arithmetic operation and `value_size` combination, two benchmarks were measured: +* arithmetic-only benchmarks +* standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space + +In the graphs below, benchmark execution time is expressed in gas via scaling by the target gas rate. + +##### `ADDMODX`/`SUBMODX`/`MULMODX` + +The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. + +###### `ADDMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) +###### `SUBMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) +###### `MULMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) +--- + +##### `SETMODX` + +`SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. + +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) + +--- + +### Security Considerations + +#### Memory Attacks via forcing cache-misses + +An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. + +To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. From 79f897089455a36db85e73a5afa73fb9f9da8f22 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 00:27:57 -0700 Subject: [PATCH 03/20] fix another markdown formatting error --- EIPS/eip-8743.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/EIPS/eip-8743.md b/EIPS/eip-8743.md index 2bcaaeafbcdb1..7e974cb62682c 100644 --- a/EIPS/eip-8743.md +++ b/EIPS/eip-8743.md @@ -142,9 +142,13 @@ def gas_setmod(element_size64bit: int) -> int: * Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. `STOREX(0xc2)` + **Stack in**: `dest source count` + **Stack out**: none + **Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. + ##### Execution * Assert that a field context is set as active in the current call frame. * Assert `dest + count` is less than or equal to the active context's value space size. From c02c5ec9c09648f061df10dccaa34815a5e849b4 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 01:34:29 -0700 Subject: [PATCH 04/20] update --- EIPS/eip-8743.md | 8 ++ EIPS/eip-x.md | 213 ----------------------------------------------- 2 files changed, 8 insertions(+), 213 deletions(-) delete mode 100644 EIPS/eip-x.md diff --git a/EIPS/eip-8743.md b/EIPS/eip-8743.md index 7e974cb62682c..98a59dac11edc 100644 --- a/EIPS/eip-8743.md +++ b/EIPS/eip-8743.md @@ -218,3 +218,11 @@ The implementations of the arithmetic are constant time. Modular addition/subtr An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. + +### Reference Implementation + +Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). + +### Test Cases + +TODO diff --git a/EIPS/eip-x.md b/EIPS/eip-x.md deleted file mode 100644 index aca702fc23443..0000000000000 --- a/EIPS/eip-x.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -eip: ? -title: EVM Modular Arithmetic Extensions -status: Draft -type: standards track -author: Jared Wasinger <@jwasinger>, Alex Beregszaszi (@axic) -discussions-to: -category: Core -created: 2023-03-15 -requires: EOF ---- - -## Abstract -This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. - -## Motivation - -Current opcodes for modular arithmetic only support values up to 256 bits wide. In addition, they are permissive and accept any representable value for the inputs. - -Many cryptographic operations are heavily-bottlenecked by modular arithmetic over prime fields. To expand the range of primitives that can be implemented efficiently in the EVM, we propose new modular arithmetic opcodes designed for this case: - -* They specify inputs/outputs as opcode immediate data containing offsets that point to values in a memory space. This avoids stack overhead and enables expanded-width operations beyond 256 bits. -* They perform operations on values located within a call-frame-scoped memory space separate from EVM memory, and only accessible via new load/store opcodes. This allows to internally express values in an optimized representation while keeping the details opaque to the EVM. - -## Specification - -### Conventions - -The use of "assert" implies that if the assertion fails, the call frame will consume all gas and terminate execution in an exceptional state. - -### Constants - -| Name | Value | Description | -| ---- | ---- | ---- | -| `MAX_FIELD_ALLOC_MEM` | ? | The maximum size of memory in bytes allocated by field contexts for the current call frame. TBD, see the relevant section under security considerations. | -| `MAX_BIT_WIDTH` | 768 bits | maximum modulus width that can be used | - -### Overview - -The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. - -An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. - -New arithmetic opcodes perform modular addition, subtraction and multiplication with inputs/outputs from the value space of the active field context. - -New load/store opcodes copy values to and from EVM memory and the value space of the active field context. - -Note: None of the new opcodes return stack items. - -### New Opcodes - -`SETMODX(0xc0)` -**Input**: ` id modulus_offset modulus_size alloc_count`. -**Output**: none - -##### Execution - -Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. - -Otherwise: - -* Assert `modulus_size < MAX_BIT_WIDTH // 8`. -* Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. -* Load the byte range interpreting it as a big endian `modulus`. -* Assert `modulus` is odd. -* Assert `modulus > 1`. -* Assert that the most significant byte of the modulus is non-zero. -* Assert `0 < alloc_count <= 256`. -* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). -* Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. -* Allocate the new field context with zeroed value space in the current call scope. Associate it with `id` in the mapping. -* The new field context is set as active. - -#### Arithmetic Opcodes - -Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediate interpreted as 3 values `out`, `x`, `y`. These are indices which correspond to individual values from the space of the active field context (0 corresponds to the first value in the space, 1 to the second, etc.). - -Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. - -Then, compute the given operation with inputs from slot `x`/`y`: -* `ADDMODX`: `value_space[x] + value_space[y] % modulus` -* `SUBMODX`: `value_space[x] - value_space[y] % modulus` -* `MULMODX`: `value_space[x] * value_space[y] % modulus` - -Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. - -Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): -``` -# element_size64bit \in [1, 12] - -def gas_mulmodx(element_size64bit: int) -> int: - coef_a = 2.3 - coef_b = -2 - coef_c = 32 - return math.ceil(coef_a * element_size64bit ** 2 + \ - coef_b * element_size64bit + coef_c) - -def gas_addmodx(element_size64bit: int) -> int: - coef_a = 0.1111 - coef_b = 1.111 - return math.ceil(coef_a * element_size64bit + coef_b) - -def gas_setmod(element_size64bit: int) -> int: - coef_a = 110 - coef_b = 730 - return math.ceil(coef_a * element_size64bit + coef_b) -``` -`SUBMODX` uses the same cost model as `ADDMODX`. - -##### Cost table: -| Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | -| ---- | ---- | ---- | ---- | -|1 - 64 bits|2|2|32| -|65 - 128 bits|2|2|36| -|129 - 192 bits|2|2|40| -|193 - 256 bits|3|2|44| -|257 - 320 bits|3|2|48| -|321 - 384 bits|4|2|52| -|385 - 448 bits|5|2|56| -|449 - 512 bits|7|2|60| -|513 - 576 bits|8|3|64| -|577 - 640 bits|9|3|68| -|641 - 704 bits|11|3|72| -|705 - 768 bits|13|3|76| - ---- - -#### Data Transfer - -`LOADX(0xc1)` -**Stack in**: `(top of stack) dest source count` -**Stack out**: none -**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. - -##### Execution -* Assert that a field context is set as active in the current call frame. -* Assert that the range `[source, source + count]` falls within the active field context value space. -* Assert that the destination of the copy falls entirely within EVM memory. -* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. - -`STOREX(0xc2)` -**Stack in**: `dest source count` -**Stack out**: none -**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. -##### Execution -* Assert that a field context is set as active in the current call frame. -* Assert `dest + count` is less than or equal to the active context's value space size. -* Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. - -#### EVM Memory Expansion Cost Modification - -When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. - -### Rationale - -By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: -* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. -* Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. - -#### EOF Dependency - -EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. - -#### Montgomery Modular Multiplication - -For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater than `M`, chosen as a power of two for efficient performance), the Montgomery representation is `A * R % M`. - -Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. - -##### Conversion of Canonical to Montgomery Representation -`mulmont(canon_val, R**2 % M, M) = mont_val` -##### Conversion from Montgomery to Canonical representation -`mulmont(mont_val, 1, M) = canon_val` - -Note that normal modular addition and subtraction algorithms work for Montgomery form values. - -#### Gas Model Justification with Benchmarks - -Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. - -For each arithmetic operation and `value_size` combination, two benchmarks were measured: -* arithmetic-only benchmarks -* standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space - -In the graphs below, benchmark execution time is expressed in gas via scaling by the target gas rate. - -##### `ADDMODX`/`SUBMODX`/`MULMODX` - -The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. - -###### `ADDMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) -###### `SUBMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) -###### `MULMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) ---- - -##### `SETMODX` - -`SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. - -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) - ---- - -### Security Considerations - -#### Memory Attacks via forcing cache-misses - -An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. - -To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. From 18e8c7e7f7d87120d012ff1322a81e20ccf2a615 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 01:38:06 -0700 Subject: [PATCH 05/20] fix formatting --- EIPS/eip-8743.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EIPS/eip-8743.md b/EIPS/eip-8743.md index 98a59dac11edc..e75a05862bcf9 100644 --- a/EIPS/eip-8743.md +++ b/EIPS/eip-8743.md @@ -50,7 +50,9 @@ Note: None of the new opcodes return stack items. ### New Opcodes `SETMODX(0xc0)` + **Input**: ` id modulus_offset modulus_size alloc_count`. + **Output**: none ##### Execution From 178d6cc45199ee40541a81a3c8491f7c7c6fe205 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 01:49:29 -0700 Subject: [PATCH 06/20] small fixes --- EIPS/eip-8743.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/EIPS/eip-8743.md b/EIPS/eip-8743.md index e75a05862bcf9..5e360988c1c06 100644 --- a/EIPS/eip-8743.md +++ b/EIPS/eip-8743.md @@ -1,5 +1,5 @@ --- -eip: ? +eip: 8743 title: EVM Modular Arithmetic Extensions status: Draft type: standards track @@ -45,8 +45,6 @@ New arithmetic opcodes perform modular addition, subtraction and multiplication New load/store opcodes copy values to and from EVM memory and the value space of the active field context. -Note: None of the new opcodes return stack items. - ### New Opcodes `SETMODX(0xc0)` @@ -61,7 +59,7 @@ Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Otherwise: -* Assert `modulus_size < MAX_BIT_WIDTH // 8`. +* Assert `modulus_size <= MAX_BIT_WIDTH // 8`. * Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. * Load the byte range interpreting it as a big endian `modulus`. * Assert `modulus` is odd. @@ -70,7 +68,7 @@ Otherwise: * Assert `0 < alloc_count <= 256`. * Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). * Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. -* Allocate the new field context with zeroed value space in the current call scope. Associate it with `id` in the mapping. +* Allocate the new field context with zeroed value space containing `alloc_count` number of values. Associate it with `id` in the mapping. * The new field context is set as active. #### Arithmetic Opcodes From ae07e124b65fda49319983900cc1a7ca0517e4ce Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 21:03:54 -0700 Subject: [PATCH 07/20] rename to eip-7743. address other review. --- EIPS/{eip-8743.md => eip-7743.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename EIPS/{eip-8743.md => eip-7743.md} (99%) diff --git a/EIPS/eip-8743.md b/EIPS/eip-7743.md similarity index 99% rename from EIPS/eip-8743.md rename to EIPS/eip-7743.md index 5e360988c1c06..c83308658aa5e 100644 --- a/EIPS/eip-8743.md +++ b/EIPS/eip-7743.md @@ -1,12 +1,12 @@ --- -eip: 8743 +eip: 7743 title: EVM Modular Arithmetic Extensions status: Draft -type: standards track +type: Standards track author: Jared Wasinger <@jwasinger>, Alex Beregszaszi (@axic) discussions-to: category: Core -created: 2023-03-15 +created: 2024-07-20 requires: EOF --- From 24876557a71f3ee2b32d0ad9d7626716172d711c Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 21:10:54 -0700 Subject: [PATCH 08/20] rename to 7747 --- EIPS/eip-7743.md | 228 ----------------------------------------------- 1 file changed, 228 deletions(-) delete mode 100644 EIPS/eip-7743.md diff --git a/EIPS/eip-7743.md b/EIPS/eip-7743.md deleted file mode 100644 index c83308658aa5e..0000000000000 --- a/EIPS/eip-7743.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -eip: 7743 -title: EVM Modular Arithmetic Extensions -status: Draft -type: Standards track -author: Jared Wasinger <@jwasinger>, Alex Beregszaszi (@axic) -discussions-to: -category: Core -created: 2024-07-20 -requires: EOF ---- - -## Abstract -This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. - -## Motivation - -Current opcodes for modular arithmetic only support values up to 256 bits wide. In addition, they are permissive and accept any representable value for the inputs. - -Many cryptographic operations are heavily-bottlenecked by modular arithmetic over prime fields. To expand the range of primitives that can be implemented efficiently in the EVM, we propose new modular arithmetic opcodes designed for this case: - -* They specify inputs/outputs as opcode immediate data containing offsets that point to values in a memory space. This avoids stack overhead and enables expanded-width operations beyond 256 bits. -* They perform operations on values located within a call-frame-scoped memory space separate from EVM memory, and only accessible via new load/store opcodes. This allows to internally express values in an optimized representation while keeping the details opaque to the EVM. - -## Specification - -### Conventions - -The use of "assert" implies that if the assertion fails, the call frame will consume all gas and terminate execution in an exceptional state. - -### Constants - -| Name | Value | Description | -| ---- | ---- | ---- | -| `MAX_FIELD_ALLOC_MEM` | ? | The maximum size of memory in bytes allocated by field contexts for the current call frame. TBD, see the relevant section under security considerations. | -| `MAX_BIT_WIDTH` | 768 bits | maximum modulus width that can be used | - -### Overview - -The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. - -An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. - -New arithmetic opcodes perform modular addition, subtraction and multiplication with inputs/outputs from the value space of the active field context. - -New load/store opcodes copy values to and from EVM memory and the value space of the active field context. - -### New Opcodes - -`SETMODX(0xc0)` - -**Input**: ` id modulus_offset modulus_size alloc_count`. - -**Output**: none - -##### Execution - -Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. - -Otherwise: - -* Assert `modulus_size <= MAX_BIT_WIDTH // 8`. -* Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. -* Load the byte range interpreting it as a big endian `modulus`. -* Assert `modulus` is odd. -* Assert `modulus > 1`. -* Assert that the most significant byte of the modulus is non-zero. -* Assert `0 < alloc_count <= 256`. -* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). -* Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. -* Allocate the new field context with zeroed value space containing `alloc_count` number of values. Associate it with `id` in the mapping. -* The new field context is set as active. - -#### Arithmetic Opcodes - -Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediate interpreted as 3 values `out`, `x`, `y`. These are indices which correspond to individual values from the space of the active field context (0 corresponds to the first value in the space, 1 to the second, etc.). - -Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. - -Then, compute the given operation with inputs from slot `x`/`y`: -* `ADDMODX`: `value_space[x] + value_space[y] % modulus` -* `SUBMODX`: `value_space[x] - value_space[y] % modulus` -* `MULMODX`: `value_space[x] * value_space[y] % modulus` - -Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. - -Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): -``` -# element_size64bit \in [1, 12] - -def gas_mulmodx(element_size64bit: int) -> int: - coef_a = 2.3 - coef_b = -2 - coef_c = 32 - return math.ceil(coef_a * element_size64bit ** 2 + \ - coef_b * element_size64bit + coef_c) - -def gas_addmodx(element_size64bit: int) -> int: - coef_a = 0.1111 - coef_b = 1.111 - return math.ceil(coef_a * element_size64bit + coef_b) - -def gas_setmod(element_size64bit: int) -> int: - coef_a = 110 - coef_b = 730 - return math.ceil(coef_a * element_size64bit + coef_b) -``` -`SUBMODX` uses the same cost model as `ADDMODX`. - -##### Cost table: -| Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | -| ---- | ---- | ---- | ---- | -|1 - 64 bits|2|2|32| -|65 - 128 bits|2|2|36| -|129 - 192 bits|2|2|40| -|193 - 256 bits|3|2|44| -|257 - 320 bits|3|2|48| -|321 - 384 bits|4|2|52| -|385 - 448 bits|5|2|56| -|449 - 512 bits|7|2|60| -|513 - 576 bits|8|3|64| -|577 - 640 bits|9|3|68| -|641 - 704 bits|11|3|72| -|705 - 768 bits|13|3|76| - ---- - -#### Data Transfer - -`LOADX(0xc1)` - -**Stack in**: `(top of stack) dest source count` - -**Stack out**: none - -**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. - -##### Execution -* Assert that a field context is set as active in the current call frame. -* Assert that the range `[source, source + count]` falls within the active field context value space. -* Assert that the destination of the copy falls entirely within EVM memory. -* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. - -`STOREX(0xc2)` - -**Stack in**: `dest source count` - -**Stack out**: none - -**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. - -##### Execution -* Assert that a field context is set as active in the current call frame. -* Assert `dest + count` is less than or equal to the active context's value space size. -* Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. - -#### EVM Memory Expansion Cost Modification - -When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. - -### Rationale - -By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: -* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. -* Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. - -#### EOF Dependency - -EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. - -#### Montgomery Modular Multiplication - -For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater than `M`, chosen as a power of two for efficient performance), the Montgomery representation is `A * R % M`. - -Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. - -##### Conversion of Canonical to Montgomery Representation -`mulmont(canon_val, R**2 % M, M) = mont_val` -##### Conversion from Montgomery to Canonical representation -`mulmont(mont_val, 1, M) = canon_val` - -Note that normal modular addition and subtraction algorithms work for Montgomery form values. - -#### Gas Model Justification with Benchmarks - -Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. - -For each arithmetic operation and `value_size` combination, two benchmarks were measured: -* arithmetic-only benchmarks -* standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space - -In the graphs below, benchmark execution time is expressed in gas via scaling by the target gas rate. - -##### `ADDMODX`/`SUBMODX`/`MULMODX` - -The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. - -###### `ADDMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) -###### `SUBMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) -###### `MULMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) ---- - -##### `SETMODX` - -`SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. - -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) - ---- - -### Security Considerations - -#### Memory Attacks via forcing cache-misses - -An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. - -To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. - -### Reference Implementation - -Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). - -### Test Cases - -TODO From 09461ed745ed7c3e906eaacdb341fe25a4367895 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 21:16:09 -0700 Subject: [PATCH 09/20] add back eip --- EIPS/eip-7747.md | 228 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 EIPS/eip-7747.md diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md new file mode 100644 index 0000000000000..42eb23b396ba5 --- /dev/null +++ b/EIPS/eip-7747.md @@ -0,0 +1,228 @@ +--- +eip: 7747 +title: EVM Modular Arithmetic Extensions +status: Draft +type: Standards track +author: Jared Wasinger (@jwasinger), Alex Beregszaszi (@axic) +discussions-to: https://ethereum-magicians.org/t/eip-7747-evm-modular-arithmetic-extensions/20608 +category: Core +created: 2024-07-20 +requires: EOF +--- + +## Abstract +This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. + +## Motivation + +Current opcodes for modular arithmetic only support values up to 256 bits wide. In addition, they are permissive and accept any representable value for the inputs. + +Many cryptographic operations are heavily-bottlenecked by modular arithmetic over prime fields. To expand the range of primitives that can be implemented efficiently in the EVM, we propose new modular arithmetic opcodes designed for this case: + +* They specify inputs/outputs as opcode immediate data containing offsets that point to values in a memory space. This avoids stack overhead and enables expanded-width operations beyond 256 bits. +* They perform operations on values located within a call-frame-scoped memory space separate from EVM memory, and only accessible via new load/store opcodes. This allows to internally express values in an optimized representation while keeping the details opaque to the EVM. + +## Specification + +### Conventions + +The use of "assert" implies that if the assertion fails, the call frame will consume all gas and terminate execution in an exceptional state. + +### Constants + +| Name | Value | Description | +| ---- | ---- | ---- | +| `MAX_FIELD_ALLOC_MEM` | ? | The maximum size of memory in bytes allocated by field contexts for the current call frame. TBD, see the relevant section under security considerations. | +| `MAX_BIT_WIDTH` | 768 bits | maximum modulus width that can be used | + +### Overview + +The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. + +An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. + +New arithmetic opcodes perform modular addition, subtraction and multiplication with inputs/outputs from the value space of the active field context. + +New load/store opcodes copy values to and from EVM memory and the value space of the active field context. + +### New Opcodes + +`SETMODX(0xc0)` + +**Input**: ` id modulus_offset modulus_size alloc_count`. + +**Output**: none + +##### Execution + +Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. + +Otherwise: + +* Assert `modulus_size <= MAX_BIT_WIDTH // 8`. +* Assert that the byte range`[modulus_offset, modulus_offset+modulus_size]` falls within EVM memory. +* Load the byte range interpreting it as a big endian `modulus`. +* Assert `modulus` is odd. +* Assert `modulus > 1`. +* Assert that the most significant byte of the modulus is non-zero. +* Assert `0 < alloc_count <= 256`. +* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). +* Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. +* Allocate the new field context with zeroed value space containing `alloc_count` number of values. Associate it with `id` in the mapping. +* The new field context is set as active. + +#### Arithmetic Opcodes + +Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediate interpreted as 3 values `out`, `x`, `y`. These are indices which correspond to individual values from the space of the active field context (0 corresponds to the first value in the space, 1 to the second, etc.). + +Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. + +Then, compute the given operation with inputs from slot `x`/`y`: +* `ADDMODX`: `value_space[x] + value_space[y] % modulus` +* `SUBMODX`: `value_space[x] - value_space[y] % modulus` +* `MULMODX`: `value_space[x] * value_space[y] % modulus` + +Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. + +Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): +``` +# element_size64bit \in [1, 12] + +def gas_mulmodx(element_size64bit: int) -> int: + coef_a = 2.3 + coef_b = -2 + coef_c = 32 + return math.ceil(coef_a * element_size64bit ** 2 + \ + coef_b * element_size64bit + coef_c) + +def gas_addmodx(element_size64bit: int) -> int: + coef_a = 0.1111 + coef_b = 1.111 + return math.ceil(coef_a * element_size64bit + coef_b) + +def gas_setmod(element_size64bit: int) -> int: + coef_a = 110 + coef_b = 730 + return math.ceil(coef_a * element_size64bit + coef_b) +``` +`SUBMODX` uses the same cost model as `ADDMODX`. + +##### Cost table: +| Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | +| ---- | ---- | ---- | ---- | +|1 - 64 bits|2|2|32| +|65 - 128 bits|2|2|36| +|129 - 192 bits|2|2|40| +|193 - 256 bits|3|2|44| +|257 - 320 bits|3|2|48| +|321 - 384 bits|4|2|52| +|385 - 448 bits|5|2|56| +|449 - 512 bits|7|2|60| +|513 - 576 bits|8|3|64| +|577 - 640 bits|9|3|68| +|641 - 704 bits|11|3|72| +|705 - 768 bits|13|3|76| + +--- + +#### Data Transfer + +`LOADX(0xc1)` + +**Stack in**: `(top of stack) dest source count` + +**Stack out**: none + +**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. + +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert that the range `[source, source + count]` falls within the active field context value space. +* Assert that the destination of the copy falls entirely within EVM memory. +* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. + +`STOREX(0xc2)` + +**Stack in**: `dest source count` + +**Stack out**: none + +**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. + +##### Execution +* Assert that a field context is set as active in the current call frame. +* Assert `dest + count` is less than or equal to the active context's value space size. +* Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. + +#### EVM Memory Expansion Cost Modification + +When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. + +### Rationale + +By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: +* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. +* Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. + +#### EOF Dependency + +EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. + +#### Montgomery Modular Multiplication + +For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater than `M`, chosen as a power of two for efficient performance), the Montgomery representation is `A * R % M`. + +Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. + +##### Conversion of Canonical to Montgomery Representation +`mulmont(canon_val, R**2 % M, M) = mont_val` +##### Conversion from Montgomery to Canonical representation +`mulmont(mont_val, 1, M) = canon_val` + +Note that normal modular addition and subtraction algorithms work for Montgomery form values. + +#### Gas Model Justification with Benchmarks + +Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. + +For each arithmetic operation and `value_size` combination, two benchmarks were measured: +* arithmetic-only benchmarks +* standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space + +In the graphs below, benchmark execution time is expressed in gas via scaling by the target gas rate. + +##### `ADDMODX`/`SUBMODX`/`MULMODX` + +The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. + +###### `ADDMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) +###### `SUBMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) +###### `MULMODX` +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) +--- + +##### `SETMODX` + +`SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. + +![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) + +--- + +### Security Considerations + +#### Memory Attacks via forcing cache-misses + +An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. + +To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. + +### Reference Implementation + +Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). + +### Test Cases + +TODO From 91fda5520fbfb09b93fc9b467cf3155e8b62387d Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Sun, 21 Jul 2024 23:21:31 -0700 Subject: [PATCH 10/20] update --- EIPS/eip-7747.md | 15 ++++++++------- assets/eip-7747/addmodx.png | Bin 0 -> 66960 bytes assets/eip-7747/mulmodx.png | Bin 0 -> 71015 bytes assets/eip-7747/submodx.png | Bin 0 -> 67185 bytes 4 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 assets/eip-7747/addmodx.png create mode 100644 assets/eip-7747/mulmodx.png create mode 100644 assets/eip-7747/submodx.png diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index 42eb23b396ba5..fde012cafe02f 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -1,10 +1,11 @@ --- eip: 7747 +description: Expanded-width modular arithmetic operations for the EVM title: EVM Modular Arithmetic Extensions -status: Draft -type: Standards track +type: Standards Track author: Jared Wasinger (@jwasinger), Alex Beregszaszi (@axic) discussions-to: https://ethereum-magicians.org/t/eip-7747-evm-modular-arithmetic-extensions/20608 +status: Draft category: Core created: 2024-07-20 requires: EOF @@ -158,7 +159,7 @@ def gas_setmod(element_size64bit: int) -> int: When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. -### Rationale +## Rationale By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: * The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. @@ -196,11 +197,11 @@ In the graphs below, benchmark execution time is expressed in gas via scaling by The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. ###### `ADDMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/addmodx.png?raw=true) +![Alt text](../assets/addmodx.png) ###### `SUBMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/submodx.png?raw=true) +![Alt text](../assets/submodx.png) ###### `MULMODX` -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/mulmodx.png?raw=true) +![Alt text](../assets/mulmodx.png) --- ##### `SETMODX` @@ -211,7 +212,7 @@ The implementations of the arithmetic are constant time. Modular addition/subtr --- -### Security Considerations +## Security Considerations #### Memory Attacks via forcing cache-misses diff --git a/assets/eip-7747/addmodx.png b/assets/eip-7747/addmodx.png new file mode 100644 index 0000000000000000000000000000000000000000..13489cdf3eb4266ce323cc18c8df4dd68ac19855 GIT binary patch literal 66960 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/eip-7747/mulmodx.png b/assets/eip-7747/mulmodx.png new file mode 100644 index 0000000000000000000000000000000000000000..aa49ab639036e72357022700bb4223f1df5cee7d GIT binary patch literal 71015 zcmeFZcTiQ?*DZR~R$5Hmwn!VmRzZ@0BB&riQPcy997RCMNsyf3j^(cr`hMTN_3j_9UcIVIl?BK-`|Q2KoMVnL=DH^%ePRv$W_k*R zvW9x{m>h*dS4yEQ>-=>E{>NEMCko#L%_UUKDjm(9(um+j61#AMu^`ufIJyc4O_r zA01if%@=;7u*e22y6j)~mNG5+BXvXPqTfzFKTNmq>*4kP_apxg29|pDr3FPH@bhO4 z|AVID0RaJgtKU?cE(~Xo#;FRAyz{c|yH2-$Ih$$mWkaXM`+I+|ZP>8kV$Yuouan_8 z;l`|Z_H59{zB4zp?p(LFmMokK8yp;bX}WpgRqTP4l?uz3FIPQuM*Z30_@jfVMq`76 zi|6l3LBdFIlu@dc@WQ(&*KYr7`u{&)8b1cDmbZf6)6+8)L#KXX38nJf+O=!1Uc2UX z?#~q0rT^S~+6UR7;Jd@a=Aj`W@6RW&v$5rq!S!Bp;=~CnYwN=LdUa!C;}qBVrJi;Q zum8;@@A-v%*Mhn_RZ&sVtCp7Dw{9(qUb=)L@HhYIw)S>TZtl~Ok&%+p(n=U_VG$7{ zrZxY3-jz+y58qL=w$5;6I<$+Imsdcq{C4?Pij2YMhK9EO{`f!Gq&sU9F6e(s;@~Qq z-=@jMudA1w6_b;bYwhhlWwn;_V&$7Xl_AtW1P>kJVr9)+SPtIX>CI0T){EDiPk3Kc z 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 z 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 KvGgNne))fJX+;+R literal 0 HcmV?d00001 diff --git a/assets/eip-7747/submodx.png b/assets/eip-7747/submodx.png new file mode 100644 index 0000000000000000000000000000000000000000..64f161dcef4788f39100ae9e997e85b3d2742fa9 GIT binary patch literal 67185 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%0Ak$Dril`0=l9ZP9694Rj>93?%SKMWc&@ zTf51jvF!9@!ou2RxlYs1&F5zF!qi_<9mGr1l-KZ)ttA8Jb7b(fOz5~*hqU2FO9~6! zvP7?Xz+k07Li;I%0D6!T+fL@FI~TqHM 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

_N+@l#Xo4(xkDawC{n8 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 Pb4pb?uAF-K)Ybn3WdAZ) literal 0 HcmV?d00001 From 8e952d8cde80aa95b5b6486bd7b9b37c2deb47c3 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 00:05:45 -0700 Subject: [PATCH 11/20] update --- EIPS/eip-7747.md | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index fde012cafe02f..901fe832b2db7 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -1,17 +1,18 @@ --- eip: 7747 -description: Expanded-width modular arithmetic operations for the EVM title: EVM Modular Arithmetic Extensions -type: Standards Track +description: Expanded-width modular arithmetic operations for the EVM author: Jared Wasinger (@jwasinger), Alex Beregszaszi (@axic) discussions-to: https://ethereum-magicians.org/t/eip-7747-evm-modular-arithmetic-extensions/20608 status: Draft +type: Standards Track category: Core created: 2024-07-20 -requires: EOF +requires: 7692 --- ## Abstract + This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. ## Motivation @@ -48,13 +49,13 @@ New load/store opcodes copy values to and from EVM memory and the value space of ### New Opcodes -`SETMODX(0xc0)` +#### `SETMODX(0xc0)` **Input**: ` id modulus_offset modulus_size alloc_count`. **Output**: none -##### Execution +#### Execution Assert `0 <= id <= 256`. If a field context for `id` exists in this call scope. Set it as the active one. @@ -79,6 +80,7 @@ Opcodes `ADDMODX(0xc3)`, `SUBMODX(0xc4)`, `MULMODX(0xc5)` take a 3-byte immediat Execution asserts that an active field context is set in the current call frame, asserts that each input index is less than the size of the active field context's value space. Then, compute the given operation with inputs from slot `x`/`y`: + * `ADDMODX`: `value_space[x] + value_space[y] % modulus` * `SUBMODX`: `value_space[x] - value_space[y] % modulus` * `MULMODX`: `value_space[x] * value_space[y] % modulus` @@ -86,6 +88,7 @@ Then, compute the given operation with inputs from slot `x`/`y`: Store the result in the value at index `out`. Note: `x`, `y` and `out` are allowed to overlap. Charge a gas cost based on `active_context.element_size/8` (the number of 64bit words needed to represent values/modulus): + ``` # element_size64bit \in [1, 12] @@ -106,9 +109,11 @@ def gas_setmod(element_size64bit: int) -> int: coef_b = 730 return math.ceil(coef_a * element_size64bit + coef_b) ``` + `SUBMODX` uses the same cost model as `ADDMODX`. -##### Cost table: +#### Cost table: + | Modulus Size | MULMODX cost | ADDMODX and SUBMODX cost | SETMODX cost | | ---- | ---- | ---- | ---- | |1 - 64 bits|2|2|32| @@ -126,9 +131,9 @@ def gas_setmod(element_size64bit: int) -> int: --- -#### Data Transfer +### Data Transfer -`LOADX(0xc1)` +#### `LOADX(0xc1)` **Stack in**: `(top of stack) dest source count` @@ -137,12 +142,13 @@ def gas_setmod(element_size64bit: int) -> int: **Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. ##### Execution + * Assert that a field context is set as active in the current call frame. * Assert that the range `[source, source + count]` falls within the active field context value space. * Assert that the destination of the copy falls entirely within EVM memory. * Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. -`STOREX(0xc2)` +#### `STOREX(0xc2)` **Stack in**: `dest source count` @@ -151,17 +157,19 @@ def gas_setmod(element_size64bit: int) -> int: **Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. ##### Execution + * Assert that a field context is set as active in the current call frame. * Assert `dest + count` is less than or equal to the active context's value space size. * Assert that `[source, source+count*active_context.element_size]` falls entirely within EVM memory. Interpret it as `count` number of values, asserting that each is less than the modulus and storing them in the value space starting at index `dest`. -#### EVM Memory Expansion Cost Modification +### EVM Memory Expansion Cost Modification When expanding EVM memory, expansion cost will now consider the size of all allocated field contexts in the current call frame. ## Rationale By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: + * The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. * Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. @@ -187,6 +195,7 @@ Note that normal modular addition and subtraction algorithms work for Montgomery Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. For each arithmetic operation and `value_size` combination, two benchmarks were measured: + * arithmetic-only benchmarks * standalone EVM bytecodes which execute arithmetic opcodes in a large loop with inputs/outputs as random indices from a 256-element sized value space @@ -214,7 +223,7 @@ The implementations of the arithmetic are constant time. Modular addition/subtr ## Security Considerations -#### Memory Attacks via forcing cache-misses +### Memory Attacks via forcing cache-misses An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. @@ -224,6 +233,10 @@ To prevent this, there should be a cap on the amount of memory that can be alloc Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). -### Test Cases +## Test Cases TODO + +## Copyright + +Copyright and related rights waived via [CC0](../LICENSE.md). From 260f9daa6ecd0bb5145b0b5c723a29405987a640 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 00:07:06 -0700 Subject: [PATCH 12/20] word --- EIPS/eip-7747.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index 901fe832b2db7..fd5c01012b715 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -13,7 +13,7 @@ requires: 7692 ## Abstract -This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits in width. +This EIP proposes new EVM modular arithmetic opcodes which support operations on odd moduli up to 768 bits wide. ## Motivation From 950b885a04bc7e2821dd68b6dd2244370d797faa Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 12:24:40 -0700 Subject: [PATCH 13/20] try to fix lint --- EIPS/eip-7747.md | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index fd5c01012b715..d21a8f6187a9a 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -173,7 +173,7 @@ By restricting that a modulus must be odd, and ensuring that inputs to arithmeti * The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. * Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. -#### EOF Dependency +### EOF Dependency EOF allows for the introduction of new opcodes that use immediates without breaking backwards compatibility. @@ -183,12 +183,15 @@ For a value `A`, an odd modulus `M` and a value `R` (must be coprime and greater Define the Montgomery modular multiplication of two values `A` and `B`: `mulmont(A, B, M): A * B * R**-1 % M` where `R**-1 % M` is the modular inverse of `R` with respect to `M`. There is various literature and algorithms for computing `mulmont` which have been published since 1985, and the operation is used ubiquitously where execution is bottlenecked by operations over prime-fields. +Note that normal modular addition and subtraction algorithms work for Montgomery form values. + ##### Conversion of Canonical to Montgomery Representation + `mulmont(canon_val, R**2 % M, M) = mont_val` + ##### Conversion from Montgomery to Canonical representation -`mulmont(mont_val, 1, M) = canon_val` -Note that normal modular addition and subtraction algorithms work for Montgomery form values. +`mulmont(mont_val, 1, M) = canon_val` #### Gas Model Justification with Benchmarks @@ -206,11 +209,17 @@ In the graphs below, benchmark execution time is expressed in gas via scaling by The implementations of the arithmetic are constant time. Modular addition/subtraction are linear with respect to modulus size. Modular multiplication scales quadratically with modulus size. ###### `ADDMODX` + ![Alt text](../assets/addmodx.png) + ###### `SUBMODX` + ![Alt text](../assets/submodx.png) + ###### `MULMODX` + ![Alt text](../assets/mulmodx.png) + --- ##### `SETMODX` @@ -221,14 +230,6 @@ The implementations of the arithmetic are constant time. Modular addition/subtr --- -## Security Considerations - -### Memory Attacks via forcing cache-misses - -An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. - -To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. - ### Reference Implementation Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). @@ -237,6 +238,14 @@ Work-in-progress reference implementation for Geth [here](https://github.com/jwa TODO +## Security Considerations + +### Memory Attacks via forcing cache-misses + +An attacker could potentially grief by allocating many field contexts with large moduli and structuring accesses to values in a way that thrashes the CPU cache. + +To prevent this, there should be a cap on the amount of memory that can be allocated via field contexts in a call frame. Looking into this, creating attack benchmarks and defining `MAX_FIELD_ALLOC_MEM` is a TODO. + ## Copyright Copyright and related rights waived via [CC0](../LICENSE.md). From 29134b2240c91afdd4b6d0b53402d8f30a1286a8 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 12:28:49 -0700 Subject: [PATCH 14/20] fix graphs --- EIPS/eip-7747.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index d21a8f6187a9a..4f711e2819861 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -210,15 +210,15 @@ The implementations of the arithmetic are constant time. Modular addition/subtr ###### `ADDMODX` -![Alt text](../assets/addmodx.png) +![Alt text](../assets/eip-7747/addmodx.png) ###### `SUBMODX` -![Alt text](../assets/submodx.png) +![Alt text](../assets/eip-7747/submodx.png) ###### `MULMODX` -![Alt text](../assets/mulmodx.png) +![Alt text](../assets/eip-7747/mulmodx.png) --- @@ -226,7 +226,7 @@ The implementations of the arithmetic are constant time. Modular addition/subtr `SETMODX` overhead is dominated by the computation of the conversion parameter used for `STOREX` (`R**2 % M`) which is assumed to be approximately `O(N)` in the bit-width of the modulus for range of bit-widths supported in this EIP. -![Alt text](https://github.com/jwasinger/evmmax-bench-plot/blob/5284df958171bc95ee9dcf47c995cffac7a136b0/charts/setmod.png?raw=true) +![Alt text](../assets/eip-7747/setmod.png) --- From e7b6863ade7318758b77d3e318b94a72805f8cb1 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 12:38:02 -0700 Subject: [PATCH 15/20] add missing graph for setmod op --- assets/eip-7747/setmod.png | Bin 0 -> 73792 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/eip-7747/setmod.png diff --git a/assets/eip-7747/setmod.png b/assets/eip-7747/setmod.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2543153ac5ffd96a9a3df5b2aa3f2d2e0ab657 GIT binary patch literal 73792 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 U`F)fRxi;z Date: Mon, 22 Jul 2024 13:06:35 -0700 Subject: [PATCH 16/20] clarify field element value size and EVM serialization --- EIPS/eip-7747.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index 4f711e2819861..1779a61b4301d 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -68,7 +68,7 @@ Otherwise: * Assert `modulus > 1`. * Assert that the most significant byte of the modulus is non-zero. * Assert `0 < alloc_count <= 256`. -* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8` (It is 64bit aligned). +* Define the size in bytes of elements in the value space: `element_size = ceil(modulus_size / 8) * 8`: the size of the modulus padded to the next multiple of 64 bits. * Charge EVM memory expansion cost to allocate `(alloc_count + 2) * element_size` bytes. * Allocate the new field context with zeroed value space containing `alloc_count` number of values. Associate it with `id` in the mapping. * The new field context is set as active. @@ -133,13 +133,15 @@ def gas_setmod(element_size64bit: int) -> int: ### Data Transfer +Serialization format for values in EVM memory: big-endian padded to `active_context.element_size` bytes. + #### `LOADX(0xc1)` **Stack in**: `(top of stack) dest source count` **Stack out**: none -**Description**: copies a number of contiguous values in the currently-active field context value space into EVM memory. +**Description**: copies one or more values in the currently-active field context's value space into EVM memory. ##### Execution @@ -154,7 +156,7 @@ def gas_setmod(element_size64bit: int) -> int: **Stack out**: none -**Description**: copies values layed out in EVM memory as 64bit-aligned big-endian numbers into a contiguous section of the currently-active field context's value space. +**Description**: copies values from EVM memory into the currently-active field context's value space. ##### Execution From d14740275926df08f293f197ba8268bdb8f975a9 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 13:25:37 -0700 Subject: [PATCH 17/20] phrasing changes --- EIPS/eip-7747.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index 1779a61b4301d..cc388f0a8cb6f 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -131,9 +131,9 @@ def gas_setmod(element_size64bit: int) -> int: --- -### Data Transfer +### Data Transfer Opcodes -Serialization format for values in EVM memory: big-endian padded to `active_context.element_size` bytes. +Note: serialization format for values in EVM memory: big-endian padded to `active_context.element_size` bytes. #### `LOADX(0xc1)` @@ -147,8 +147,8 @@ Serialization format for values in EVM memory: big-endian padded to `active_cont * Assert that a field context is set as active in the current call frame. * Assert that the range `[source, source + count]` falls within the active field context value space. -* Assert that the destination of the copy falls entirely within EVM memory. -* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`, laying them out in big-endian ordering, padded such that size of each is a multiple of 64 bits. +* Assert that the range `[dest, dest + count * active_context.element_size]` falls entirely within EVM memory. +* Charge `gas_mulmodx(active_context.element_size / 8) * count` and copy the values into EVM memory starting at offset `dest`. #### `STOREX(0xc2)` From fe67dac06e0e59f27bf673b6222f1a2960879eb7 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 13:36:30 -0700 Subject: [PATCH 18/20] fix typo, and change phrasing --- EIPS/eip-7747.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index cc388f0a8cb6f..ee40ae50785d1 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -39,7 +39,7 @@ The use of "assert" implies that if the assertion fails, the call frame will con ### Overview -The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-255) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. +The execution state of an EVM call frame is modified to include a mapping of `id` (a number 0-256) to "field context". A field context comprises a modulus and an allocated space of values to perform operations on. An executing contract uses a new instruction `SETMODX` to set the active field context, allocating a new one in the mapping if it does not already exist for `id`. @@ -172,7 +172,7 @@ When expanding EVM memory, expansion cost will now consider the size of all allo By restricting that a modulus must be odd, and ensuring that inputs to arithmetic operations will be reduced by the modulus, modular arithmetic operations can be optimized: -* The reduction step for modular addition/subtraction can be implemented using only addition and subtraction. +* The reduction step for modular addition/subtraction can be implemented without division using only conditional subtraction. * Modular multiplication can be implemented using Montgomery multiplication, a family of similar algorithms which have greatly-improved performance compared to the naive method. ### EOF Dependency From afeed9dd4ee3e08ac85b1780ee5ee8f5df526ac6 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 14:32:57 -0700 Subject: [PATCH 19/20] remove link to geth implementation --- EIPS/eip-7747.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index ee40ae50785d1..ae4d9c79950b1 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -234,7 +234,7 @@ The implementations of the arithmetic are constant time. Modular addition/subtr ### Reference Implementation -Work-in-progress reference implementation for Geth [here](https://github.com/jwasinger/go-ethereum/tree/eip-8743). +There is a work-in-progress implementation for Geth. ## Test Cases From 58475fc29c9466a796f5fa2fea43081f69240bf0 Mon Sep 17 00:00:00 2001 From: Jared Wasinger Date: Mon, 22 Jul 2024 21:32:06 -0700 Subject: [PATCH 20/20] note processor used for benchmarking --- EIPS/eip-7747.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EIPS/eip-7747.md b/EIPS/eip-7747.md index ae4d9c79950b1..23eb2638f278e 100644 --- a/EIPS/eip-7747.md +++ b/EIPS/eip-7747.md @@ -197,7 +197,7 @@ Note that normal modular addition and subtraction algorithms work for Montgomery #### Gas Model Justification with Benchmarks -Benchmarks were performed on consumer-grade hardware. A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. +Benchmarks were performed on a Xeon CPU E5-2686 v4 (2.30GHz). A target gas rate of 27 ns/gas was chosen by benchmarking the performance of the ecrecover precompile. For each arithmetic operation and `value_size` combination, two benchmarks were measured: