diff --git a/packages/evm/src/precompiles/14-kzg-point-evaluation.ts b/packages/evm/src/precompiles/0a-kzg-point-evaluation.ts similarity index 98% rename from packages/evm/src/precompiles/14-kzg-point-evaluation.ts rename to packages/evm/src/precompiles/0a-kzg-point-evaluation.ts index 16f16c3957..6f4af98f1a 100644 --- a/packages/evm/src/precompiles/14-kzg-point-evaluation.ts +++ b/packages/evm/src/precompiles/0a-kzg-point-evaluation.ts @@ -20,7 +20,7 @@ export const BLS_MODULUS = BigInt( const modulusBuffer = setLengthLeft(bigIntToBytes(BLS_MODULUS), 32) -export async function precompile14(opts: PrecompileInput): Promise { +export async function precompile0a(opts: PrecompileInput): Promise { const gasUsed = opts._common.param('gasPrices', 'kzgPointEvaluationGasPrecompilePrice') if (opts._debug !== undefined) { opts._debug( diff --git a/packages/evm/src/precompiles/0a-bls12-g1add.ts b/packages/evm/src/precompiles/0c-bls12-g1add.ts similarity index 97% rename from packages/evm/src/precompiles/0a-bls12-g1add.ts rename to packages/evm/src/precompiles/0c-bls12-g1add.ts index c2c71cdbbc..a465345c8c 100644 --- a/packages/evm/src/precompiles/0a-bls12-g1add.ts +++ b/packages/evm/src/precompiles/0c-bls12-g1add.ts @@ -9,7 +9,7 @@ import { BLS12_381_FromG1Point, BLS12_381_ToG1Point } from './util/bls12_381.js' import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0a(opts: PrecompileInput): Promise { +export async function precompile0c(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/0b-bls12-g1mul.ts b/packages/evm/src/precompiles/0d-bls12-g1mul.ts similarity index 97% rename from packages/evm/src/precompiles/0b-bls12-g1mul.ts rename to packages/evm/src/precompiles/0d-bls12-g1mul.ts index 14768feb5a..029da65e40 100644 --- a/packages/evm/src/precompiles/0b-bls12-g1mul.ts +++ b/packages/evm/src/precompiles/0d-bls12-g1mul.ts @@ -13,7 +13,7 @@ import { import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0b(opts: PrecompileInput): Promise { +export async function precompile0d(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/0c-bls12-g1multiexp.ts b/packages/evm/src/precompiles/0e-bls12-g1multiexp.ts similarity index 98% rename from packages/evm/src/precompiles/0c-bls12-g1multiexp.ts rename to packages/evm/src/precompiles/0e-bls12-g1multiexp.ts index f649ea11f9..86f2189586 100644 --- a/packages/evm/src/precompiles/0c-bls12-g1multiexp.ts +++ b/packages/evm/src/precompiles/0e-bls12-g1multiexp.ts @@ -13,7 +13,7 @@ import { import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0c(opts: PrecompileInput): Promise { +export async function precompile0e(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/0d-bls12-g2add.ts b/packages/evm/src/precompiles/0f-bls12-g2add.ts similarity index 97% rename from packages/evm/src/precompiles/0d-bls12-g2add.ts rename to packages/evm/src/precompiles/0f-bls12-g2add.ts index 2487e73fc6..edff918d64 100644 --- a/packages/evm/src/precompiles/0d-bls12-g2add.ts +++ b/packages/evm/src/precompiles/0f-bls12-g2add.ts @@ -9,7 +9,7 @@ import { BLS12_381_FromG2Point, BLS12_381_ToG2Point } from './util/bls12_381.js' import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0d(opts: PrecompileInput): Promise { +export async function precompile0f(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/0e-bls12-g2mul.ts b/packages/evm/src/precompiles/10-bls12-g2mul.ts similarity index 97% rename from packages/evm/src/precompiles/0e-bls12-g2mul.ts rename to packages/evm/src/precompiles/10-bls12-g2mul.ts index f5e4126911..f3e2b0d92c 100644 --- a/packages/evm/src/precompiles/0e-bls12-g2mul.ts +++ b/packages/evm/src/precompiles/10-bls12-g2mul.ts @@ -13,7 +13,7 @@ import { import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0e(opts: PrecompileInput): Promise { +export async function precompile10(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/0f-bls12-g2multiexp.ts b/packages/evm/src/precompiles/11-bls12-g2multiexp.ts similarity index 98% rename from packages/evm/src/precompiles/0f-bls12-g2multiexp.ts rename to packages/evm/src/precompiles/11-bls12-g2multiexp.ts index 988a096bf8..7fa88ce559 100644 --- a/packages/evm/src/precompiles/0f-bls12-g2multiexp.ts +++ b/packages/evm/src/precompiles/11-bls12-g2multiexp.ts @@ -14,7 +14,7 @@ import { import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile0f(opts: PrecompileInput): Promise { +export async function precompile11(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/10-bls12-pairing.ts b/packages/evm/src/precompiles/12-bls12-pairing.ts similarity index 98% rename from packages/evm/src/precompiles/10-bls12-pairing.ts rename to packages/evm/src/precompiles/12-bls12-pairing.ts index 5b28b1728f..018d6f76e2 100644 --- a/packages/evm/src/precompiles/10-bls12-pairing.ts +++ b/packages/evm/src/precompiles/12-bls12-pairing.ts @@ -12,7 +12,7 @@ import type { PrecompileInput } from './types.js' const zeroBuffer = new Uint8Array(32) const oneBuffer = concatBytesNoTypeCheck(new Uint8Array(31), hexToBytes('01')) -export async function precompile10(opts: PrecompileInput): Promise { +export async function precompile12(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/11-bls12-map-fp-to-g1.ts b/packages/evm/src/precompiles/13-bls12-map-fp-to-g1.ts similarity index 97% rename from packages/evm/src/precompiles/11-bls12-map-fp-to-g1.ts rename to packages/evm/src/precompiles/13-bls12-map-fp-to-g1.ts index 811d4e8a42..afbdd06a65 100644 --- a/packages/evm/src/precompiles/11-bls12-map-fp-to-g1.ts +++ b/packages/evm/src/precompiles/13-bls12-map-fp-to-g1.ts @@ -9,7 +9,7 @@ import { BLS12_381_FromG1Point, BLS12_381_ToFpPoint } from './util/bls12_381.js' import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile11(opts: PrecompileInput): Promise { +export async function precompile13(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/12-bls12-map-fp2-to-g2.ts b/packages/evm/src/precompiles/14-bls12-map-fp2-to-g2.ts similarity index 97% rename from packages/evm/src/precompiles/12-bls12-map-fp2-to-g2.ts rename to packages/evm/src/precompiles/14-bls12-map-fp2-to-g2.ts index 5506a7814a..87dd82fc5c 100644 --- a/packages/evm/src/precompiles/12-bls12-map-fp2-to-g2.ts +++ b/packages/evm/src/precompiles/14-bls12-map-fp2-to-g2.ts @@ -9,7 +9,7 @@ import { BLS12_381_FromG2Point, BLS12_381_ToFp2Point } from './util/bls12_381.js import type { ExecResult } from '../evm.js' import type { PrecompileInput } from './types.js' -export async function precompile12(opts: PrecompileInput): Promise { +export async function precompile14(opts: PrecompileInput): Promise { const mcl = (opts._EVM)._mcl! const inputData = opts.data diff --git a/packages/evm/src/precompiles/index.ts b/packages/evm/src/precompiles/index.ts index 7695dd9d89..8af39ce8c8 100644 --- a/packages/evm/src/precompiles/index.ts +++ b/packages/evm/src/precompiles/index.ts @@ -1,6 +1,5 @@ import { Hardfork } from '@ethereumjs/common' -import { Address } from '@ethereumjs/util' -import { bytesToHex, hexToBytes } from 'ethereum-cryptography/utils.js' +import { bytesToHex } from 'ethereum-cryptography/utils.js' import { precompile01 } from './01-ecrecover.js' import { precompile02 } from './02-sha256.js' @@ -11,26 +10,29 @@ import { precompile06 } from './06-ecadd.js' import { precompile07 } from './07-ecmul.js' import { precompile08 } from './08-ecpairing.js' import { precompile09 } from './09-blake2f.js' -import { precompile0a } from './0a-bls12-g1add.js' -import { precompile0b } from './0b-bls12-g1mul.js' -import { precompile0c } from './0c-bls12-g1multiexp.js' -import { precompile0d } from './0d-bls12-g2add.js' -import { precompile0e } from './0e-bls12-g2mul.js' -import { precompile0f } from './0f-bls12-g2multiexp.js' -import { precompile10 } from './10-bls12-pairing.js' -import { precompile11 } from './11-bls12-map-fp-to-g1.js' -import { precompile12 } from './12-bls12-map-fp2-to-g2.js' -import { precompile14 } from './14-kzg-point-evaluation.js' +import { precompile0a } from './0a-kzg-point-evaluation.js' +import { precompile0c } from './0c-bls12-g1add.js' +import { precompile0d } from './0d-bls12-g1mul.js' +import { precompile0e } from './0e-bls12-g1multiexp.js' +import { precompile0f } from './0f-bls12-g2add.js' +import { precompile10 } from './10-bls12-g2mul.js' +import { precompile11 } from './11-bls12-g2multiexp.js' +import { precompile12 } from './12-bls12-pairing.js' +import { precompile13 } from './13-bls12-map-fp-to-g1.js' +import { precompile14 } from './14-bls12-map-fp2-to-g2.js' import type { PrecompileFunc, PrecompileInput } from './types.js' import type { Common } from '@ethereumjs/common' +import type { Address } from '@ethereumjs/util' -interface Precompiles { - [key: string]: PrecompileFunc +interface PrecompileEntry { + address: string + check: PrecompileAvailabilityCheckType + precompile: PrecompileFunc } -interface PrecompileAvailability { - [key: string]: PrecompileAvailabilityCheckType +interface Precompiles { + [key: string]: PrecompileFunc } type PrecompileAvailabilityCheckType = @@ -53,121 +55,184 @@ interface PrecompileAvailabilityCheckTypeEIP { } const ripemdPrecompileAddress = '0000000000000000000000000000000000000003' -const precompiles: Precompiles = { - '0000000000000000000000000000000000000001': precompile01, - '0000000000000000000000000000000000000002': precompile02, - [ripemdPrecompileAddress]: precompile03, - '0000000000000000000000000000000000000004': precompile04, - '0000000000000000000000000000000000000005': precompile05, - '0000000000000000000000000000000000000006': precompile06, - '0000000000000000000000000000000000000007': precompile07, - '0000000000000000000000000000000000000008': precompile08, - '0000000000000000000000000000000000000009': precompile09, - '000000000000000000000000000000000000000a': precompile0a, - '000000000000000000000000000000000000000b': precompile0b, - '000000000000000000000000000000000000000c': precompile0c, - '000000000000000000000000000000000000000d': precompile0d, - '000000000000000000000000000000000000000e': precompile0e, - '000000000000000000000000000000000000000f': precompile0f, - '0000000000000000000000000000000000000010': precompile10, - '0000000000000000000000000000000000000011': precompile11, - '0000000000000000000000000000000000000012': precompile12, - '0000000000000000000000000000000000000014': precompile14, -} -const precompileAvailability: PrecompileAvailability = { - '0000000000000000000000000000000000000001': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Chainstart, +const precompileEntries: PrecompileEntry[] = [ + { + address: '0000000000000000000000000000000000000001', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Chainstart, + }, + precompile: precompile01, }, - '0000000000000000000000000000000000000002': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Chainstart, + { + address: '0000000000000000000000000000000000000002', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Chainstart, + }, + precompile: precompile02, }, - [ripemdPrecompileAddress]: { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Chainstart, + { + address: '0000000000000000000000000000000000000003', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Chainstart, + }, + precompile: precompile03, }, - '0000000000000000000000000000000000000004': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Chainstart, + { + address: '0000000000000000000000000000000000000004', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Chainstart, + }, + precompile: precompile04, }, - '0000000000000000000000000000000000000005': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Byzantium, + { + address: '0000000000000000000000000000000000000005', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Byzantium, + }, + precompile: precompile05, }, - '0000000000000000000000000000000000000006': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Byzantium, + { + address: '0000000000000000000000000000000000000006', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Byzantium, + }, + precompile: precompile06, }, - '0000000000000000000000000000000000000007': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Byzantium, + { + address: '0000000000000000000000000000000000000007', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Byzantium, + }, + precompile: precompile07, }, - '0000000000000000000000000000000000000008': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Byzantium, + { + address: '0000000000000000000000000000000000000008', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Byzantium, + }, + precompile: precompile08, }, - '0000000000000000000000000000000000000009': { - type: PrecompileAvailabilityCheck.Hardfork, - param: Hardfork.Istanbul, + { + address: '0000000000000000000000000000000000000009', + check: { + type: PrecompileAvailabilityCheck.Hardfork, + param: Hardfork.Istanbul, + }, + precompile: precompile09, }, - '000000000000000000000000000000000000000a': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '000000000000000000000000000000000000000a', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 4844, + }, + precompile: precompile0a, }, - '000000000000000000000000000000000000000b': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + // 0x00..0b: beacon block root, see PR 2810 + { + address: '000000000000000000000000000000000000000c', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0c, }, - '000000000000000000000000000000000000000c': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '000000000000000000000000000000000000000d', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0d, }, - '000000000000000000000000000000000000000d': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '000000000000000000000000000000000000000e', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0e, }, - '000000000000000000000000000000000000000f': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '000000000000000000000000000000000000000f', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0f, }, - '000000000000000000000000000000000000000e': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '0000000000000000000000000000000000000010', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile10, }, - '0000000000000000000000000000000000000010': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '0000000000000000000000000000000000000011', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile11, }, - '0000000000000000000000000000000000000011': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '0000000000000000000000000000000000000012', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile12, }, - '0000000000000000000000000000000000000012': { - type: PrecompileAvailabilityCheck.EIP, - param: 2537, + { + address: '0000000000000000000000000000000000000013', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile13, }, - '0000000000000000000000000000000000000014': { - type: PrecompileAvailabilityCheck.EIP, - param: 4844, + { + address: '0000000000000000000000000000000000000014', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile14, }, -} +] -function getPrecompile(address: Address, common: Common): PrecompileFunc { - const addr = bytesToHex(address.bytes) - if (precompiles[addr] !== undefined) { - const availability = precompileAvailability[addr] - if ( - (availability.type === PrecompileAvailabilityCheck.Hardfork && - common.gteHardfork(availability.param)) || - (availability.type === PrecompileAvailabilityCheck.EIP && - common.isActivatedEIP(availability.param)) - ) { - return precompiles[addr] - } - } - return precompiles[''] +const precompiles: Precompiles = { + '0000000000000000000000000000000000000001': precompile01, + '0000000000000000000000000000000000000002': precompile02, + [ripemdPrecompileAddress]: precompile03, + '0000000000000000000000000000000000000004': precompile04, + '0000000000000000000000000000000000000005': precompile05, + '0000000000000000000000000000000000000006': precompile06, + '0000000000000000000000000000000000000007': precompile07, + '0000000000000000000000000000000000000008': precompile08, + '0000000000000000000000000000000000000009': precompile09, + '000000000000000000000000000000000000000a': precompile0a, + // 0b: beacon block root see PR 2810 + '000000000000000000000000000000000000000c': precompile0c, + '000000000000000000000000000000000000000d': precompile0d, + '000000000000000000000000000000000000000e': precompile0e, + '000000000000000000000000000000000000000f': precompile0f, + '0000000000000000000000000000000000000010': precompile10, + '0000000000000000000000000000000000000011': precompile11, + '0000000000000000000000000000000000000012': precompile12, + '0000000000000000000000000000000000000013': precompile13, + '0000000000000000000000000000000000000014': precompile14, } type DeletePrecompile = { @@ -194,20 +259,23 @@ function getActivePrecompiles( ) } } - for (const addressString in precompiles) { - if (precompileMap.has(addressString)) { + for (const entry of precompileEntries) { + if (precompileMap.has(entry.address)) { continue } + const type = entry.check.type - const address = new Address(hexToBytes(addressString)) - const precompileFunc = getPrecompile(address, common) - if (precompileFunc !== undefined) { - precompileMap.set(addressString, precompileFunc) + if ( + (type === PrecompileAvailabilityCheck.Hardfork && common.gteHardfork(entry.check.param)) || + (entry.check.type === PrecompileAvailabilityCheck.EIP && + common.isActivatedEIP(entry.check.param)) + ) { + precompileMap.set(entry.address, entry.precompile) } } return precompileMap } -export { getActivePrecompiles, precompiles, ripemdPrecompileAddress } +export { getActivePrecompiles, precompileEntries, precompiles, ripemdPrecompileAddress } export type { AddPrecompile, CustomPrecompile, DeletePrecompile, PrecompileFunc, PrecompileInput } diff --git a/packages/evm/test/precompiles/14-pointevaluation.spec.ts b/packages/evm/test/precompiles/0a-pointevaluation.spec.ts similarity index 99% rename from packages/evm/test/precompiles/14-pointevaluation.spec.ts rename to packages/evm/test/precompiles/0a-pointevaluation.spec.ts index 6a1fd6a8b8..e8995df2dd 100644 --- a/packages/evm/test/precompiles/14-pointevaluation.spec.ts +++ b/packages/evm/test/precompiles/0a-pointevaluation.spec.ts @@ -37,7 +37,7 @@ describe('Precompiles: point evaluation', () => { common, stateManager: new DefaultStateManager(), }) - const addressStr = '0000000000000000000000000000000000000014' + const addressStr = '000000000000000000000000000000000000000a' const pointEvaluation = getActivePrecompiles(common).get(addressStr)! const testCase = { diff --git a/packages/evm/test/precompiles/eip-2537-BLS.spec.ts b/packages/evm/test/precompiles/eip-2537-BLS.spec.ts index 070987fe9d..a65c384ea8 100644 --- a/packages/evm/test/precompiles/eip-2537-BLS.spec.ts +++ b/packages/evm/test/precompiles/eip-2537-BLS.spec.ts @@ -7,8 +7,8 @@ import { assert, describe, it } from 'vitest' import { EVM } from '../../src/evm.js' import { getActivePrecompiles } from '../../src/index.js' -const precompileAddressStart = 0x0a -const precompileAddressEnd = 0x12 +const precompileAddressStart = 0x0c +const precompileAddressEnd = 0x14 const precompiles: string[] = [] @@ -100,7 +100,7 @@ describe('EIP-2537 BLS tests', () => { stateManager: new DefaultStateManager(), }) const BLS12G2MultiExp = getActivePrecompiles(common).get( - '000000000000000000000000000000000000000f' + '0000000000000000000000000000000000000011' )! const testVector =