From 089f81cf32b3725095fd35c5b7922aeede8aa598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 7 Nov 2025 15:49:26 +0100 Subject: [PATCH 1/9] feat: constraints update --- linea-constraints | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linea-constraints b/linea-constraints index 89350fbec2..00e31bc22d 160000 --- a/linea-constraints +++ b/linea-constraints @@ -1 +1 @@ -Subproject commit 89350fbec2c2c568658b697e6dc858d798baeb86 +Subproject commit 00e31bc22d65d8eb99c032409d1bfd3aa9f7884d From bd40fca04682ec48a47a58cbe88df712c9b75161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 7 Nov 2025 16:51:21 +0100 Subject: [PATCH 2/9] constraints update --- .../linea/zktracer/module/mmu/instructions/ModexpData.java | 2 +- .../linea/zktracer/module/mmu/instructions/ModexpZero.java | 2 +- linea-constraints | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpData.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpData.java index 4f91ae176c..7513143cc9 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpData.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpData.java @@ -20,8 +20,8 @@ import static net.consensys.linea.zktracer.Trace.MMIO_INST_RAM_TO_LIMB_ONE_SOURCE; import static net.consensys.linea.zktracer.Trace.MMIO_INST_RAM_TO_LIMB_TRANSPLANT; import static net.consensys.linea.zktracer.Trace.MMIO_INST_RAM_TO_LIMB_TWO_SOURCE; -import static net.consensys.linea.zktracer.Trace.Mmu.NB_MICRO_ROWS_TOT_MODEXP_DATA; import static net.consensys.linea.zktracer.Trace.Mmu.NB_PP_ROWS_MODEXP_DATA; +import static net.consensys.linea.zktracer.TraceLondon.Mmu.NB_MICRO_ROWS_TOT_MODEXP_DATA; import static net.consensys.linea.zktracer.types.Conversions.longToBytes; import java.util.ArrayList; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpZero.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpZero.java index 863d6e21dd..8bbb60be78 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpZero.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ModexpZero.java @@ -16,8 +16,8 @@ package net.consensys.linea.zktracer.module.mmu.instructions; import static net.consensys.linea.zktracer.Trace.MMIO_INST_LIMB_VANISHES; -import static net.consensys.linea.zktracer.Trace.Mmu.NB_MICRO_ROWS_TOT_MODEXP_ZERO; import static net.consensys.linea.zktracer.Trace.Mmu.NB_PP_ROWS_MODEXP_ZERO; +import static net.consensys.linea.zktracer.TraceLondon.Mmu.NB_MICRO_ROWS_TOT_MODEXP_ZERO; import java.util.ArrayList; import java.util.List; diff --git a/linea-constraints b/linea-constraints index 00e31bc22d..14de5965e4 160000 --- a/linea-constraints +++ b/linea-constraints @@ -1 +1 @@ -Subproject commit 00e31bc22d65d8eb99c032409d1bfd3aa9f7884d +Subproject commit 14de5965e4926bda94a44a903a9119ec8614357e From 4718cd1e1ad2339206e8094d5807a1b81a805857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Wed, 12 Nov 2025 18:56:50 +0100 Subject: [PATCH 3/9] first commit --- .../consensys/linea/zktracer/ZkCounter.java | 18 ++-- .../blake2fmodexpdata/BlakeComponents.java | 4 +- ...{BlakeModexpData.java => BlakeModexp.java} | 28 ++++-- ...eration.java => BlakeModexpOperation.java} | 75 +++++++------- .../LondonBlakeModexpOperation.java | 55 +++++++++++ .../OsakaBlakeModexpOperation.java | 51 ++++++++++ .../zktracer/module/exp/ExpOperation.java | 4 +- .../linea/zktracer/module/hub/Hub.java | 11 +-- .../fragment/imc/exp/ModexpLogExpCall.java | 2 +- .../module/hub/fragment/imc/mmu/MmuCall.java | 50 +++++----- .../modexp/ModexpCallDataSizeOobCall.java | 4 +- .../modexp/ModexpExtractOobCall.java | 4 +- .../precompiles/modexp/ModexpLeadOobCall.java | 6 +- .../modexp/ModexpPricingOobCall.java | 2 +- .../xbsOobCall/LondonModexpXbsOobCall.java | 84 ++++++++++++++++ .../{ => xbsOobCall}/ModexpXbsOobCall.java | 45 +++++---- .../xbsOobCall/OsakaModexpXbsOobCall.java | 97 +++++++++++++++++++ .../scenario/PrecompileScenarioFragment.java | 2 +- .../modexpMetadata/LondonModexpMetadata.java | 42 ++++++++ .../{ => modexpMetadata}/ModexpMetadata.java | 58 ++++++++--- .../modexpMetadata/OsakaModexpMetadata.java | 54 +++++++++++ .../module/hub/section/call/CallSection.java | 74 ++++++++------ .../precompileSubsection/BlakeSubsection.java | 4 +- ...ction.java => LondonModexpSubsection.java} | 35 ++++--- .../OsakaModexpSubsection.java | 24 +++++ .../PrecompileSubsection.java | 14 +-- .../limits/precompiles/BlakeRounds.java | 2 +- .../zktracer/module/oob/OobOperation.java | 6 +- .../net/consensys/linea/ZkCounterTest.java | 2 - .../precompileLimits/BlakeRoundsTests.java | 6 +- .../precompileLimits/ModexpLimitsTests.java | 3 +- .../zktracer/precompiles/BlakeTests.java | 2 +- .../zktracer/precompiles/ModexpTests.java | 20 ++-- 33 files changed, 693 insertions(+), 195 deletions(-) rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/{BlakeModexpData.java => BlakeModexp.java} (70%) rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/{BlakeModexpDataOperation.java => BlakeModexpOperation.java} (68%) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/{ => xbsOobCall}/ModexpXbsOobCall.java (73%) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/{ => modexpMetadata}/ModexpMetadata.java (78%) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/{ModexpSubsection.java => LondonModexpSubsection.java} (87%) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java index 444e20d57e..84d7d486a6 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java @@ -16,7 +16,6 @@ package net.consensys.linea.zktracer; import static net.consensys.linea.zktracer.Fork.*; -import static net.consensys.linea.zktracer.Trace.*; import static net.consensys.linea.zktracer.Trace.BLOCKHASH_MAX_HISTORY; import static net.consensys.linea.zktracer.Trace.Ecdata.TOTAL_SIZE_ECPAIRING_DATA_MIN; import static net.consensys.linea.zktracer.TraceCancun.Oob.CT_MAX_CALL; @@ -24,8 +23,7 @@ import static net.consensys.linea.zktracer.module.ModuleName.*; import static net.consensys.linea.zktracer.module.ModuleName.GAS; import static net.consensys.linea.zktracer.module.add.AddOperation.NB_ROWS_ADD; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.NB_ROWS_BLAKEMODEPX_BLAKE; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.NB_ROWS_BLAKEMODEXP_MODEXP; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.*; import static net.consensys.linea.zktracer.module.blockdata.module.CancunBlockData.NB_ROWS_BLOCK_DATA; import static net.consensys.linea.zktracer.module.blockhash.BlockhashOperation.NB_ROWS_BLOCKHASH; import static net.consensys.linea.zktracer.module.gas.GasOperation.NB_ROWS_GAS; @@ -48,7 +46,7 @@ import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.BlakeSubsection.NB_ROWS_HUB_PRC_BLAKE; import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.EllipticCurvePrecompileSubsection.NB_ROWS_HUB_PRC_ELLIPTIC_CURVE; import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.IdentitySubsection.NB_ROWS_HUB_PRC_IDENTITY; -import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.ModexpSubsection.NB_ROWS_HUB_PRC_MODEXP; +import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.LondonModexpSubsection.NB_ROWS_HUB_PRC_MODEXP; import static net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.ShaTwoOrRipemdSubSection.NB_ROWS_HUB_PRC_SHARIP; import static net.consensys.linea.zktracer.module.hub.section.copy.CallDataCopySection.NB_ROWS_HUB_CALL_DATA_COPY; import static net.consensys.linea.zktracer.module.hub.section.copy.CodeCopySection.NB_ROWS_HUB_CODE_COPY; @@ -108,7 +106,9 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ExplogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ModexpLogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.limits.BlockTransactions; import net.consensys.linea.zktracer.module.limits.Keccak; import net.consensys.linea.zktracer.module.limits.L1BlockSize; @@ -726,12 +726,12 @@ public void tracePrecompileCall(MessageFrame frame, long gasRequirement, Bytes o case PRC_MODEXP -> { hub.updateTally(NB_ROWS_HUB_PRC_MODEXP); final MemoryRange memoryRange = new MemoryRange(0, 0, callData.size(), callData); - final ModexpMetadata modexpMetadata = new ModexpMetadata(memoryRange); - if (modexpMetadata.unprovableModexp()) { + final ModexpMetadata modexpMetadata = new OsakaModexpMetadata(memoryRange); + if (modexpMetadata instanceof LondonModexpMetadata && modexpMetadata.unprovableModexp()) { modexpEffectiveCall.detectEvent(); return; } - blakemodexp.updateTally(NB_ROWS_BLAKEMODEXP_MODEXP); + blakemodexp.updateTally(modexpMetadata.getNumberOfRowsForModexp()); modexpEffectiveCall.updateTally(prcSuccess); modexpLargeCall.updateTally(modexpMetadata.largeModexp()); if (modexpMetadata.loadRawLeadingWord()) { @@ -755,7 +755,7 @@ public void tracePrecompileCall(MessageFrame frame, long gasRequirement, Bytes o blakeEffectiveCall.updateTally(true); hub.updateTally(NB_ROWS_HUB_PRC_BLAKE); oob.updateTally(oobLineCountForPrc(PRC_BLAKE2F)); - blakemodexp.updateTally(NB_ROWS_BLAKEMODEPX_BLAKE); + blakemodexp.updateTally(numberOfRowsBlake()); // TODO: still unchecked module for now: blakeRounds.updateTally(); } case PRC_BLS_G1_ADD, diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeComponents.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeComponents.java index 3af9c387ae..f192d59758 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeComponents.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeComponents.java @@ -15,8 +15,8 @@ package net.consensys.linea.zktracer.module.blake2fmodexpdata; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_HASH_INPUT_OFFSET; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_HASH_INPUT_SIZE; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_HASH_INPUT_OFFSET; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_HASH_INPUT_SIZE; import org.apache.tuweni.bytes.Bytes; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpData.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java similarity index 70% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpData.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java index 6f06956d77..24e781c283 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpData.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java @@ -15,6 +15,7 @@ package net.consensys.linea.zktracer.module.blake2fmodexpdata; +import static com.google.common.base.Preconditions.checkState; import static net.consensys.linea.zktracer.module.ModuleName.BLAKE_MODEXP_DATA; import java.util.List; @@ -28,21 +29,23 @@ import net.consensys.linea.zktracer.container.module.OperationListModule; import net.consensys.linea.zktracer.container.stacked.ModuleOperationStackedList; import net.consensys.linea.zktracer.module.ModuleName; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; import net.consensys.linea.zktracer.module.wcp.Wcp; @RequiredArgsConstructor @Getter @Accessors(fluent = true) -public class BlakeModexpData implements OperationListModule { +public class BlakeModexp implements OperationListModule { private final Wcp wcp; private final IncrementAndDetectModule modexpEffectiveCall; private final IncrementingModule modexpLargeCall; private final IncrementingModule blakeEffectiveCall; private final BlakeRounds blakeRounds; - private final ModuleOperationStackedList operations = + private final ModuleOperationStackedList operations = new ModuleOperationStackedList<>(); private long previousID = 0; @@ -53,14 +56,27 @@ public ModuleName moduleKey() { } public void callModexp(final ModexpMetadata modexpMetaData, final int operationID) { - operations.add(new BlakeModexpDataOperation(modexpMetaData, operationID)); + checkState( + modexpMetaData instanceof LondonModexpMetadata + || modexpMetaData instanceof OsakaModexpMetadata, + "Unsupported ModexpMetadata type for BlakeModexpData module"); + + if (modexpMetaData instanceof LondonModexpMetadata) { + operations.add( + new LondonBlakeModexpOperation((LondonModexpMetadata) modexpMetaData, operationID)); + } + if (modexpMetaData instanceof OsakaModexpMetadata) { + operations.add( + new OsakaBlakeModexpOperation((OsakaModexpMetadata) modexpMetaData, operationID)); + } + modexpEffectiveCall.updateTally(1); modexpLargeCall.updateTally(modexpMetaData.largeModexp()); callWcpForIdCheck(operationID); } public void callBlake(final BlakeComponents blakeComponents, final int operationID) { - operations.add(new BlakeModexpDataOperation(blakeComponents, operationID)); + operations.add(new LondonBlakeModexpOperation(blakeComponents, operationID)); blakeEffectiveCall.updateTally(1); blakeRounds.addPrecompileLimit(blakeComponents.r()); callWcpForIdCheck(operationID); @@ -84,7 +100,7 @@ public int spillage(Trace trace) { @Override public void commit(Trace trace) { int stamp = 0; - for (BlakeModexpDataOperation o : operations.getAll()) { + for (BlakeModexpOperation o : operations.getAll()) { o.trace(trace.blake2fmodexpdata(), ++stamp); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpDataOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java similarity index 68% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpDataOperation.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java index 7772507ffc..b85b433af3 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpDataOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java @@ -15,14 +15,7 @@ package net.consensys.linea.zktracer.module.blake2fmodexpdata; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_BLAKE_DATA; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_BLAKE_PARAMS; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_BLAKE_RESULT; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_MODEXP; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_MODEXP_BASE; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_MODEXP_EXPONENT; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_MODEXP_MODULUS; -import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.INDEX_MAX_MODEXP_RESULT; +import static net.consensys.linea.zktracer.Trace.Blake2fmodexpdata.*; import static net.consensys.linea.zktracer.Trace.LLARGE; import static net.consensys.linea.zktracer.Trace.PHASE_BLAKE_DATA; import static net.consensys.linea.zktracer.Trace.PHASE_BLAKE_PARAMS; @@ -39,38 +32,50 @@ import lombok.experimental.Accessors; import net.consensys.linea.zktracer.Trace; import net.consensys.linea.zktracer.container.ModuleOperation; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.types.UnsignedByte; import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.crypto.Hash; @Accessors(fluent = true) -public class BlakeModexpDataOperation extends ModuleOperation { - public static final short MODEXP_COMPONENT_BYTE_SIZE = LLARGE * (INDEX_MAX_MODEXP + 1); - public static final short NB_ROWS_BLAKEMODEXP_MODEXP = - (INDEX_MAX_MODEXP_BASE + 1) - + (INDEX_MAX_MODEXP_EXPONENT + 1) - + (INDEX_MAX_MODEXP_MODULUS + 1) - + (INDEX_MAX_MODEXP_RESULT + 1); - public static final short NB_ROWS_BLAKEMODEPX_BLAKE = - (INDEX_MAX_BLAKE_DATA + 1) + (INDEX_MAX_BLAKE_PARAMS + 1) + (INDEX_MAX_BLAKE_RESULT + 1); +public abstract class BlakeModexpOperation extends ModuleOperation { public static final short BLAKE2f_R_SIZE = 4; public static final short BLAKE2f_HASH_INPUT_OFFSET = BLAKE2f_R_SIZE; public static final short BLAKE2f_HASH_INPUT_SIZE = LLARGE * (INDEX_MAX_BLAKE_DATA + 1); public static final short BLAKE2f_HASH_OUTPUT_SIZE = LLARGE * (INDEX_MAX_BLAKE_RESULT + 1); + public static short numberOfRowsBlake() { + return (INDEX_MAX_BLAKE_DATA + 1) + (INDEX_MAX_BLAKE_PARAMS + 1) + (INDEX_MAX_BLAKE_RESULT + 1); + } + + public abstract short getIndexMaxModexpBase(); + + public abstract short getIndexMaxModexpExponent(); + + public abstract short getIndexMaxModexpModulus(); + + public abstract short getIndexMaxModexpResult(); + + public short numberOfRowsModexp() { + return (short) + ((getIndexMaxModexpBase() + 1) + + (getIndexMaxModexpExponent() + 1) + + (getIndexMaxModexpModulus() + 1) + + (getIndexMaxModexpResult() + 1)); + } + @Getter public final long id; public final Optional modexpMetaData; public final Optional blake2fComponents; - public BlakeModexpDataOperation(final ModexpMetadata modexpMetaData, final int id) { + public BlakeModexpOperation(final ModexpMetadata modexpMetaData, final int id) { this.id = id; this.modexpMetaData = Optional.of(modexpMetaData); this.blake2fComponents = Optional.empty(); } - public BlakeModexpDataOperation(final BlakeComponents blakeComponents, final int id) { + public BlakeModexpOperation(final BlakeComponents blakeComponents, final int id) { this.id = id; this.modexpMetaData = Optional.empty(); this.blake2fComponents = Optional.of(blakeComponents); @@ -78,7 +83,7 @@ public BlakeModexpDataOperation(final BlakeComponents blakeComponents, final int @Override protected int computeLineCount() { - return modexpMetaData.isPresent() ? NB_ROWS_BLAKEMODEXP_MODEXP : NB_ROWS_BLAKEMODEPX_BLAKE; + return modexpMetaData.isPresent() ? numberOfRowsModexp() : numberOfRowsBlake(); } void trace(Trace.Blake2fmodexpdata trace, final int stamp) { @@ -131,17 +136,19 @@ private void traceBlakeResult(Trace.Blake2fmodexpdata trace, int stamp) { } private void traceBase(Trace.Blake2fmodexpdata trace, final int stamp) { - final Bytes input = leftPadTo(modexpMetaData.get().base(), MODEXP_COMPONENT_BYTE_SIZE); - for (int index = 0; index <= INDEX_MAX_MODEXP_BASE; index++) { - commonTrace(trace, stamp, index, input, INDEX_MAX_MODEXP_BASE); + final Bytes input = + leftPadTo(modexpMetaData.get().base(), modexpMetaData.get().getMaxInputSize()); + for (int index = 0; index <= getIndexMaxModexpBase(); index++) { + commonTrace(trace, stamp, index, input, getIndexMaxModexpBase()); trace.phase(UnsignedByte.of(PHASE_MODEXP_BASE)).isModexpBase(true).fillAndValidateRow(); } } private void traceExponent(Trace.Blake2fmodexpdata trace, final int stamp) { - final Bytes input = leftPadTo(modexpMetaData.get().exp(), MODEXP_COMPONENT_BYTE_SIZE); - for (int index = 0; index <= INDEX_MAX_MODEXP_EXPONENT; index++) { - commonTrace(trace, stamp, index, input, INDEX_MAX_MODEXP_EXPONENT); + final Bytes input = + leftPadTo(modexpMetaData.get().exp(), modexpMetaData.get().getMaxInputSize()); + for (int index = 0; index <= getIndexMaxModexpExponent(); index++) { + commonTrace(trace, stamp, index, input, getIndexMaxModexpExponent()); trace .phase(UnsignedByte.of(PHASE_MODEXP_EXPONENT)) .isModexpExponent(true) @@ -150,17 +157,19 @@ private void traceExponent(Trace.Blake2fmodexpdata trace, final int stamp) { } private void traceModulus(Trace.Blake2fmodexpdata trace, final int stamp) { - final Bytes input = leftPadTo(modexpMetaData.get().mod(), MODEXP_COMPONENT_BYTE_SIZE); - for (int index = 0; index <= INDEX_MAX_MODEXP_MODULUS; index++) { - commonTrace(trace, stamp, index, input, INDEX_MAX_MODEXP_MODULUS); + final Bytes input = + leftPadTo(modexpMetaData.get().mod(), modexpMetaData.get().getMaxInputSize()); + for (int index = 0; index <= getIndexMaxModexpModulus(); index++) { + commonTrace(trace, stamp, index, input, getIndexMaxModexpModulus()); trace.phase(UnsignedByte.of(PHASE_MODEXP_MODULUS)).isModexpModulus(true).fillAndValidateRow(); } } private void traceModexpResult(Trace.Blake2fmodexpdata trace, final int stamp) { - final Bytes input = leftPadTo(modexpMetaData.get().rawResult(), MODEXP_COMPONENT_BYTE_SIZE); - for (int index = 0; index <= INDEX_MAX_MODEXP_RESULT; index++) { - commonTrace(trace, stamp, index, input, INDEX_MAX_MODEXP_RESULT); + final Bytes input = + leftPadTo(modexpMetaData.get().rawResult(), modexpMetaData.get().getMaxInputSize()); + for (int index = 0; index <= getIndexMaxModexpResult(); index++) { + commonTrace(trace, stamp, index, input, getIndexMaxModexpResult()); trace.phase(UnsignedByte.of(PHASE_MODEXP_RESULT)).isModexpResult(true).fillAndValidateRow(); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java new file mode 100644 index 0000000000..2a413e37ab --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java @@ -0,0 +1,55 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.blake2fmodexpdata; + +import static net.consensys.linea.zktracer.Trace.LLARGE; +import static net.consensys.linea.zktracer.TraceLondon.Blake2fmodexpdata.*; + +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; + +public class LondonBlakeModexpOperation extends BlakeModexpOperation { + + public LondonBlakeModexpOperation(LondonModexpMetadata modexpMetaData, int id) { + super(modexpMetaData, id); + } + + public LondonBlakeModexpOperation(BlakeComponents blakeComponents, int id) { + super(blakeComponents, id); + } + + public static short modexpComponentByteSize() { + return LLARGE * (INDEX_MAX_MODEXP + 1); + } + + @Override + public short getIndexMaxModexpBase() { + return INDEX_MAX_MODEXP_BASE; + } + + @Override + public short getIndexMaxModexpExponent() { + return INDEX_MAX_MODEXP_EXPONENT; + } + + @Override + public short getIndexMaxModexpModulus() { + return INDEX_MAX_MODEXP_MODULUS; + } + + @Override + public short getIndexMaxModexpResult() { + return INDEX_MAX_MODEXP_RESULT; + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java new file mode 100644 index 0000000000..a65d37fe25 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java @@ -0,0 +1,51 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.blake2fmodexpdata; + +import static net.consensys.linea.zktracer.Trace.LLARGE; +import static net.consensys.linea.zktracer.TraceOsaka.Blake2fmodexpdata.*; + +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; + +public class OsakaBlakeModexpOperation extends BlakeModexpOperation { + + public OsakaBlakeModexpOperation(OsakaModexpMetadata modexpMetaData, int id) { + super(modexpMetaData, id); + } + + public static short modexpComponentByteSize() { + return LLARGE * (INDEX_MAX_MODEXP + 1); + } + + @Override + public short getIndexMaxModexpBase() { + return INDEX_MAX_MODEXP_BASE; + } + + @Override + public short getIndexMaxModexpExponent() { + return INDEX_MAX_MODEXP_EXPONENT; + } + + @Override + public short getIndexMaxModexpModulus() { + return INDEX_MAX_MODEXP_MODULUS; + } + + @Override + public short getIndexMaxModexpResult() { + return INDEX_MAX_MODEXP_RESULT; + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/exp/ExpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/exp/ExpOperation.java index 1aa1d69345..775d355d48 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/exp/ExpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/exp/ExpOperation.java @@ -20,7 +20,7 @@ import static java.lang.Math.min; import static net.consensys.linea.zktracer.Trace.EXP_INST_EXPLOG; import static net.consensys.linea.zktracer.Trace.EXP_INST_MODEXPLOG; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; import static net.consensys.linea.zktracer.types.Conversions.bigIntegerToBytes; import java.math.BigInteger; @@ -34,7 +34,7 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ExplogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ModexpLogExpCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.types.EWord; import org.apache.tuweni.bytes.Bytes; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java index 2dddcbe219..1b653723bf 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java @@ -47,7 +47,7 @@ import net.consensys.linea.zktracer.module.ModuleName; import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.bin.Bin; -import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpData; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexp; import net.consensys.linea.zktracer.module.blockdata.module.Blockdata; import net.consensys.linea.zktracer.module.blockhash.Blockhash; import net.consensys.linea.zktracer.module.ecdata.EcData; @@ -342,9 +342,8 @@ public List getTracelessModules() { * those module are traced (and could be count) */ private final ShakiraData shakiraData; - private final BlakeModexpData blakeModexpData = - new BlakeModexpData( - wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + private final BlakeModexp blakeModexp = + new BlakeModexp(wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); public final EcData ecData = new EcData( wcp, @@ -375,7 +374,7 @@ public List realModule() { this, add, bin, - blakeModexpData, + blakeModexp, blockdata, blockhash, blsData, @@ -463,7 +462,7 @@ public Hub(final ChainConfig chain, Map historicalBlockHashes) { Stream.of( add, bin, - blakeModexpData, + blakeModexp, blockhash, /* WARN: must be called BEFORE WCP (for traceEndConflation) */ blsData, ecData, diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/exp/ModexpLogExpCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/exp/ModexpLogExpCall.java index 417fad81de..0fa5926630 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/exp/ModexpLogExpCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/exp/ModexpLogExpCall.java @@ -25,7 +25,7 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import net.consensys.linea.zktracer.Trace; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.types.EWord; import org.apache.tuweni.bytes.Bytes; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/MmuCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/MmuCall.java index 94c3e3594d..e748bed096 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/MmuCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/MmuCall.java @@ -19,13 +19,13 @@ import static net.consensys.linea.zktracer.Trace.*; import static net.consensys.linea.zktracer.Trace.Ecdata.*; import static net.consensys.linea.zktracer.module.Util.rightPaddedSlice; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.*; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.*; import static net.consensys.linea.zktracer.module.hub.Hub.newIdentifierFromStamp; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.PRC_RIPEMD_160; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.PRC_SHA2_256; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.EBS_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.MBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.EBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.MBS_MIN_OFFSET; import static net.consensys.linea.zktracer.runtime.callstack.CallFrame.extractContiguousLimbsFromMemory; import static net.consensys.linea.zktracer.types.Conversions.*; import static net.consensys.linea.zktracer.types.Utils.leftPadTo; @@ -44,9 +44,9 @@ import net.consensys.linea.zktracer.module.hub.fragment.TraceSubFragment; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.opcode.*; import net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.EllipticCurvePrecompileSubsection; -import net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.ModexpSubsection; +import net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.LondonModexpSubsection; import net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.PrecompileSubsection; import net.consensys.linea.zktracer.module.hub.signals.Exceptions; import net.consensys.linea.zktracer.module.hub.state.State; @@ -731,8 +731,8 @@ public static MmuCall partialCopyOfReturnDataforBlake( .referenceSize(subsection.returnAtCapacity()); } - public static MmuCall forModexpExtractBbs( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata metaData) { + public static MmuCall extractBbsForModexp( + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) @@ -742,8 +742,8 @@ public static MmuCall forModexpExtractBbs( .limb2(metaData.bbs().lo()); } - public static MmuCall forModexpExtractEbs( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata metaData) { + public static MmuCall extractEbsForModexp( + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) @@ -754,8 +754,8 @@ public static MmuCall forModexpExtractEbs( .limb2(metaData.ebs().lo()); } - public static MmuCall forModexpExtractMbs( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata metaData) { + public static MmuCall extractMbsForModexp( + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) @@ -767,7 +767,7 @@ public static MmuCall forModexpExtractMbs( } public static MmuCall forModexpLoadLead( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata metaData) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_MLOAD) .sourceId(hub.currentFrame().contextNumber()) .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) @@ -777,13 +777,13 @@ public static MmuCall forModexpLoadLead( } public static MmuCall forModexpExtractBase( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata modExpMetadata) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata modExpMetadata) { if (modExpMetadata.extractBase()) { return new MmuCall(hub, MMU_INST_MODEXP_DATA) .sourceId(hub.currentFrame().contextNumber()) // called at ContextReEntry .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) .targetId(subsection.exoModuleOperationId()) - .exoBytes(Optional.of(leftPadTo(modExpMetadata.base(), MODEXP_COMPONENT_BYTE_SIZE))) + .exoBytes(Optional.of(leftPadTo(modExpMetadata.base(), modExpMetadata.getMaxInputSize()))) .sourceOffset(EWord.of(BASE_MIN_OFFSET)) .size(modExpMetadata.bbs().toInt()) .referenceOffset(subsection.callDataOffset()) @@ -799,13 +799,13 @@ public static MmuCall forModexpExtractBase( } public static MmuCall forModexpExtractExponent( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata modExpMetadata) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata modExpMetadata) { if (modExpMetadata.extractExponent()) { return new MmuCall(hub, MMU_INST_MODEXP_DATA) .sourceId(hub.currentFrame().contextNumber()) // called at ContextReEntry .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) .targetId(subsection.exoModuleOperationId()) - .exoBytes(Optional.of(leftPadTo(modExpMetadata.exp(), MODEXP_COMPONENT_BYTE_SIZE))) + .exoBytes(Optional.of(leftPadTo(modExpMetadata.exp(), modExpMetadata.getMaxInputSize()))) .sourceOffset(EWord.of(BASE_MIN_OFFSET + modExpMetadata.bbs().toInt())) .size(modExpMetadata.ebs().toInt()) .referenceOffset(subsection.callDataOffset()) @@ -821,12 +821,12 @@ public static MmuCall forModexpExtractExponent( } public static MmuCall forModexpExtractModulus( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata modExpMetadata) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata modExpMetadata) { return new MmuCall(hub, MMU_INST_MODEXP_DATA) .sourceId(hub.currentFrame().contextNumber()) // called at ContextReEntry .sourceRamBytes(Optional.of(subsection.rawCallerMemory())) .targetId(subsection.exoModuleOperationId()) - .exoBytes(Optional.of(leftPadTo(modExpMetadata.mod(), MODEXP_COMPONENT_BYTE_SIZE))) + .exoBytes(Optional.of(leftPadTo(modExpMetadata.mod(), modExpMetadata.getMaxInputSize()))) .sourceOffset( EWord.of(BASE_MIN_OFFSET + modExpMetadata.bbs().toInt() + modExpMetadata.ebs().toInt())) .size(modExpMetadata.mbs().toInt()) @@ -837,29 +837,29 @@ public static MmuCall forModexpExtractModulus( } public static MmuCall forModexpFullResultCopy( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata modExpMetadata) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata modExpMetadata) { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(subsection.exoModuleOperationId()) .exoBytes( Optional.of( - leftPadTo(subsection.returnDataRange.extract(), MODEXP_COMPONENT_BYTE_SIZE))) + leftPadTo(subsection.returnDataRange.extract(), modExpMetadata.getMaxInputSize()))) .targetId(subsection.returnDataContextNumber()) .targetRamBytes(Optional.of(Bytes.EMPTY)) - .size(MODEXP_COMPONENT_BYTE_SIZE) + .size(modExpMetadata.getMaxInputSize()) .phase(PHASE_MODEXP_RESULT) .setBlakeModexp(); } public static MmuCall forModexpPartialResultCopy( - final Hub hub, final ModexpSubsection subsection, final ModexpMetadata modExpMetadata) { + final Hub hub, final LondonModexpSubsection subsection, final ModexpMetadata modExpMetadata) { return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(subsection.exoModuleOperationId()) .sourceRamBytes( Optional.of( - leftPadTo(subsection.returnDataRange.extract(), MODEXP_COMPONENT_BYTE_SIZE))) + leftPadTo(subsection.returnDataRange.extract(), modExpMetadata.getMaxInputSize()))) .targetId(hub.currentFrame().contextNumber()) .targetRamBytes(Optional.of(subsection.rawCallerMemory())) - .sourceOffset(EWord.of(MODEXP_COMPONENT_BYTE_SIZE - modExpMetadata.mbs().toInt())) + .sourceOffset(EWord.of(modExpMetadata.getMaxInputSize() - modExpMetadata.mbs().toInt())) .size(modExpMetadata.mbs().toInt()) .referenceOffset(subsection.returnAtOffset()) .referenceSize(subsection.returnAtCapacity()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpCallDataSizeOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpCallDataSizeOobCall.java index ece03cb4fb..0aeae28744 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpCallDataSizeOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpCallDataSizeOobCall.java @@ -17,7 +17,7 @@ import static net.consensys.linea.zktracer.Trace.OOB_INST_MODEXP_CDS; import static net.consensys.linea.zktracer.Trace.Oob.CT_MAX_MODEXP_CDS; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.*; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.*; import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; import static net.consensys.linea.zktracer.types.Conversions.*; @@ -28,7 +28,7 @@ import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.mod.Mod; import net.consensys.linea.zktracer.module.wcp.Wcp; import net.consensys.linea.zktracer.opcode.OpCodeData; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpExtractOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpExtractOobCall.java index 80c2313dfa..e954339a7a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpExtractOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpExtractOobCall.java @@ -17,7 +17,7 @@ import static net.consensys.linea.zktracer.Trace.OOB_INST_MODEXP_EXTRACT; import static net.consensys.linea.zktracer.Trace.Oob.CT_MAX_MODEXP_EXTRACT; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToIsZero; import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; import static net.consensys.linea.zktracer.types.Conversions.*; @@ -29,7 +29,7 @@ import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.mod.Mod; import net.consensys.linea.zktracer.module.oob.OobExoCall; import net.consensys.linea.zktracer.module.wcp.Wcp; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpLeadOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpLeadOobCall.java index 79078abcdf..fe443ffb39 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpLeadOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpLeadOobCall.java @@ -18,8 +18,8 @@ import static net.consensys.linea.zktracer.Trace.OOB_INST_MODEXP_LEAD; import static net.consensys.linea.zktracer.Trace.Oob.CT_MAX_MODEXP_LEAD; import static net.consensys.linea.zktracer.Trace.WORD_SIZE; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.EBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.EBS_MIN_OFFSET; import static net.consensys.linea.zktracer.module.oob.OobExoCall.*; import static net.consensys.linea.zktracer.types.Conversions.*; @@ -32,7 +32,7 @@ import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.mod.Mod; import net.consensys.linea.zktracer.module.oob.OobExoCall; import net.consensys.linea.zktracer.module.wcp.Wcp; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java index f957d0aca1..ddb2fe1509 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java @@ -33,7 +33,7 @@ import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.mod.Mod; import net.consensys.linea.zktracer.module.oob.OobExoCall; import net.consensys.linea.zktracer.module.wcp.Wcp; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java new file mode 100644 index 0000000000..1e4c14f1a4 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java @@ -0,0 +1,84 @@ +/* + * Copyright ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; + +import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToIsZero; +import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; +import static net.consensys.linea.zktracer.types.Conversions.*; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import net.consensys.linea.zktracer.module.add.Add; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; +import net.consensys.linea.zktracer.module.hub.Hub; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; +import net.consensys.linea.zktracer.module.mod.Mod; +import net.consensys.linea.zktracer.module.oob.OobExoCall; +import net.consensys.linea.zktracer.module.wcp.Wcp; +import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.evm.frame.MessageFrame; + +@Getter +@Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +public class LondonModexpXbsOobCall extends ModexpXbsOobCall { + + public LondonModexpXbsOobCall(LondonModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { + super(modexpMetaData, modexpXbsCase); + } + + protected LondonModexpMetadata getForkAppropriateModexpMetadata() { + return (LondonModexpMetadata) this.modexpMetadata; + } + + public int modexpComponentByteSize() { + return LondonBlakeModexpOperation.modexpComponentByteSize(); + } + + @Override + public void setInputData(MessageFrame frame, Hub hub) {} + + @Override + public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { + // row i + final OobExoCall xbsVsModexpComponentByteSize = + callToLT(wcp, xbs(), Bytes.ofUnsignedInt(modexpComponentByteSize() + 1)); + exoCalls.add(xbsVsModexpComponentByteSize); + + // row i + 1 + final OobExoCall compareXbsYbsCall = callToLT(wcp, xbs().lo(), ybsLo()); + exoCalls.add(compareXbsYbsCall); + final boolean comp = bytesToBoolean(compareXbsYbsCall.result()); + setMaxXbsYbs(computeMax() ? (comp ? ybsLo() : xbs().lo()) : Bytes.EMPTY); + + // row i + 2 + final OobExoCall xbsNonZerCall = callToIsZero(wcp, xbs().lo()); + exoCalls.add(xbsNonZerCall); + setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZerCall.result()) : false); + } + + @Override + protected boolean xbsIsWithinBounds() { + return false; + } + + @Override + protected boolean xbsIsOutOfBounds() { + return false; + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java similarity index 73% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpXbsOobCall.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java index 1f2239fa3b..c90b11545f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java @@ -13,7 +13,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp; +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; import static net.consensys.linea.zktracer.Trace.OOB_INST_MODEXP_XBS; import static net.consensys.linea.zktracer.Trace.Oob.CT_MAX_MODEXP_XBS; @@ -28,7 +28,8 @@ import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.mod.Mod; import net.consensys.linea.zktracer.module.oob.OobExoCall; import net.consensys.linea.zktracer.module.wcp.Wcp; @@ -39,7 +40,7 @@ @Getter @Setter @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) -public class ModexpXbsOobCall extends OobCall { +public abstract class ModexpXbsOobCall extends OobCall { public static final short NB_ROWS_OOB_MODEXP_XBS = CT_MAX_MODEXP_XBS + 1; @@ -49,7 +50,7 @@ public class ModexpXbsOobCall extends OobCall { // Outputs Bytes maxXbsYbs; - boolean xbsNonZero; + boolean xbsNormalizedNonZero; public ModexpXbsOobCall(ModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { super(); @@ -57,13 +58,19 @@ public ModexpXbsOobCall(ModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCa this.modexpXbsCase = modexpXbsCase; } + protected abstract ModexpMetadata getForkAppropriateModexpMetadata(); + + public abstract int modexpComponentByteSize(); + @Override public void setInputData(MessageFrame frame, Hub hub) {} @Override public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { // row i - exoCalls.add(callToLT(wcp, xbs(), Bytes.ofUnsignedInt(513))); + final OobExoCall xbsVsModexpComponentByteSize = + callToLT(wcp, xbs(), Bytes.ofUnsignedInt(modexpComponentByteSize() + 1)); + exoCalls.add(xbsVsModexpComponentByteSize); // row i + 1 final OobExoCall compareXbsYbsCall = callToLT(wcp, xbs().lo(), ybsLo()); @@ -74,7 +81,7 @@ public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { // row i + 2 final OobExoCall xbsNonZerCall = callToIsZero(wcp, xbs().lo()); exoCalls.add(xbsNonZerCall); - setXbsNonZero(computeMax() ? !bytesToBoolean(xbsNonZerCall.result()) : false); + setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZerCall.result()) : false); } @Override @@ -82,22 +89,22 @@ public int ctMax() { return CT_MAX_MODEXP_XBS; } - private EWord xbs() { - return switch (modexpXbsCase) { - case OOB_INST_MODEXP_BBS -> modexpMetadata.bbs(); - case OOB_INST_MODEXP_EBS -> modexpMetadata.ebs(); - case OOB_INST_MODEXP_MBS -> modexpMetadata.mbs(); - }; + protected EWord xbs() { + return modexpMetadata.xbs(modexpXbsCase); } - private Bytes ybsLo() { + protected abstract boolean xbsIsWithinBounds(); + + protected abstract boolean xbsIsOutOfBounds(); + + public Bytes ybsLo() { return switch (modexpXbsCase) { case OOB_INST_MODEXP_BBS, OOB_INST_MODEXP_EBS -> Bytes.EMPTY; - case OOB_INST_MODEXP_MBS -> modexpMetadata.bbs().lo(); + case OOB_INST_MODEXP_MBS -> getForkAppropriateModexpMetadata().normalizedBbs(); }; } - private boolean computeMax() { + protected boolean computeMax() { return switch (modexpXbsCase) { case OOB_INST_MODEXP_BBS, OOB_INST_MODEXP_EBS -> false; case OOB_INST_MODEXP_MBS -> true; @@ -113,8 +120,10 @@ public Trace.Oob trace(Trace.Oob trace) { .data2(xbs().lo()) .data3(ybsLo()) .data4(booleanToBytes(computeMax())) + .data5(booleanToBytes(xbsIsWithinBounds())) + .data6(booleanToBytes(xbsIsOutOfBounds())) .data7(maxXbsYbs) - .data8(booleanToBytes(xbsNonZero)); + .data8(booleanToBytes(xbsNormalizedNonZero)); } @Override @@ -126,7 +135,9 @@ public Trace.Hub trace(Trace.Hub trace) { .pMiscOobData2(xbs().lo()) .pMiscOobData3(ybsLo()) .pMiscOobData4(booleanToBytes(computeMax())) + .pMiscOobData5(booleanToBytes(xbsIsWithinBounds())) + .pMiscOobData6(booleanToBytes(xbsIsOutOfBounds())) .pMiscOobData7(maxXbsYbs) - .pMiscOobData8(booleanToBytes(xbsNonZero)); + .pMiscOobData8(booleanToBytes(xbsNormalizedNonZero)); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java new file mode 100644 index 0000000000..d993079d86 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java @@ -0,0 +1,97 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; + +import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToIsZero; +import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; +import static net.consensys.linea.zktracer.types.Conversions.bytesToBoolean; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import net.consensys.linea.zktracer.Trace; +import net.consensys.linea.zktracer.module.add.Add; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.OsakaBlakeModexpOperation; +import net.consensys.linea.zktracer.module.hub.Hub; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; +import net.consensys.linea.zktracer.module.mod.Mod; +import net.consensys.linea.zktracer.module.oob.OobExoCall; +import net.consensys.linea.zktracer.module.wcp.Wcp; +import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.evm.frame.MessageFrame; + +@Getter +@Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +public class OsakaModexpXbsOobCall extends ModexpXbsOobCall { + + public OsakaModexpXbsOobCall(OsakaModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { + super(modexpMetaData, modexpXbsCase); + } + + protected OsakaModexpMetadata getForkAppropriateModexpMetadata() { + return (OsakaModexpMetadata) modexpMetadata; + } + + public int modexpComponentByteSize() { + return OsakaBlakeModexpOperation.modexpComponentByteSize(); + } + + @Override + public void setInputData(MessageFrame frame, Hub hub) {} + + @Override + public Trace.Oob trace(Trace.Oob trace) { + return null; + } + + @Override + public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { + // row i + final OobExoCall xbsVsModexpComponentByteSize = + callToLT(wcp, xbs(), Bytes.ofUnsignedInt(modexpComponentByteSize() + 1)); + exoCalls.add(xbsVsModexpComponentByteSize); + + // row i + 1 + final Bytes xbsNormalized = getForkAppropriateModexpMetadata().normalize(modexpXbsCase); + final Bytes ybsNormalized = xbsIsWithinBounds() ? ybsLo() : Bytes.EMPTY; + final OobExoCall xbsNormalizedLtYbsNormalizedCall = callToLT(wcp, xbsNormalized, ybsNormalized); + exoCalls.add(xbsNormalizedLtYbsNormalizedCall); + final boolean isXbsNormalizedLtYbsNormalized = + bytesToBoolean(xbsNormalizedLtYbsNormalizedCall.result()); + if (computeMax() && xbsIsWithinBounds()) { + setMaxXbsYbs(isXbsNormalizedLtYbsNormalized ? ybsNormalized : xbsNormalized); + } else { + setMaxXbsYbs(Bytes.EMPTY); + } + + // row i + 2 + final OobExoCall xbsNormalizedIszeroCall = callToIsZero(wcp, xbsNormalized); + exoCalls.add(xbsNormalizedIszeroCall); + setXbsNormalizedNonZero( + computeMax() ? !bytesToBoolean(xbsNormalizedIszeroCall.result()) : false); + } + + @Override + protected boolean xbsIsWithinBounds() { + return getForkAppropriateModexpMetadata().tracedIsWithinBounds(modexpXbsCase); + } + + @Override + protected boolean xbsIsOutOfBounds() { + return getForkAppropriateModexpMetadata().tracedIsOutOfBounds(modexpXbsCase); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java index 0d2061189e..235fa713cc 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java @@ -32,7 +32,7 @@ import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpExtractOobCall.NB_ROWS_OOB_MODEXP_EXTRACT; import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpLeadOobCall.NB_ROWS_OOB_MODEXP_LEAD; import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpPricingOobCall.NB_ROWS_OOB_MODEXP_PRICING; -import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsOobCall.NB_ROWS_OOB_MODEXP_XBS; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.LondonModexpXbsOobCall.NB_ROWS_OOB_MODEXP_XBS; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.*; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.*; import static net.consensys.linea.zktracer.module.mod.ModOperation.NB_ROWS_MOD; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java new file mode 100644 index 0000000000..06b76e8320 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java @@ -0,0 +1,42 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata; + +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.types.MemoryRange; +import org.apache.tuweni.bytes.Bytes; + +public class LondonModexpMetadata extends ModexpMetadata { + + public LondonModexpMetadata(MemoryRange callDataRange) { + super(callDataRange); + } + + @Override + public boolean unprovableModexp() { + return bbs().toUnsignedBigInteger().compareTo(getMaxInputSizeBigInteger()) > 0 + || mbs().toUnsignedBigInteger().compareTo(getMaxInputSizeBigInteger()) > 0 + || ebs().toUnsignedBigInteger().compareTo(getMaxInputSizeBigInteger()) > 0; + } + + public int getMaxInputSize() { + return 512; + } + + @Override + public Bytes normalize(ModexpXbsCase modexpXbsCase) { + return xbs(modexpXbsCase).lo(); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/ModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/ModexpMetadata.java similarity index 78% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/ModexpMetadata.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/ModexpMetadata.java index 915ce8f52f..c6e4e5a6d7 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/ModexpMetadata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/ModexpMetadata.java @@ -13,11 +13,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.module.hub.precompiles; +package net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata; +import static net.consensys.linea.zktracer.Trace.LLARGE; import static net.consensys.linea.zktracer.Trace.WORD_SIZE; import static net.consensys.linea.zktracer.module.Util.rightPaddedSlice; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.MODEXP_COMPONENT_BYTE_SIZE; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase.*; import static net.consensys.linea.zktracer.types.Conversions.safeLongToInt; import static net.consensys.linea.zktracer.types.Utils.rightPadTo; @@ -26,6 +27,7 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; import net.consensys.linea.zktracer.types.EWord; import net.consensys.linea.zktracer.types.MemoryRange; import org.apache.tuweni.bytes.Bytes; @@ -33,18 +35,40 @@ @Getter @Accessors(fluent = true) -public class ModexpMetadata { +public abstract class ModexpMetadata { public static final int BBS_MIN_OFFSET = 0x00; public static final int EBS_MIN_OFFSET = 0x20; public static final int MBS_MIN_OFFSET = 0x40; public static final int BASE_MIN_OFFSET = 0x60; - public static BigInteger MODEXP_MAX_PROVABLE_INPUT_SIZE = - BigInteger.valueOf(MODEXP_COMPONENT_BYTE_SIZE); private static int MODEXP_LARGE_INPUT_BYTE_WIDTH = 32; private final MemoryRange callDataRange; @Setter private Bytes rawResult; + public short getNumberOfRowsForModexp() { + return (short) (4 * (getMaxInputSize() / LLARGE)); + } + + public abstract int getMaxInputSize(); + + public BigInteger getMaxInputSizeBigInteger() { + return BigInteger.valueOf(getMaxInputSize()); + } + + public abstract Bytes normalize(ModexpXbsCase modexpXbsCase); + + public Bytes normalizedBbs() { + return normalize(OOB_INST_MODEXP_BBS); + } + + public Bytes normalizedEbs() { + return normalize(OOB_INST_MODEXP_EBS); + } + + public Bytes normalizedMbs() { + return normalize(OOB_INST_MODEXP_MBS); + } + public ModexpMetadata(MemoryRange callDataRange) { this.callDataRange = callDataRange; } @@ -105,6 +129,14 @@ public EWord mbs() { return EWord.of(rawMbs().shiftRight(mbsShift()).shiftLeft(mbsShift())); } + public EWord xbs(ModexpXbsCase modexpXbsCase) { + return switch (modexpXbsCase) { + case OOB_INST_MODEXP_BBS -> bbs(); + case OOB_INST_MODEXP_EBS -> ebs(); + case OOB_INST_MODEXP_MBS -> mbs(); + }; + } + public int bbsInt() { return Words.clampedToInt(bbs()); } @@ -175,16 +207,20 @@ public EWord rawLeadingWord() { WORD_SIZE)); } - public boolean unprovableModexp() { - return bbs().toUnsignedBigInteger().compareTo(MODEXP_MAX_PROVABLE_INPUT_SIZE) > 0 - || mbs().toUnsignedBigInteger().compareTo(MODEXP_MAX_PROVABLE_INPUT_SIZE) > 0 - || ebs().toUnsignedBigInteger().compareTo(MODEXP_MAX_PROVABLE_INPUT_SIZE) > 0; - } + public abstract boolean unprovableModexp(); - /** This is to detect large (ie > 32 bytes = 216 bit) modexp for the prover */ + /** This is to detect large (ie > 32 bytes = 256 bit) modexp for the prover */ public boolean largeModexp() { return bbsInt() > MODEXP_LARGE_INPUT_BYTE_WIDTH || ebsInt() > MODEXP_LARGE_INPUT_BYTE_WIDTH || mbsInt() > MODEXP_LARGE_INPUT_BYTE_WIDTH; } + + public boolean tracedIsWithinBounds(ModexpXbsCase modexpXbsCase) { + return false; + } + + public boolean tracedIsOutOfBounds(ModexpXbsCase modexpXbsCase) { + return false; + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java new file mode 100644 index 0000000000..69b47ee993 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java @@ -0,0 +1,54 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata; + +import static net.consensys.linea.zktracer.TraceOsaka.EIP_7823_MODEXP_UPPER_BYTE_SIZE_BOUND; + +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.types.MemoryRange; +import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.evm.internal.Words; + +public class OsakaModexpMetadata extends ModexpMetadata { + public OsakaModexpMetadata(MemoryRange callDataRange) { + super(callDataRange); + } + + /** Linea supports the full breadth of Osaka-EVM-legal MODEXP inputs. */ + @Override + public boolean unprovableModexp() { + return false; + } + + @Override + public boolean tracedIsWithinBounds(ModexpXbsCase modexpXbsCase) { + return (Words.clampedToInt(xbs(modexpXbsCase)) <= getMaxInputSize()); + } + + @Override + public boolean tracedIsOutOfBounds(ModexpXbsCase modexpXbsCase) { + return !tracedIsWithinBounds(modexpXbsCase); + } + + @Override + public int getMaxInputSize() { + return EIP_7823_MODEXP_UPPER_BYTE_SIZE_BOUND; + } + + @Override + public Bytes normalize(ModexpXbsCase modexpXbsCase) { + return tracedIsWithinBounds(modexpXbsCase) ? xbs(modexpXbsCase).toBytes() : Bytes.EMPTY; + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java index b43bc730ce..9b49bb0357 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java @@ -16,16 +16,16 @@ package net.consensys.linea.zktracer.module.hub.section.call; import static com.google.common.base.Preconditions.*; +import static net.consensys.linea.zktracer.Fork.forkPredatesOsaka; import static net.consensys.linea.zktracer.module.hub.AccountSnapshot.canonical; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.CallScenarioFragment.CallScenario.*; +import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.addressToPrecompileFlag; import static net.consensys.linea.zktracer.opcode.OpCode.CALL; import static net.consensys.linea.zktracer.types.AddressUtils.*; import static net.consensys.linea.zktracer.types.Conversions.bytesToBoolean; import static org.hyperledger.besu.datatypes.Address.*; -import java.util.Map; import java.util.Optional; -import java.util.function.BiFunction; import lombok.Getter; import lombok.Setter; @@ -89,27 +89,6 @@ public class CallSection extends TraceSection EndTransactionDefer { public static final short NB_ROWS_HUB_CALL = 11; // 2 stack + up to 9 for SMC failure will revert - // Note: in case of precompile call there could be more rows. - private static final Map> - ADDRESS_TO_PRECOMPILE = - Map.ofEntries( - Map.entry(ECREC, EllipticCurvePrecompileSubsection::new), - Map.entry(SHA256, ShaTwoOrRipemdSubSection::new), - Map.entry(RIPEMD160, ShaTwoOrRipemdSubSection::new), - Map.entry(ID, IdentitySubsection::new), - Map.entry(MODEXP, ModexpSubsection::new), - Map.entry(ALTBN128_ADD, EllipticCurvePrecompileSubsection::new), - Map.entry(ALTBN128_MUL, EllipticCurvePrecompileSubsection::new), - Map.entry(ALTBN128_PAIRING, EllipticCurvePrecompileSubsection::new), - Map.entry(BLAKE2B_F_COMPRESSION, BlakeSubsection::new), - Map.entry(KZG_POINT_EVAL, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_G1ADD, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_G1MULTIEXP, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_G2ADD, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_G2MULTIEXP, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_PAIRING, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_MAP_FP_TO_G1, EllipticCurvePrecompileSubsection::new), - Map.entry(BLS12_MAP_FP2_TO_G2, EllipticCurvePrecompileSubsection::new)); public Optional
precompileAddress; @@ -377,14 +356,42 @@ private void smcProcessing(Hub hub, MessageFrame frame) { hub.romLex().callRomLex(frame); } + private PrecompileSubsection getPrecompileSubsection(Hub hub) { + return switch (addressToPrecompileFlag(calleeFirst.address())) { + case PRC_ECRECOVER, + PRC_POINT_EVALUATION, + PRC_BLS_G1_ADD, + PRC_BLS_G1_MSM, + PRC_BLS_G2_ADD, + PRC_BLS_G2_MSM, + PRC_BLS_PAIRING_CHECK, + PRC_BLS_MAP_FP_TO_G1, + PRC_BLS_MAP_FP2_TO_G2, + PRC_ECADD, + PRC_ECMUL, + PRC_ECPAIRING -> new EllipticCurvePrecompileSubsection(hub, this); + case PRC_SHA2_256, PRC_RIPEMD_160 -> new ShaTwoOrRipemdSubSection(hub, this); + case PRC_IDENTITY -> new IdentitySubsection(hub, this); + case PRC_MODEXP -> { + if (forkPredatesOsaka(hub.fork)) { + yield new LondonModexpSubsection(hub, this); + } else { + yield new OsakaModexpSubsection(hub, this); + } + } + case PRC_BLAKE2F -> new BlakeSubsection(hub, this); + }; + } + private void prcProcessing(Hub hub) { - precompileSubsection = ADDRESS_TO_PRECOMPILE.get(calleeFirst.address()).apply(hub, this); + precompileSubsection = getPrecompileSubsection(hub); + hub.defers().scheduleForContextEntry(this); hub.defers().scheduleForContextReEntry(this, hub.currentFrame()); // In case of arguments too large for MODEXP, transaction will be popped anyway, and resolving // some defers will create NPE - if (precompileSubsection instanceof ModexpSubsection - && ((ModexpSubsection) precompileSubsection).transactionWillBePopped) { + if (precompileSubsection instanceof LondonModexpSubsection + && ((LondonModexpSubsection) precompileSubsection).transactionWillBePopped) { hub.defers().unscheduleForContextReEntry(this, hub.currentFrame()); hub.defers().unscheduleForPostTransaction(this); System.out.println( @@ -394,11 +401,20 @@ private void prcProcessing(Hub hub) { + "\n\tABS_TX_NUM = " + hub.txStack().currentAbsNumber() + "\n\tbase byte size = " - + ((ModexpSubsection) precompileSubsection).modexpMetaData.bbs().toDecimalString() + + ((LondonModexpSubsection) precompileSubsection) + .modexpMetaData + .bbs() + .toDecimalString() + "\n\texp byte size = " - + ((ModexpSubsection) precompileSubsection).modexpMetaData.ebs().toDecimalString() + + ((LondonModexpSubsection) precompileSubsection) + .modexpMetaData + .ebs() + .toDecimalString() + "\n\tmod byte size = " - + ((ModexpSubsection) precompileSubsection).modexpMetaData.mbs().toDecimalString() + + ((LondonModexpSubsection) precompileSubsection) + .modexpMetaData + .mbs() + .toDecimalString() + "\nTransaction must be popped!"); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java index b66ee51e33..99a0bf20e4 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java @@ -16,7 +16,7 @@ package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; import static com.google.common.base.Preconditions.checkArgument; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_R_SIZE; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_R_SIZE; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.PRC_FAILURE_KNOWN_TO_HUB; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.PRC_FAILURE_KNOWN_TO_RAM; @@ -123,7 +123,7 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { callData.slice(0, BLAKE2f_R_SIZE), callData.slice(212, 1), extractReturnData()); - hub.blakeModexpData().callBlake(blake2f, this.exoModuleOperationId()); + hub.blakeModexp().callBlake(blake2f, this.exoModuleOperationId()); } @Override diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java similarity index 87% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java index 025d66ebcc..2c9f722cbe 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java @@ -16,11 +16,11 @@ package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; import static com.google.common.base.Preconditions.checkArgument; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractBbsForModexp; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractEbsForModexp; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractMbsForModexp; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractBase; -import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractBbs; -import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractEbs; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractExponent; -import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractMbs; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpExtractModulus; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpFullResultCopy; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.forModexpLoadLead; @@ -39,59 +39,58 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpExtractOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpLeadOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpPricingOobCall; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsOobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.LondonModexpXbsOobCall; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.CallSection; import net.consensys.linea.zktracer.runtime.callstack.CallFrame; import org.apache.tuweni.bytes.Bytes; -public class ModexpSubsection extends PrecompileSubsection { +public class LondonModexpSubsection extends PrecompileSubsection { public static final short NB_ROWS_HUB_PRC_MODEXP = 13; // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) - public final ModexpMetadata modexpMetaData; + public final LondonModexpMetadata modexpMetaData; private ModexpPricingOobCall sixthOobCall; private ImcFragment seventhImcFragment; public boolean transactionWillBePopped = false; - public ModexpSubsection(final Hub hub, final CallSection callSection) { + public LondonModexpSubsection(final Hub hub, final CallSection callSection) { super(hub, callSection); - modexpMetaData = new ModexpMetadata(getCallDataRange()); + modexpMetaData = new LondonModexpMetadata(getCallDataRange()); + if (modexpMetaData.unprovableModexp()) { hub.modexpEffectiveCall().detectEvent(); hub.defers().unscheduleForContextReEntry(this, hub.currentFrame()); transactionWillBePopped = true; return; } - firstImcFragment.callOob(new ModexpCallDataSizeOobCall(modexpMetaData)); final ImcFragment secondImcFragment = ImcFragment.empty(hub); fragments().add(secondImcFragment); if (modexpMetaData.extractBbs()) { - final MmuCall mmuCall = forModexpExtractBbs(hub, this, modexpMetaData); + final MmuCall mmuCall = extractBbsForModexp(hub, this, modexpMetaData); secondImcFragment.callMmu(mmuCall); } - - secondImcFragment.callOob(new ModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_BBS)); + secondImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_BBS)); final ImcFragment thirdImcFragment = ImcFragment.empty(hub); fragments().add(thirdImcFragment); if (modexpMetaData.extractEbs()) { - final MmuCall mmuCall = forModexpExtractEbs(hub, this, modexpMetaData); + final MmuCall mmuCall = extractEbsForModexp(hub, this, modexpMetaData); thirdImcFragment.callMmu(mmuCall); } - thirdImcFragment.callOob(new ModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_EBS)); + thirdImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_EBS)); final ImcFragment fourthImcFragment = ImcFragment.empty(hub); fragments().add(fourthImcFragment); if (modexpMetaData.extractMbs()) { - final MmuCall mmuCall = forModexpExtractMbs(hub, this, modexpMetaData); + final MmuCall mmuCall = extractMbsForModexp(hub, this, modexpMetaData); fourthImcFragment.callMmu(mmuCall); } - fourthImcFragment.callOob(new ModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_MBS)); + fourthImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_MBS)); final ImcFragment fifthImcFragment = ImcFragment.empty(hub); fragments().add(fifthImcFragment); @@ -132,7 +131,7 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { final Bytes returnData = extractReturnData(); modexpMetaData.rawResult(returnData); - hub.blakeModexpData().callModexp(modexpMetaData, exoModuleOperationId()); + hub.blakeModexp().callModexp(modexpMetaData, exoModuleOperationId()); fragments().add(seventhImcFragment); if (modexpMetaData.extractModulus()) { diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java new file mode 100644 index 0000000000..173d1e6e9c --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java @@ -0,0 +1,24 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; + +import net.consensys.linea.zktracer.module.hub.Hub; +import net.consensys.linea.zktracer.module.hub.section.call.CallSection; + +public class OsakaModexpSubsection extends PrecompileSubsection { + public OsakaModexpSubsection(Hub hub, CallSection callSection) { + super(hub, callSection); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java index e32fff0bf5..8f5d6f1135 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java @@ -15,7 +15,6 @@ package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; import static com.google.common.base.Preconditions.*; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.MODEXP_COMPONENT_BYTE_SIZE; import static net.consensys.linea.zktracer.module.hub.Hub.newIdentifierFromStamp; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.*; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.*; @@ -157,23 +156,24 @@ private void setReturnDataRange(MessageFrame frame, boolean callSuccess) { } // successful PRC_CALL to MODEXP - final int mbs = ((ModexpSubsection) this).modexpMetaData.mbsInt(); + final LondonModexpSubsection modexpSubsection = (LondonModexpSubsection) this; + final int mbs = modexpSubsection.modexpMetaData.mbsInt(); + final int maxInputSize = modexpSubsection.modexpMetaData.getMaxInputSize(); final Bytes returnData = frame.getReturnData(); checkState( - 0 <= mbs && mbs <= MODEXP_COMPONENT_BYTE_SIZE, + 0 <= mbs && mbs <= maxInputSize, "MODEXP PrecompileSubsection: invalid mbs: %s not in range [0,%s]", mbs, - MODEXP_COMPONENT_BYTE_SIZE); + maxInputSize); checkState( returnData.size() == mbs, "MODEXP PrecompileSubsection: return data size %s does not agree with mbs %s", returnData.size(), mbs); - final Bytes leftPaddedReturnData = leftPadTo(returnData, MODEXP_COMPONENT_BYTE_SIZE); + final Bytes leftPaddedReturnData = leftPadTo(returnData, maxInputSize); returnDataRange = - new MemoryRange( - returnDataContextNumber(), MODEXP_COMPONENT_BYTE_SIZE - mbs, mbs, leftPaddedReturnData); + new MemoryRange(returnDataContextNumber(), maxInputSize - mbs, mbs, leftPaddedReturnData); } public int exoModuleOperationId() { diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/limits/precompiles/BlakeRounds.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/limits/precompiles/BlakeRounds.java index 5cc4d4bce0..7d06b780dd 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/limits/precompiles/BlakeRounds.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/limits/precompiles/BlakeRounds.java @@ -17,7 +17,7 @@ import static java.lang.Integer.MAX_VALUE; import static net.consensys.linea.zktracer.module.ModuleName.PRECOMPILE_BLAKE_ROUNDS; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_R_SIZE; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_R_SIZE; import java.math.BigInteger; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/oob/OobOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/oob/OobOperation.java index c90b808076..d569be4d73 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/oob/OobOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/oob/OobOperation.java @@ -17,8 +17,8 @@ import static com.google.common.math.BigIntegerMath.log2; import static java.lang.Math.min; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.EBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.EBS_MIN_OFFSET; import static net.consensys.linea.zktracer.types.Utils.rightPadTo; import java.math.BigInteger; @@ -31,7 +31,7 @@ import net.consensys.linea.zktracer.container.ModuleOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.frame.MessageFrame; diff --git a/arithmetization/src/test/java/net/consensys/linea/ZkCounterTest.java b/arithmetization/src/test/java/net/consensys/linea/ZkCounterTest.java index 1a49e7fbf8..3c9c41c090 100644 --- a/arithmetization/src/test/java/net/consensys/linea/ZkCounterTest.java +++ b/arithmetization/src/test/java/net/consensys/linea/ZkCounterTest.java @@ -19,8 +19,6 @@ import static net.consensys.linea.zktracer.Utils.call; import static net.consensys.linea.zktracer.Utils.delegateCall; import static net.consensys.linea.zktracer.module.ModuleName.*; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.*; -import static org.hyperledger.besu.datatypes.Address.*; import static org.junit.jupiter.api.Assertions.*; import java.util.List; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/BlakeRoundsTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/BlakeRoundsTests.java index 0d497b93fd..cf591c0940 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/BlakeRoundsTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/BlakeRoundsTests.java @@ -16,7 +16,7 @@ package net.consensys.linea.zktracer.module.limits.precompileLimits; import static java.lang.Integer.MAX_VALUE; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_R_SIZE; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_R_SIZE; import static net.consensys.linea.zktracer.types.Utils.leftPadTo; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -39,7 +39,7 @@ public class BlakeRoundsTests extends TracerTestBase { @Test void checkWoCommit() { final ZkTracer state = new ZkTracer(chainConfig); - final BlakeRounds blakeRounds = state.getHub().blakeModexpData().blakeRounds(); + final BlakeRounds blakeRounds = state.getHub().blakeModexp().blakeRounds(); blakeRounds.addPrecompileLimit(ONE); assertThat(blakeRounds.lineCount()).isEqualTo(1); @@ -69,7 +69,7 @@ void checkWoCommit() { @Test void checkWithCommit() { final ZkTracer state = new ZkTracer(chainConfig); - final BlakeRounds blakeRounds = state.getHub().blakeModexpData().blakeRounds(); + final BlakeRounds blakeRounds = state.getHub().blakeModexp().blakeRounds(); blakeRounds.addPrecompileLimit(ONE); assertThat(blakeRounds.lineCount()).isEqualTo(1); diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/ModexpLimitsTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/ModexpLimitsTests.java index cced2d2f17..609ce3bb83 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/ModexpLimitsTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/module/limits/precompileLimits/ModexpLimitsTests.java @@ -15,8 +15,7 @@ package net.consensys.linea.zktracer.module.limits.precompileLimits; -import static net.consensys.linea.zktracer.module.ModuleName.*; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.*; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.*; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/BlakeTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/BlakeTests.java index 6b57600cd8..ace980d0c1 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/BlakeTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/BlakeTests.java @@ -15,7 +15,7 @@ package net.consensys.linea.zktracer.precompiles; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.BLAKE2f_HASH_OUTPUT_SIZE; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation.BLAKE2f_HASH_OUTPUT_SIZE; import static org.junit.jupiter.api.Assertions.assertEquals; import net.consensys.linea.reporting.TracerTestBase; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java index 9f51b83771..570f81c8bd 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java @@ -14,13 +14,13 @@ */ package net.consensys.linea.zktracer.precompiles; +import static net.consensys.linea.zktracer.Fork.*; import static net.consensys.linea.zktracer.instructionprocessing.utilities.MonoOpCodeSmcs.keyPair; import static net.consensys.linea.zktracer.instructionprocessing.utilities.MonoOpCodeSmcs.userAccount; -import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.MODEXP_COMPONENT_BYTE_SIZE; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BASE_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.BBS_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.EBS_MIN_OFFSET; -import static net.consensys.linea.zktracer.module.hub.precompiles.ModexpMetadata.MBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BASE_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.BBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.EBS_MIN_OFFSET; +import static net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata.MBS_MIN_OFFSET; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -30,6 +30,8 @@ import net.consensys.linea.UnitTestWatcher; import net.consensys.linea.reporting.TracerTestBase; import net.consensys.linea.testing.*; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.OsakaBlakeModexpOperation; import net.consensys.linea.zktracer.opcode.OpCode; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; @@ -78,6 +80,12 @@ void basicModexpTest(TestInfo testInfo) { @Test void basicNonTrivialModexpTest(TestInfo testInfo) { + + final int modexpComponentByteSize = + forkPredatesOsaka(chainConfig.fork) + ? LondonBlakeModexpOperation.modexpComponentByteSize() + : OsakaBlakeModexpOperation.modexpComponentByteSize(); + final int base = 2; final int exp = 5; final int mod = 7; @@ -101,7 +109,7 @@ void basicNonTrivialModexpTest(TestInfo testInfo) { .push(mod) .push(BASE_MIN_OFFSET + 2) .op(OpCode.MSTORE8) - .push(MODEXP_COMPONENT_BYTE_SIZE) // retLength + .push(modexpComponentByteSize) // retLength .push(0) // retOffset .push(BASE_MIN_OFFSET + 3) // argLength .push(0) // argOffset From 0bd9eefdc056fcc06e86484b22e4ad0c69abd675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Thu, 13 Nov 2025 21:21:44 +0100 Subject: [PATCH 4/9] various ... --- .../module/blake2fmodexpdata/BlakeModexp.java | 37 +++---- .../BlakeModexpOperation.java | 10 ++ .../blake2fmodexpdata/LondonBlakeModexp.java | 35 +++++++ .../LondonBlakeModexpOperation.java | 10 ++ .../blake2fmodexpdata/OsakaBlakeModexp.java | 35 +++++++ .../OsakaBlakeModexpOperation.java | 2 +- .../linea/zktracer/module/hub/Hub.java | 12 ++- .../linea/zktracer/module/hub/LondonHub.java | 16 +++ .../linea/zktracer/module/hub/OsakaHub.java | 16 +++ .../xbsOobCall/LondonModexpXbsOobCall.java | 6 +- .../xbsOobCall/OsakaModexpXbsOobCall.java | 2 +- .../modexpMetadata/OsakaModexpMetadata.java | 2 +- .../module/hub/section/call/CallSection.java | 14 ++- .../precompileSubsection/BlakeSubsection.java | 4 +- .../LondonModexpSubsection.java | 97 ++++++++++--------- .../ModexpSubsection.java | 44 +++++++++ .../OsakaModexpSubsection.java | 29 +++++- .../PrecompileSubsection.java | 6 +- 18 files changed, 287 insertions(+), 90 deletions(-) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexp.java create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexp.java create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java index 24e781c283..6d67d037d0 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexp.java @@ -29,16 +29,13 @@ import net.consensys.linea.zktracer.container.module.OperationListModule; import net.consensys.linea.zktracer.container.stacked.ModuleOperationStackedList; import net.consensys.linea.zktracer.module.ModuleName; -import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; -import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; -import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; import net.consensys.linea.zktracer.module.wcp.Wcp; @RequiredArgsConstructor @Getter @Accessors(fluent = true) -public class BlakeModexp implements OperationListModule { +public abstract class BlakeModexp implements OperationListModule { private final Wcp wcp; private final IncrementAndDetectModule modexpEffectiveCall; private final IncrementingModule modexpLargeCall; @@ -55,34 +52,26 @@ public ModuleName moduleKey() { return BLAKE_MODEXP_DATA; } - public void callModexp(final ModexpMetadata modexpMetaData, final int operationID) { - checkState( - modexpMetaData instanceof LondonModexpMetadata - || modexpMetaData instanceof OsakaModexpMetadata, - "Unsupported ModexpMetadata type for BlakeModexpData module"); + public void callModexp(BlakeModexpOperation modexpOperation) { - if (modexpMetaData instanceof LondonModexpMetadata) { - operations.add( - new LondonBlakeModexpOperation((LondonModexpMetadata) modexpMetaData, operationID)); - } - if (modexpMetaData instanceof OsakaModexpMetadata) { - operations.add( - new OsakaBlakeModexpOperation((OsakaModexpMetadata) modexpMetaData, operationID)); - } + checkState(modexpOperation.isModexpOperation(), "Operation must be a MODEXP operation"); + operations.add(modexpOperation); modexpEffectiveCall.updateTally(1); - modexpLargeCall.updateTally(modexpMetaData.largeModexp()); - callWcpForIdCheck(operationID); + modexpLargeCall.updateTally(modexpOperation.modexpMetaData.get().largeModexp()); + callWcpForIdCheck(modexpOperation.id()); } - public void callBlake(final BlakeComponents blakeComponents, final int operationID) { - operations.add(new LondonBlakeModexpOperation(blakeComponents, operationID)); + public void callBlake(BlakeModexpOperation blakeOperation) { + checkState(blakeOperation.isBlakeOperation(), "Operation must be a BLAKE2f operation"); + operations.add(blakeOperation); + blakeEffectiveCall.updateTally(1); - blakeRounds.addPrecompileLimit(blakeComponents.r()); - callWcpForIdCheck(operationID); + blakeRounds.addPrecompileLimit(blakeOperation.blake2fComponents.get().r()); + callWcpForIdCheck(blakeOperation.id()); } - private void callWcpForIdCheck(final int operationID) { + private void callWcpForIdCheck(final long operationID) { wcp.callLT(previousID, operationID); previousID = operationID; } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java index b85b433af3..d6d29be9ed 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java @@ -187,4 +187,14 @@ private void commonTrace( private Bytes computeBlake2fResult() { return Hash.blake2bf(blake2fComponents.get().callData()); } + + public boolean isModexpOperation() { + return modexpMetaData.isPresent(); + } + ; + + public boolean isBlakeOperation() { + return blake2fComponents.isPresent(); + } + ; } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexp.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexp.java new file mode 100644 index 0000000000..f350aafe9d --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexp.java @@ -0,0 +1,35 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.blake2fmodexpdata; + +import lombok.Getter; +import lombok.experimental.Accessors; +import net.consensys.linea.zktracer.container.module.IncrementAndDetectModule; +import net.consensys.linea.zktracer.container.module.IncrementingModule; +import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; +import net.consensys.linea.zktracer.module.wcp.Wcp; + +@Getter +@Accessors(fluent = true) +public class LondonBlakeModexp extends BlakeModexp { + public LondonBlakeModexp( + Wcp wcp, + IncrementAndDetectModule modexpEffectiveCall, + IncrementingModule modexpLargeCall, + IncrementingModule blakeEffectiveCall, + BlakeRounds blakeRounds) { + super(wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java index 2a413e37ab..4004ee7428 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java @@ -29,6 +29,16 @@ public LondonBlakeModexpOperation(BlakeComponents blakeComponents, int id) { super(blakeComponents, id); } + @Override + public boolean isModexpOperation() { + return false; + } + + @Override + public boolean isBlakeOperation() { + return false; + } + public static short modexpComponentByteSize() { return LLARGE * (INDEX_MAX_MODEXP + 1); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexp.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexp.java new file mode 100644 index 0000000000..0f21372b08 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexp.java @@ -0,0 +1,35 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.blake2fmodexpdata; + +import lombok.Getter; +import lombok.experimental.Accessors; +import net.consensys.linea.zktracer.container.module.IncrementAndDetectModule; +import net.consensys.linea.zktracer.container.module.IncrementingModule; +import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; +import net.consensys.linea.zktracer.module.wcp.Wcp; + +@Getter +@Accessors(fluent = true) +public class OsakaBlakeModexp extends LondonBlakeModexp { + public OsakaBlakeModexp( + Wcp wcp, + IncrementAndDetectModule modexpEffectiveCall, + IncrementingModule modexpLargeCall, + IncrementingModule blakeEffectiveCall, + BlakeRounds blakeRounds) { + super(wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java index a65d37fe25..d2b1404bd7 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/OsakaBlakeModexpOperation.java @@ -19,7 +19,7 @@ import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; -public class OsakaBlakeModexpOperation extends BlakeModexpOperation { +public class OsakaBlakeModexpOperation extends LondonBlakeModexpOperation { public OsakaBlakeModexpOperation(OsakaModexpMetadata modexpMetaData, int id) { super(modexpMetaData, id); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java index 1b653723bf..810ba3f89b 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/Hub.java @@ -342,8 +342,18 @@ public List getTracelessModules() { * those module are traced (and could be count) */ private final ShakiraData shakiraData; + + @Getter private final BlakeModexp blakeModexp = - new BlakeModexp(wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + setBlakeModexp(wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + + public abstract BlakeModexp setBlakeModexp( + Wcp wcp, + IncrementAndDetectModule modexpEffectiveCall, + IncrementingModule modexpLargeCall, + IncrementingModule blakeEffectiveCall, + BlakeRounds blakeRounds); + public final EcData ecData = new EcData( wcp, diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java index ed7bae72bd..efc70a018c 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java @@ -24,7 +24,11 @@ import net.consensys.linea.zktracer.ChainConfig; import net.consensys.linea.zktracer.container.module.CountingOnlyModule; +import net.consensys.linea.zktracer.container.module.IncrementAndDetectModule; +import net.consensys.linea.zktracer.container.module.IncrementingModule; import net.consensys.linea.zktracer.container.module.Module; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexp; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexp; import net.consensys.linea.zktracer.module.blockdata.module.Blockdata; import net.consensys.linea.zktracer.module.blockdata.module.LondonBlockData; import net.consensys.linea.zktracer.module.euc.Euc; @@ -34,6 +38,7 @@ import net.consensys.linea.zktracer.module.hub.section.skip.LondonTxSkipSection; import net.consensys.linea.zktracer.module.hub.section.txInitializationSection.LondonInitializationSection; import net.consensys.linea.zktracer.module.hub.transients.Transients; +import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; import net.consensys.linea.zktracer.module.mxp.module.LondonMxp; import net.consensys.linea.zktracer.module.mxp.module.Mxp; import net.consensys.linea.zktracer.module.rlptxn.RlpTxn; @@ -56,6 +61,17 @@ public LondonHub(ChainConfig chain, Map historicalBlockHashes) { super(chain, historicalBlockHashes); } + @Override + public BlakeModexp setBlakeModexp( + Wcp wcp, + IncrementAndDetectModule modexpEffectiveCall, + IncrementingModule modexpLargeCall, + IncrementingModule blakeEffectiveCall, + BlakeRounds blakeRounds) { + return new LondonBlakeModexp( + wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + } + @Override protected Module setBlsData(Hub hub) { // Bls is not used in London diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java index 7eef3d287a..79f288e453 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java @@ -18,8 +18,13 @@ import java.util.Map; import net.consensys.linea.zktracer.ChainConfig; +import net.consensys.linea.zktracer.container.module.IncrementAndDetectModule; +import net.consensys.linea.zktracer.container.module.IncrementingModule; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.*; +import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; import net.consensys.linea.zktracer.module.txndata.TxnData; import net.consensys.linea.zktracer.module.txndata.osaka.OsakaTxnData; +import net.consensys.linea.zktracer.module.wcp.Wcp; import org.hyperledger.besu.datatypes.Hash; public class OsakaHub extends PragueHub { @@ -27,6 +32,17 @@ public OsakaHub(ChainConfig chain, Map historicalBlockHashes) { super(chain, historicalBlockHashes); } + @Override + public BlakeModexp setBlakeModexp( + Wcp wcp, + IncrementAndDetectModule modexpEffectiveCall, + IncrementingModule modexpLargeCall, + IncrementingModule blakeEffectiveCall, + BlakeRounds blakeRounds) { + return new OsakaBlakeModexp( + wcp, modexpEffectiveCall, modexpLargeCall, blakeEffectiveCall, blakeRounds); + } + @Override protected TxnData setTxnData() { return new OsakaTxnData(this, wcp(), euc()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java index 1e4c14f1a4..d4b5003b05 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java @@ -67,9 +67,9 @@ public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { setMaxXbsYbs(computeMax() ? (comp ? ybsLo() : xbs().lo()) : Bytes.EMPTY); // row i + 2 - final OobExoCall xbsNonZerCall = callToIsZero(wcp, xbs().lo()); - exoCalls.add(xbsNonZerCall); - setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZerCall.result()) : false); + final OobExoCall xbsNonZeroCall = callToIsZero(wcp, xbs().lo()); + exoCalls.add(xbsNonZeroCall); + setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZeroCall.result()) : false); } @Override diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java index d993079d86..a34596271f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java @@ -36,7 +36,7 @@ @Getter @Setter @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) -public class OsakaModexpXbsOobCall extends ModexpXbsOobCall { +public class OsakaModexpXbsOobCall extends LondonModexpXbsOobCall { public OsakaModexpXbsOobCall(OsakaModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { super(modexpMetaData, modexpXbsCase); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java index 69b47ee993..911d1fd9d0 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java @@ -21,7 +21,7 @@ import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.internal.Words; -public class OsakaModexpMetadata extends ModexpMetadata { +public class OsakaModexpMetadata extends LondonModexpMetadata { public OsakaModexpMetadata(MemoryRange callDataRange) { super(callDataRange); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java index 9b49bb0357..b14c2e056f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java @@ -48,6 +48,8 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.opcodes.CallOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.opcodes.XCallOobCall; import net.consensys.linea.zktracer.module.hub.fragment.scenario.CallScenarioFragment; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.TraceSection; import net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection.*; import net.consensys.linea.zktracer.module.hub.signals.Exceptions; @@ -374,9 +376,11 @@ private PrecompileSubsection getPrecompileSubsection(Hub hub) { case PRC_IDENTITY -> new IdentitySubsection(hub, this); case PRC_MODEXP -> { if (forkPredatesOsaka(hub.fork)) { - yield new LondonModexpSubsection(hub, this); + yield new LondonModexpSubsection( + hub, this, new LondonModexpMetadata(this.getCallDataRange())); } else { - yield new OsakaModexpSubsection(hub, this); + yield new OsakaModexpSubsection( + hub, this, new OsakaModexpMetadata(this.getCallDataRange())); } } case PRC_BLAKE2F -> new BlakeSubsection(hub, this); @@ -402,17 +406,17 @@ private void prcProcessing(Hub hub) { + hub.txStack().currentAbsNumber() + "\n\tbase byte size = " + ((LondonModexpSubsection) precompileSubsection) - .modexpMetaData + .modexpMetadata .bbs() .toDecimalString() + "\n\texp byte size = " + ((LondonModexpSubsection) precompileSubsection) - .modexpMetaData + .modexpMetadata .ebs() .toDecimalString() + "\n\tmod byte size = " + ((LondonModexpSubsection) precompileSubsection) - .modexpMetaData + .modexpMetadata .mbs() .toDecimalString() + "\nTransaction must be popped!"); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java index 99a0bf20e4..8d7ab9827e 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/BlakeSubsection.java @@ -21,6 +21,7 @@ import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.PRC_FAILURE_KNOWN_TO_RAM; import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeComponents; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.ImcFragment; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; @@ -123,7 +124,8 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { callData.slice(0, BLAKE2f_R_SIZE), callData.slice(212, 1), extractReturnData()); - hub.blakeModexp().callBlake(blake2f, this.exoModuleOperationId()); + hub.blakeModexp() + .callBlake(new LondonBlakeModexpOperation(blake2f, this.exoModuleOperationId())); } @Override diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java index 2c9f722cbe..401dcb1c12 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java @@ -16,6 +16,7 @@ package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractBbsForModexp; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractEbsForModexp; import static net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall.extractMbsForModexp; @@ -30,75 +31,68 @@ import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase.OOB_INST_MODEXP_MBS; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.PRC_FAILURE_KNOWN_TO_RAM; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.ImcFragment; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ModexpLogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpCallDataSizeOobCall; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpExtractOobCall; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpLeadOobCall; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpPricingOobCall; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.*; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.LondonModexpXbsOobCall; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.CallSection; import net.consensys.linea.zktracer.runtime.callstack.CallFrame; import org.apache.tuweni.bytes.Bytes; -public class LondonModexpSubsection extends PrecompileSubsection { +public class LondonModexpSubsection extends ModexpSubsection { - public static final short NB_ROWS_HUB_PRC_MODEXP = - 13; // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) - - public final LondonModexpMetadata modexpMetaData; private ModexpPricingOobCall sixthOobCall; private ImcFragment seventhImcFragment; public boolean transactionWillBePopped = false; - public LondonModexpSubsection(final Hub hub, final CallSection callSection) { - super(hub, callSection); - - modexpMetaData = new LondonModexpMetadata(getCallDataRange()); + public LondonModexpSubsection( + final Hub hub, final CallSection callSection, LondonModexpMetadata modexpMetadata) { + super(hub, callSection, modexpMetadata); - if (modexpMetaData.unprovableModexp()) { + if (modexpMetadata.unprovableModexp()) { hub.modexpEffectiveCall().detectEvent(); hub.defers().unscheduleForContextReEntry(this, hub.currentFrame()); transactionWillBePopped = true; return; } - firstImcFragment.callOob(new ModexpCallDataSizeOobCall(modexpMetaData)); + firstImcFragment.callOob(new ModexpCallDataSizeOobCall(modexpMetadata)); final ImcFragment secondImcFragment = ImcFragment.empty(hub); fragments().add(secondImcFragment); - if (modexpMetaData.extractBbs()) { - final MmuCall mmuCall = extractBbsForModexp(hub, this, modexpMetaData); + if (modexpMetadata.extractBbs()) { + final MmuCall mmuCall = extractBbsForModexp(hub, this, modexpMetadata); secondImcFragment.callMmu(mmuCall); } - secondImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_BBS)); + secondImcFragment.callOob(getForkAppropriateModexpXbsOobCall(OOB_INST_MODEXP_BBS)); final ImcFragment thirdImcFragment = ImcFragment.empty(hub); fragments().add(thirdImcFragment); - if (modexpMetaData.extractEbs()) { - final MmuCall mmuCall = extractEbsForModexp(hub, this, modexpMetaData); + if (modexpMetadata.extractEbs()) { + final MmuCall mmuCall = extractEbsForModexp(hub, this, modexpMetadata); thirdImcFragment.callMmu(mmuCall); } - thirdImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_EBS)); + thirdImcFragment.callOob(getForkAppropriateModexpXbsOobCall(OOB_INST_MODEXP_EBS)); final ImcFragment fourthImcFragment = ImcFragment.empty(hub); fragments().add(fourthImcFragment); - if (modexpMetaData.extractMbs()) { - final MmuCall mmuCall = extractMbsForModexp(hub, this, modexpMetaData); + if (modexpMetadata.extractMbs()) { + final MmuCall mmuCall = extractMbsForModexp(hub, this, modexpMetadata); fourthImcFragment.callMmu(mmuCall); } - fourthImcFragment.callOob(new LondonModexpXbsOobCall(modexpMetaData, OOB_INST_MODEXP_MBS)); + fourthImcFragment.callOob(getForkAppropriateModexpXbsOobCall(OOB_INST_MODEXP_MBS)); final ImcFragment fifthImcFragment = ImcFragment.empty(hub); fragments().add(fifthImcFragment); - fifthImcFragment.callOob(new ModexpLeadOobCall(modexpMetaData)); - if (modexpMetaData.loadRawLeadingWord()) { - final MmuCall mmuCall = forModexpLoadLead(hub, this, modexpMetaData); + fifthImcFragment.callOob(new ModexpLeadOobCall(modexpMetadata)); + if (modexpMetadata.loadRawLeadingWord()) { + final MmuCall mmuCall = forModexpLoadLead(hub, this, modexpMetadata); fifthImcFragment.callMmu(mmuCall); - final ExpCall modexpLogCallToExp = new ModexpLogExpCall(modexpMetaData); + final ExpCall modexpLogCallToExp = new ModexpLogExpCall(modexpMetadata); fifthImcFragment.callExp(modexpLogCallToExp); } @@ -107,15 +101,20 @@ public LondonModexpSubsection(final Hub hub, final CallSection callSection) { final long calleeGas = callSection.stpCall.effectiveChildContextGasAllowance(); sixthOobCall = (ModexpPricingOobCall) - sixthImcFragment.callOob(new ModexpPricingOobCall(modexpMetaData, calleeGas)); + sixthImcFragment.callOob(new ModexpPricingOobCall(modexpMetadata, calleeGas)); // We need to trigger the OOB before CALL's execution if (sixthOobCall.isRamSuccess()) { seventhImcFragment = ImcFragment.empty(hub); - seventhImcFragment.callOob(new ModexpExtractOobCall(modexpMetaData)); + seventhImcFragment.callOob(new ModexpExtractOobCall(modexpMetadata)); } } + @Override + public LondonModexpMetadata getForkAppropriateModexpMetadata() { + return (LondonModexpMetadata) modexpMetadata; + } + @Override public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { super.resolveAtContextReEntry(hub, callFrame); @@ -130,49 +129,53 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { final Bytes returnData = extractReturnData(); - modexpMetaData.rawResult(returnData); - hub.blakeModexp().callModexp(modexpMetaData, exoModuleOperationId()); + modexpMetadata.rawResult(returnData); + hub.blakeModexp() + .callModexp( + new LondonBlakeModexpOperation( + getForkAppropriateModexpMetadata(), exoModuleOperationId())); fragments().add(seventhImcFragment); - if (modexpMetaData.extractModulus()) { - final MmuCall mmuCall = forModexpExtractBase(hub, this, modexpMetaData); + if (modexpMetadata.extractModulus()) { + final MmuCall mmuCall = forModexpExtractBase(hub, this, modexpMetadata); seventhImcFragment.callMmu(mmuCall); } final ImcFragment eighthImcFragment = ImcFragment.empty(hub); fragments().add(eighthImcFragment); - if (modexpMetaData.extractModulus()) { - final MmuCall mmuCall = forModexpExtractExponent(hub, this, modexpMetaData); + if (modexpMetadata.extractModulus()) { + final MmuCall mmuCall = forModexpExtractExponent(hub, this, modexpMetadata); eighthImcFragment.callMmu(mmuCall); } final ImcFragment ninthImcFragment = ImcFragment.empty(hub); fragments().add(ninthImcFragment); - if (modexpMetaData.extractModulus()) { - final MmuCall mmuCall = forModexpExtractModulus(hub, this, modexpMetaData); + if (modexpMetadata.extractModulus()) { + final MmuCall mmuCall = forModexpExtractModulus(hub, this, modexpMetadata); ninthImcFragment.callMmu(mmuCall); } final ImcFragment tenthImcFragment = ImcFragment.empty(hub); fragments().add(tenthImcFragment); - if (modexpMetaData.extractModulus()) { - final MmuCall mmuCall = forModexpFullResultCopy(hub, this, modexpMetaData); + if (modexpMetadata.extractModulus()) { + final MmuCall mmuCall = forModexpFullResultCopy(hub, this, modexpMetadata); tenthImcFragment.callMmu(mmuCall); } final ImcFragment eleventhImcFragment = ImcFragment.empty(hub); fragments().add(eleventhImcFragment); - if (modexpMetaData.mbsNonZero() && !getReturnAtRange().isEmpty()) { - final MmuCall mmuCall = forModexpPartialResultCopy(hub, this, modexpMetaData); + if (modexpMetadata.mbsNonZero() && !getReturnAtRange().isEmpty()) { + final MmuCall mmuCall = forModexpPartialResultCopy(hub, this, modexpMetadata); eleventhImcFragment.callMmu(mmuCall); } } - // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) @Override - protected short maxNumberOfLines() { - return NB_ROWS_HUB_PRC_MODEXP; - // Note: we don't have the successBit available at the moment - // and can't provide the "real" value (8 in case of failure.) + public LondonModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase) { + + checkState( + modexpMetadata instanceof LondonModexpMetadata, + "modexpMetadata must be LondonModexpMetadata"); + return new LondonModexpXbsOobCall((LondonModexpMetadata) modexpMetadata, modexpXbsCase); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java new file mode 100644 index 0000000000..6cae36d5fb --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java @@ -0,0 +1,44 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; + +import net.consensys.linea.zktracer.module.hub.Hub; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.ModexpXbsOobCall; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; +import net.consensys.linea.zktracer.module.hub.section.call.CallSection; + +public abstract class ModexpSubsection extends PrecompileSubsection { + // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) + public static final short NB_ROWS_HUB_PRC_MODEXP = 13; + public final ModexpMetadata modexpMetadata; + + public ModexpSubsection( + final Hub hub, final CallSection callSection, ModexpMetadata modexpMetadata) { + super(hub, callSection); + this.modexpMetadata = modexpMetadata; + } + + public abstract ModexpMetadata getForkAppropriateModexpMetadata(); + + // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) + protected short maxNumberOfLines() { + return NB_ROWS_HUB_PRC_MODEXP; + // Note: we don't have the successBit available at the moment + // and can't provide the "real" value (8 in case of failure.) + } + + public abstract ModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase); +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java index 173d1e6e9c..504bb80f0d 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java @@ -14,11 +14,34 @@ */ package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; +import static com.google.common.base.Preconditions.checkState; + import net.consensys.linea.zktracer.module.hub.Hub; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.OsakaModexpXbsOobCall; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.CallSection; -public class OsakaModexpSubsection extends PrecompileSubsection { - public OsakaModexpSubsection(Hub hub, CallSection callSection) { - super(hub, callSection); +public class OsakaModexpSubsection extends LondonModexpSubsection { + public OsakaModexpSubsection( + Hub hub, CallSection callSection, OsakaModexpMetadata modexpMetadata) { + super(hub, callSection, modexpMetadata); + } + + @Override + public OsakaModexpMetadata getForkAppropriateModexpMetadata() { + checkState( + modexpMetadata instanceof OsakaModexpMetadata, + "modexpMetadata must be OsakaModexpMetadata"); + return (OsakaModexpMetadata) modexpMetadata; + } + + @Override + public OsakaModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase) { + + checkState( + modexpMetadata instanceof OsakaModexpMetadata, + "modexpMetadata must be OsakaModexpMetadata"); + return new OsakaModexpXbsOobCall((OsakaModexpMetadata) modexpMetadata, modexpXbsCase); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java index 8f5d6f1135..5ccd97d9b9 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java @@ -156,9 +156,9 @@ private void setReturnDataRange(MessageFrame frame, boolean callSuccess) { } // successful PRC_CALL to MODEXP - final LondonModexpSubsection modexpSubsection = (LondonModexpSubsection) this; - final int mbs = modexpSubsection.modexpMetaData.mbsInt(); - final int maxInputSize = modexpSubsection.modexpMetaData.getMaxInputSize(); + final ModexpSubsection modexpSubsection = (ModexpSubsection) this; + final int mbs = modexpSubsection.getForkAppropriateModexpMetadata().mbsInt(); + final int maxInputSize = modexpSubsection.getForkAppropriateModexpMetadata().getMaxInputSize(); final Bytes returnData = frame.getReturnData(); checkState( 0 <= mbs && mbs <= maxInputSize, From 56978e9dc4486d39f763dbeaf86e6b79e1db12b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 14 Nov 2025 09:07:17 +0100 Subject: [PATCH 5/9] stuff ... --- .../xbsOobCall/LondonModexpXbsOobCall.java | 36 ++++++-------- .../modexp/xbsOobCall/ModexpXbsOobCall.java | 26 +++++----- .../xbsOobCall/OsakaModexpXbsOobCall.java | 49 +++++++++---------- .../modexpMetadata/LondonModexpMetadata.java | 1 + .../modexpMetadata/OsakaModexpMetadata.java | 2 +- .../PrecompileSubsection.java | 2 +- plan.md | 35 +++++++++++++ 7 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 plan.md diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java index d4b5003b05..a21a4336cb 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java @@ -15,22 +15,15 @@ package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; -import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToIsZero; -import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; import static net.consensys.linea.zktracer.types.Conversions.*; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; -import net.consensys.linea.zktracer.module.mod.Mod; -import net.consensys.linea.zktracer.module.oob.OobExoCall; -import net.consensys.linea.zktracer.module.wcp.Wcp; -import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.frame.MessageFrame; @Getter @@ -54,22 +47,23 @@ public int modexpComponentByteSize() { public void setInputData(MessageFrame frame, Hub hub) {} @Override - public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { - // row i - final OobExoCall xbsVsModexpComponentByteSize = - callToLT(wcp, xbs(), Bytes.ofUnsignedInt(modexpComponentByteSize() + 1)); - exoCalls.add(xbsVsModexpComponentByteSize); + short xbsNormalized() { + return (short) xbs().toInt(); + } - // row i + 1 - final OobExoCall compareXbsYbsCall = callToLT(wcp, xbs().lo(), ybsLo()); - exoCalls.add(compareXbsYbsCall); - final boolean comp = bytesToBoolean(compareXbsYbsCall.result()); - setMaxXbsYbs(computeMax() ? (comp ? ybsLo() : xbs().lo()) : Bytes.EMPTY); + @Override + short ybsNormalized() { + return (short) ybsLo().toInt(); + } - // row i + 2 - final OobExoCall xbsNonZeroCall = callToIsZero(wcp, xbs().lo()); - exoCalls.add(xbsNonZeroCall); - setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZeroCall.result()) : false); + @Override + short maxXbsYbs() { + return computeMax() ? (short) Math.max(xbsNormalized(), ybsNormalized()) : 0; + } + + @Override + boolean xbsNormalizedIsNonZero() { + return xbsNormalized() != 0; } @Override diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java index c90b11545f..55dcc65773 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java @@ -48,10 +48,6 @@ public abstract class ModexpXbsOobCall extends OobCall { @EqualsAndHashCode.Include final ModexpMetadata modexpMetadata; @EqualsAndHashCode.Include final ModexpXbsCase modexpXbsCase; - // Outputs - Bytes maxXbsYbs; - boolean xbsNormalizedNonZero; - public ModexpXbsOobCall(ModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { super(); this.modexpMetadata = modexpMetaData; @@ -73,15 +69,12 @@ public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { exoCalls.add(xbsVsModexpComponentByteSize); // row i + 1 - final OobExoCall compareXbsYbsCall = callToLT(wcp, xbs().lo(), ybsLo()); + final OobExoCall compareXbsYbsCall = callToLT(wcp, Bytes.ofUnsignedShort(xbsNormalized()), Bytes.ofUnsignedShort(ybsNormalized())); exoCalls.add(compareXbsYbsCall); - final boolean comp = bytesToBoolean(compareXbsYbsCall.result()); - setMaxXbsYbs(computeMax() ? (comp ? ybsLo() : xbs().lo()) : Bytes.EMPTY); // row i + 2 - final OobExoCall xbsNonZerCall = callToIsZero(wcp, xbs().lo()); - exoCalls.add(xbsNonZerCall); - setXbsNormalizedNonZero(computeMax() ? !bytesToBoolean(xbsNonZerCall.result()) : false); + final OobExoCall xbsIszeroCall = callToIsZero(wcp, Bytes.ofUnsignedShort(xbsNormalized())); + exoCalls.add(xbsIszeroCall); } @Override @@ -93,6 +86,11 @@ protected EWord xbs() { return modexpMetadata.xbs(modexpXbsCase); } + abstract short xbsNormalized(); + abstract short ybsNormalized(); + abstract short maxXbsYbs(); + abstract boolean xbsNormalizedIsNonZero(); + protected abstract boolean xbsIsWithinBounds(); protected abstract boolean xbsIsOutOfBounds(); @@ -122,8 +120,8 @@ public Trace.Oob trace(Trace.Oob trace) { .data4(booleanToBytes(computeMax())) .data5(booleanToBytes(xbsIsWithinBounds())) .data6(booleanToBytes(xbsIsOutOfBounds())) - .data7(maxXbsYbs) - .data8(booleanToBytes(xbsNormalizedNonZero)); + .data7(Bytes.ofUnsignedShort(maxXbsYbs())) + .data8(booleanToBytes(xbsNormalizedIsNonZero())); } @Override @@ -137,7 +135,7 @@ public Trace.Hub trace(Trace.Hub trace) { .pMiscOobData4(booleanToBytes(computeMax())) .pMiscOobData5(booleanToBytes(xbsIsWithinBounds())) .pMiscOobData6(booleanToBytes(xbsIsOutOfBounds())) - .pMiscOobData7(maxXbsYbs) - .pMiscOobData8(booleanToBytes(xbsNormalizedNonZero)); + .pMiscOobData7(Bytes.ofUnsignedShort(maxXbsYbs())) + .pMiscOobData8(booleanToBytes(xbsNormalizedIsNonZero())); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java index a34596271f..ee53db2248 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java @@ -58,33 +58,6 @@ public Trace.Oob trace(Trace.Oob trace) { return null; } - @Override - public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { - // row i - final OobExoCall xbsVsModexpComponentByteSize = - callToLT(wcp, xbs(), Bytes.ofUnsignedInt(modexpComponentByteSize() + 1)); - exoCalls.add(xbsVsModexpComponentByteSize); - - // row i + 1 - final Bytes xbsNormalized = getForkAppropriateModexpMetadata().normalize(modexpXbsCase); - final Bytes ybsNormalized = xbsIsWithinBounds() ? ybsLo() : Bytes.EMPTY; - final OobExoCall xbsNormalizedLtYbsNormalizedCall = callToLT(wcp, xbsNormalized, ybsNormalized); - exoCalls.add(xbsNormalizedLtYbsNormalizedCall); - final boolean isXbsNormalizedLtYbsNormalized = - bytesToBoolean(xbsNormalizedLtYbsNormalizedCall.result()); - if (computeMax() && xbsIsWithinBounds()) { - setMaxXbsYbs(isXbsNormalizedLtYbsNormalized ? ybsNormalized : xbsNormalized); - } else { - setMaxXbsYbs(Bytes.EMPTY); - } - - // row i + 2 - final OobExoCall xbsNormalizedIszeroCall = callToIsZero(wcp, xbsNormalized); - exoCalls.add(xbsNormalizedIszeroCall); - setXbsNormalizedNonZero( - computeMax() ? !bytesToBoolean(xbsNormalizedIszeroCall.result()) : false); - } - @Override protected boolean xbsIsWithinBounds() { return getForkAppropriateModexpMetadata().tracedIsWithinBounds(modexpXbsCase); @@ -94,4 +67,26 @@ protected boolean xbsIsWithinBounds() { protected boolean xbsIsOutOfBounds() { return getForkAppropriateModexpMetadata().tracedIsOutOfBounds(modexpXbsCase); } + + @Override + short xbsNormalized() { + return (short) getForkAppropriateModexpMetadata().normalize(modexpXbsCase).toInt(); + } + + @Override + short ybsNormalized() { + return xbsIsWithinBounds() ? (short) ybsLo().toInt() : 0; + } + + @Override + short maxXbsYbs() { + return computeMax() && xbsIsWithinBounds() + ? (short) Math.max(xbsNormalized(), ybsNormalized()) + : 0; + } + + @Override + boolean xbsNormalizedIsNonZero() { + return xbsIsWithinBounds() && xbsNormalized() != 0; + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java index 06b76e8320..588443400a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/LondonModexpMetadata.java @@ -31,6 +31,7 @@ public boolean unprovableModexp() { || ebs().toUnsignedBigInteger().compareTo(getMaxInputSizeBigInteger()) > 0; } + @Override public int getMaxInputSize() { return 512; } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java index 911d1fd9d0..69b47ee993 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java @@ -21,7 +21,7 @@ import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.internal.Words; -public class OsakaModexpMetadata extends LondonModexpMetadata { +public class OsakaModexpMetadata extends ModexpMetadata { public OsakaModexpMetadata(MemoryRange callDataRange) { super(callDataRange); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java index 5ccd97d9b9..85ebe64598 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java @@ -44,7 +44,7 @@ @RequiredArgsConstructor @Getter @Accessors(fluent = true) -public class PrecompileSubsection +public abstract class PrecompileSubsection implements ContextEntryDefer, ContextExitDefer, ContextReEntryDefer, PostRollbackDefer { public final CallSection callSection; diff --git a/plan.md b/plan.md new file mode 100644 index 0000000000..12dc037cf7 --- /dev/null +++ b/plan.md @@ -0,0 +1,35 @@ + +BlakeModexp <= module +- abstract +- London +- Osaka + + +BlakeModexpOperation <= operation +- abstract +- London +- Osaka + + +ModexpMetadata +- abstract +- London +- Osaka + + +ModexpXbsOobCall +- abstract +- London +- Osaka + + +ModexpPricingOobCall +- abstract +- London +- Osaka + + +ModexpPrecompileSection +- abstract +- London +- Osaka From 1bcb4a34597af32e9c250bc117cf32dee9c84624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 14 Nov 2025 14:01:16 +0100 Subject: [PATCH 6/9] clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With Lorenzo and François --- .../linea/zktracer/module/hub/LondonHub.java | 3 +- .../linea/zktracer/module/hub/OsakaHub.java | 2 +- .../LondonModexpPricingOobCall.java | 87 +++++++++++++++++++ .../ModexpPricingOobCall.java | 76 ++-------------- .../OsakaModexpPricingOobCall.java | 31 +++++++ .../xbsOobCall/LondonModexpXbsOobCall.java | 6 +- .../modexp/xbsOobCall/ModexpXbsOobCall.java | 9 +- .../xbsOobCall/OsakaModexpXbsOobCall.java | 33 +++---- .../scenario/PrecompileScenarioFragment.java | 2 +- .../modexpMetadata/OsakaModexpMetadata.java | 2 +- .../module/hub/section/call/CallSection.java | 1 - .../LondonModexpSubsection.java | 51 +++++++---- .../ModexpSubsection.java | 44 ---------- .../OsakaModexpSubsection.java | 21 +++-- .../PrecompileSubsection.java | 2 +- 15 files changed, 200 insertions(+), 170 deletions(-) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/LondonModexpPricingOobCall.java rename arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/{ => pricingOobCall}/ModexpPricingOobCall.java (57%) create mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/OsakaModexpPricingOobCall.java delete mode 100644 arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java index efc70a018c..3a4e5c8908 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/LondonHub.java @@ -27,7 +27,6 @@ import net.consensys.linea.zktracer.container.module.IncrementAndDetectModule; import net.consensys.linea.zktracer.container.module.IncrementingModule; import net.consensys.linea.zktracer.container.module.Module; -import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexp; import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexp; import net.consensys.linea.zktracer.module.blockdata.module.Blockdata; import net.consensys.linea.zktracer.module.blockdata.module.LondonBlockData; @@ -62,7 +61,7 @@ public LondonHub(ChainConfig chain, Map historicalBlockHashes) { } @Override - public BlakeModexp setBlakeModexp( + public LondonBlakeModexp setBlakeModexp( Wcp wcp, IncrementAndDetectModule modexpEffectiveCall, IncrementingModule modexpLargeCall, diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java index 79f288e453..aba087aee7 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/OsakaHub.java @@ -33,7 +33,7 @@ public OsakaHub(ChainConfig chain, Map historicalBlockHashes) { } @Override - public BlakeModexp setBlakeModexp( + public OsakaBlakeModexp setBlakeModexp( Wcp wcp, IncrementAndDetectModule modexpEffectiveCall, IncrementingModule modexpLargeCall, diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/LondonModexpPricingOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/LondonModexpPricingOobCall.java new file mode 100644 index 0000000000..6cc05f5e64 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/LondonModexpPricingOobCall.java @@ -0,0 +1,87 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall; + +import static java.lang.Math.max; +import static net.consensys.linea.zktracer.Trace.Oob.G_QUADDIVISOR; +import static net.consensys.linea.zktracer.module.oob.OobExoCall.*; +import static net.consensys.linea.zktracer.types.Conversions.*; + +import java.math.BigInteger; + +import net.consensys.linea.zktracer.module.add.Add; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; +import net.consensys.linea.zktracer.module.mod.Mod; +import net.consensys.linea.zktracer.module.oob.OobExoCall; +import net.consensys.linea.zktracer.module.wcp.Wcp; +import org.apache.tuweni.bytes.Bytes; + +public class LondonModexpPricingOobCall extends ModexpPricingOobCall { + + public LondonModexpPricingOobCall(ModexpMetadata metadata, long calleeGas) { + super(metadata, calleeGas); + } + + @Override + public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { + final int maxMbsBbs = max(metadata.mbsInt(), metadata.bbsInt()); + setMaxMbsBbs(maxMbsBbs); + + // row i + final OobExoCall returnAtCapacityIsZeroCall = callToIsZero(wcp, returnAtCapacity); + exoCalls.add(returnAtCapacityIsZeroCall); + final boolean returnAtCapacityIsZero = bytesToBoolean(returnAtCapacityIsZeroCall.result()); + + // row i + 1 + final OobExoCall exponentLogIsZeroCall = callToIsZero(wcp, bigIntegerToBytes(exponentLog)); + exoCalls.add(exponentLogIsZeroCall); + final boolean exponentLogIsZero = bytesToBoolean(exponentLogIsZeroCall.result()); + + // row i + 2 + final OobExoCall ceilngOfMaxDividedBy8Call = + callToDIV(mod, Bytes.ofUnsignedInt(maxMbsBbs + 7), Bytes.ofUnsignedInt(8)); + exoCalls.add(ceilngOfMaxDividedBy8Call); + final BigInteger ceilingOfMaxDividedBy8 = + ceilngOfMaxDividedBy8Call.result().toUnsignedBigInteger(); + final BigInteger fOfMax = ceilingOfMaxDividedBy8.multiply(ceilingOfMaxDividedBy8); + + // row i + 3 + final BigInteger bigNumerator = exponentLogIsZero ? fOfMax : fOfMax.multiply(exponentLog); + final OobExoCall bigQuotientCall = + callToDIV(mod, bigIntegerToBytes(bigNumerator), Bytes.ofUnsignedInt(G_QUADDIVISOR)); + exoCalls.add(bigQuotientCall); + final Bytes bigQuotient = bigQuotientCall.result(); + + // row i + 4 + final OobExoCall bigQuotientLT200Call = callToLT(wcp, bigQuotient, Bytes.ofUnsignedInt(200)); + exoCalls.add(bigQuotientLT200Call); + final boolean bigQuotientLT200 = bytesToBoolean(bigQuotientLT200Call.result()); + + // row i + 5 + final Bytes precompileCost = bigQuotientLT200 ? Bytes.ofUnsignedInt(200) : bigQuotient; + final OobExoCall ramSuccessCall = callToLT(wcp, callGas, precompileCost); + exoCalls.add(ramSuccessCall); + setRamSuccess(!bytesToBoolean(ramSuccessCall.result())); + + final BigInteger returnGas = + ramSuccess + ? callGas.toUnsignedBigInteger().subtract(precompileCost.toUnsignedBigInteger()) + : BigInteger.ZERO; + setReturnGas(returnGas); + + setReturnAtCapacityNonZero(!returnAtCapacityIsZero); + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/ModexpPricingOobCall.java similarity index 57% rename from arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java rename to arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/ModexpPricingOobCall.java index ddb2fe1509..968d96cae2 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/ModexpPricingOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/ModexpPricingOobCall.java @@ -12,16 +12,13 @@ * * SPDX-License-Identifier: Apache-2.0 */ +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall; -package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp; - -import static java.lang.Math.max; import static net.consensys.linea.zktracer.Trace.OOB_INST_MODEXP_PRICING; import static net.consensys.linea.zktracer.Trace.Oob.CT_MAX_MODEXP_PRICING; -import static net.consensys.linea.zktracer.Trace.Oob.G_QUADDIVISOR; -import static net.consensys.linea.zktracer.module.oob.OobExoCall.*; import static net.consensys.linea.zktracer.module.oob.OobOperation.computeExponentLog; -import static net.consensys.linea.zktracer.types.Conversions.*; +import static net.consensys.linea.zktracer.types.Conversions.bigIntegerToBytes; +import static net.consensys.linea.zktracer.types.Conversions.booleanToBytes; import static org.hyperledger.besu.evm.internal.Words.clampedToInt; import java.math.BigInteger; @@ -30,13 +27,9 @@ import lombok.Getter; import lombok.Setter; import net.consensys.linea.zktracer.Trace; -import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; -import net.consensys.linea.zktracer.module.mod.Mod; -import net.consensys.linea.zktracer.module.oob.OobExoCall; -import net.consensys.linea.zktracer.module.wcp.Wcp; import net.consensys.linea.zktracer.opcode.OpCodeData; import net.consensys.linea.zktracer.types.EWord; import org.apache.tuweni.bytes.Bytes; @@ -45,8 +38,7 @@ @Getter @Setter @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) -public class ModexpPricingOobCall extends OobCall { - +public abstract class ModexpPricingOobCall extends OobCall { public static final short NB_ROWS_OOB_MODEXP_PRICING = CT_MAX_MODEXP_PRICING + 1; // Inputs @@ -76,61 +68,6 @@ public void setInputData(MessageFrame frame, Hub hub) { setExponentLog(BigInteger.valueOf(computeExponentLog(metadata, cds))); } - @Override - public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { - final int maxMbsBbs = max(metadata.mbsInt(), metadata.bbsInt()); - setMaxMbsBbs(maxMbsBbs); - - // row i - final OobExoCall returnAtCapacityIsZeroCall = callToIsZero(wcp, returnAtCapacity); - exoCalls.add(returnAtCapacityIsZeroCall); - final boolean returnAtCapacityIsZero = bytesToBoolean(returnAtCapacityIsZeroCall.result()); - - // row i + 1 - final OobExoCall exponentLogIsZeroCall = callToIsZero(wcp, bigIntegerToBytes(exponentLog)); - exoCalls.add(exponentLogIsZeroCall); - final boolean exponentLogIsZero = bytesToBoolean(exponentLogIsZeroCall.result()); - - // row i + 2 - final OobExoCall ceilngOfMaxDividedBy8Call = - callToDIV(mod, Bytes.ofUnsignedInt(maxMbsBbs + 7), Bytes.ofUnsignedInt(8)); - exoCalls.add(ceilngOfMaxDividedBy8Call); - final BigInteger ceilingOfMaxDividedBy8 = - ceilngOfMaxDividedBy8Call.result().toUnsignedBigInteger(); - final BigInteger fOfMax = ceilingOfMaxDividedBy8.multiply(ceilingOfMaxDividedBy8); - - // row i + 3 - final BigInteger bigNumerator = exponentLogIsZero ? fOfMax : fOfMax.multiply(exponentLog); - final OobExoCall bigQuotientCall = - callToDIV(mod, bigIntegerToBytes(bigNumerator), Bytes.ofUnsignedInt(G_QUADDIVISOR)); - exoCalls.add(bigQuotientCall); - final Bytes bigQuotient = bigQuotientCall.result(); - - // row i + 4 - final OobExoCall bigQuotientLT200Call = callToLT(wcp, bigQuotient, Bytes.ofUnsignedInt(200)); - exoCalls.add(bigQuotientLT200Call); - final boolean bigQuotientLT200 = bytesToBoolean(bigQuotientLT200Call.result()); - - // row i + 5 - final Bytes precompileCost = bigQuotientLT200 ? Bytes.ofUnsignedInt(200) : bigQuotient; - final OobExoCall ramSuccessCall = callToLT(wcp, callGas, precompileCost); - exoCalls.add(ramSuccessCall); - setRamSuccess(!bytesToBoolean(ramSuccessCall.result())); - - final BigInteger returnGas = - ramSuccess - ? callGas.toUnsignedBigInteger().subtract(precompileCost.toUnsignedBigInteger()) - : BigInteger.ZERO; - setReturnGas(returnGas); - - setReturnAtCapacityNonZero(!returnAtCapacityIsZero); - } - - @Override - public int ctMax() { - return CT_MAX_MODEXP_PRICING; - } - @Override public Trace.Oob trace(Trace.Oob trace) { return trace @@ -158,4 +95,9 @@ public Trace.Hub trace(Trace.Hub trace) { .pMiscOobData7(Bytes.ofUnsignedInt(maxMbsBbs)) .pMiscOobData8(booleanToBytes(returnAtCapacityNonZero)); } + + @Override + public int ctMax() { + return CT_MAX_MODEXP_PRICING; + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/OsakaModexpPricingOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/OsakaModexpPricingOobCall.java new file mode 100644 index 0000000000..fddad16288 --- /dev/null +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/pricingOobCall/OsakaModexpPricingOobCall.java @@ -0,0 +1,31 @@ +/* + * Copyright Consensys Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall; + +import net.consensys.linea.zktracer.module.add.Add; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; +import net.consensys.linea.zktracer.module.mod.Mod; +import net.consensys.linea.zktracer.module.wcp.Wcp; + +public class OsakaModexpPricingOobCall extends LondonModexpPricingOobCall { + public OsakaModexpPricingOobCall(ModexpMetadata metadata, long calleeGas) { + super(metadata, calleeGas); + } + + @Override + public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { + // TODO + } +} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java index a21a4336cb..8b4e23b947 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java @@ -15,8 +15,6 @@ package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; -import static net.consensys.linea.zktracer.types.Conversions.*; - import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -52,13 +50,13 @@ short xbsNormalized() { } @Override - short ybsNormalized() { + short ybsReNormalized() { return (short) ybsLo().toInt(); } @Override short maxXbsYbs() { - return computeMax() ? (short) Math.max(xbsNormalized(), ybsNormalized()) : 0; + return computeMax() ? (short) Math.max(xbsNormalized(), ybsReNormalized()) : 0; } @Override diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java index 55dcc65773..caf11a6ddb 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java @@ -69,7 +69,9 @@ public void callExoModulesAndSetOutputs(Add add, Mod mod, Wcp wcp) { exoCalls.add(xbsVsModexpComponentByteSize); // row i + 1 - final OobExoCall compareXbsYbsCall = callToLT(wcp, Bytes.ofUnsignedShort(xbsNormalized()), Bytes.ofUnsignedShort(ybsNormalized())); + final OobExoCall compareXbsYbsCall = + callToLT( + wcp, Bytes.ofUnsignedShort(xbsNormalized()), Bytes.ofUnsignedShort(ybsReNormalized())); exoCalls.add(compareXbsYbsCall); // row i + 2 @@ -87,8 +89,11 @@ protected EWord xbs() { } abstract short xbsNormalized(); - abstract short ybsNormalized(); + + abstract short ybsReNormalized(); + abstract short maxXbsYbs(); + abstract boolean xbsNormalizedIsNonZero(); protected abstract boolean xbsIsWithinBounds(); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java index ee53db2248..a890b54b54 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java @@ -14,23 +14,14 @@ */ package net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall; -import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToIsZero; -import static net.consensys.linea.zktracer.module.oob.OobExoCall.callToLT; -import static net.consensys.linea.zktracer.types.Conversions.bytesToBoolean; - import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import net.consensys.linea.zktracer.Trace; -import net.consensys.linea.zktracer.module.add.Add; import net.consensys.linea.zktracer.module.blake2fmodexpdata.OsakaBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; -import net.consensys.linea.zktracer.module.mod.Mod; -import net.consensys.linea.zktracer.module.oob.OobExoCall; -import net.consensys.linea.zktracer.module.wcp.Wcp; -import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.frame.MessageFrame; @Getter @@ -70,23 +61,23 @@ protected boolean xbsIsOutOfBounds() { @Override short xbsNormalized() { - return (short) getForkAppropriateModexpMetadata().normalize(modexpXbsCase).toInt(); + return (short) getForkAppropriateModexpMetadata().normalize(modexpXbsCase).toInt(); } @Override - short ybsNormalized() { - return xbsIsWithinBounds() ? (short) ybsLo().toInt() : 0; + short ybsReNormalized() { + return xbsIsWithinBounds() ? (short) ybsLo().toInt() : 0; } @Override - short maxXbsYbs() { - return computeMax() && xbsIsWithinBounds() - ? (short) Math.max(xbsNormalized(), ybsNormalized()) - : 0; - } + short maxXbsYbs() { + return computeMax() && xbsIsWithinBounds() + ? (short) Math.max(xbsNormalized(), this.ybsReNormalized()) + : 0; + } - @Override - boolean xbsNormalizedIsNonZero() { - return xbsIsWithinBounds() && xbsNormalized() != 0; - } + @Override + boolean xbsNormalizedIsNonZero() { + return xbsIsWithinBounds() && xbsNormalized() != 0; + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java index 235fa713cc..9068247459 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/scenario/PrecompileScenarioFragment.java @@ -31,7 +31,7 @@ import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpCallDataSizeOobCall.NB_ROWS_OOB_MODEXP_CDS; import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpExtractOobCall.NB_ROWS_OOB_MODEXP_EXTRACT; import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpLeadOobCall.NB_ROWS_OOB_MODEXP_LEAD; -import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpPricingOobCall.NB_ROWS_OOB_MODEXP_PRICING; +import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.LondonModexpPricingOobCall.NB_ROWS_OOB_MODEXP_PRICING; import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.LondonModexpXbsOobCall.NB_ROWS_OOB_MODEXP_XBS; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileFlag.*; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.*; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java index 69b47ee993..911d1fd9d0 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/precompiles/modexpMetadata/OsakaModexpMetadata.java @@ -21,7 +21,7 @@ import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.internal.Words; -public class OsakaModexpMetadata extends ModexpMetadata { +public class OsakaModexpMetadata extends LondonModexpMetadata { public OsakaModexpMetadata(MemoryRange callDataRange) { super(callDataRange); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java index b14c2e056f..9156c97a54 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/CallSection.java @@ -23,7 +23,6 @@ import static net.consensys.linea.zktracer.opcode.OpCode.CALL; import static net.consensys.linea.zktracer.types.AddressUtils.*; import static net.consensys.linea.zktracer.types.Conversions.bytesToBoolean; -import static org.hyperledger.besu.datatypes.Address.*; import java.util.Optional; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java index 401dcb1c12..99e92aabc1 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java @@ -31,6 +31,7 @@ import static net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase.OOB_INST_MODEXP_MBS; import static net.consensys.linea.zktracer.module.hub.fragment.scenario.PrecompileScenarioFragment.PrecompileScenario.PRC_FAILURE_KNOWN_TO_RAM; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation; import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.ImcFragment; @@ -38,21 +39,34 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ModexpLogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.*; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.LondonModexpPricingOobCall; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.ModexpPricingOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.LondonModexpXbsOobCall; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.LondonModexpMetadata; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.CallSection; import net.consensys.linea.zktracer.runtime.callstack.CallFrame; import org.apache.tuweni.bytes.Bytes; -public class LondonModexpSubsection extends ModexpSubsection { +public class LondonModexpSubsection extends PrecompileSubsection { + // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) + public static final short NB_ROWS_HUB_PRC_MODEXP = 13; + + public final ModexpMetadata modexpMetadata; private ModexpPricingOobCall sixthOobCall; private ImcFragment seventhImcFragment; public boolean transactionWillBePopped = false; public LondonModexpSubsection( - final Hub hub, final CallSection callSection, LondonModexpMetadata modexpMetadata) { - super(hub, callSection, modexpMetadata); + final Hub hub, final CallSection callSection, ModexpMetadata modexpMetadata) { + super(hub, callSection); + + checkState( + modexpMetadata instanceof LondonModexpMetadata, + "modexpMetadata must be LondonModexpMetadata"); + + this.modexpMetadata = modexpMetadata; if (modexpMetadata.unprovableModexp()) { hub.modexpEffectiveCall().detectEvent(); @@ -98,10 +112,8 @@ public LondonModexpSubsection( final ImcFragment sixthImcFragment = ImcFragment.empty(hub); fragments().add(sixthImcFragment); - final long calleeGas = callSection.stpCall.effectiveChildContextGasAllowance(); sixthOobCall = - (ModexpPricingOobCall) - sixthImcFragment.callOob(new ModexpPricingOobCall(modexpMetadata, calleeGas)); + (ModexpPricingOobCall) sixthImcFragment.callOob(getForkAppropriateModexpPricingOobCall()); // We need to trigger the OOB before CALL's execution if (sixthOobCall.isRamSuccess()) { @@ -110,7 +122,6 @@ public LondonModexpSubsection( } } - @Override public LondonModexpMetadata getForkAppropriateModexpMetadata() { return (LondonModexpMetadata) modexpMetadata; } @@ -130,10 +141,7 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { final Bytes returnData = extractReturnData(); modexpMetadata.rawResult(returnData); - hub.blakeModexp() - .callModexp( - new LondonBlakeModexpOperation( - getForkAppropriateModexpMetadata(), exoModuleOperationId())); + hub.blakeModexp().callModexp(getForkAppropriateBlakeModexpOperation()); fragments().add(seventhImcFragment); if (modexpMetadata.extractModulus()) { @@ -170,12 +178,23 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { } } - @Override public LondonModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase) { - - checkState( - modexpMetadata instanceof LondonModexpMetadata, - "modexpMetadata must be LondonModexpMetadata"); return new LondonModexpXbsOobCall((LondonModexpMetadata) modexpMetadata, modexpXbsCase); } + + public LondonModexpPricingOobCall getForkAppropriateModexpPricingOobCall() { + return new LondonModexpPricingOobCall(modexpMetadata, calleeGas); + } + + protected BlakeModexpOperation getForkAppropriateBlakeModexpOperation() { + return new LondonBlakeModexpOperation( + getForkAppropriateModexpMetadata(), exoModuleOperationId()); + } + + // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) + protected short maxNumberOfLines() { + return NB_ROWS_HUB_PRC_MODEXP; + // Note: we don't have the successBit available at the moment + // and can't provide the "real" value (8 in case of failure.) + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java deleted file mode 100644 index 6cae36d5fb..0000000000 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/ModexpSubsection.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Consensys Software Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package net.consensys.linea.zktracer.module.hub.section.call.precompileSubsection; - -import net.consensys.linea.zktracer.module.hub.Hub; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; -import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.ModexpXbsOobCall; -import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; -import net.consensys.linea.zktracer.module.hub.section.call.CallSection; - -public abstract class ModexpSubsection extends PrecompileSubsection { - // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) - public static final short NB_ROWS_HUB_PRC_MODEXP = 13; - public final ModexpMetadata modexpMetadata; - - public ModexpSubsection( - final Hub hub, final CallSection callSection, ModexpMetadata modexpMetadata) { - super(hub, callSection); - this.modexpMetadata = modexpMetadata; - } - - public abstract ModexpMetadata getForkAppropriateModexpMetadata(); - - // 13 = 1 + 12 (scenario row + up to 12 miscellaneous fragments) - protected short maxNumberOfLines() { - return NB_ROWS_HUB_PRC_MODEXP; - // Note: we don't have the successBit available at the moment - // and can't provide the "real" value (8 in case of failure.) - } - - public abstract ModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase); -} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java index 504bb80f0d..5f3088aa0f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java @@ -16,32 +16,35 @@ import static com.google.common.base.Preconditions.checkState; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpOperation; +import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.OsakaModexpXbsOobCall; +import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; import net.consensys.linea.zktracer.module.hub.section.call.CallSection; public class OsakaModexpSubsection extends LondonModexpSubsection { - public OsakaModexpSubsection( - Hub hub, CallSection callSection, OsakaModexpMetadata modexpMetadata) { + public OsakaModexpSubsection(Hub hub, CallSection callSection, ModexpMetadata modexpMetadata) { super(hub, callSection, modexpMetadata); + checkState( + modexpMetadata instanceof OsakaModexpMetadata, + "modexpMetadata must be LondonModexpMetadata"); } @Override public OsakaModexpMetadata getForkAppropriateModexpMetadata() { - checkState( - modexpMetadata instanceof OsakaModexpMetadata, - "modexpMetadata must be OsakaModexpMetadata"); return (OsakaModexpMetadata) modexpMetadata; } @Override public OsakaModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase) { - - checkState( - modexpMetadata instanceof OsakaModexpMetadata, - "modexpMetadata must be OsakaModexpMetadata"); return new OsakaModexpXbsOobCall((OsakaModexpMetadata) modexpMetadata, modexpXbsCase); } + + protected BlakeModexpOperation getForkAppropriateBlakeModexpOperation() { + return new LondonBlakeModexpOperation( + getForkAppropriateModexpMetadata(), exoModuleOperationId()); + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java index 85ebe64598..6fe0688346 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/PrecompileSubsection.java @@ -156,7 +156,7 @@ private void setReturnDataRange(MessageFrame frame, boolean callSuccess) { } // successful PRC_CALL to MODEXP - final ModexpSubsection modexpSubsection = (ModexpSubsection) this; + final LondonModexpSubsection modexpSubsection = (LondonModexpSubsection) this; final int mbs = modexpSubsection.getForkAppropriateModexpMetadata().mbsInt(); final int maxInputSize = modexpSubsection.getForkAppropriateModexpMetadata().getMaxInputSize(); final Bytes returnData = frame.getReturnData(); From 5be004c3715f4cc2e5569a3f443a1ba850f1da05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 14 Nov 2025 20:01:49 +0100 Subject: [PATCH 7/9] fix: 99% up to par + @EqualsAndHash(callSuper = true) One failing test (MODEXP limits) --- .../BlakeModexpOperation.java | 2 -- .../LondonBlakeModexpOperation.java | 10 ---------- .../xbsOobCall/LondonModexpXbsOobCall.java | 2 +- .../modexp/xbsOobCall/ModexpXbsOobCall.java | 4 ++-- .../xbsOobCall/OsakaModexpXbsOobCall.java | 8 +------- .../LondonModexpSubsection.java | 19 ++++++++++++------- .../OsakaModexpSubsection.java | 7 +++++++ 7 files changed, 23 insertions(+), 29 deletions(-) diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java index d6d29be9ed..755e8e6b97 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/BlakeModexpOperation.java @@ -191,10 +191,8 @@ private Bytes computeBlake2fResult() { public boolean isModexpOperation() { return modexpMetaData.isPresent(); } - ; public boolean isBlakeOperation() { return blake2fComponents.isPresent(); } - ; } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java index 4004ee7428..2a413e37ab 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blake2fmodexpdata/LondonBlakeModexpOperation.java @@ -29,16 +29,6 @@ public LondonBlakeModexpOperation(BlakeComponents blakeComponents, int id) { super(blakeComponents, id); } - @Override - public boolean isModexpOperation() { - return false; - } - - @Override - public boolean isBlakeOperation() { - return false; - } - public static short modexpComponentByteSize() { return LLARGE * (INDEX_MAX_MODEXP + 1); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java index 8b4e23b947..f3d78fd4c9 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/LondonModexpXbsOobCall.java @@ -26,7 +26,7 @@ @Getter @Setter -@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) public class LondonModexpXbsOobCall extends ModexpXbsOobCall { public LondonModexpXbsOobCall(LondonModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java index caf11a6ddb..a33ac19f0f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/ModexpXbsOobCall.java @@ -126,7 +126,7 @@ public Trace.Oob trace(Trace.Oob trace) { .data5(booleanToBytes(xbsIsWithinBounds())) .data6(booleanToBytes(xbsIsOutOfBounds())) .data7(Bytes.ofUnsignedShort(maxXbsYbs())) - .data8(booleanToBytes(xbsNormalizedIsNonZero())); + .data8(booleanToBytes(computeMax() && xbsNormalizedIsNonZero())); } @Override @@ -141,6 +141,6 @@ public Trace.Hub trace(Trace.Hub trace) { .pMiscOobData5(booleanToBytes(xbsIsWithinBounds())) .pMiscOobData6(booleanToBytes(xbsIsOutOfBounds())) .pMiscOobData7(Bytes.ofUnsignedShort(maxXbsYbs())) - .pMiscOobData8(booleanToBytes(xbsNormalizedIsNonZero())); + .pMiscOobData8(booleanToBytes(computeMax() && xbsNormalizedIsNonZero())); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java index a890b54b54..47c390472d 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/oob/precompiles/modexp/xbsOobCall/OsakaModexpXbsOobCall.java @@ -17,7 +17,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import net.consensys.linea.zktracer.Trace; import net.consensys.linea.zktracer.module.blake2fmodexpdata.OsakaBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; @@ -26,7 +25,7 @@ @Getter @Setter -@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) public class OsakaModexpXbsOobCall extends LondonModexpXbsOobCall { public OsakaModexpXbsOobCall(OsakaModexpMetadata modexpMetaData, ModexpXbsCase modexpXbsCase) { @@ -44,11 +43,6 @@ public int modexpComponentByteSize() { @Override public void setInputData(MessageFrame frame, Hub hub) {} - @Override - public Trace.Oob trace(Trace.Oob trace) { - return null; - } - @Override protected boolean xbsIsWithinBounds() { return getForkAppropriateModexpMetadata().tracedIsWithinBounds(modexpXbsCase); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java index 99e92aabc1..4b28b09d72 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/LondonModexpSubsection.java @@ -38,6 +38,7 @@ import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.exp.ModexpLogExpCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.OobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.*; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.LondonModexpPricingOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.ModexpPricingOobCall; @@ -112,9 +113,13 @@ public LondonModexpSubsection( final ImcFragment sixthImcFragment = ImcFragment.empty(hub); fragments().add(sixthImcFragment); + // Note: we must compute the callee gas here as the eponymous PrecompileSubsection field gets + // computed + // at traceContextEnter() which happens after the constructor invocation. + final long calleeGas = callSection.stpCall.effectiveChildContextGasAllowance(); sixthOobCall = - (ModexpPricingOobCall) sixthImcFragment.callOob(getForkAppropriateModexpPricingOobCall()); - + (ModexpPricingOobCall) + sixthImcFragment.callOob(getForkAppropriateModexpPricingOobCall(calleeGas)); // We need to trigger the OOB before CALL's execution if (sixthOobCall.isRamSuccess()) { seventhImcFragment = ImcFragment.empty(hub); @@ -122,10 +127,6 @@ public LondonModexpSubsection( } } - public LondonModexpMetadata getForkAppropriateModexpMetadata() { - return (LondonModexpMetadata) modexpMetadata; - } - @Override public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { super.resolveAtContextReEntry(hub, callFrame); @@ -178,11 +179,15 @@ public void resolveAtContextReEntry(Hub hub, CallFrame callFrame) { } } + public LondonModexpMetadata getForkAppropriateModexpMetadata() { + return (LondonModexpMetadata) modexpMetadata; + } + public LondonModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase modexpXbsCase) { return new LondonModexpXbsOobCall((LondonModexpMetadata) modexpMetadata, modexpXbsCase); } - public LondonModexpPricingOobCall getForkAppropriateModexpPricingOobCall() { + public LondonModexpPricingOobCall getForkAppropriateModexpPricingOobCall(long calleeGas) { return new LondonModexpPricingOobCall(modexpMetadata, calleeGas); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java index 5f3088aa0f..77af102b26 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/call/precompileSubsection/OsakaModexpSubsection.java @@ -20,6 +20,7 @@ import net.consensys.linea.zktracer.module.blake2fmodexpdata.LondonBlakeModexpOperation; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.ModexpXbsCase; +import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.pricingOobCall.OsakaModexpPricingOobCall; import net.consensys.linea.zktracer.module.hub.fragment.imc.oob.precompiles.modexp.xbsOobCall.OsakaModexpXbsOobCall; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.ModexpMetadata; import net.consensys.linea.zktracer.module.hub.precompiles.modexpMetadata.OsakaModexpMetadata; @@ -43,6 +44,12 @@ public OsakaModexpXbsOobCall getForkAppropriateModexpXbsOobCall(ModexpXbsCase mo return new OsakaModexpXbsOobCall((OsakaModexpMetadata) modexpMetadata, modexpXbsCase); } + @Override + public OsakaModexpPricingOobCall getForkAppropriateModexpPricingOobCall(long calleeGas) { + return new OsakaModexpPricingOobCall(modexpMetadata, calleeGas); + } + + @Override protected BlakeModexpOperation getForkAppropriateBlakeModexpOperation() { return new LondonBlakeModexpOperation( getForkAppropriateModexpMetadata(), exoModuleOperationId()); From de62eeda5102073d196e3b8615f083655605dc93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 14 Nov 2025 20:02:14 +0100 Subject: [PATCH 8/9] fix: ModexpTests the old tests were overwriting mbs in memory ! --- .../zktracer/precompiles/ModexpTests.java | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java index 570f81c8bd..9cdee6f22e 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/precompiles/ModexpTests.java @@ -128,7 +128,25 @@ void basicNonTrivialModexpTest(TestInfo testInfo) { } @Test - void testUnpaddedModexp(TestInfo testInfo) { + void testSingleUnpaddedModexp(TestInfo testInfo) { + + String hexBase = "407CB5AD"; + String hexExpn = "40BDB1ED"; + String hexModl = "48AF8739"; + + BytecodeCompiler program = + preparingSingleBaseExponentAndModulusForModexp( + hexBase, hexExpn, hexModl); + + final BytecodeRunner bytecodeRunner = BytecodeRunner.of(program.compile()); + bytecodeRunner.run(chainConfig, testInfo); + + // check precompile limits line count + assertTrue(bytecodeRunner.getHub().modexpEffectiveCall().lineCount() > 0); + } + + @Test + void testUnpaddedModexp(TestInfo testInfo) { String hexBase = "407CB5AD"; String hexExpn = "40BDB1ED"; @@ -144,6 +162,34 @@ void testUnpaddedModexp(TestInfo testInfo) { assertTrue(bytecodeRunner.getHub().modexpEffectiveCall().lineCount() > 0); } + @Test + void testSinglePaddedModexp(TestInfo testInfo) { + + String hexBase = "00407CB5AD"; + String hexExpn = "40BDB1ED"; + String hexModl = "000048AF8739"; + + BytecodeCompiler program = + preparingSingleBaseExponentAndModulusForModexp( + hexBase, hexExpn, hexModl); + + final BytecodeRunner bytecodeRunner = BytecodeRunner.of(program.compile()); + bytecodeRunner.run(chainConfig, testInfo); + + // check precompile limits line count + assertTrue(bytecodeRunner.getHub().modexpEffectiveCall().lineCount() > 0); + } + + BytecodeCompiler preparingSingleBaseExponentAndModulusForModexp( + String hexBase, String hexExpn, String hexModl) { + + BytecodeCompiler program = preparingBaseExponentAndModulusForModexp(hexBase, hexExpn, hexModl); + + appendParametrizedModexpCall(program, 32, 32); + + return program; + } + @Test void testPaddedModexp(TestInfo testInfo) { @@ -230,6 +276,17 @@ BytecodeCompiler preparingBaseExponentAndModulusForModexp( int expnOffset = 64 + bbs + ebs; int modlOffset = 64 + bbs + ebs + mbs; return BytecodeCompiler.newProgram(chainConfig) + // modulus, exponent and base values at correct offsets + .push(hexModl) + .push(modlOffset) + .op(OpCode.MSTORE) // this sets the modulus + .push(hexExpn) + .push(expnOffset) + .op(OpCode.MSTORE) // this sets the exponent + .push(hexBase) + .push(baseOffset) + .op(OpCode.MSTORE) // this sets the base + // bbs, ebs, mbs at correct offsets .push(byteSize(hexBase)) .push("00") .op(OpCode.MSTORE) // this sets bbs = 4 @@ -240,15 +297,6 @@ BytecodeCompiler preparingBaseExponentAndModulusForModexp( .push("40") .op(OpCode.MSTORE) // this sets mbs = 4 // to read call data 32 + 32 + 32 + 4 + 4 + 4 = 108 bytes are sufficient - .push(hexBase) - .push(baseOffset) - .op(OpCode.MSTORE) // this sets the base - .push(hexExpn) - .push(expnOffset) - .op(OpCode.MSTORE) // this sets the exponent - .push(hexModl) - .push(modlOffset) - .op(OpCode.MSTORE) // this sets the modulus ; } From 613c29091a9b1c525c624fa9892272400d272862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Fri, 14 Nov 2025 20:25:54 +0100 Subject: [PATCH 9/9] feat: fix ZkCounter event detection --- .../java/net/consensys/linea/zktracer/ZkCounter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java index 84d7d486a6..be53f2c8f8 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/ZkCounter.java @@ -137,7 +137,7 @@ @Slf4j public class ZkCounter implements LineCountingTracer { - public static final Fork FORK_TO_USE_FOR_ZK_COUNTER = OSAKA; + public static final Fork FORK_TO_USE_FOR_ZK_COUNTER = PRAGUE; private final OpCodes opCodes = OpCodes.load(FORK_TO_USE_FOR_ZK_COUNTER); private static final Trace trace = getTraceFromFork(FORK_TO_USE_FOR_ZK_COUNTER); @@ -726,8 +726,11 @@ public void tracePrecompileCall(MessageFrame frame, long gasRequirement, Bytes o case PRC_MODEXP -> { hub.updateTally(NB_ROWS_HUB_PRC_MODEXP); final MemoryRange memoryRange = new MemoryRange(0, 0, callData.size(), callData); - final ModexpMetadata modexpMetadata = new OsakaModexpMetadata(memoryRange); - if (modexpMetadata instanceof LondonModexpMetadata && modexpMetadata.unprovableModexp()) { + final ModexpMetadata modexpMetadata = + forkPredatesOsaka(FORK_TO_USE_FOR_ZK_COUNTER) + ? new LondonModexpMetadata(memoryRange) + : new OsakaModexpMetadata(memoryRange); + if (modexpMetadata.unprovableModexp()) { modexpEffectiveCall.detectEvent(); return; }