diff --git a/arithmetization/src/main/java/net/consensys/linea/blockcapture/snapshots/BlockHeaderSnapshot.java b/arithmetization/src/main/java/net/consensys/linea/blockcapture/snapshots/BlockHeaderSnapshot.java index ae722bc214..45c472bd8e 100644 --- a/arithmetization/src/main/java/net/consensys/linea/blockcapture/snapshots/BlockHeaderSnapshot.java +++ b/arithmetization/src/main/java/net/consensys/linea/blockcapture/snapshots/BlockHeaderSnapshot.java @@ -46,7 +46,7 @@ public record BlockHeaderSnapshot( String mixHashOrPrevRandao, long nonce, Optional baseFee, - Bytes32 parentBeaconBlockRoot) { + Optional parentBeaconBlockRoot) { public static BlockHeaderSnapshot from(BlockHeader header) { return new BlockHeaderSnapshot( header.getParentHash().toHexString(), @@ -65,7 +65,7 @@ public static BlockHeaderSnapshot from(BlockHeader header) { header.getMixHashOrPrevRandao().toHexString(), header.getNonce(), header.getBaseFee().map(Quantity::toHexString), - header.getParentBeaconBlockRoot().orElse(null)); + header.getParentBeaconBlockRoot().map(Bytes::toHexString)); } public BlockHeader toBlockHeader() { @@ -87,11 +87,11 @@ public BlockHeader toBlockHeader() { .mixHash(Hash.fromHexString(this.mixHashOrPrevRandao)) .prevRandao(Bytes32.fromHexString(this.mixHashOrPrevRandao)) .nonce(this.nonce) - .blockHeaderFunctions(new CliqueBlockHeaderFunctions()) - .parentBeaconBlockRoot(parentBeaconBlockRoot); + .blockHeaderFunctions(new CliqueBlockHeaderFunctions()); this.baseFee.ifPresent(baseFee -> builder.baseFee(Wei.fromHexString(baseFee))); - + this.parentBeaconBlockRoot.ifPresent( + root -> builder.parentBeaconBlockRoot(Bytes32.fromHexString(root))); return builder.buildBlockHeader(); } } diff --git a/arithmetization/src/main/java/net/consensys/linea/zktracer/ChainConfig.java b/arithmetization/src/main/java/net/consensys/linea/zktracer/ChainConfig.java index fac6a3253e..0480f3e7e2 100644 --- a/arithmetization/src/main/java/net/consensys/linea/zktracer/ChainConfig.java +++ b/arithmetization/src/main/java/net/consensys/linea/zktracer/ChainConfig.java @@ -15,6 +15,7 @@ package net.consensys.linea.zktracer; import static net.consensys.linea.zktracer.Fork.LONDON; +import static net.consensys.linea.zktracer.Fork.PRAGUE; import static net.consensys.linea.zktracer.Trace.ETHEREUM_GAS_LIMIT_MAXIMUM; import static net.consensys.linea.zktracer.Trace.ETHEREUM_GAS_LIMIT_MINIMUM; import static net.consensys.linea.zktracer.Trace.LINEA_CHAIN_ID; @@ -37,6 +38,8 @@ public class ChainConfig { */ public static final ChainConfig MAINNET_LONDON_TESTCONFIG = MAINNET_TESTCONFIG(LONDON); + public static final ChainConfig SEPOLIA_PRAGUE_TESTCONFIG = SEPOLIA_TESTCONFIG(PRAGUE); + public static final ChainConfig MAINNET_TESTCONFIG(final Fork fork) { return new ChainConfig( fork, @@ -47,6 +50,16 @@ public static final ChainConfig MAINNET_TESTCONFIG(final Fork fork) { LineaL1L2BridgeSharedConfiguration.TEST_DEFAULT); } + public static final ChainConfig SEPOLIA_TESTCONFIG(final Fork fork) { + return new ChainConfig( + fork, + LINEA_SEPOLIA_CHAIN_ID, + true, + BigInteger.valueOf(LINEA_GAS_LIMIT_MINIMUM), + BigInteger.valueOf(LINEA_GAS_LIMIT_MAXIMUM), + LineaL1L2BridgeSharedConfiguration.TEST_DEFAULT); + } + /** * Represents Linea mainnet prior to the block gas limit being enforced for the purposes of * running existing replay tests. As the name suggest, this is only intended for testing purposes. diff --git a/testing/src/main/java/net/consensys/linea/testing/ReplayExecutionEnvironment.java b/testing/src/main/java/net/consensys/linea/testing/ReplayExecutionEnvironment.java index 5ef2a139f7..b12f27fab3 100644 --- a/testing/src/main/java/net/consensys/linea/testing/ReplayExecutionEnvironment.java +++ b/testing/src/main/java/net/consensys/linea/testing/ReplayExecutionEnvironment.java @@ -41,6 +41,7 @@ import net.consensys.linea.corset.CorsetValidator; import net.consensys.linea.zktracer.ChainConfig; import net.consensys.linea.zktracer.ConflationAwareOperationTracer; +import net.consensys.linea.zktracer.Fork; import net.consensys.linea.zktracer.ZkTracer; import net.consensys.linea.zktracer.module.hub.Hub; import org.apache.commons.io.FileUtils; @@ -288,10 +289,12 @@ private static void executeFrom( new BlockBody( blockSnapshot.txs().stream().map(TransactionSnapshot::toTransaction).toList(), new ArrayList<>()); + // Determine mining beneficiay final Address miningBeneficiary = useCoinbaseAddressFromBlockHeader ? header.getCoinbase() - : CliqueHelpers.getProposerOfBlock(header); + : determineMiningBeneficiary(header, chain.fork); + tracer.traceStartBlock(world.updater(), header, body, miningBeneficiary); runSystemInitialTransactions(protocolSpec, chain.fork, world, header, tracer); @@ -321,6 +324,15 @@ public Hub getHub() { return zkTracer.getHub(); } + private static Address determineMiningBeneficiary(BlockHeader header, Fork fork) { + // Clique was only used on forks prior to Shanghai + if (Fork.isPostShanghai(fork)) { + return header.getCoinbase(); + } else { + return CliqueHelpers.getProposerOfBlock(header); + } + } + /** * Initialise a fresh world state from a conflation. *