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/BlakeModexpData.java index 49f491e889..9f97b1c994 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/BlakeModexpData.java @@ -15,13 +15,6 @@ package net.consensys.linea.zktracer.module.blake2fmodexpdata; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_BLAKE_DATA; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_BLAKE_RESULT; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_MODEXP_BASE; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_MODEXP_EXPONENT; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_MODEXP_MODULUS; -import static net.consensys.linea.zktracer.module.constants.GlobalConstants.PHASE_MODEXP_RESULT; - import java.nio.MappedByteBuffer; import java.util.List; @@ -34,7 +27,6 @@ import net.consensys.linea.zktracer.module.limits.precompiles.BlakeRounds; import net.consensys.linea.zktracer.module.limits.precompiles.ModexpEffectiveCall; import net.consensys.linea.zktracer.module.wcp.Wcp; -import org.apache.tuweni.bytes.Bytes; @RequiredArgsConstructor public class BlakeModexpData implements Module { @@ -98,27 +90,4 @@ public void commit(List buffers) { o.trace(trace, stamp); } } - - // TODO: this should die, the MMU just have to read in MmuCall - public Bytes getInputDataByIdAndPhase(final int id, final int phase) { - final BlakeModexpDataOperation op = getOperationById(id); - return switch (phase) { - case PHASE_MODEXP_BASE -> op.modexpMetaData.get().base(); - case PHASE_MODEXP_EXPONENT -> op.modexpMetaData.get().exp(); - case PHASE_MODEXP_MODULUS -> op.modexpMetaData.get().mod(); - case PHASE_MODEXP_RESULT -> Bytes.EMPTY; // TODO - case PHASE_BLAKE_DATA -> op.blake2fComponents.get().data(); - case PHASE_BLAKE_RESULT -> Bytes.EMPTY; // TODO - default -> throw new IllegalStateException("Unexpected value: " + phase); - }; - } - - private BlakeModexpDataOperation getOperationById(final int id) { - for (BlakeModexpDataOperation operation : this.operations) { - if (id == operation.id) { - return operation; - } - } - throw new RuntimeException("BlakeModexpOperation not found"); - } } 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/BlakeModexpDataOperation.java index ec6fc185ac..e06078d040 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/BlakeModexpDataOperation.java @@ -47,7 +47,7 @@ @Accessors(fluent = true) public class BlakeModexpDataOperation extends ModuleOperation { - private static final int MODEXP_COMPONENT_BYTE_SIZE = LLARGE * (INDEX_MAX_MODEXP + 1); + public static final int MODEXP_COMPONENT_BYTE_SIZE = LLARGE * (INDEX_MAX_MODEXP + 1); private static final int MODEXP_COMPONENTS_LINE_COUNT = (INDEX_MAX_MODEXP_BASE + 1) + (INDEX_MAX_MODEXP_EXPONENT + 1) 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 cae7c2fd2f..450b7fbe05 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 @@ -386,17 +386,8 @@ public Hub(final Address l2l1ContractAddress, final Bytes l2l1Topic) { this.keccak = new Keccak(ecRecoverEffectiveCall, l2Block); this.shakiraData = new ShakiraData(wcp, sha256Blocks, keccak, ripemdBlocks); this.blockdata = new Blockdata(this.wcp, this.txnData, this.rlpTxn); - this.mmu = - new Mmu( - this.euc, - this.wcp, - this.romLex, - this.rlpTxn, - this.rlpTxnRcpt, - this.ecData, - this.blakeModexpData, - this.callStack); - this.mmio = new Mmio(this.mmu); + this.mmu = new Mmu(euc, wcp); + this.mmio = new Mmio(mmu); this.refTableModules = List.of(new BinRt(), new InstructionDecoder(), new ShfRt()); 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 005e26f9e3..1830c3b5d8 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 @@ -16,6 +16,7 @@ package net.consensys.linea.zktracer.module.hub.fragment.imc.mmu; import static net.consensys.linea.zktracer.module.Util.slice; +import static net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpDataOperation.MODEXP_COMPONENT_BYTE_SIZE; import static net.consensys.linea.zktracer.module.constants.GlobalConstants.EMPTY_RIPEMD_HI; import static net.consensys.linea.zktracer.module.constants.GlobalConstants.EMPTY_RIPEMD_LO; import static net.consensys.linea.zktracer.module.constants.GlobalConstants.EMPTY_SHA2_HI; @@ -57,6 +58,9 @@ import static net.consensys.linea.zktracer.module.constants.GlobalConstants.WORD_SIZE; 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.types.Conversions.bigIntegerToBytes; import static org.apache.tuweni.bytes.Bytes.minimalBytes; @@ -174,11 +178,7 @@ public MmuCall(final Hub hub, final int instruction) { this.instruction = instruction; } - public static MmuCall nop() { - return new MmuCall().instruction(-1); - } - - public static MmuCall sha3(final Hub hub) { + public static MmuCall sha3(final Hub hub, final Bytes hashInput) { return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(hub.currentFrame().contextNumber()) .sourceRamBytes( @@ -187,6 +187,7 @@ public static MmuCall sha3(final Hub hub) { .frame() .shadowReadMemory(0, hub.currentFrame().frame().memoryByteSize()))) .auxId(hub.state().stamps().hub()) + .exoBytes(Optional.of(hashInput)) .sourceOffset(EWord.of(hub.messageFrame().getStackItem(0))) .size(Words.clampedToLong(hub.messageFrame().getStackItem(1))) .referenceSize(Words.clampedToLong(hub.messageFrame().getStackItem(1))) @@ -226,10 +227,6 @@ public static int callDataContextNumber(final Hub hub) { public static MmuCall LogX(final Hub hub, final LogData logData) { return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(logData.callFrame.contextNumber()) - .targetId(hub.state.stamps().log()) - .sourceOffset(logData.offset) - .size(logData.size) - .referenceSize(logData.size) .sourceRamBytes(Optional.of(logData.ramSourceBytes)) .exoBytes( Optional.of( @@ -237,7 +234,14 @@ public static MmuCall LogX(final Hub hub, final LogData logData) { logData.ramSourceBytes, (int) Words.clampedToLong(logData.offset), (int) logData.size))) + .sourceOffset(logData.offset) + .size(logData.size) + .referenceSize(logData.size) .setLog(); + + // Note: The targetId() is set at the end of the transaction. We don't know now if the LOG will + // be reverted or not + } public static MmuCall codeCopy(final Hub hub) { @@ -252,6 +256,7 @@ public static MmuCall returnDataCopy(final Hub hub) { final MemorySpan returnDataSegment = hub.currentFrame().returnDataSpan(); final CallFrame returnerFrame = hub.callStack().getByContextNumber(hub.currentFrame().returnDataContextNumber()); + return new MmuCall(hub, MMU_INST_ANY_TO_RAM_WITH_PADDING) .sourceId(returnerFrame.contextNumber()) .sourceRamBytes( @@ -301,9 +306,21 @@ public static MmuCall invalidCodePrefix(final Hub hub) { } public static MmuCall revert(final Hub hub) { + final CallFrame parentFrame = hub.callStack().parent(); + return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(hub.currentFrame().contextNumber()) - .targetId(hub.callStack().getById(hub.currentFrame().parentFrameId()).contextNumber()) + .sourceRamBytes( + Optional.of( + hub.currentFrame() + .frame() + .shadowReadMemory(0, hub.currentFrame().frame().memoryByteSize()))) + .targetId(parentFrame.contextNumber()) + .targetRamBytes( + Optional.of( + parentFrame + .frame() + .shadowReadMemory(0, hub.callStack().parent().frame().memoryByteSize()))) .sourceOffset(EWord.of(hub.messageFrame().getStackItem(0))) .size(Words.clampedToLong(hub.messageFrame().getStackItem(1))) .referenceOffset(hub.currentFrame().returnDataTargetInCaller().offset()) @@ -313,6 +330,7 @@ public static MmuCall revert(final Hub hub) { public static MmuCall txInit(final Hub hub) { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(hub.txStack().current().getAbsoluteTransactionNumber()) + .exoBytes(Optional.of(hub.txStack().current().getBesuTransaction().getPayload())) .targetId(hub.stamp()) .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(hub.txStack().current().getBesuTransaction().getData().map(Bytes::size).orElse(0)) @@ -327,7 +345,7 @@ public static MmuCall callDataExtractionForEcrecover( .sourceId(hub.currentFrame().contextNumber()) // called at ContextReEntry .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(subsection.exoModuleOperationId()) - .targetRamBytes(Optional.of(subsection.callData)) + .exoBytes(Optional.of(subsection.callData)) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset())) .size(subsection.callDataMemorySpan.length()) .referenceSize(128) @@ -355,7 +373,6 @@ public static MmuCall partialReturnDataCopyForEcrecover( final Hub hub, EllipticCurvePrecompileSubsection subsection) { final int precompileContextNumber = subsection.exoModuleOperationId(); - // if (recoverySuccessful && !subsection.parentReturnDataTarget.isEmpty()) { return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(precompileContextNumber) @@ -371,7 +388,7 @@ public static MmuCall partialReturnDataCopyForEcrecover( public static MmuCall callDataExtractionForShaTwoAndRipemd( final Hub hub, PrecompileSubsection precompileSubsection) { - PrecompileScenarioFragment.PrecompileFlag flag = + final PrecompileScenarioFragment.PrecompileFlag flag = precompileSubsection.precompileScenarioFragment().flag; Preconditions.checkArgument(flag.isAnyOf(PRC_SHA2_256, PRC_RIPEMD_160)); @@ -390,7 +407,7 @@ public static MmuCall callDataExtractionForShaTwoAndRipemd( public static MmuCall fullResultTransferForShaTwoAndRipemd( final Hub hub, PrecompileSubsection precompileSubsection) { - PrecompileScenarioFragment.PrecompileFlag flag = + final PrecompileScenarioFragment.PrecompileFlag flag = precompileSubsection.precompileScenarioFragment().flag; Preconditions.checkArgument(flag.isAnyOf(PRC_SHA2_256, PRC_RIPEMD_160)); @@ -405,8 +422,8 @@ public static MmuCall fullResultTransferForShaTwoAndRipemd( } else { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(precompileSubsection.exoModuleOperationId()) - .targetId(precompileSubsection.returnDataContextNumber()) .exoBytes(Optional.of(precompileSubsection.returnData)) + .targetId(precompileSubsection.returnDataContextNumber()) .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(WORD_SIZE) .phase(flag.resultPhase()) @@ -417,7 +434,7 @@ public static MmuCall fullResultTransferForShaTwoAndRipemd( public static MmuCall partialReturnDataCopyForShaTwoAndRipemd( final Hub hub, PrecompileSubsection precompileSubsection) { - PrecompileScenarioFragment.PrecompileFlag flag = + final PrecompileScenarioFragment.PrecompileFlag flag = precompileSubsection.precompileScenarioFragment().flag; Preconditions.checkArgument(flag.isAnyOf(PRC_SHA2_256, PRC_RIPEMD_160)); @@ -425,7 +442,9 @@ public static MmuCall partialReturnDataCopyForShaTwoAndRipemd( return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(precompileSubsection.returnDataContextNumber()) + .sourceRamBytes(Optional.of(precompileSubsection.returnData)) .targetId(hub.currentFrame().contextNumber()) + .targetRamBytes(Optional.of(precompileSubsection.callerMemorySnapshot)) .sourceOffset(EWord.ZERO) .size(WORD_SIZE) .referenceOffset(precompileSubsection.parentReturnDataTarget.offset()) @@ -463,7 +482,9 @@ public static MmuCall callDataExtractionForEcadd( final Hub hub, PrecompileSubsection subsection, boolean failureKnownToRam) { return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(subsection.exoModuleOperationId()) + .exoBytes(Optional.of(subsection.callData)) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset())) .size(subsection.callDataMemorySpan.length()) .referenceSize(128) @@ -476,7 +497,9 @@ public static MmuCall fullReturnDataTransferForEcadd( final Hub hub, PrecompileSubsection subsection) { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(subsection.exoModuleOperationId()) + .exoBytes(Optional.of(subsection.returnData())) .targetId(subsection.exoModuleOperationId()) + .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(64) .setEcData() .phase(PHASE_ECADD_RESULT); @@ -486,7 +509,9 @@ public static MmuCall partialCopyOfReturnDataForEcadd( final Hub hub, PrecompileSubsection subsection) { return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(subsection.exoModuleOperationId()) + .sourceRamBytes(Optional.of(subsection.returnData())) .targetId(hub.currentFrame().contextNumber()) + .targetRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetOffset(EWord.of(subsection.parentReturnDataTarget.offset())) .size(subsection.parentReturnDataTarget.length()) .referenceSize(64); @@ -496,7 +521,9 @@ public static MmuCall callDataExtractionForEcmul( final Hub hub, final PrecompileSubsection subsection, boolean failureKnownToRam) { return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(subsection.exoModuleOperationId()) + .exoBytes(Optional.of(subsection.callData)) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset())) .size(subsection.callDataMemorySpan.length()) .referenceSize(96) @@ -509,7 +536,9 @@ public static MmuCall fullReturnDataTransferForEcmul( final Hub hub, final PrecompileSubsection subsection) { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(subsection.exoModuleOperationId()) + .exoBytes(Optional.of(subsection.returnData())) .targetId(subsection.exoModuleOperationId()) + .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(64) .setEcData() .phase(PHASE_ECMUL_RESULT); @@ -519,7 +548,9 @@ public static MmuCall partialCopyOfReturnDataForEcmul( final Hub hub, final PrecompileSubsection subsection) { return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(subsection.exoModuleOperationId()) + .sourceRamBytes(Optional.of(subsection.returnData())) .targetId(hub.currentFrame().contextNumber()) + .targetRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetOffset(EWord.of(subsection.parentReturnDataTarget().offset())) .size(subsection.parentReturnDataTarget().length()) .referenceSize(64); @@ -530,7 +561,9 @@ public static MmuCall callDataExtractionForEcpairing( final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(precompileContextNumber) + .exoBytes(Optional.of(subsection.callData)) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset())) .size(subsection.callDataMemorySpan.length()) .referenceSize(subsection.callDataMemorySpan.length()) @@ -551,7 +584,9 @@ public static MmuCall fullReturnDataTransferForEcpairing( } else { return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(precompileContextNumber) + .exoBytes(Optional.of(subsection.returnData())) .targetId(precompileContextNumber) + .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(WORD_SIZE) .setEcData() .phase(PHASE_ECPAIRING_RESULT); @@ -563,7 +598,9 @@ public static MmuCall partialCopyOfReturnDataForEcpairing( final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(precompileContextNumber) + .sourceRamBytes(Optional.of(subsection.returnData())) .targetId(hub.currentFrame().contextNumber()) + .targetRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetOffset(EWord.of(subsection.parentReturnDataTarget.offset())) .size(subsection.parentReturnDataTarget.length()) .referenceSize(32); @@ -578,6 +615,7 @@ public static MmuCall parameterExtractionForBlake( final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_BLAKE) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(precompileContextNumber) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset())) .successBit(blakeSuccess) @@ -591,7 +629,9 @@ public static MmuCall callDataExtractionforBlake(final Hub hub, PrecompileSubsec final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_RAM_TO_EXO_WITH_PADDING) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(subsection.callerMemorySnapshot())) .targetId(precompileContextNumber) + .exoBytes(Optional.of(subsection.callData)) .sourceOffset(EWord.of(subsection.callDataMemorySpan.offset() + 4)) .size(208) .referenceSize(208) @@ -604,7 +644,9 @@ public static MmuCall fullReturnDataTransferForBlake( final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_EXO_TO_RAM_TRANSPLANTS) .sourceId(precompileContextNumber) + .exoBytes(Optional.of(subsection.returnData())) .targetId(precompileContextNumber) + .targetRamBytes(Optional.of(Bytes.EMPTY)) .size(64) .setBlakeModexp() .phase(PHASE_BLAKE_RESULT); @@ -615,7 +657,9 @@ public static MmuCall partialCopyOfReturnDataforBlake( final int precompileContextNumber = subsection.exoModuleOperationId(); return new MmuCall(hub, MMU_INST_RAM_TO_RAM_SANS_PADDING) .sourceId(precompileContextNumber) + .sourceRamBytes(Optional.of(subsection.returnData())) .targetId(hub.currentFrame().contextNumber()) + .targetRamBytes(Optional.of(subsection.callerMemorySnapshot())) .size(64) .referenceOffset(subsection.parentReturnDataTarget.offset()) .referenceSize(subsection.parentReturnDataTarget.length()); @@ -625,6 +669,7 @@ public static MmuCall forModexpExtractBbs( final Hub hub, final ModexpSubsection precompileSubsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(precompileSubsection.callerMemorySnapshot())) .referenceOffset(precompileSubsection.callDataMemorySpan.offset()) .referenceSize(precompileSubsection.callDataMemorySpan.length()) .limb1(metaData.bbs().hi()) @@ -635,7 +680,8 @@ public static MmuCall forModexpExtractEbs( final Hub hub, final ModexpSubsection precompileSubsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) - .sourceOffset(EWord.of(32)) + .sourceRamBytes(Optional.of(precompileSubsection.callerMemorySnapshot())) + .sourceOffset(EWord.of(EBS_MIN_OFFSET)) .referenceOffset(precompileSubsection.callDataMemorySpan.offset()) .referenceSize(precompileSubsection.callDataMemorySpan.length()) .limb1(metaData.ebs().hi()) @@ -646,7 +692,8 @@ public static MmuCall forModexpExtractMbs( final Hub hub, final ModexpSubsection precompileSubsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) .sourceId(hub.currentFrame().contextNumber()) - .sourceOffset(EWord.of(64)) + .sourceRamBytes(Optional.of(precompileSubsection.callerMemorySnapshot())) + .sourceOffset(EWord.of(MBS_MIN_OFFSET)) .referenceOffset(precompileSubsection.callDataMemorySpan.offset()) .referenceSize(precompileSubsection.callDataMemorySpan.length()) .limb1(metaData.mbs().hi()) @@ -657,6 +704,7 @@ public static MmuCall forModexpLoadLead( final Hub hub, final ModexpSubsection precompileSubsection, final ModexpMetadata metaData) { return new MmuCall(hub, MMU_INST_MLOAD) .sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes(Optional.of(precompileSubsection.callerMemorySnapshot())) .sourceOffset( EWord.of( precompileSubsection.callDataMemorySpan.offset() + 96 + metaData.bbs().toInt())) @@ -671,8 +719,8 @@ public static MmuCall forModexpExtractBase( .sourceId(modexpSubsection.callSection.hubStamp()) .sourceRamBytes(Optional.of(modexpSubsection.callerMemorySnapshot)) .targetId(modexpSubsection.exoModuleOperationId()) - .targetRamBytes(Optional.of(modExpMetadata.base())) - .sourceOffset(EWord.of(96)) + .exoBytes(Optional.of(modExpMetadata.base())) + .sourceOffset(EWord.of(BASE_MIN_OFFSET)) .size(modExpMetadata.bbs().toInt()) .referenceOffset(modexpSubsection.callDataMemorySpan.offset()) .referenceSize(modexpSubsection.callDataMemorySpan.length()) @@ -693,8 +741,8 @@ public static MmuCall forModexpExtractExponent( .sourceId(modexpSubsection.callSection.hubStamp()) .sourceRamBytes(Optional.of(modexpSubsection.callerMemorySnapshot)) .targetId(modexpSubsection.exoModuleOperationId()) - .targetRamBytes(Optional.of(modExpMetadata.exp())) - .sourceOffset(EWord.of(96 + modExpMetadata.bbs().toInt())) + .exoBytes(Optional.of(modExpMetadata.exp())) + .sourceOffset(EWord.of(BASE_MIN_OFFSET + modExpMetadata.bbs().toInt())) .size(modExpMetadata.ebs().toInt()) .referenceOffset(modexpSubsection.callDataMemorySpan.offset()) .referenceSize(modexpSubsection.callDataMemorySpan.length()) @@ -714,8 +762,9 @@ public static MmuCall forModexpExtractModulus( .sourceId(modexpSubsection.callSection.hubStamp()) .sourceRamBytes(Optional.of(modexpSubsection.callerMemorySnapshot)) .targetId(modexpSubsection.exoModuleOperationId()) - .targetRamBytes(Optional.of(modExpMetadata.mod())) - .sourceOffset(EWord.of(96 + modExpMetadata.bbs().toInt() + modExpMetadata.ebs().toInt())) + .exoBytes(Optional.of(modExpMetadata.mod())) + .sourceOffset( + EWord.of(BASE_MIN_OFFSET + modExpMetadata.bbs().toInt() + modExpMetadata.ebs().toInt())) .size(modExpMetadata.mbs().toInt()) .referenceOffset(modexpSubsection.callDataMemorySpan.offset()) .referenceSize(modexpSubsection.callDataMemorySpan.length()) @@ -730,7 +779,7 @@ public static MmuCall forModexpFullResultCopy( .exoBytes(Optional.of(modexpSubsection.returnData())) .targetId(modexpSubsection.returnDataContextNumber()) .targetRamBytes(Optional.of(Bytes.EMPTY)) - .size(512) + .size(MODEXP_COMPONENT_BYTE_SIZE) .phase(PHASE_MODEXP_RESULT) .setBlakeModexp(); } @@ -742,7 +791,7 @@ public static MmuCall forModexpPartialResultCopy( .sourceRamBytes(Optional.of(modexpSubsection.returnData())) .targetId(modexpSubsection.callSection.hubStamp()) .targetRamBytes(Optional.of(modexpSubsection.callerMemorySnapshot)) - .sourceOffset(EWord.of(512 - modExpMetadata.mbs().toInt())) + .sourceOffset(EWord.of(MODEXP_COMPONENT_BYTE_SIZE - modExpMetadata.mbs().toInt())) .size(modExpMetadata.mbs().toInt()) .referenceOffset(modexpSubsection.parentReturnDataTarget.offset()) .referenceSize(modexpSubsection.parentReturnDataTarget.length()); @@ -754,24 +803,21 @@ public Trace trace(Trace trace, State.TxState.Stamps stamps) { stamps.incrementMmuStamp(); return trace .pMiscMmuFlag(true) - .pMiscMmuInst( - this.instruction() == -1 - ? 0 - : this.instruction()) // TODO: WTF I wanted to put -1? Only for debug? - .pMiscMmuTgtId(this.targetId()) - .pMiscMmuSrcId(this.sourceId()) - .pMiscMmuAuxId(this.auxId()) - .pMiscMmuSrcOffsetHi(this.sourceOffset().hi()) - .pMiscMmuSrcOffsetLo(this.sourceOffset().lo()) - .pMiscMmuTgtOffsetLo(this.targetOffset().lo()) - .pMiscMmuSize(this.size()) - .pMiscMmuRefOffset(this.referenceOffset()) - .pMiscMmuRefSize(this.referenceSize()) - .pMiscMmuSuccessBit(this.successBit()) - .pMiscMmuLimb1(this.limb1()) - .pMiscMmuLimb2(this.limb2()) - .pMiscMmuExoSum(this.exoSum) - .pMiscMmuPhase(this.phase()); + .pMiscMmuInst(instruction) + .pMiscMmuTgtId(targetId) + .pMiscMmuSrcId(sourceId) + .pMiscMmuAuxId(auxId) + .pMiscMmuSrcOffsetHi(sourceOffset.hi()) + .pMiscMmuSrcOffsetLo(sourceOffset.lo()) + .pMiscMmuTgtOffsetLo(targetOffset.lo()) + .pMiscMmuSize(size) + .pMiscMmuRefOffset(referenceOffset) + .pMiscMmuRefSize(referenceSize) + .pMiscMmuSuccessBit(successBit) + .pMiscMmuLimb1(limb1) + .pMiscMmuLimb2(limb2) + .pMiscMmuExoSum(exoSum) + .pMiscMmuPhase(phase); } else { return trace; } @@ -781,7 +827,7 @@ public Trace trace(Trace trace, State.TxState.Stamps stamps) { public void resolvePostTransaction( Hub hub, WorldView state, Transaction tx, boolean isSuccessful) { if (traceMe) { - hub.mmu().call(this, hub.callStack()); + hub.mmu().call(this); } } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/CodeCopy.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/CodeCopy.java index eb6d108401..1ae9b31323 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/CodeCopy.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/CodeCopy.java @@ -38,7 +38,8 @@ public CodeCopy(final Hub hub) { this.hub = hub; this.contract = hub.currentFrame().metadata(); - this.targetId(hub.currentFrame().contextNumber()) + this.exoBytes(Optional.of(hub.romLex().getCodeByMetadata(contract))) + .targetId(hub.currentFrame().contextNumber()) .targetRamBytes( Optional.of( hub.currentFrame() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create.java index c1fb726db4..25007d99bb 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create.java @@ -45,6 +45,7 @@ public Create(final Hub hub) { hub.currentFrame() .frame() .shadowReadMemory(0, hub.currentFrame().frame().memoryByteSize()))) + .exoBytes(Optional.of(hub.romLex().getCodeByMetadata(contract))) .sourceOffset(EWord.of(hub.messageFrame().getStackItem(1))) .size(Words.clampedToLong(hub.messageFrame().getStackItem(2))) .referenceSize(Words.clampedToLong(hub.messageFrame().getStackItem(2))) diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create2.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create2.java index de863b5268..ad88b5b4d3 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create2.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/Create2.java @@ -45,6 +45,7 @@ public Create2(final Hub hub, final boolean failedCreate) { hub.currentFrame() .frame() .shadowReadMemory(0, hub.currentFrame().frame().memoryByteSize()))) + .exoBytes(Optional.of(hub.romLex().getCodeByMetadata(contract))) .auxId(hub.state().stamps().hub()) .sourceOffset(EWord.of(hub.messageFrame().getStackItem(1))) .size(Words.clampedToLong(hub.messageFrame().getStackItem(2))) diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ExtCodeCopy.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ExtCodeCopy.java index 067094aadc..1452b48950 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ExtCodeCopy.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ExtCodeCopy.java @@ -48,7 +48,8 @@ public ExtCodeCopy(final Hub hub) { hub.transients().conflation().deploymentInfo().number(sourceAddress), hub.transients().conflation().deploymentInfo().isDeploying(sourceAddress)); - this.targetId(hub.currentFrame().contextNumber()) + this.exoBytes(Optional.of(hub.romLex().getCodeByMetadata(contract))) + .targetId(hub.currentFrame().contextNumber()) .targetRamBytes( Optional.of( hub.currentFrame() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ReturnFromDeployment.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ReturnFromDeployment.java index 126bdea7c4..779bc1dc1f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ReturnFromDeployment.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/fragment/imc/mmu/opcode/ReturnFromDeployment.java @@ -17,6 +17,8 @@ import static net.consensys.linea.zktracer.module.constants.GlobalConstants.MMU_INST_RAM_TO_EXO_WITH_PADDING; +import java.util.Optional; + import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; import net.consensys.linea.zktracer.module.romlex.ContractMetadata; @@ -43,6 +45,12 @@ public ReturnFromDeployment(final Hub hub) { this.contract = ContractMetadata.underDeployment(contractAddress, depNumber); this.sourceId(hub.currentFrame().contextNumber()) + .sourceRamBytes( + Optional.of( + hub.currentFrame() + .frame() + .shadowReadMemory(0, hub.currentFrame().frame().memoryByteSize()))) + .exoBytes(Optional.of(hub.romLex().getCodeByMetadata(contract))) .auxId(hub.state().stamps().hub()) .sourceOffset(EWord.of(hub.messageFrame().getStackItem(0))) .size(Words.clampedToLong(hub.messageFrame().getStackItem(1))) 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.java index 126c93e6cb..325cce07bd 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.java @@ -31,10 +31,10 @@ @Getter @Accessors(fluent = true) public class ModexpMetadata { - static final int BBS_MIN_OFFSET = 0x00; - static final int EBS_MIN_OFFSET = 0x20; - static final int MBS_MIN_OFFSET = 0x40; - static final int BASE_MIN_OFFSET = 0x60; + 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; private final Bytes callData; private final EWord rawLeadingWord; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/KeccakSection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/KeccakSection.java index 91083972d7..405e42ac2a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/KeccakSection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/KeccakSection.java @@ -49,11 +49,11 @@ public KeccakSection(Hub hub) { triggerMmu = mayTriggerNonTrivialOperation & Exceptions.none(hub.pch().exceptions()); if (triggerMmu) { - final MmuCall mmuCall = MmuCall.sha3(hub); - imcFragment.callMmu(mmuCall); final long offset = Words.clampedToLong(hub.messageFrame().getStackItem(0)); final long size = Words.clampedToLong(hub.messageFrame().getStackItem(1)); hashInput = hub.currentFrame().frame().shadowReadMemory(offset, size); + final MmuCall mmuCall = MmuCall.sha3(hub, hashInput); + imcFragment.callMmu(mmuCall); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/LogSection.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/LogSection.java index f3eb560efd..81402ffcaa 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/LogSection.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/hub/section/LogSection.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import net.consensys.linea.zktracer.module.hub.Hub; import net.consensys.linea.zktracer.module.hub.defer.PostRollbackDefer; +import net.consensys.linea.zktracer.module.hub.defer.PostTransactionDefer; import net.consensys.linea.zktracer.module.hub.fragment.ContextFragment; import net.consensys.linea.zktracer.module.hub.fragment.imc.ImcFragment; import net.consensys.linea.zktracer.module.hub.fragment.imc.MxpCall; @@ -25,11 +26,14 @@ import net.consensys.linea.zktracer.module.hub.signals.Exceptions; import net.consensys.linea.zktracer.runtime.LogData; import net.consensys.linea.zktracer.runtime.callstack.CallFrame; +import org.hyperledger.besu.datatypes.Transaction; import org.hyperledger.besu.evm.frame.MessageFrame; +import org.hyperledger.besu.evm.worldstate.WorldView; -public class LogSection extends TraceSection implements PostRollbackDefer { +public class LogSection extends TraceSection implements PostRollbackDefer, PostTransactionDefer { - MmuCall mmuCall; + private MmuCall mmuCall; + private boolean logReverted = false; public LogSection(Hub hub) { super(hub, maxNumberOfRows(hub)); @@ -69,6 +73,8 @@ public LogSection(Hub hub) { // the unexceptional case Preconditions.checkArgument(Exceptions.none(exceptions)); + hub.defers().scheduleForPostTransaction(this); + final LogData logData = new LogData(hub); Preconditions.checkArgument( logData.nontrivialLog() == mxpCall.mayTriggerNontrivialMmuOperation); @@ -88,8 +94,21 @@ private static short maxNumberOfRows(Hub hub) { @Override public void resolvePostRollback(Hub hub, MessageFrame messageFrame, CallFrame callFrame) { + logReverted = true; if (mmuCall != null) { mmuCall.dontTraceMe(); } } + + @Override + public void resolvePostTransaction( + Hub hub, WorldView state, Transaction tx, boolean isSuccessful) { + if (!logReverted) { + hub.state.stamps().incrementLogStamp(); + commonValues.logStamp(hub.state.stamps().log()); + if (mmuCall != null) { + mmuCall.targetId(hub.state.stamps().log()); + } + } + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/CallStackReader.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/CallStackReader.java deleted file mode 100644 index 051774fac7..0000000000 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/CallStackReader.java +++ /dev/null @@ -1,56 +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.mmio; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Accessors; -import net.consensys.linea.zktracer.runtime.callstack.CallFrame; -import net.consensys.linea.zktracer.runtime.callstack.CallFrameType; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; -import org.apache.tuweni.bytes.Bytes; -import org.hyperledger.besu.evm.frame.MessageFrame; - -@Getter -@RequiredArgsConstructor -@Accessors(fluent = true) -public class CallStackReader { - private final CallStack callStack; - - /** - * Performs a full copy of the memory based on the identified context. - * - * @param contextNumber - * @param ramIsSource - * @return returns either the current contents of memory of an execution context or the return - * data of a precompile or the calldata of a transaction depending on the type of the context. - */ - public Bytes fullCopyOfContextMemory(final long contextNumber, final boolean ramIsSource) { - final CallFrame callFrame = callStack.getByContextNumber(contextNumber); - - if (callFrame.type() == CallFrameType.TRANSACTION_CALL_DATA_HOLDER) { - return callFrame.callDataInfo().data(); - } - - if (callFrame.type() == CallFrameType.PRECOMPILE_RETURN_DATA) { - return ramIsSource ? callFrame.outputData() : Bytes.EMPTY; - } - - final MessageFrame messageFrame = callFrame.frame(); - - return messageFrame.shadowReadMemory(0, messageFrame.memoryByteSize()); - } -} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioData.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioData.java index daa8ef3ec3..2902e9946f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioData.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioData.java @@ -39,7 +39,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import net.consensys.linea.zktracer.module.mmu.ExoSumDecoder; import net.consensys.linea.zktracer.module.mmu.values.HubToMmuValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; @@ -90,7 +89,6 @@ public class MmioData { private final int kecId; private final int phase; private final boolean successBit; - private final ExoSumDecoder exoSumDecoder; private final boolean targetLimbIsTouchedTwice; private long indexX; @@ -112,8 +110,7 @@ public class MmioData { public MmioData( HubToMmuValues hubToMmuValues, MmuToMmioConstantValues mmuToMmioConstantValues, - MmuToMmioInstruction mmuToMmioInstruction, - ExoSumDecoder exoSumDecoder) { + MmuToMmioInstruction mmuToMmioInstruction) { this( 0, 0, @@ -149,7 +146,6 @@ public MmioData( mmuToMmioConstantValues.kecId(), mmuToMmioConstantValues.phase(), mmuToMmioConstantValues.successBit(), - exoSumDecoder, mmuToMmioInstruction.targetLimbIsTouchedTwice(), 0, new ArrayList<>(LLARGE), diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioInstructions.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioInstructions.java index 414c935fc9..07d3d0ed62 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioInstructions.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/MmioInstructions.java @@ -51,7 +51,7 @@ @Accessors(fluent = true) public class MmioInstructions { - private Map mmioInstructionMap; + private final Map mmioInstructionMap; public MmioInstructions(final MmuData mmuData, final int mmioInstructionNumber) { mmioInstructionMap = diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamOneTarget.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamOneTarget.java index 113a25f9c8..984ae55e1a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamOneTarget.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamOneTarget.java @@ -19,31 +19,19 @@ import static net.consensys.linea.zktracer.module.mmio.MmioPatterns.updateTemporaryTargetRam; import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class LimbToRamOneTarget implements MmioInstruction { - private final MmuData mmuData; +public class LimbToRamOneTarget extends MmioInstruction { - private final int instructionNumber; + public LimbToRamOneTarget(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.targetContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTransplant.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTransplant.java index c9d4e1f0b4..f760231af6 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTransplant.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTransplant.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class LimbToRamTransplant implements MmioInstruction { - private final MmuData mmuData; +public class LimbToRamTransplant extends MmioInstruction { - private final int instructionNumber; + public LimbToRamTransplant(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.targetContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTwoTarget.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTwoTarget.java index c0dc01deb6..1934d73f83 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTwoTarget.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbToRamTwoTarget.java @@ -21,31 +21,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; import com.google.common.base.Preconditions; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class LimbToRamTwoTarget implements MmioInstruction { - private final MmuData mmuData; +public class LimbToRamTwoTarget extends MmioInstruction { - private final int instructionId; + public LimbToRamTwoTarget(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionId); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); Preconditions.checkArgument( mmioData.targetLimbIsTouchedTwice(), diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbVanishes.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbVanishes.java index 288cd6b020..47097d7ee8 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbVanishes.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/LimbVanishes.java @@ -15,34 +15,26 @@ package net.consensys.linea.zktracer.module.mmio.instructions; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; +import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class LimbVanishes implements MmioInstruction { - private final MmuData mmuData; +public class LimbVanishes extends MmioInstruction { - private final int instructionNumber; + public LimbVanishes(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); + mmioData.cnA(0); mmioData.cnB(0); mmioData.cnC(0); + mmioData.limb(Bytes16.ZERO); + mmioData.indexX(mmioData.targetLimbOffset()); return mmioData; diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/MmioInstruction.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/MmioInstruction.java index 59ca995294..8e5ad58be1 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/MmioInstruction.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/MmioInstruction.java @@ -15,8 +15,26 @@ package net.consensys.linea.zktracer.module.mmio.instructions; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; import net.consensys.linea.zktracer.module.mmio.MmioData; +import net.consensys.linea.zktracer.module.mmu.MmuData; +import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; +import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; -public interface MmioInstruction { - MmioData execute(); +@RequiredArgsConstructor +@Getter +@Accessors(fluent = true) +public class MmioInstruction { + protected final MmuData mmuData; + protected final int instructionNumber; + + public MmioData execute() { + final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); + final MmuToMmioInstruction mmuToMmioInstruction = + mmuData.mmuToMmioInstructions().get(instructionNumber); + + return new MmioData(mmuData.hubToMmuValues(), mmuToMmioConstantValues, mmuToMmioInstruction); + } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamExcision.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamExcision.java index 424f760ad9..a0750f1221 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamExcision.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamExcision.java @@ -18,31 +18,19 @@ import static net.consensys.linea.zktracer.module.mmio.MmioPatterns.excision; import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamExcision implements MmioInstruction { - private final MmuData mmuData; +public class RamExcision extends MmioInstruction { - private final int instructionNumber; + public RamExcision(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.targetContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbOneSource.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbOneSource.java index d0efe7505e..a453dee780 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbOneSource.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbOneSource.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToLimbOneSource implements MmioInstruction { - private final MmuData mmuData; +public class RamToLimbOneSource extends MmioInstruction { - private final int instructionNumber; + public RamToLimbOneSource(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTransplant.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTransplant.java index 978e2b717b..f8eecae896 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTransplant.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTransplant.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToLimbTransplant implements MmioInstruction { - private final MmuData mmuData; +public class RamToLimbTransplant extends MmioInstruction { - private final int instructionNumber; + public RamToLimbTransplant(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTwoSource.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTwoSource.java index 9ee947e496..7299ff2daf 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTwoSource.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToLimbTwoSource.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToLimbTwoSource implements MmioInstruction { - private final MmuData mmuData; +public class RamToLimbTwoSource extends MmioInstruction { - private final int instructionNumber; + public RamToLimbTwoSource(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(mmioData.sourceContext()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamPartial.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamPartial.java index 0cb1ab5bc8..2d5273be2e 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamPartial.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamPartial.java @@ -19,31 +19,19 @@ import static net.consensys.linea.zktracer.module.mmio.MmioPatterns.updateTemporaryTargetRam; import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToRamPartial implements MmioInstruction { - private final MmuData mmuData; +public class RamToRamPartial extends MmioInstruction { - private final int instructionNumber; + public RamToRamPartial(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(mmioData.targetContext()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTransplant.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTransplant.java index 7265ac57ba..48f0f7b017 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTransplant.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTransplant.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToRamTransplant implements MmioInstruction { - private final MmuData mmuData; +public class RamToRamTransplant extends MmioInstruction { - private final int instructionNumber; + public RamToRamTransplant(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(mmioData.targetContext()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoSource.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoSource.java index 31cb93e75c..cb601c55ad 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoSource.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoSource.java @@ -18,31 +18,19 @@ import static net.consensys.linea.zktracer.module.mmio.MmioPatterns.twoPartialToOne; import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToRamTwoSource implements MmioInstruction { - private final MmuData mmuData; +public class RamToRamTwoSource extends MmioInstruction { - private final int instructionNumber; + public RamToRamTwoSource(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.sourceContext()); mmioData.cnB(mmioData.sourceContext()); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoTarget.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoTarget.java index d21b666e35..7a43d2bfbd 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoTarget.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamToRamTwoTarget.java @@ -21,31 +21,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; import com.google.common.base.Preconditions; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamToRamTwoTarget implements MmioInstruction { - private final MmuData mmuData; +public class RamToRamTwoTarget extends MmioInstruction { - private final int instructionNumber; + public RamToRamTwoTarget(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); Preconditions.checkArgument( mmioData.targetLimbIsTouchedTwice(), diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamVanishes.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamVanishes.java index eff58aab32..a310a4064e 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamVanishes.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmio/instructions/RamVanishes.java @@ -17,31 +17,19 @@ import static net.consensys.linea.zktracer.types.Bytecodes.readLimb; -import lombok.RequiredArgsConstructor; import net.consensys.linea.zktracer.module.mmio.MmioData; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; -import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.types.Bytes16; -@RequiredArgsConstructor -public class RamVanishes implements MmioInstruction { - private final MmuData mmuData; +public class RamVanishes extends MmioInstruction { - private final int instructionNumber; + public RamVanishes(MmuData mmuData, int instructionNumber) { + super(mmuData, instructionNumber); + } @Override public MmioData execute() { - final MmuToMmioConstantValues mmuToMmioConstantValues = mmuData.mmuToMmioConstantValues(); - final MmuToMmioInstruction mmuToMmioInstruction = - mmuData.mmuToMmioInstructions().get(instructionNumber); - - MmioData mmioData = - new MmioData( - mmuData.hubToMmuValues(), - mmuToMmioConstantValues, - mmuToMmioInstruction, - mmuData.exoSumDecoder()); + final MmioData mmioData = super.execute(); mmioData.cnA(mmioData.targetContext()); mmioData.cnB(0); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/ExoSumDecoder.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/ExoSumDecoder.java deleted file mode 100644 index b4beae7630..0000000000 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/ExoSumDecoder.java +++ /dev/null @@ -1,91 +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.mmu; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Accessors; -import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpData; -import net.consensys.linea.zktracer.module.ecdata.EcData; -import net.consensys.linea.zktracer.module.mmu.values.HubToMmuValues; -import net.consensys.linea.zktracer.module.rlptxn.RlpTxn; -import net.consensys.linea.zktracer.module.rlptxrcpt.RlpTxnRcpt; -import net.consensys.linea.zktracer.module.romlex.RomLex; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; -import org.apache.tuweni.bytes.Bytes; - -@Getter -@Accessors(fluent = true) -@RequiredArgsConstructor -public class ExoSumDecoder { - private final CallStack callStack; - private final RomLex romLex; - private final RlpTxn rlpTxn; - private final RlpTxnRcpt rlpTxnRcpt; - private final EcData ecData; - private final BlakeModexpData blakeModexpData; - - private boolean exoIsRom; - private boolean exoIsBlake2fModexp; - private boolean exoIsEcData; - private boolean exoIsRipSha; - private boolean exoIsKeccak; - private boolean exoIsLog; - private boolean exoIsTxcd; - - public Bytes getExoBytes(final HubToMmuValues hubToMmuValues, final int exoId) { - exoIsRom = hubToMmuValues.exoIsRom(); - exoIsBlake2fModexp = hubToMmuValues.exoIsBlake2fModexp(); - exoIsEcData = hubToMmuValues.exoIsEcData(); - exoIsRipSha = hubToMmuValues.exoIsRipSha(); - exoIsKeccak = hubToMmuValues.exoIsKeccak(); - exoIsLog = hubToMmuValues.exoIsLog(); - exoIsTxcd = hubToMmuValues.exoIsTxcd(); - - if (exoIsRom) { - return exoId == 0 ? Bytes.EMPTY : romLex.sortedChunks().get(exoId - 1).byteCode().copy(); - } - - if (exoIsTxcd) { - return this.rlpTxn.chunkList.get(exoId - 1).tx().getPayload(); - } - - if (exoIsLog) { - return this.rlpTxnRcpt.getLogDataByAbsLogNumber(exoId); - } - - if (exoIsEcData) { - return Bytes.EMPTY; - // TODO - } - - if (exoIsRipSha) { - return Bytes.EMPTY; - // TODO - } - - if (exoIsBlake2fModexp) { - return this.blakeModexpData.getInputDataByIdAndPhase(exoId, hubToMmuValues.phase()); - } - - if (exoIsKeccak) { - return Bytes.EMPTY; - // TODO use hubToMmuValues.auxId() - } - - throw new IllegalArgumentException("No exo flag set, can't retrieve exo bytes"); - } -} diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/Mmu.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/Mmu.java index fcc9bf885c..f148744cb4 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/Mmu.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/Mmu.java @@ -23,16 +23,10 @@ import net.consensys.linea.zktracer.ColumnHeader; import net.consensys.linea.zktracer.container.stacked.list.StackedList; import net.consensys.linea.zktracer.module.Module; -import net.consensys.linea.zktracer.module.blake2fmodexpdata.BlakeModexpData; -import net.consensys.linea.zktracer.module.ecdata.EcData; import net.consensys.linea.zktracer.module.euc.Euc; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; import net.consensys.linea.zktracer.module.mmu.values.HubToMmuValues; -import net.consensys.linea.zktracer.module.rlptxn.RlpTxn; -import net.consensys.linea.zktracer.module.rlptxrcpt.RlpTxnRcpt; -import net.consensys.linea.zktracer.module.romlex.RomLex; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; @Accessors(fluent = true) public class Mmu implements Module { @@ -40,22 +34,9 @@ public class Mmu implements Module { private final Euc euc; private final Wcp wcp; - private final ExoSumDecoder exoSumDecoder; - - public Mmu( - final Euc euc, - final Wcp wcp, - final RomLex romLex, - final RlpTxn rlpTxn, - final RlpTxnRcpt rlpTxnRcpt, - final EcData ecData, - final BlakeModexpData blakeModexpData, - // TODO: SHAKIRA module - final CallStack callStack) { + public Mmu(final Euc euc, final Wcp wcp) { this.euc = euc; this.wcp = wcp; - this.exoSumDecoder = - new ExoSumDecoder(callStack, romLex, rlpTxn, rlpTxnRcpt, ecData, blakeModexpData); } @Override @@ -94,7 +75,6 @@ public void commit(List buffers) { if (mmuOperation.traceMe()) { mmuOperation.getCFI(); - mmuOperation.setExoBytes(exoSumDecoder); mmuOperation.fillLimb(); mmuStamp += 1; @@ -104,14 +84,14 @@ public void commit(List buffers) { } } - public void call(final MmuCall mmuCall, final CallStack callStack) { - MmuData mmuData = new MmuData(mmuCall, callStack); + public void call(final MmuCall mmuCall) { + MmuData mmuData = new MmuData(mmuCall); mmuData.hubToMmuValues( HubToMmuValues.fromMmuCall(mmuCall, mmuData.exoLimbIsSource(), mmuData.exoLimbIsTarget())); final MmuInstructions mmuInstructions = new MmuInstructions(euc, wcp); - mmuData = mmuInstructions.compute(mmuData, callStack); + mmuData = mmuInstructions.compute(mmuData); - this.mmuOperations.add(new MmuOperation(mmuData, callStack)); + this.mmuOperations.add(new MmuOperation(mmuData)); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuData.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuData.java index c8fbf828ce..e9f0df7f86 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuData.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuData.java @@ -28,14 +28,12 @@ import lombok.experimental.Accessors; import net.consensys.linea.zktracer.module.constants.GlobalConstants; import net.consensys.linea.zktracer.module.hub.fragment.imc.mmu.MmuCall; -import net.consensys.linea.zktracer.module.mmio.CallStackReader; import net.consensys.linea.zktracer.module.mmu.values.HubToMmuValues; import net.consensys.linea.zktracer.module.mmu.values.MmuEucCallRecord; import net.consensys.linea.zktracer.module.mmu.values.MmuOutAndBinValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; @AllArgsConstructor @@ -53,16 +51,22 @@ public class MmuData { private HubToMmuValues hubToMmuValues; private MmuToMmioConstantValues mmuToMmioConstantValues; private List mmuToMmioInstructions; - private ExoSumDecoder exoSumDecoder; private boolean mmuInstAnyToRamWithPaddingIsPurePadding; private Bytes exoBytes; private Bytes sourceRamBytes; private Bytes targetRamBytes; - private CallStackReader callStackReader; private final boolean exoLimbIsSource; private final boolean exoLimbIsTarget; + private static final List MMU_INST_EXO_IS_SOURCE = + List.of(MMU_INST_ANY_TO_RAM_WITH_PADDING, MMU_INST_EXO_TO_RAM_TRANSPLANTS); + private static final List MMU_INST_EXO_IS_TARGET = + List.of( + MMU_INST_BLAKE, + GlobalConstants.MMU_INST_MODEXP_DATA, + GlobalConstants.MMU_INST_MODEXP_ZERO, + GlobalConstants.MMU_INST_RAM_TO_EXO_WITH_PADDING); - public MmuData(final MmuCall mmuCall, final CallStack callStack) { + public MmuData(final MmuCall mmuCall) { this( mmuCall, 0, @@ -74,20 +78,16 @@ public MmuData(final MmuCall mmuCall, final CallStack callStack) { null, MmuToMmioConstantValues.builder().build(), new ArrayList<>(), - null, false, Bytes.EMPTY, Bytes.EMPTY, Bytes.EMPTY, - new CallStackReader(callStack), - List.of(MMU_INST_ANY_TO_RAM_WITH_PADDING, MMU_INST_EXO_TO_RAM_TRANSPLANTS) - .contains(mmuCall.instruction()), - List.of( - MMU_INST_BLAKE, - GlobalConstants.MMU_INST_MODEXP_DATA, - GlobalConstants.MMU_INST_MODEXP_ZERO, - GlobalConstants.MMU_INST_RAM_TO_EXO_WITH_PADDING) - .contains(mmuCall.instruction())); + MMU_INST_EXO_IS_SOURCE.contains(mmuCall.instruction()), + MMU_INST_EXO_IS_TARGET.contains(mmuCall.instruction())); + + this.setSourceRamBytes(); + this.setTargetRamBytes(); + this.setExoBytes(); } public int numberMmioInstructions() { @@ -103,31 +103,20 @@ public void mmuToMmioInstruction(final MmuToMmioInstruction mmuToMmioInstruction } public void setSourceRamBytes() { - if (this.mmuCall.sourceRamBytes().isPresent()) { - this.sourceRamBytes(this.mmuCall.sourceRamBytes().get()); - return; - } - final MmuToMmioConstantValues mmuToMmioConstantValues = this.mmuToMmioConstantValues(); - - final long sourceContextNumber = mmuToMmioConstantValues.sourceContextNumber(); - if (sourceContextNumber != 0) { - final Bytes sourceMemory = callStackReader.fullCopyOfContextMemory(sourceContextNumber, true); - this.sourceRamBytes(sourceMemory); + if (mmuCall.sourceRamBytes().isPresent()) { + sourceRamBytes(mmuCall.sourceRamBytes().get()); } } public void setTargetRamBytes() { - if (this.mmuCall.targetRamBytes().isPresent()) { - this.targetRamBytes(this.mmuCall.targetRamBytes().get()); - return; + if (mmuCall.targetRamBytes().isPresent()) { + targetRamBytes(mmuCall.targetRamBytes().get()); } - final MmuToMmioConstantValues mmuToMmioConstantValues = this.mmuToMmioConstantValues(); + } - final long targetContextNumber = mmuToMmioConstantValues.targetContextNumber(); - if (targetContextNumber != 0) { - final Bytes targetMemory = - callStackReader.fullCopyOfContextMemory(targetContextNumber, false); - this.targetRamBytes(targetMemory); + public void setExoBytes() { + if (mmuCall.exoBytes().isPresent()) { + exoBytes(mmuCall.exoBytes().get()); } } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuInstructions.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuInstructions.java index e17b1e05e2..c81c497b2a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuInstructions.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuInstructions.java @@ -44,7 +44,6 @@ import net.consensys.linea.zktracer.module.mmu.instructions.RamToRamSansPadding; import net.consensys.linea.zktracer.module.mmu.instructions.RightPaddedWordExtraction; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; @Accessors(fluent = true) class MmuInstructions { @@ -77,56 +76,56 @@ class MmuInstructions { this.blake = new Blake(euc, wcp); } - public MmuData compute(MmuData mmuData, final CallStack callStack) { + public MmuData compute(MmuData mmuData) { int mmuInstruction = mmuData.hubToMmuValues().mmuInstruction(); return switch (mmuInstruction) { case MMU_INST_MLOAD -> { - mmuData = mLoadPreComputation.preProcess(mmuData, callStack); + mmuData = mLoadPreComputation.preProcess(mmuData); yield mLoadPreComputation.setMicroInstructions(mmuData); } case MMU_INST_MSTORE -> { - mmuData = mStorePreComputation.preProcess(mmuData, callStack); + mmuData = mStorePreComputation.preProcess(mmuData); yield mStorePreComputation.setMicroInstructions(mmuData); } case MMU_INST_MSTORE8 -> { - mmuData = mStore8PreComputation.preProcess(mmuData, callStack); + mmuData = mStore8PreComputation.preProcess(mmuData); yield mStore8PreComputation.setMicroInstructions(mmuData); } case MMU_INST_INVALID_CODE_PREFIX -> { - mmuData = invalidCodePrefix.preProcess(mmuData, callStack); + mmuData = invalidCodePrefix.preProcess(mmuData); yield invalidCodePrefix.setMicroInstructions(mmuData); } case MMU_INST_RIGHT_PADDED_WORD_EXTRACTION -> { - mmuData = rightPaddedWordExtraction.preProcess(mmuData, callStack); + mmuData = rightPaddedWordExtraction.preProcess(mmuData); yield rightPaddedWordExtraction.setMicroInstructions(mmuData); } case MMU_INST_RAM_TO_EXO_WITH_PADDING -> { - mmuData = ramToExoWithPadding.preProcess(mmuData, callStack); + mmuData = ramToExoWithPadding.preProcess(mmuData); yield ramToExoWithPadding.setMicroInstructions(mmuData); } case MMU_INST_EXO_TO_RAM_TRANSPLANTS -> { - mmuData = exoToRamTransplants.preProcess(mmuData, callStack); + mmuData = exoToRamTransplants.preProcess(mmuData); yield exoToRamTransplants.setMicroInstructions(mmuData); } case MMU_INST_RAM_TO_RAM_SANS_PADDING -> { - mmuData = ramToRamSansPadding.preProcess(mmuData, callStack); + mmuData = ramToRamSansPadding.preProcess(mmuData); yield ramToRamSansPadding.setMicroInstructions(mmuData); } case MMU_INST_ANY_TO_RAM_WITH_PADDING -> { - mmuData = anyToRamWithPadding.preProcess(mmuData, callStack); + mmuData = anyToRamWithPadding.preProcess(mmuData); yield anyToRamWithPadding.setMicroInstructions(mmuData); } case MMU_INST_MODEXP_ZERO -> { - mmuData = modexpZero.preProcess(mmuData, callStack); + mmuData = modexpZero.preProcess(mmuData); yield modexpZero.setMicroInstructions(mmuData); } case MMU_INST_MODEXP_DATA -> { - mmuData = modexpData.preProcess(mmuData, callStack); + mmuData = modexpData.preProcess(mmuData); yield modexpData.setMicroInstructions(mmuData); } case MMU_INST_BLAKE -> { - mmuData = blake.preProcess(mmuData, callStack); + mmuData = blake.preProcess(mmuData); yield blake.setMicroInstructions(mmuData); } default -> throw new IllegalArgumentException( diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuOperation.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuOperation.java index 9cf6ba4c67..2586cdcd6f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuOperation.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/MmuOperation.java @@ -42,7 +42,6 @@ import lombok.Getter; import lombok.experimental.Accessors; import net.consensys.linea.zktracer.container.ModuleOperation; -import net.consensys.linea.zktracer.module.mmio.CallStackReader; import net.consensys.linea.zktracer.module.mmu.values.HubToMmuValues; import net.consensys.linea.zktracer.module.mmu.values.MmuEucCallRecord; import net.consensys.linea.zktracer.module.mmu.values.MmuOutAndBinValues; @@ -50,7 +49,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.mmu.values.RowTypeRecord; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import net.consensys.linea.zktracer.types.Bytes16; import net.consensys.linea.zktracer.types.UnsignedByte; import org.apache.tuweni.bytes.Bytes; @@ -72,11 +70,11 @@ public class MmuOperation extends ModuleOperation { private boolean isModexpZero; private boolean isModexpData; private boolean isBlake; - private final CallStackReader callStackReader; - MmuOperation(MmuData mmuData, final CallStack callStack) { + private int mmioLineCount = -1; + + MmuOperation(MmuData mmuData) { this.mmuData = mmuData; - this.callStackReader = new CallStackReader(callStack); } public boolean traceMe() { @@ -91,14 +89,18 @@ protected int computeLineCount() { } public int computeMmioLineCount() { - int sum = 0; + if (mmioLineCount != -1) { + return mmioLineCount; + } + + mmioLineCount = 0; if (traceMe()) { for (int i = 0; i < mmuData().numberMmioInstructions(); i++) { - sum += + mmioLineCount += numberOfRowOfMmioInstruction(mmuData.mmuToMmioInstructions().get(i).mmioInstruction()); } } - return sum; + return mmioLineCount; } void trace(final int mmuStamp, final int mmioStamp, Trace trace) { @@ -109,7 +111,7 @@ void trace(final int mmuStamp, final int mmioStamp, Trace trace) { traceMacroRow(mmuStamp, mmioStamp, trace); // Trace Preprocessing rows - tracePreprocessingRows(this.mmuData, mmuStamp, mmioStamp, trace); + tracePreprocessingRows(mmuData, mmuStamp, mmioStamp, trace); // Trace Micro Instructions Rows traceMicroRows(mmuStamp, mmioStamp, trace); @@ -150,21 +152,6 @@ public void getCFI() { } } - public void setExoBytes(ExoSumDecoder exoSumDecoder) { - if (mmuData.mmuCall().exoBytes().isPresent()) { - mmuData.exoBytes(mmuData.mmuCall().exoBytes().get()); - return; - } - final int exoSum = mmuData.hubToMmuValues().exoSum(); - - if (exoSum != 0) { - mmuData.exoSumDecoder(exoSumDecoder); - final int exoId = - mmuData.exoLimbIsSource() ? mmuData.mmuCall().sourceId() : mmuData.mmuCall().targetId(); - mmuData.exoBytes(exoSumDecoder.getExoBytes(mmuData.hubToMmuValues(), exoId)); - } - } - public void fillLimb() { final int mmuInstruction = mmuData.hubToMmuValues().mmuInstruction(); // Job already done in the preprocessing only for INVALID_CODE_PREFIX @@ -238,7 +225,7 @@ private void traceMacroRow(final long mmuStamp, final long mmioStamp, Trace trac traceFillMmuInstructionFlag(trace); traceOutAndBin(trace); - HubToMmuValues mmuHubInput = mmuData.hubToMmuValues(); + final HubToMmuValues mmuHubInput = mmuData.hubToMmuValues(); trace .stamp(mmuStamp) @@ -274,8 +261,8 @@ private void tracePreprocessingRows( for (int i = 1; i <= mmuData().numberMmuPreprocessingRows(); i++) { traceFillMmuInstructionFlag(trace); traceOutAndBin(trace); - MmuEucCallRecord currentMmuEucCallRecord = mmuData.eucCallRecords().get(i - 1); - MmuWcpCallRecord currentMmuWcpCallRecord = mmuData.wcpCallRecords().get(i - 1); + final MmuEucCallRecord currentMmuEucCallRecord = mmuData.eucCallRecords().get(i - 1); + final MmuWcpCallRecord currentMmuWcpCallRecord = mmuData.wcpCallRecords().get(i - 1); trace .stamp(mmuStamp) .mmioStamp(mmioStamp) @@ -305,7 +292,7 @@ private void tracePreprocessingRows( private List generateRowTypeList() { final int totInit = mmuData().numberMmioInstructions(); - List output = new ArrayList<>(totInit); + final List output = new ArrayList<>(totInit); final int totLeftZeroInit = mmuData.totalLeftZeroesInitials(); final int totNonTrivialInit = mmuData.totalNonTrivialInitials(); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/AnyToRamWithPadding.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/AnyToRamWithPadding.java index fd4f539bea..c9c40c7d3c 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/AnyToRamWithPadding.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/AnyToRamWithPadding.java @@ -43,7 +43,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class AnyToRamWithPadding implements MmuInstruction { @@ -106,7 +105,7 @@ public AnyToRamWithPadding(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); // Shared PreProcessing @@ -521,12 +520,6 @@ private void setMicroInstructionsPurePaddingCase(MmuData mmuData) { mmuData.mmuToMmioConstantValues( MmuToMmioConstantValues.builder().targetContextNumber(hubToMmuValues.targetId()).build()); - // Setting the source (if relevant) and target ram bytes - if (dataSourceIsRam) { - mmuData.setSourceRamBytes(); - } - mmuData.setTargetRamBytes(); - if (totalRightZeroIsOne) { purePaddingOnlyMicroInstruction(mmuData); } else { @@ -556,12 +549,6 @@ private void setMicroInstructionsSomeDataCase(MmuData mmuData) { .totalSize((int) hubToMmuValues.referenceSize()) .build()); - // Setting the source (if relevant) and target ram bytes - if (dataSourceIsRam) { - mmuData.setSourceRamBytes(); - } - mmuData.setTargetRamBytes(); - // Setting data transfer micro instructions if (totalNonTrivialIsOne) { someDataOnlyNonTrivialInstruction(mmuData); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/Blake.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/Blake.java index 3f688e7aa1..b82eaffb93 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/Blake.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/Blake.java @@ -34,7 +34,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class Blake implements MmuInstruction { @@ -56,7 +55,7 @@ public Blake(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); // Preprocessing row n°1 @@ -126,9 +125,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { .exoId(successBit ? (int) hubToMmuValues.targetId() : 0) .build()); - // Setting the source ram bytes - mmuData.setSourceRamBytes(); - // First micro instruction mmuData.mmuToMmioInstruction( MmuToMmioInstruction.builder() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ExoToRamTransplants.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ExoToRamTransplants.java index 7020f857a0..41065e011a 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ExoToRamTransplants.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/ExoToRamTransplants.java @@ -31,7 +31,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class ExoToRamTransplants implements MmuInstruction { @@ -46,7 +45,7 @@ public ExoToRamTransplants(Euc euc) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { // row n°1 final Bytes dividend = Bytes.ofUnsignedInt(mmuData.hubToMmuValues().size()); final EucOperation eucOp = euc.callEUC(dividend, Bytes.of(LLARGE)); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/InvalidCodePrefix.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/InvalidCodePrefix.java index 8f4a239bed..8592f6f0a1 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/InvalidCodePrefix.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/InvalidCodePrefix.java @@ -35,7 +35,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import net.consensys.linea.zktracer.types.Bytes16; import org.apache.tuweni.bytes.Bytes; @@ -57,7 +56,7 @@ public InvalidCodePrefix(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { // Set mmuData.sourceRamBytes final Bytes sourceMemory = mmuData.mmuCall().sourceRamBytes().get(); mmuData.sourceRamBytes(sourceMemory); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MLoad.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MLoad.java index db64a657eb..7b3e658267 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MLoad.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MLoad.java @@ -33,7 +33,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class MLoad implements MmuInstruction { @@ -53,7 +52,7 @@ public MLoad(Euc euc, Wcp wcp) { this.wcpCallRecords = new ArrayList<>(Trace.NB_PP_ROWS_MLOAD); } - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final long dividend1 = mmuData.hubToMmuValues().sourceOffsetLo().longValueExact(); final EucOperation eucOp = euc.callEUC(Bytes.ofUnsignedLong(dividend1), Bytes.of(LLARGE)); final short rem = (short) eucOp.remainder().toInt(); @@ -94,9 +93,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { mmuData.mmuToMmioConstantValues( MmuToMmioConstantValues.builder().sourceContextNumber(hubToMmuValues.sourceId()).build()); - // Setting the source ram bytes - mmuData.setSourceRamBytes(); - // First micro-instruction. mmuData.mmuToMmioInstruction( MmuToMmioInstruction.builder() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore.java index 9475c0ed44..18c01577b3 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore.java @@ -33,7 +33,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class MStore implements MmuInstruction { @@ -54,7 +53,7 @@ public MStore(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { // row n°1 final long dividend = mmuData.hubToMmuValues().targetOffset(); @@ -105,9 +104,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { mmuData.mmuToMmioConstantValues( MmuToMmioConstantValues.builder().targetContextNumber(hubToMmuValues.targetId()).build()); - // Setting the target ram bytes - mmuData.setTargetRamBytes(); - // First micro-instruction. mmuData.mmuToMmioInstruction( MmuToMmioInstruction.builder() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore8.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore8.java index 3d26b9a7a9..b49920f644 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore8.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MStore8.java @@ -32,7 +32,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class MStore8 implements MmuInstruction { @@ -49,7 +48,7 @@ public MStore8(Euc euc) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { // row n°1 final long dividend1 = mmuData.hubToMmuValues().targetOffset(); @@ -90,9 +89,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { mmuData.mmuToMmioConstantValues( MmuToMmioConstantValues.builder().targetContextNumber(hubToMmuValues.targetId()).build()); - // Setting the target ram bytes - mmuData.setTargetRamBytes(); - // First and only micro-instruction. mmuData.mmuToMmioInstruction( MmuToMmioInstruction.builder() diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MmuInstruction.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MmuInstruction.java index 9b16b09033..ec8ddcae76 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MmuInstruction.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/MmuInstruction.java @@ -16,10 +16,9 @@ package net.consensys.linea.zktracer.module.mmu.instructions; import net.consensys.linea.zktracer.module.mmu.MmuData; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; public interface MmuInstruction { - MmuData preProcess(MmuData mmuData, final CallStack callStack); + MmuData preProcess(MmuData mmuData); MmuData setMicroInstructions(MmuData mmuData); } 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 c2a2d83360..c7aefb6f3f 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 @@ -36,7 +36,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class ModexpData implements MmuInstruction { @@ -72,7 +71,7 @@ public ModexpData(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); row1(hubToMmuValues); row2(); @@ -248,9 +247,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { .exoId((int) hubToMmuValues.targetId()) .build()); - // Setting the source ram bytes - mmuData.setSourceRamBytes(); - // Left Zeroes for (int i = 0; i < initialTotalLeftZeroes; i++) { vanishingMicroInstruction(mmuData, i); 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 99cb4b85ac..ff883fe580 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 @@ -28,7 +28,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioConstantValues; import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; public class ModexpZero implements MmuInstruction { private List eucCallRecords; @@ -40,7 +39,7 @@ public ModexpZero() { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { // no call to wcp nor euc. So much fun. eucCallRecords.add(MmuEucCallRecord.EMPTY_CALL); @@ -70,9 +69,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { .targetContextNumber(hubToMmuValues.targetId()) .build()); - // Setting the source ram bytes - mmuData.setSourceRamBytes(); - for (int i = 0; i < Trace.NB_MICRO_ROWS_TOT_MODEXP_ZERO; i++) { vanishingMicroInstruction(mmuData, i); } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToExoWithPadding.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToExoWithPadding.java index 98422493a4..29a71e8650 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToExoWithPadding.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToExoWithPadding.java @@ -37,7 +37,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class RamToExoWithPadding implements MmuInstruction { @@ -65,7 +64,7 @@ public RamToExoWithPadding(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); row1(hubToMmuValues); @@ -201,9 +200,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { .totalSize((int) hubToMmuValues.referenceSize()) .build()); - // Setting the source ram bytes - mmuData.setTargetRamBytes(); - // Setting the list of MMIO instructions if (mmuData.totalNonTrivialInitials() == 1) { onlyMicroInstruction(mmuData); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToRamSansPadding.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToRamSansPadding.java index e6be868d75..18a0450551 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToRamSansPadding.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RamToRamSansPadding.java @@ -36,7 +36,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.tuweni.bytes.Bytes; public class RamToRamSansPadding implements MmuInstruction { @@ -72,7 +71,7 @@ public RamToRamSansPadding(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(final MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(final MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); row1(hubToMmuValues); row2(hubToMmuValues); @@ -256,10 +255,6 @@ public MmuData setMicroInstructions(final MmuData mmuData) { .targetContextNumber(hubToMmuValues.targetId()) .build()); - // Setting the source and target ram bytes - mmuData.setSourceRamBytes(); - mmuData.setTargetRamBytes(); - // Setting the list of MMIO instructions if (mmuData.totalNonTrivialInitials() == 1) { onlyMicroInstruction(mmuData); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RightPaddedWordExtraction.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RightPaddedWordExtraction.java index 599e22029d..92f1da015c 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RightPaddedWordExtraction.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/mmu/instructions/RightPaddedWordExtraction.java @@ -40,7 +40,6 @@ import net.consensys.linea.zktracer.module.mmu.values.MmuToMmioInstruction; import net.consensys.linea.zktracer.module.mmu.values.MmuWcpCallRecord; import net.consensys.linea.zktracer.module.wcp.Wcp; -import net.consensys.linea.zktracer.runtime.callstack.CallStack; import org.apache.commons.lang3.BooleanUtils; import org.apache.tuweni.bytes.Bytes; @@ -72,7 +71,7 @@ public RightPaddedWordExtraction(Euc euc, Wcp wcp) { } @Override - public MmuData preProcess(MmuData mmuData, final CallStack callStack) { + public MmuData preProcess(MmuData mmuData) { final HubToMmuValues hubToMmuValues = mmuData.hubToMmuValues(); row1(hubToMmuValues); row2(); @@ -205,9 +204,6 @@ public MmuData setMicroInstructions(MmuData mmuData) { mmuData.mmuToMmioConstantValues( MmuToMmioConstantValues.builder().sourceContextNumber(hubToMmuValues.sourceId()).build()); - // Setting the source ram bytes - mmuData.setSourceRamBytes(); - // Setting the list of MMIO instructions firstMicroInstruction(mmuData); secondMicroInstruction(mmuData); diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/rlptxrcpt/RlpTxnRcpt.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/rlptxrcpt/RlpTxnRcpt.java index d98da7a40c..a17163d652 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/rlptxrcpt/RlpTxnRcpt.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/rlptxrcpt/RlpTxnRcpt.java @@ -709,19 +709,6 @@ private void traceRow(RlpTxrcptColumns traceValue, Trace trace) { } } - public Bytes getLogDataByAbsLogNumber(final int absLogNumber) { - int counter = 0; - for (RlpTxrcptChunk chunk : this.chunkList) { - for (Log log : chunk.logs()) { - counter += 1; - if (counter == absLogNumber) { - return log.getData(); - } - } - } - throw new IllegalArgumentException("Absolute Log Number not found: " + absLogNumber); - } - /** * Calculates the size of the RLP of a transaction receipt WITHOUT its RLP prefix. * diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/romlex/RomLex.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/romlex/RomLex.java index 7cadc92be6..142e87eccd 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/romlex/RomLex.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/romlex/RomLex.java @@ -111,6 +111,10 @@ public Optional getChunkByMetadata(final ContractMetadata metadata) { return Optional.empty(); } + public Bytes getCodeByMetadata(final ContractMetadata metadata) { + return getChunkByMetadata(metadata).map(RomChunk::byteCode).orElse(Bytes.EMPTY); + } + @Override public void traceStartTx(WorldView worldView, TransactionProcessingMetadata txMetaData) { final Transaction tx = txMetaData.getBesuTransaction(); 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 c68508620f..7fcd4e52ce 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,6 +14,12 @@ */ package net.consensys.linea.zktracer.precompiles; +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 java.util.List; import net.consensys.linea.testing.BytecodeCompiler; @@ -51,6 +57,44 @@ void basicModexpTest() { BytecodeRunner.of(bytecode).run(); } + @Test + void basicNonTrivialModexpTest() { + final int base = 2; + final int exp = 5; + final int mod = 7; + final Bytes bytecode = + BytecodeCompiler.newProgram() + .push(1) + .push(BBS_MIN_OFFSET) + .op(OpCode.MSTORE) + .push(1) + .push(EBS_MIN_OFFSET) + .op(OpCode.MSTORE) + .push(1) + .push(MBS_MIN_OFFSET) + .op(OpCode.MSTORE) + .push(base) + .push(BASE_MIN_OFFSET) + .op(OpCode.MSTORE8) + .push(exp) + .push(BASE_MIN_OFFSET + 1) + .op(OpCode.MSTORE8) + .push(mod) + .push(BASE_MIN_OFFSET + 2) + .op(OpCode.MSTORE8) + .push(MODEXP_COMPONENT_BYTE_SIZE) // retLength + .push(0) // retOffset + .push(BASE_MIN_OFFSET + 3) // argLength + .push(0) // argOffset + .push(0) // value + .push(0x05) // address + .push(0xffff) // gas + .op(OpCode.CALL) + .op(OpCode.POP) + .compile(); + BytecodeRunner.of(bytecode).run(); + } + @Test void testUnpaddedModexp() {