From dadff1ec5202c9a4fb86b7b6af812eecd7fdb741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Bojarski?= <54240434+letypequividelespoubelles@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:28:00 +0100 Subject: [PATCH] fix: blockdata line counting & traceEndBlock trigger in ref tests (#1751) * blockdata fix: missing one count for traxce limit Signed-off-by: F Bojarski * update blockdata constraints Signed-off-by: F Bojarski * fix: calling twice traceEndBlock for ref tests Signed-off-by: F Bojarski --------- Signed-off-by: F Bojarski --- .../zktracer/module/blockdata/Blockdata.java | 22 +-- .../linea/zktracer/module/hub/Hub.java | 4 +- .../MessageCallTests.java | 2 +- .../RootOfMessageCallTests.java | 2 +- .../todo.md | 0 .../CallArguments.java | 2 +- .../CallArgumentsMaybeRedundant.java | 2 +- .../ReturnRevertArguments.java | 2 +- .../module/rlptxn/TestRandomTxns.java | 165 ------------------ .../linea/BlockchainReferenceTestTools.java | 3 +- 10 files changed, 21 insertions(+), 183 deletions(-) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ContextFamilyTests => contextFamily}/MessageCallTests.java (97%) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ContextFamilyTests => contextFamily}/RootOfMessageCallTests.java (93%) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ContextFamilyTests => contextFamily}/todo.md (100%) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ZeroSizeTests => zeroSize}/CallArguments.java (97%) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ZeroSizeTests => zeroSize}/CallArgumentsMaybeRedundant.java (98%) rename arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/{ZeroSizeTests => zeroSize}/ReturnRevertArguments.java (99%) delete mode 100644 arithmetization/src/test/java/net/consensys/linea/zktracer/module/rlptxn/TestRandomTxns.java diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blockdata/Blockdata.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blockdata/Blockdata.java index c97fb70340..a0b9d88a6f 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blockdata/Blockdata.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/module/blockdata/Blockdata.java @@ -19,7 +19,6 @@ import static net.consensys.linea.zktracer.module.blockdata.Trace.nROWS_DEPTH; import static net.consensys.linea.zktracer.module.constants.GlobalConstants.LLARGE; -import java.math.BigInteger; import java.nio.MappedByteBuffer; import java.util.*; @@ -30,8 +29,8 @@ import net.consensys.linea.zktracer.module.txndata.TxnData; import net.consensys.linea.zktracer.module.wcp.Wcp; import net.consensys.linea.zktracer.opcode.OpCode; -import net.consensys.linea.zktracer.types.EWord; import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.evm.worldstate.WorldView; import org.hyperledger.besu.plugin.data.BlockBody; import org.hyperledger.besu.plugin.data.BlockHeader; @@ -40,12 +39,14 @@ public class Blockdata implements Module { private final Wcp wcp; private final Euc euc; private final TxnData txnData; + private final Bytes chainId; - private final Deque operations = new ArrayDeque<>(); + private final List operations = new ArrayList<>(); private long firstBlockNumber; - private Bytes chainId; - final OpCode[] opCodes = { + private boolean conflationFinished = false; + + private static final OpCode[] opCodes = { OpCode.COINBASE, OpCode.TIMESTAMP, OpCode.NUMBER, @@ -55,10 +56,6 @@ public class Blockdata implements Module { OpCode.BASEFEE }; - public void setChainId(BigInteger chainId) { - this.chainId = EWord.of(chainId).lo(); - } - @Override public String moduleKey() { return "BLOCK_DATA"; @@ -81,6 +78,11 @@ public void traceStartConflation(final long blockCount) { euc.additionalRows.add(8); } + @Override + public void traceEndConflation(final WorldView state) { + conflationFinished = true; + } + @Override public void traceEndBlock(final BlockHeader blockHeader, final BlockBody blockBody) { final long blockNumber = blockHeader.getNumber(); @@ -113,7 +115,7 @@ public void popTransaction() {} @Override public int lineCount() { - final int numberOfBlock = (operations.size() / opCodes.length); + final int numberOfBlock = (operations.size() / opCodes.length) + (conflationFinished ? 0 : 1); return numberOfBlock * nROWS_DEPTH; } 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 cc8d20533d..2f783739c5 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 @@ -113,6 +113,7 @@ import net.consensys.linea.zktracer.runtime.stack.StackContext; import net.consensys.linea.zktracer.runtime.stack.StackLine; import net.consensys.linea.zktracer.types.Bytecode; +import net.consensys.linea.zktracer.types.EWord; import net.consensys.linea.zktracer.types.MemoryRange; import net.consensys.linea.zktracer.types.TransactionProcessingMetadata; import org.apache.tuweni.bytes.Bytes; @@ -388,8 +389,7 @@ public Hub(final Address l2l1ContractAddress, final Bytes l2l1Topic, final BigIn l2L1Logs = new L2L1Logs(l2Block); keccak = new Keccak(ecRecoverEffectiveCall, l2Block); shakiraData = new ShakiraData(wcp, sha256Blocks, keccak, ripemdBlocks); - blockdata = new Blockdata(wcp, euc, txnData); - blockdata.setChainId(chainId); + blockdata = new Blockdata(wcp, euc, txnData, EWord.of(chainId)); mmu = new Mmu(euc, wcp); mmio = new Mmio(mmu); diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/MessageCallTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/MessageCallTests.java similarity index 97% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/MessageCallTests.java rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/MessageCallTests.java index ff873d57c4..7734b5fbe0 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/MessageCallTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/MessageCallTests.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.instructionprocessing.ContextFamilyTests; +package net.consensys.linea.zktracer.instructionprocessing.contextFamily; import static net.consensys.linea.zktracer.instructionprocessing.utilities.Calls.appendCall; import static net.consensys.linea.zktracer.instructionprocessing.utilities.MonoOpCodeSmcs.keyPair; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/RootOfMessageCallTests.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/RootOfMessageCallTests.java similarity index 93% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/RootOfMessageCallTests.java rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/RootOfMessageCallTests.java index c3b5224a1b..c159edb15b 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/RootOfMessageCallTests.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/RootOfMessageCallTests.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.instructionprocessing.ContextFamilyTests; +package net.consensys.linea.zktracer.instructionprocessing.contextFamily; import static net.consensys.linea.zktracer.instructionprocessing.utilities.MultiOpCodeSmcs.allContextOpCodes; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/todo.md b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/todo.md similarity index 100% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ContextFamilyTests/todo.md rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/contextFamily/todo.md diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArguments.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArguments.java similarity index 97% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArguments.java rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArguments.java index 6c8f92a873..bd29f5282e 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArguments.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArguments.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.instructionprocessing.ZeroSizeTests; +package net.consensys.linea.zktracer.instructionprocessing.zeroSize; import static net.consensys.linea.zktracer.instructionprocessing.utilities.Calls.*; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArgumentsMaybeRedundant.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArgumentsMaybeRedundant.java similarity index 98% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArgumentsMaybeRedundant.java rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArgumentsMaybeRedundant.java index 6f5ec84abb..b5b5c27b10 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/CallArgumentsMaybeRedundant.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/CallArgumentsMaybeRedundant.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.instructionprocessing.ZeroSizeTests; +package net.consensys.linea.zktracer.instructionprocessing.zeroSize; import java.util.List; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/ReturnRevertArguments.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/ReturnRevertArguments.java similarity index 99% rename from arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/ReturnRevertArguments.java rename to arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/ReturnRevertArguments.java index 7a87e7789e..4f0a10a918 100644 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/ZeroSizeTests/ReturnRevertArguments.java +++ b/arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/zeroSize/ReturnRevertArguments.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package net.consensys.linea.zktracer.instructionprocessing.ZeroSizeTests; +package net.consensys.linea.zktracer.instructionprocessing.zeroSize; import static com.google.common.base.Preconditions.checkArgument; import static net.consensys.linea.zktracer.instructionprocessing.utilities.MonoOpCodeSmcs.keyPair; diff --git a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/rlptxn/TestRandomTxns.java b/arithmetization/src/test/java/net/consensys/linea/zktracer/module/rlptxn/TestRandomTxns.java deleted file mode 100644 index 883e84a898..0000000000 --- a/arithmetization/src/test/java/net/consensys/linea/zktracer/module/rlptxn/TestRandomTxns.java +++ /dev/null @@ -1,165 +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.rlptxn; - -import java.util.Random; - -class TestRandomTxns { - private final Random rnd = new Random(666); - private static final int TEST_TX_COUNT = 200; - - // @Test - // void test() { - // OpCodes.load(); - // ToyWorld.ToyWorldBuilder world = ToyWorld.builder(); - // List txList = new ArrayList<>(); - // - // for (int i = 0; i < TEST_TX_COUNT; i++) { - // KeyPair keyPair = new SECP256K1().generateKeyPair(); - // Address senderAddress = - // Address.extract(Hash.hash(keyPair.getPublicKey().getEncodedBytes())); - // ToyAccount senderAccount = randToyAccount(senderAddress); - // ToyAccount receiverAccount = receiverAccount(); - // - // world.account(senderAccount).account(receiverAccount); - // txList.add(randTx(senderAccount, keyPair, receiverAccount)); - // } - // ToyExecutionEnvironment.builder() - // .toyWorld(world.build()) - // .transactions(txList) - // - // .transactionProcessingResultValidator(TransactionProcessingResultValidator.EMPTY_VALIDATOR) - // .build() - // .run(); - // } - // - // final Transaction randTx(ToyAccount senderAccount, KeyPair keyPair, ToyAccount - // receiverAccount) { - // - // int txType = rnd.nextInt(0, 6); - // - // return switch (txType) { - // case 0 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.FRONTIER) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randBigInt(true))) - // .payload(randData(false)) - // .build(); - // - // case 1 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.FRONTIER) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randBigInt(true))) - // .to(receiverAccount) - // .payload(randData(false)) - // .build(); - // - // case 2 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.ACCESS_LIST) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randLong())) - // .payload(randData(false)) - // .accessList(randAccessList()) - // .build(); - // - // case 3 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.ACCESS_LIST) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randLong())) - // .to(receiverAccount) - // .payload(randData(false)) - // .accessList(randAccessList()) - // .build(); - // - // case 4 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.EIP1559) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randLong())) - // .payload(randData(false)) - // .accessList(randAccessList()) - // .build(); - // - // case 5 -> ToyTransaction.builder() - // .sender(senderAccount) - // .keyPair(keyPair) - // .transactionType(TransactionType.EIP1559) - // .gasLimit(rnd.nextLong(21000, 0xfffffffffffffL)) - // .value(Wei.of(randLong())) - // .to(receiverAccount) - // .payload(randData(false)) - // .accessList(randAccessList()) - // .build(); - // - // default -> throw new IllegalStateException("Unexpected value: " + txType); - // }; - // } - // - // final List randAccessList() { - // List accessList = new ArrayList<>(); - // boolean entries = rnd.nextBoolean(); - // if (entries) { - // for (int i = 1; i < 25; i++) { - // accessList.add(randAccessListEntry()); - // } - // } - // return accessList; - // } - // - // final AccessListEntry randAccessListEntry() { - // List keyList = new ArrayList<>(); - // boolean key = rnd.nextBoolean(); - // if (key) { - // for (int nKey = 1; nKey < rnd.nextInt(1, 20); nKey++) { - // keyList.add(Bytes32.random(rnd)); - // } - // } - // return new AccessListEntry(Address.wrap(Bytes.random(20, rnd)), keyList); - // } - // - // final ToyAccount receiverAccount() { - // - // return ToyAccount.builder() - // .balance(Wei.v_ONE) - // .nonce(6) - // .address(Address.wrap(Bytes.random(20, rnd))) - // .code( - // BytecodeCompiler.newProgram() - // .push(32, 0xbeef) - // .push(32, 0xdead) - // .op(OpCode.ADD) - // .compile()) - // .build(); - // } - // - // final ToyAccount randToyAccount(Address senderAddress) { - // - // return ToyAccount.builder() - // .balance(Wei.wrap(Bytes.random(16, rnd))) - // .nonce(randLong()) - // .address(senderAddress) - // .build(); - // } -} diff --git a/reference-tests/src/test/java/net/consensys/linea/BlockchainReferenceTestTools.java b/reference-tests/src/test/java/net/consensys/linea/BlockchainReferenceTestTools.java index 31075c3979..d4abd565c4 100644 --- a/reference-tests/src/test/java/net/consensys/linea/BlockchainReferenceTestTools.java +++ b/reference-tests/src/test/java/net/consensys/linea/BlockchainReferenceTestTools.java @@ -412,6 +412,8 @@ public static void executeTest(final BlockchainReferenceTestCaseSpec spec) { ? HeaderValidationMode.LIGHT : HeaderValidationMode.FULL; + // Note: somehow this function is calling traceEndBlock through + // blockValidator.validateAndProcessBlock final BlockImportResult importResult = blockImporter.importBlock(context, block, validationMode, validationMode); log.info( @@ -425,7 +427,6 @@ public static void executeTest(final BlockchainReferenceTestCaseSpec spec) { importResult.isImported(), candidateBlock.isValid()); - zkTracer.traceEndBlock(block.getHeader(), block.getBody()); } catch (final RLPException e) { log.info("caught RLP exception, checking it's invalid {}", candidateBlock.isValid()); assertThat(candidateBlock.isValid()).isFalse();