diff --git a/coordinator/app/src/main/kotlin/linea/coordinator/config/ConfigLoader.kt b/coordinator/app/src/main/kotlin/linea/coordinator/config/ConfigLoader.kt new file mode 100644 index 00000000000..d80c1c1d5b5 --- /dev/null +++ b/coordinator/app/src/main/kotlin/linea/coordinator/config/ConfigLoader.kt @@ -0,0 +1,136 @@ +package linea.coordinator.config + +import com.github.michaelbull.result.Err +import com.github.michaelbull.result.Ok +import com.github.michaelbull.result.Result +import com.github.michaelbull.result.get +import com.github.michaelbull.result.getOrElse +import com.sksamuel.hoplite.ConfigLoaderBuilder +import com.sksamuel.hoplite.addPathSource +import net.consensys.linea.traces.TracesCountersV1 +import net.consensys.linea.traces.TracesCountersV2 +import net.consensys.zkevm.coordinator.app.config.CoordinatorConfig +import net.consensys.zkevm.coordinator.app.config.CoordinatorConfigTomlDto +import net.consensys.zkevm.coordinator.app.config.GasPriceCapTimeOfDayMultipliersConfig +import net.consensys.zkevm.coordinator.app.config.SmartContractErrorCodesConfig +import net.consensys.zkevm.coordinator.app.config.TracesLimitsV1ConfigFile +import net.consensys.zkevm.coordinator.app.config.TracesLimitsV2ConfigFile +import org.apache.logging.log4j.LogManager +import org.apache.logging.log4j.Logger +import java.nio.file.Path + +inline fun loadConfigsOrError( + configFiles: List +): Result { + val confBuilder: ConfigLoaderBuilder = ConfigLoaderBuilder.Companion.empty().addDefaults() + for (configFile in configFiles.reversed()) { + // files must be added in reverse order for overriding + confBuilder.addPathSource(configFile, false) + } + + return confBuilder.build().loadConfig(emptyList()).let { config -> + if (config.isInvalid()) { + Err(config.getInvalidUnsafe().description()) + } else { + Ok(config.getUnsafe()) + } + } +} + +fun logErrorIfPresent( + configName: String, + configFiles: List, + configLoadingResult: Result, + logger: Logger +) { + if (configLoadingResult is Err) { + logger.error("Failed to load $configName from files=$configFiles with error=${configLoadingResult.error}") + } +} + +inline fun loadConfigsAndLogErrors( + configFiles: List, + configName: String, + logger: Logger = LogManager.getLogger("linea.coordinator.config") +): Result { + return loadConfigsOrError(configFiles) + .also { logErrorIfPresent(configName, configFiles, it, logger) } +} + +fun loadConfigsOrError( + coordinatorConfigFiles: List, + tracesLimitsFileV1: Path?, + tracesLimitsFileV2: Path?, + gasPriceCapTimeOfDayMultipliersFile: Path, + smartContractErrorsFile: Path, + logger: Logger = LogManager.getLogger("linea.coordinator.config") +): Result { + val coordinatorBaseConfigs = + loadConfigsAndLogErrors(coordinatorConfigFiles, "coordinator", logger) + val tracesLimitsV1Configs = tracesLimitsFileV1 + ?.let { loadConfigsAndLogErrors(listOf(it), "traces limit v1", logger) } + val tracesLimitsV2Configs = tracesLimitsFileV2 + ?.let { loadConfigsAndLogErrors(listOf(it), "traces limits v2", logger) } + val gasPriceCapTimeOfDayMultipliersConfig = + loadConfigsAndLogErrors( + listOf(gasPriceCapTimeOfDayMultipliersFile), + "l1 submission gas prices caps", + logger + ) + val smartContractErrorsConfig = loadConfigsAndLogErrors( + listOf(smartContractErrorsFile), + "smart contract errors", + logger + ) + val configError = listOf( + coordinatorBaseConfigs, + tracesLimitsV1Configs, + tracesLimitsV1Configs, + gasPriceCapTimeOfDayMultipliersConfig, + smartContractErrorsConfig + ) + .find { it is Err } + + if (configError != null) { + @Suppress("UNCHECKED_CAST") + return configError as Result + } + + val baseConfig = coordinatorBaseConfigs.get()!! + val finalConfig = baseConfig.copy( + conflation = baseConfig.conflation.copy( + _tracesLimitsV1 = tracesLimitsV1Configs?.get()?.tracesLimits?.let { TracesCountersV1(it) }, + _tracesLimitsV2 = tracesLimitsV2Configs?.get()?.tracesLimits?.let { TracesCountersV2(it) }, + _smartContractErrors = smartContractErrorsConfig.get()!!.smartContractErrors + ), + l1DynamicGasPriceCapService = baseConfig.l1DynamicGasPriceCapService.copy( + gasPriceCapCalculation = baseConfig.l1DynamicGasPriceCapService.gasPriceCapCalculation.copy( + timeOfDayMultipliers = gasPriceCapTimeOfDayMultipliersConfig.get()?.gasPriceCapTimeOfDayMultipliers + ) + ) + ) + return Ok(finalConfig) +} + +fun loadConfigs( + coordinatorConfigFiles: List, + tracesLimitsFileV1: Path?, + tracesLimitsFileV2: Path?, + gasPriceCapTimeOfDayMultipliersFile: Path, + smartContractErrorsFile: Path, + logger: Logger = LogManager.getLogger("linea.coordinator.config") +): CoordinatorConfig { + loadConfigsOrError( + coordinatorConfigFiles, + tracesLimitsFileV1, + tracesLimitsFileV2, + gasPriceCapTimeOfDayMultipliersFile, + smartContractErrorsFile, + logger + ).let { + return it + .getOrElse { + throw RuntimeException("Invalid configurations: $it") + }.reified() + } +} diff --git a/coordinator/app/src/main/kotlin/net/consensys/zkevm/coordinator/app/CoordinatorAppCli.kt b/coordinator/app/src/main/kotlin/net/consensys/zkevm/coordinator/app/CoordinatorAppCli.kt index e552add8c25..febd8afecd3 100644 --- a/coordinator/app/src/main/kotlin/net/consensys/zkevm/coordinator/app/CoordinatorAppCli.kt +++ b/coordinator/app/src/main/kotlin/net/consensys/zkevm/coordinator/app/CoordinatorAppCli.kt @@ -1,21 +1,6 @@ package net.consensys.zkevm.coordinator.app -import com.github.michaelbull.result.Err -import com.github.michaelbull.result.Ok -import com.github.michaelbull.result.Result -import com.github.michaelbull.result.get -import com.github.michaelbull.result.getError -import com.github.michaelbull.result.onFailure -import com.sksamuel.hoplite.ConfigLoaderBuilder -import com.sksamuel.hoplite.addFileSource -import net.consensys.linea.traces.TracesCountersV1 -import net.consensys.linea.traces.TracesCountersV2 import net.consensys.zkevm.coordinator.app.config.CoordinatorConfig -import net.consensys.zkevm.coordinator.app.config.CoordinatorConfigTomlDto -import net.consensys.zkevm.coordinator.app.config.GasPriceCapTimeOfDayMultipliersConfig -import net.consensys.zkevm.coordinator.app.config.SmartContractErrorCodesConfig -import net.consensys.zkevm.coordinator.app.config.TracesLimitsV1ConfigFile -import net.consensys.zkevm.coordinator.app.config.TracesLimitsV2ConfigFile import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger import picocli.CommandLine @@ -115,13 +100,14 @@ internal constructor(private val errorWriter: PrintWriter, private val startActi } } - val configs = validateConfigs( - tracesLimitsFile, - tracesLimitsV2File, - smartContractErrorsFile, - gasPriceCapTimeOfDayMultipliersFile, - configFiles - ) ?: return 1 + val configs = linea.coordinator.config.loadConfigs( + coordinatorConfigFiles = configFiles.map { it.toPath() }, + tracesLimitsFileV1 = tracesLimitsFile?.toPath(), + tracesLimitsFileV2 = tracesLimitsV2File?.toPath(), + smartContractErrorsFile = smartContractErrorsFile.toPath(), + gasPriceCapTimeOfDayMultipliersFile = gasPriceCapTimeOfDayMultipliersFile.toPath(), + logger = logger + ) if (checkConfigsOnly) { logger.info("All configs are valid. Final configs: {}", configs) @@ -144,7 +130,7 @@ internal constructor(private val errorWriter: PrintWriter, private val startActi } fun reportUserError(ex: Throwable) { - logger.fatal(ex.message, ex) + logger.fatal(ex.message) errorWriter.println(ex.message) printUsage(errorWriter) } @@ -155,97 +141,6 @@ internal constructor(private val errorWriter: PrintWriter, private val startActi outputWriter.println(COMMAND_NAME + " --help") } - private fun validateConfigs( - tracesLimitsFile: File?, - tracesLimitsV2File: File?, - smartContractErrorsFile: File, - gasPriceCapTimeOfDayMultipliersFile: File, - coordinatorConfigFiles: List - ): CoordinatorConfig? { - var hasConfigError = false - val tracesLimitsV1Configs = if (tracesLimitsFile == null) { - null - } else { - loadConfigsOrError(listOf(tracesLimitsFile)) - } - - val tracesLimitsV2Configs = if (tracesLimitsV2File == null) { - null - } else { - loadConfigsOrError(listOf(tracesLimitsV2File)) - } - - val smartContractErrorCodes = - loadConfigsOrError(listOf(smartContractErrorsFile)) - - val gasPriceCapTimeOfDayMultipliers = - loadConfigsOrError(listOf(gasPriceCapTimeOfDayMultipliersFile)) - - val configs = loadConfigsOrError(coordinatorConfigFiles) - - if (tracesLimitsV1Configs is Err) { - hasConfigError = true - logger.error("Reading {} failed: {}", tracesLimitsFile, tracesLimitsV1Configs.getError()) - } else if (tracesLimitsV1Configs is Ok) { - runCatching { - TracesCountersV1(tracesLimitsV1Configs.get()!!.tracesLimits) - }.getOrElse { - hasConfigError = true - logger.error("Traces limits file {} is incomplete. {}", tracesLimitsFile, it.message) - } - } - - if (tracesLimitsV2Configs is Err) { - hasConfigError = true - logger.error("Reading {} failed: {}", tracesLimitsV2File, tracesLimitsV2Configs.getError()) - } else if (tracesLimitsV2Configs is Ok) { - runCatching { - TracesCountersV2(tracesLimitsV2Configs.get()!!.tracesLimits) - }.getOrElse { - hasConfigError = true - logger.error("Traces limits file {} is incomplete. {}", tracesLimitsV2File, it.message) - } - } - - if (smartContractErrorCodes is Err) { - hasConfigError = true - logger.error("Reading {} failed: {}", smartContractErrorsFile, smartContractErrorCodes.getError()) - } - - if (gasPriceCapTimeOfDayMultipliers is Err) { - hasConfigError = true - logger.error( - "Reading {} failed: {}", - gasPriceCapTimeOfDayMultipliersFile, - gasPriceCapTimeOfDayMultipliers.getError() - ) - } - - if (configs is Err) { - hasConfigError = true - logger.error("Reading {} failed: {}", configFiles, configs.getError()) - } - - return if (hasConfigError) { - null - } else { - configs.get()?.let { config: CoordinatorConfigTomlDto -> - config.copy( - conflation = config.conflation.copy( - _tracesLimitsV1 = tracesLimitsV1Configs?.get()?.tracesLimits?.let { TracesCountersV1(it) }, - _tracesLimitsV2 = tracesLimitsV2Configs?.get()?.tracesLimits?.let { TracesCountersV2(it) }, - _smartContractErrors = smartContractErrorCodes.get()?.smartContractErrors - ), - l1DynamicGasPriceCapService = config.l1DynamicGasPriceCapService.copy( - gasPriceCapCalculation = config.l1DynamicGasPriceCapService.gasPriceCapCalculation.copy( - timeOfDayMultipliers = gasPriceCapTimeOfDayMultipliers.get()?.gasPriceCapTimeOfDayMultipliers - ) - ) - ).reified() - } - } - } - /** * Not using a static field for this log instance because some code in this class executes prior * to the logging configuration being applied so it's not always safe to use the logger. @@ -267,29 +162,5 @@ internal constructor(private val errorWriter: PrintWriter, private val startActi val errorWriter = PrintWriter(System.err, true, Charset.defaultCharset()) return CoordinatorAppCli(errorWriter, startAction) } - - inline fun loadConfigs(configFiles: List, errorWriter: PrintWriter): T? { - return loadConfigsOrError(configFiles).onFailure { error -> - errorWriter.println(error) - }.get() - } - - inline fun loadConfigsOrError( - configFiles: List - ): Result { - val confBuilder: ConfigLoaderBuilder = ConfigLoaderBuilder.Companion.empty().addDefaults() - for (configFile in configFiles.reversed()) { - // files must be added in reverse order for overriding - confBuilder.addFileSource(configFile, false) - } - - return confBuilder.build().loadConfig(emptyList()).let { config -> - if (config.isInvalid()) { - Err(config.getInvalidUnsafe().description()) - } else { - Ok(config.getUnsafe()) - } - } - } } } diff --git a/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/CoordinatorConfigTest.kt b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/CoordinatorConfigTest.kt index 33005abe6e4..3b62a295a14 100644 --- a/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/CoordinatorConfigTest.kt +++ b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/CoordinatorConfigTest.kt @@ -1,10 +1,9 @@ package net.consensys.zkevm.coordinator.app.config -import com.github.michaelbull.result.get import com.github.michaelbull.result.getError -import com.github.michaelbull.result.onFailure -import com.github.michaelbull.result.onSuccess import com.sksamuel.hoplite.Masked +import linea.coordinator.config.loadConfigs +import linea.coordinator.config.loadConfigsOrError import net.consensys.linea.BlockParameter import net.consensys.linea.blob.BlobCompressorVersion import net.consensys.linea.ethereum.gaspricing.BoundableFeeCalculator @@ -15,178 +14,39 @@ import net.consensys.linea.ethereum.gaspricing.staticcap.MinerExtraDataV1Calcula import net.consensys.linea.ethereum.gaspricing.staticcap.TransactionCostCalculator import net.consensys.linea.ethereum.gaspricing.staticcap.VariableFeesCalculator import net.consensys.linea.jsonrpc.client.RequestRetryConfig -import net.consensys.linea.traces.TracesCountersV1 -import net.consensys.linea.traces.TracesCountersV2 -import net.consensys.linea.traces.TracingModuleV1 -import net.consensys.linea.traces.TracingModuleV2 -import net.consensys.linea.web3j.SmartContractErrors -import net.consensys.zkevm.coordinator.app.CoordinatorAppCli import net.consensys.zkevm.coordinator.app.L2NetworkGasPricingService import net.consensys.zkevm.coordinator.clients.prover.FileBasedProverConfig import net.consensys.zkevm.coordinator.clients.prover.ProverConfig import net.consensys.zkevm.coordinator.clients.prover.ProversConfig import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.fail import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertDoesNotThrow import org.junit.jupiter.api.assertThrows -import java.io.File import java.math.BigInteger import java.net.URI import java.nio.file.Path +import java.nio.file.Paths import java.time.Duration import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds class CoordinatorConfigTest { companion object { - private val apiConfig = ApiConfig(9545U) - private val conflationConfig = ConflationConfig( consistentNumberOfBlocksOnL1ToWait = 1, conflationDeadline = Duration.parse("PT6S"), conflationDeadlineCheckInterval = Duration.parse("PT3S"), conflationDeadlineLastBlockConfirmationDelay = Duration.parse("PT2S"), blocksLimit = 2, - _tracesLimitsV1 = TracesCountersV1( - mapOf( - TracingModuleV1.ADD to 524288U, - TracingModuleV1.BIN to 262144U, - TracingModuleV1.BIN_RT to 262144U, - TracingModuleV1.EC_DATA to 4096U, - TracingModuleV1.EXT to 131072U, - TracingModuleV1.HUB to 2097152U, - TracingModuleV1.INSTRUCTION_DECODER to 512U, - TracingModuleV1.MMIO to 131072U, - TracingModuleV1.MMU to 131072U, - TracingModuleV1.MMU_ID to 131072U, - TracingModuleV1.MOD to 131072U, - TracingModuleV1.MUL to 65536U, - TracingModuleV1.MXP to 524288U, - TracingModuleV1.PHONEY_RLP to 32768U, - TracingModuleV1.PUB_HASH to 32768U, - TracingModuleV1.PUB_HASH_INFO to 32768U, - TracingModuleV1.PUB_LOG to 16384U, - TracingModuleV1.PUB_LOG_INFO to 16384U, - TracingModuleV1.RLP to 512U, - TracingModuleV1.ROM to 4194304U, - TracingModuleV1.SHF to 65536U, - TracingModuleV1.SHF_RT to 4096U, - TracingModuleV1.TX_RLP to 131072U, - TracingModuleV1.WCP to 262144U, - TracingModuleV1.BLOCK_TX to 200U, - TracingModuleV1.BLOCK_L2L1LOGS to 16U, - TracingModuleV1.BLOCK_KECCAK to 8192U, - TracingModuleV1.PRECOMPILE_ECRECOVER to 10000U, - TracingModuleV1.PRECOMPILE_SHA2 to 10000U, - TracingModuleV1.PRECOMPILE_RIPEMD to 10000U, - TracingModuleV1.PRECOMPILE_IDENTITY to 10000U, - TracingModuleV1.PRECOMPILE_MODEXP to 10000U, - TracingModuleV1.PRECOMPILE_ECADD to 10000U, - TracingModuleV1.PRECOMPILE_ECMUL to 10000U, - TracingModuleV1.PRECOMPILE_ECPAIRING to 10000U, - TracingModuleV1.PRECOMPILE_BLAKE2F to 512U - ) - ), - _tracesLimitsV2 = TracesCountersV2( - mapOf( - TracingModuleV2.ADD to 524288u, - TracingModuleV2.BIN to 262144u, - TracingModuleV2.BLAKE_MODEXP_DATA to 16384u, - TracingModuleV2.BLOCK_DATA to 1024u, - TracingModuleV2.BLOCK_HASH to 512u, - TracingModuleV2.EC_DATA to 262144u, - TracingModuleV2.EUC to 65536u, - TracingModuleV2.EXP to 8192u, - TracingModuleV2.EXT to 1048576u, - TracingModuleV2.GAS to 65536u, - TracingModuleV2.HUB to 2097152u, - TracingModuleV2.LOG_DATA to 65536u, - TracingModuleV2.LOG_INFO to 4096u, - TracingModuleV2.MMIO to 4194304u, - TracingModuleV2.MMU to 4194304u, - TracingModuleV2.MOD to 131072u, - TracingModuleV2.MUL to 65536u, - TracingModuleV2.MXP to 524288u, - TracingModuleV2.OOB to 262144u, - TracingModuleV2.RLP_ADDR to 4096u, - TracingModuleV2.RLP_TXN to 131072u, - TracingModuleV2.RLP_TXN_RCPT to 65536u, - TracingModuleV2.ROM to 4194304u, - TracingModuleV2.ROM_LEX to 1024u, - TracingModuleV2.SHAKIRA_DATA to 32768u, - TracingModuleV2.SHF to 65536u, - TracingModuleV2.STP to 16384u, - TracingModuleV2.TRM to 32768u, - TracingModuleV2.TXN_DATA to 8192u, - TracingModuleV2.WCP to 262144u, - TracingModuleV2.BIN_REFERENCE_TABLE to 4294967295u, - TracingModuleV2.SHF_REFERENCE_TABLE to 4294967295u, - TracingModuleV2.INSTRUCTION_DECODER to 4294967295u, - TracingModuleV2.PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS to 128u, - TracingModuleV2.PRECOMPILE_SHA2_BLOCKS to 671u, - TracingModuleV2.PRECOMPILE_RIPEMD_BLOCKS to 671u, - TracingModuleV2.PRECOMPILE_MODEXP_EFFECTIVE_CALLS to 4u, - TracingModuleV2.PRECOMPILE_ECADD_EFFECTIVE_CALLS to 16384u, - TracingModuleV2.PRECOMPILE_ECMUL_EFFECTIVE_CALLS to 32u, - TracingModuleV2.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS to 16u, - TracingModuleV2.PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS to 64u, - TracingModuleV2.PRECOMPILE_ECPAIRING_MILLER_LOOPS to 64u, - TracingModuleV2.PRECOMPILE_BLAKE_EFFECTIVE_CALLS to 600u, - TracingModuleV2.PRECOMPILE_BLAKE_ROUNDS to 600u, - TracingModuleV2.BLOCK_KECCAK to 8192u, - TracingModuleV2.BLOCK_L1_SIZE to 1000000u, - TracingModuleV2.BLOCK_L2_L1_LOGS to 16u, - TracingModuleV2.BLOCK_TRANSACTIONS to 200u - ) - ), + _tracesLimitsV1 = expectedTracesCountersV1, + _tracesLimitsV2 = expectedTracesLimitsV2, _smartContractErrors = mapOf( // L1 Linea Rollup "0f06cd15" to "DataAlreadySubmitted", "c01eab56" to "EmptySubmissionData", - "abefa5e8" to "DataStartingBlockDoesNotMatch", - "5548c6b3" to "DataParentHasEmptyShnarf", - "36459fa0" to "L1RollingHashDoesNotExistOnL1", - "cbbd7953" to "FirstBlockGreaterThanFinalBlock", - "a386ed70" to "FirstBlockLessThanOrEqualToLastFinalizedBlock", - "70614405" to "FinalBlockNumberLessThanOrEqualToLastFinalizedBlock", - "2898482a" to "FinalBlockStateEqualsZeroHash", - "bf81c6e0" to "FinalizationInTheFuture", - "0c256592" to "MissingMessageNumberForRollingHash", - "5228f4c8" to "MissingRollingHashForMessageNumber", - "729eebce" to "FirstByteIsNotZero", - "6426c6c5" to "BytesLengthNotMultipleOf32", - "68dcad5f" to "PointEvaluationResponseInvalid", - "f75db381" to "PrecompileReturnDataLengthWrong", - "a71194af" to "PointEvaluationFailed", - "2f22b98a" to "LastFinalizedShnarfWrong", - "7dc2487d" to "SnarkHashIsZeroHash", - "bc5aad11" to "FinalizationStateIncorrect", - "b1504a5f" to "BlobSubmissionDataIsMissing", - "c0e41e1d" to "EmptyBlobDataAtIndex", - "fb4cd6ef" to "FinalBlockDoesNotMatchShnarfFinalBlock", - "2526F108" to "ShnarfAndFinalBlockNumberLengthsMismatched", - "d3664fb3" to "FinalShnarfWrong", - "4e686675" to "L2MerkleRootDoesNotExist", - "e5d14425" to "L2MerkleRootAlreadyAnchored", - "0c91d776" to "BytesLengthNotMultipleOfTwo", - "ead4c30e" to "StartingRootHashDoesNotMatch", - "7907d79b" to "ProofIsEmpty", - "69ed70ab" to "InvalidProofType", - "09bde339" to "InvalidProof", - "db246dde" to "IsPaused", - "b015579f" to "IsNotPaused", - "3b174434" to "MessageHashesListLengthHigherThanOneHundred", - "ca389c44" to "InvalidProofOrProofVerificationRanOutOfGas", - "42ab979d" to "ParentBlobNotSubmitted", - "edeae83c" to "FinalBlobNotSubmitted", - // L2 Message Service - "6446cc9c" to "MessageHashesListLengthIsZero", - "d39e75f9" to "L1MessageNumberSynchronizationWrong", - "7557a60a" to "L1RollingHashSynchronizationWrong", - "36a4bb94" to "FinalRollingHashIsZero" + "abefa5e8" to "DataStartingBlockDoesNotMatch" ), fetchBlocksLimit = 4000 ) @@ -478,176 +338,7 @@ class CoordinatorConfigTest { gasPriceCapsCheckCoefficient = 0.9, historicBaseFeePerBlobGasLowerBound = 100_000_000u, historicAvgRewardConstant = 100_000_000u, - timeOfDayMultipliers = mapOf( - "SUNDAY_0" to 1.7489178377946066, - "SUNDAY_1" to 1.7494632175198737, - "SUNDAY_2" to 1.75, - "SUNDAY_3" to 1.733166295438555, - "SUNDAY_4" to 1.6993775444542885, - "SUNDAY_5" to 1.6350086618091364, - "SUNDAY_6" to 1.5627740860151331, - "SUNDAY_7" to 1.4831149222064164, - "SUNDAY_8" to 1.4101476768256929, - "SUNDAY_9" to 1.370085278922007, - "SUNDAY_10" to 1.3516015544068651, - "SUNDAY_11" to 1.3482404546676368, - "SUNDAY_12" to 1.3580905751578942, - "SUNDAY_13" to 1.3775497419563296, - "SUNDAY_14" to 1.3700255667542938, - "SUNDAY_15" to 1.2642948506461285, - "SUNDAY_16" to 1.2794806131912935, - "SUNDAY_17" to 1.2750892256476676, - "SUNDAY_18" to 1.2919720208955585, - "SUNDAY_19" to 1.317984990098603, - "SUNDAY_20" to 1.4433501639513178, - "SUNDAY_21" to 1.4705921238901998, - "SUNDAY_22" to 1.515043370430801, - "SUNDAY_23" to 1.5556742617266397, - "MONDAY_0" to 1.5381562278760164, - "MONDAY_1" to 1.5423761828433993, - "MONDAY_2" to 1.539015963719092, - "MONDAY_3" to 1.487676153648977, - "MONDAY_4" to 1.430973985132037, - "MONDAY_5" to 1.4656765439056292, - "MONDAY_6" to 1.4484298622828233, - "MONDAY_7" to 1.4459076216659752, - "MONDAY_8" to 1.4899061835032241, - "MONDAY_9" to 1.5249733712852067, - "MONDAY_10" to 1.511367489481033, - "MONDAY_11" to 1.4225695658047797, - "MONDAY_12" to 1.2887291896624584, - "MONDAY_13" to 1.1460926897291355, - "MONDAY_14" to 1.0004897955233254, - "MONDAY_15" to 0.8694664537368378, - "MONDAY_16" to 0.8270273375962802, - "MONDAY_17" to 0.7868289022833883, - "MONDAY_18" to 0.7780303121746551, - "MONDAY_19" to 0.7756215256634205, - "MONDAY_20" to 0.7984895728860915, - "MONDAY_21" to 0.8918589268832423, - "MONDAY_22" to 0.9967716668541272, - "MONDAY_23" to 1.0973334887144106, - "TUESDAY_0" to 1.2233064209957951, - "TUESDAY_1" to 1.3238883432855082, - "TUESDAY_2" to 1.3874518307497257, - "TUESDAY_3" to 1.463621147171298, - "TUESDAY_4" to 1.4975989065490154, - "TUESDAY_5" to 1.481679186141442, - "TUESDAY_6" to 1.452778387763161, - "TUESDAY_7" to 1.3414858185569951, - "TUESDAY_8" to 1.2869454637983988, - "TUESDAY_9" to 1.249347290389873, - "TUESDAY_10" to 1.196488297386161, - "TUESDAY_11" to 1.1136140507034202, - "TUESDAY_12" to 0.9867528660797885, - "TUESDAY_13" to 0.8018989158195754, - "TUESDAY_14" to 0.6173048748109258, - "TUESDAY_15" to 0.46718586671750373, - "TUESDAY_16" to 0.4103633833041902, - "TUESDAY_17" to 0.4871260756989506, - "TUESDAY_18" to 0.5667378483016126, - "TUESDAY_19" to 0.6464203510900723, - "TUESDAY_20" to 0.7780268325299871, - "TUESDAY_21" to 0.8995921101255763, - "TUESDAY_22" to 1.0077600114996088, - "TUESDAY_23" to 1.1109769960680498, - "WEDNESDAY_0" to 1.2097668746150059, - "WEDNESDAY_1" to 1.2631002319009361, - "WEDNESDAY_2" to 1.2912775191940549, - "WEDNESDAY_3" to 1.3229785939630059, - "WEDNESDAY_4" to 1.3428607301494424, - "WEDNESDAY_5" to 1.3750788517823973, - "WEDNESDAY_6" to 1.3752344527256497, - "WEDNESDAY_7" to 1.3505490078766218, - "WEDNESDAY_8" to 1.2598503219367945, - "WEDNESDAY_9" to 1.2051668977452374, - "WEDNESDAY_10" to 1.0320896222195326, - "WEDNESDAY_11" to 0.8900138031631949, - "WEDNESDAY_12" to 0.6341155208698448, - "WEDNESDAY_13" to 0.48337590254714624, - "WEDNESDAY_14" to 0.2903189399226416, - "WEDNESDAY_15" to 0.25, - "WEDNESDAY_16" to 0.25711039485046006, - "WEDNESDAY_17" to 0.37307641907591793, - "WEDNESDAY_18" to 0.45280799454961196, - "WEDNESDAY_19" to 0.5631397823847637, - "WEDNESDAY_20" to 0.6285005244224133, - "WEDNESDAY_21" to 0.6671897537279405, - "WEDNESDAY_22" to 0.7268406397452634, - "WEDNESDAY_23" to 0.8068904097486369, - "THURSDAY_0" to 0.9021601102971811, - "THURSDAY_1" to 1.023741688964238, - "THURSDAY_2" to 1.1340689935096755, - "THURSDAY_3" to 1.2530130345819006, - "THURSDAY_4" to 1.3163421664973542, - "THURSDAY_5" to 1.3536343767230727, - "THURSDAY_6" to 1.3432290485306728, - "THURSDAY_7" to 1.2864983218982178, - "THURSDAY_8" to 1.2320488534113174, - "THURSDAY_9" to 1.1984530721079034, - "THURSDAY_10" to 1.0877338251341975, - "THURSDAY_11" to 0.9999324929016475, - "THURSDAY_12" to 0.87536726762619, - "THURSDAY_13" to 0.6560822412167919, - "THURSDAY_14" to 0.44836474861432074, - "THURSDAY_15" to 0.36145134935025247, - "THURSDAY_16" to 0.2695997829759713, - "THURSDAY_17" to 0.2898426312618241, - "THURSDAY_18" to 0.3970093434340387, - "THURSDAY_19" to 0.5193273246848977, - "THURSDAY_20" to 0.6426415257034419, - "THURSDAY_21" to 0.800685718218497, - "THURSDAY_22" to 0.9215516833839711, - "THURSDAY_23" to 1.053701659160912, - "FRIDAY_0" to 1.149649788723893, - "FRIDAY_1" to 1.2046315447861193, - "FRIDAY_2" to 1.2724031281576726, - "FRIDAY_3" to 1.3525693456352732, - "FRIDAY_4" to 1.3746126314960814, - "FRIDAY_5" to 1.3744591862592468, - "FRIDAY_6" to 1.3297812543035683, - "FRIDAY_7" to 1.2762064429631657, - "FRIDAY_8" to 1.235662409263294, - "FRIDAY_9" to 1.2171558028785991, - "FRIDAY_10" to 1.182722399785398, - "FRIDAY_11" to 1.137345538963285, - "FRIDAY_12" to 0.9999308422620752, - "FRIDAY_13" to 0.8055000309055653, - "FRIDAY_14" to 0.5667135273493851, - "FRIDAY_15" to 0.4081529603000651, - "FRIDAY_16" to 0.3987031354907009, - "FRIDAY_17" to 0.5030075499003412, - "FRIDAY_18" to 0.6518159532641841, - "FRIDAY_19" to 0.8733483414970974, - "FRIDAY_20" to 1.0496224913080463, - "FRIDAY_21" to 1.1820684558591705, - "FRIDAY_22" to 1.2561688567574458, - "FRIDAY_23" to 1.3204704912328773, - "SATURDAY_0" to 1.3832230236620218, - "SATURDAY_1" to 1.4632908341022142, - "SATURDAY_2" to 1.5019230781315296, - "SATURDAY_3" to 1.5437332506007084, - "SATURDAY_4" to 1.5934153179751855, - "SATURDAY_5" to 1.6245578072557723, - "SATURDAY_6" to 1.6294919789890665, - "SATURDAY_7" to 1.6027665451672717, - "SATURDAY_8" to 1.6068061069158674, - "SATURDAY_9" to 1.624257927970777, - "SATURDAY_10" to 1.5996112411089, - "SATURDAY_11" to 1.5659672993092648, - "SATURDAY_12" to 1.5333537902522736, - "SATURDAY_13" to 1.445292929996356, - "SATURDAY_14" to 1.2966021477035259, - "SATURDAY_15" to 1.250999408961155, - "SATURDAY_16" to 1.2535364828163025, - "SATURDAY_17" to 1.2736456128871074, - "SATURDAY_18" to 1.3348268054897328, - "SATURDAY_19" to 1.4571388900094875, - "SATURDAY_20" to 1.5073787902995706, - "SATURDAY_21" to 1.5605139580010123, - "SATURDAY_22" to 1.5885303316932382, - "SATURDAY_23" to 1.6169891066719597 - ) + timeOfDayMultipliers = expectedTimeOfDayMultipliers ), feeHistoryFetcher = L1DynamicGasPriceCapServiceConfig.FeeHistoryFetcher( fetchInterval = Duration.parse("PT1S"), @@ -689,201 +380,141 @@ class CoordinatorConfigTest { private data class TestConfig(val extraField: String) @Test - fun parsesValidConfig() { - val smartContractErrorConfig = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/smart-contract-errors.toml")) - ) - val timeOfDayMultipliers = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/gas-price-cap-time-of-day-multipliers.toml")) - ) - val tracesLimitsConfigs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v1.toml")) - ) - val tracesLimitsV2Configs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v2.toml")) - ) - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/coordinator/coordinator-docker.config.toml")) - ) - .onFailure { error: String -> fail(error) } - .onSuccess { config: CoordinatorConfigTomlDto -> - val configs = config.copy( - conflation = config.conflation.copy( - _tracesLimitsV1 = tracesLimitsConfigs.get()?.tracesLimits?.let { TracesCountersV1(it) }, - _tracesLimitsV2 = tracesLimitsV2Configs.get()?.tracesLimits?.let { TracesCountersV2(it) }, - _smartContractErrors = smartContractErrorConfig.get()!!.smartContractErrors - ), - l1DynamicGasPriceCapService = config.l1DynamicGasPriceCapService.copy( - gasPriceCapCalculation = config.l1DynamicGasPriceCapService.gasPriceCapCalculation.copy( - timeOfDayMultipliers = timeOfDayMultipliers.get()?.gasPriceCapTimeOfDayMultipliers - ) - ) - ) - assertEquals(coordinatorConfig, configs.reified()) - assertEquals(coordinatorConfig.l1.rpcEndpoint, coordinatorConfig.l1.ethFeeHistoryEndpoint) - } + fun `should keep local stack testing configs uptodate with the code`() { + // Just assert that Files have been loaded and parsed correctly + // This is to prevent Code changes in coordinator and forgetting to update config files used in the local stack + loadConfigs( + coordinatorConfigFiles = listOf( + Path.of("../../config/coordinator/coordinator-docker.config.toml"), + Path.of("../../config/coordinator/coordinator-docker-traces-v2-override.config.toml"), + Path.of("../../config/coordinator/coordinator-docker-web3signer-override.config.toml"), + Path.of("../../config/coordinator/coordinator-local-dev.config.overrides.toml"), + Path.of("../../config/coordinator/coordinator-local-dev.config-traces-v2.overrides.toml") + ), + tracesLimitsFileV1 = Path.of("../../config/common/traces-limits-v1.toml"), + tracesLimitsFileV2 = Path.of("../../config/common/traces-limits-v2.toml"), + gasPriceCapTimeOfDayMultipliersFile = Path.of("../../config/common/gas-price-cap-time-of-day-multipliers.toml"), + smartContractErrorsFile = Path.of("../../config/common/smart-contract-errors.toml") + ) + } + + private fun pathToResource(resource: String): Path { + return Paths.get( + this::class.java.classLoader.getResource(resource)?.toURI() + ?: error("Resource not found: $resource") + ) } @Test - fun parsesValidWeb3SignerConfigOverride() { - val smartContractErrorCodes: SmartContractErrors = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/smart-contract-errors.toml")) - ).get()!!.smartContractErrors - val timeOfDayMultipliers = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/gas-price-cap-time-of-day-multipliers.toml")) - ) - val tracesLimitsConfigs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v1.toml")) - ) - val tracesLimitsV2Configs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v2.toml")) - ) + fun `should parse and consolidate configs`() { + val configs = loadConfigs( + coordinatorConfigFiles = listOf(pathToResource("configs/coordinator.config.toml")), + tracesLimitsFileV1 = pathToResource("configs/traces-limits-v1.toml"), + tracesLimitsFileV2 = pathToResource("configs/traces-limits-v2.toml"), + gasPriceCapTimeOfDayMultipliersFile = pathToResource("configs/gas-price-cap-time-of-day-multipliers.toml"), + smartContractErrorsFile = pathToResource("configs/smart-contract-errors.toml") + ) - CoordinatorAppCli.loadConfigsOrError( - listOf( - File("../../config/coordinator/coordinator-docker.config.toml"), - File("../../config/coordinator/coordinator-docker-web3signer-override.config.toml") - ) + assertEquals(coordinatorConfig, configs) + assertEquals(coordinatorConfig.l1.rpcEndpoint, coordinatorConfig.l1.ethFeeHistoryEndpoint) + } + + @Test + fun parsesValidWeb3SignerConfigOverride() { + val config = loadConfigs( + coordinatorConfigFiles = listOf( + pathToResource("configs/coordinator.config.toml"), + pathToResource("configs/coordinator-web3signer-override.config.toml") + ), + tracesLimitsFileV1 = pathToResource("configs/traces-limits-v1.toml"), + tracesLimitsFileV2 = pathToResource("configs/traces-limits-v2.toml"), + gasPriceCapTimeOfDayMultipliersFile = pathToResource("configs/gas-price-cap-time-of-day-multipliers.toml"), + smartContractErrorsFile = pathToResource("configs/smart-contract-errors.toml") ) - .onFailure { error: String -> fail(error) } - .onSuccess { - val configs = it.copy( - conflation = it.conflation.copy( - _tracesLimitsV1 = tracesLimitsConfigs.get()?.tracesLimits?.let { TracesCountersV1(it) }, - _tracesLimitsV2 = tracesLimitsV2Configs.get()?.tracesLimits?.let { TracesCountersV2(it) }, - _smartContractErrors = smartContractErrorCodes - ), - l1DynamicGasPriceCapService = it.l1DynamicGasPriceCapService.copy( - gasPriceCapCalculation = it.l1DynamicGasPriceCapService.gasPriceCapCalculation.copy( - timeOfDayMultipliers = timeOfDayMultipliers.get()?.gasPriceCapTimeOfDayMultipliers - ) - ) - ) - val expectedConfig = - coordinatorConfig.copy( - finalizationSigner = finalizationSigner.copy(type = SignerConfig.Type.Web3Signer), - dataSubmissionSigner = dataSubmissionSigner.copy(type = SignerConfig.Type.Web3Signer), - l2Signer = l2SignerConfig.copy(type = SignerConfig.Type.Web3Signer) - ) + val expectedConfig = + coordinatorConfig.copy( + finalizationSigner = finalizationSigner.copy(type = SignerConfig.Type.Web3Signer), + dataSubmissionSigner = dataSubmissionSigner.copy(type = SignerConfig.Type.Web3Signer), + l2Signer = l2SignerConfig.copy(type = SignerConfig.Type.Web3Signer) + ) - assertEquals(expectedConfig, configs.reified()) - } + assertThat(config).isEqualTo(expectedConfig) } @Test fun parsesValidTracesV2ConfigOverride() { - val smartContractErrorCodes: SmartContractErrors = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/smart-contract-errors.toml")) - ).get()!!.smartContractErrors - val timeOfDayMultipliers = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/gas-price-cap-time-of-day-multipliers.toml")) - ) - val tracesLimitsConfigs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v1.toml")) - ) - val tracesLimitsV2Configs = - CoordinatorAppCli.loadConfigsOrError( - listOf(File("../../config/common/traces-limits-v2.toml")) - ) - - CoordinatorAppCli.loadConfigsOrError( - listOf( - File("../../config/coordinator/coordinator-docker.config.toml"), - File("../../config/coordinator/coordinator-docker-traces-v2-override.config.toml") - ) + val config = loadConfigs( + coordinatorConfigFiles = listOf( + pathToResource("configs/coordinator.config.toml"), + pathToResource("configs/coordinator-traces-v2-override.config.toml") + ), + tracesLimitsFileV1 = pathToResource("configs/traces-limits-v1.toml"), + tracesLimitsFileV2 = pathToResource("configs/traces-limits-v2.toml"), + gasPriceCapTimeOfDayMultipliersFile = pathToResource("configs/gas-price-cap-time-of-day-multipliers.toml"), + smartContractErrorsFile = pathToResource("configs/smart-contract-errors.toml") ) - .onFailure { error: String -> fail(error) } - .onSuccess { - val configs = it.copy( - conflation = it.conflation.copy( - _tracesLimitsV1 = tracesLimitsConfigs.get()?.tracesLimits?.let { TracesCountersV1(it) }, - _tracesLimitsV2 = tracesLimitsV2Configs.get()?.tracesLimits?.let { TracesCountersV2(it) }, - _smartContractErrors = smartContractErrorCodes + + val expectedConfig = + coordinatorConfig.copy( + zkTraces = zkTracesConfig.copy(ethApi = URI("http://traces-node-v2:8545").toURL()), + l2NetworkGasPricingService = l2NetworkGasPricingServiceConfig.copy( + legacy = + l2NetworkGasPricingServiceConfig.legacy.copy( + transactionCostCalculatorConfig = + l2NetworkGasPricingServiceConfig.legacy.transactionCostCalculatorConfig?.copy( + compressedTxSize = 350, + expectedGas = 29400 + ) + ) + ), + traces = tracesConfig.copy( + switchToLineaBesu = true, + blobCompressorVersion = BlobCompressorVersion.V1_0_1, + expectedTracesApiVersionV2 = "v0.8.0-rc8", + conflationV2 = tracesConfig.conflation.copy( + endpoints = listOf(URI("http://traces-node-v2:8545/").toURL()), + requestLimitPerEndpoint = 1U ), - l1DynamicGasPriceCapService = it.l1DynamicGasPriceCapService.copy( - gasPriceCapCalculation = it.l1DynamicGasPriceCapService.gasPriceCapCalculation.copy( - timeOfDayMultipliers = timeOfDayMultipliers.get()?.gasPriceCapTimeOfDayMultipliers + countersV2 = TracesConfig.FunctionalityEndpoint( + listOf( + URI("http://traces-node-v2:8545/").toURL() + ), + requestLimitPerEndpoint = 1U, + requestRetry = RequestRetryConfigTomlFriendly( + backoffDelay = Duration.parse("PT1S"), + failuresWarningThreshold = 2 ) ) - ) - - val expectedConfig = - coordinatorConfig.copy( - zkTraces = zkTracesConfig.copy(ethApi = URI("http://traces-node-v2:8545").toURL()), - l2NetworkGasPricingService = l2NetworkGasPricingServiceConfig.copy( - legacy = - l2NetworkGasPricingServiceConfig.legacy.copy( - transactionCostCalculatorConfig = - l2NetworkGasPricingServiceConfig.legacy.transactionCostCalculatorConfig?.copy( - compressedTxSize = 350, - expectedGas = 29400 - ) - ) + ), + proversConfig = proversConfig.copy( + proverA = proversConfig.proverA.copy( + execution = proversConfig.proverA.execution.copy( + requestsDirectory = Path.of("/data/prover/v3/execution/requests"), + responsesDirectory = Path.of("/data/prover/v3/execution/responses") ), - traces = tracesConfig.copy( - switchToLineaBesu = true, - blobCompressorVersion = BlobCompressorVersion.V1_0_1, - expectedTracesApiVersionV2 = "v0.8.0-rc8", - conflationV2 = tracesConfig.conflation.copy( - endpoints = listOf(URI("http://traces-node-v2:8545/").toURL()), - requestLimitPerEndpoint = 1U - ), - countersV2 = TracesConfig.FunctionalityEndpoint( - listOf( - URI("http://traces-node-v2:8545/").toURL() - ), - requestLimitPerEndpoint = 1U, - requestRetry = RequestRetryConfigTomlFriendly( - backoffDelay = Duration.parse("PT1S"), - failuresWarningThreshold = 2 - ) - ) + blobCompression = proversConfig.proverA.blobCompression.copy( + requestsDirectory = Path.of("/data/prover/v3/compression/requests"), + responsesDirectory = Path.of("/data/prover/v3/compression/responses") ), - proversConfig = proversConfig.copy( - proverA = proversConfig.proverA.copy( - execution = proversConfig.proverA.execution.copy( - requestsDirectory = Path.of("/data/prover/v3/execution/requests"), - responsesDirectory = Path.of("/data/prover/v3/execution/responses") - ), - blobCompression = proversConfig.proverA.blobCompression.copy( - requestsDirectory = Path.of("/data/prover/v3/compression/requests"), - responsesDirectory = Path.of("/data/prover/v3/compression/responses") - ), - proofAggregation = proversConfig.proverA.proofAggregation.copy( - requestsDirectory = Path.of("/data/prover/v3/aggregation/requests"), - responsesDirectory = Path.of("/data/prover/v3/aggregation/responses") - ) - ) + proofAggregation = proversConfig.proverA.proofAggregation.copy( + requestsDirectory = Path.of("/data/prover/v3/aggregation/requests"), + responsesDirectory = Path.of("/data/prover/v3/aggregation/responses") ) ) + ) + ) - assertEquals(expectedConfig, configs.reified()) - } + assertThat(config).isEqualTo(expectedConfig) } @Test fun invalidConfigReturnsErrorResult() { - val configs = - CoordinatorAppCli.loadConfigsOrError( - listOf( - File("../../config/coordinator/coordinator-docker.config.toml"), - File("../../config/coordinator/coordinator-docker-web3signer-override.config.toml") - ) - ) + val configsResult = loadConfigsOrError( + configFiles = listOf(pathToResource("configs/coordinator.config.toml")) + ) - assertThat(configs.getError()).contains("'extraField': Missing from config") + assertThat(configsResult.getError()).contains("'extraField': Missing from config") } @Test @@ -930,8 +561,7 @@ class CoordinatorConfigTest { } @Test - fun testValidAggregationAndConflationByTargetBlockNumberWhenL2InclusiveBlockNumberToStopAndFlushAggregationSpecified - () { + fun testValidAggrAndConflationByTargetBlockNumberWhenL2InclusiveBlockNumberToStopAndFlushAggregationSpecified() { val aggregationConfigWithoutSwithBlockNumber = aggregationConfig.copy( _targetEndBlocks = listOf(10L, 100L) ) diff --git a/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedGasPriceMultipliers.kt b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedGasPriceMultipliers.kt new file mode 100644 index 00000000000..d872e96a11c --- /dev/null +++ b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedGasPriceMultipliers.kt @@ -0,0 +1,172 @@ +package net.consensys.zkevm.coordinator.app.config + +val expectedTimeOfDayMultipliers = mapOf( + "SUNDAY_0" to 1.7489178377946066, + "SUNDAY_1" to 1.7494632175198737, + "SUNDAY_2" to 1.75, + "SUNDAY_3" to 1.733166295438555, + "SUNDAY_4" to 1.6993775444542885, + "SUNDAY_5" to 1.6350086618091364, + "SUNDAY_6" to 1.5627740860151331, + "SUNDAY_7" to 1.4831149222064164, + "SUNDAY_8" to 1.4101476768256929, + "SUNDAY_9" to 1.370085278922007, + "SUNDAY_10" to 1.3516015544068651, + "SUNDAY_11" to 1.3482404546676368, + "SUNDAY_12" to 1.3580905751578942, + "SUNDAY_13" to 1.3775497419563296, + "SUNDAY_14" to 1.3700255667542938, + "SUNDAY_15" to 1.2642948506461285, + "SUNDAY_16" to 1.2794806131912935, + "SUNDAY_17" to 1.2750892256476676, + "SUNDAY_18" to 1.2919720208955585, + "SUNDAY_19" to 1.317984990098603, + "SUNDAY_20" to 1.4433501639513178, + "SUNDAY_21" to 1.4705921238901998, + "SUNDAY_22" to 1.515043370430801, + "SUNDAY_23" to 1.5556742617266397, + "MONDAY_0" to 1.5381562278760164, + "MONDAY_1" to 1.5423761828433993, + "MONDAY_2" to 1.539015963719092, + "MONDAY_3" to 1.487676153648977, + "MONDAY_4" to 1.430973985132037, + "MONDAY_5" to 1.4656765439056292, + "MONDAY_6" to 1.4484298622828233, + "MONDAY_7" to 1.4459076216659752, + "MONDAY_8" to 1.4899061835032241, + "MONDAY_9" to 1.5249733712852067, + "MONDAY_10" to 1.511367489481033, + "MONDAY_11" to 1.4225695658047797, + "MONDAY_12" to 1.2887291896624584, + "MONDAY_13" to 1.1460926897291355, + "MONDAY_14" to 1.0004897955233254, + "MONDAY_15" to 0.8694664537368378, + "MONDAY_16" to 0.8270273375962802, + "MONDAY_17" to 0.7868289022833883, + "MONDAY_18" to 0.7780303121746551, + "MONDAY_19" to 0.7756215256634205, + "MONDAY_20" to 0.7984895728860915, + "MONDAY_21" to 0.8918589268832423, + "MONDAY_22" to 0.9967716668541272, + "MONDAY_23" to 1.0973334887144106, + "TUESDAY_0" to 1.2233064209957951, + "TUESDAY_1" to 1.3238883432855082, + "TUESDAY_2" to 1.3874518307497257, + "TUESDAY_3" to 1.463621147171298, + "TUESDAY_4" to 1.4975989065490154, + "TUESDAY_5" to 1.481679186141442, + "TUESDAY_6" to 1.452778387763161, + "TUESDAY_7" to 1.3414858185569951, + "TUESDAY_8" to 1.2869454637983988, + "TUESDAY_9" to 1.249347290389873, + "TUESDAY_10" to 1.196488297386161, + "TUESDAY_11" to 1.1136140507034202, + "TUESDAY_12" to 0.9867528660797885, + "TUESDAY_13" to 0.8018989158195754, + "TUESDAY_14" to 0.6173048748109258, + "TUESDAY_15" to 0.46718586671750373, + "TUESDAY_16" to 0.4103633833041902, + "TUESDAY_17" to 0.4871260756989506, + "TUESDAY_18" to 0.5667378483016126, + "TUESDAY_19" to 0.6464203510900723, + "TUESDAY_20" to 0.7780268325299871, + "TUESDAY_21" to 0.8995921101255763, + "TUESDAY_22" to 1.0077600114996088, + "TUESDAY_23" to 1.1109769960680498, + "WEDNESDAY_0" to 1.2097668746150059, + "WEDNESDAY_1" to 1.2631002319009361, + "WEDNESDAY_2" to 1.2912775191940549, + "WEDNESDAY_3" to 1.3229785939630059, + "WEDNESDAY_4" to 1.3428607301494424, + "WEDNESDAY_5" to 1.3750788517823973, + "WEDNESDAY_6" to 1.3752344527256497, + "WEDNESDAY_7" to 1.3505490078766218, + "WEDNESDAY_8" to 1.2598503219367945, + "WEDNESDAY_9" to 1.2051668977452374, + "WEDNESDAY_10" to 1.0320896222195326, + "WEDNESDAY_11" to 0.8900138031631949, + "WEDNESDAY_12" to 0.6341155208698448, + "WEDNESDAY_13" to 0.48337590254714624, + "WEDNESDAY_14" to 0.2903189399226416, + "WEDNESDAY_15" to 0.25, + "WEDNESDAY_16" to 0.25711039485046006, + "WEDNESDAY_17" to 0.37307641907591793, + "WEDNESDAY_18" to 0.45280799454961196, + "WEDNESDAY_19" to 0.5631397823847637, + "WEDNESDAY_20" to 0.6285005244224133, + "WEDNESDAY_21" to 0.6671897537279405, + "WEDNESDAY_22" to 0.7268406397452634, + "WEDNESDAY_23" to 0.8068904097486369, + "THURSDAY_0" to 0.9021601102971811, + "THURSDAY_1" to 1.023741688964238, + "THURSDAY_2" to 1.1340689935096755, + "THURSDAY_3" to 1.2530130345819006, + "THURSDAY_4" to 1.3163421664973542, + "THURSDAY_5" to 1.3536343767230727, + "THURSDAY_6" to 1.3432290485306728, + "THURSDAY_7" to 1.2864983218982178, + "THURSDAY_8" to 1.2320488534113174, + "THURSDAY_9" to 1.1984530721079034, + "THURSDAY_10" to 1.0877338251341975, + "THURSDAY_11" to 0.9999324929016475, + "THURSDAY_12" to 0.87536726762619, + "THURSDAY_13" to 0.6560822412167919, + "THURSDAY_14" to 0.44836474861432074, + "THURSDAY_15" to 0.36145134935025247, + "THURSDAY_16" to 0.2695997829759713, + "THURSDAY_17" to 0.2898426312618241, + "THURSDAY_18" to 0.3970093434340387, + "THURSDAY_19" to 0.5193273246848977, + "THURSDAY_20" to 0.6426415257034419, + "THURSDAY_21" to 0.800685718218497, + "THURSDAY_22" to 0.9215516833839711, + "THURSDAY_23" to 1.053701659160912, + "FRIDAY_0" to 1.149649788723893, + "FRIDAY_1" to 1.2046315447861193, + "FRIDAY_2" to 1.2724031281576726, + "FRIDAY_3" to 1.3525693456352732, + "FRIDAY_4" to 1.3746126314960814, + "FRIDAY_5" to 1.3744591862592468, + "FRIDAY_6" to 1.3297812543035683, + "FRIDAY_7" to 1.2762064429631657, + "FRIDAY_8" to 1.235662409263294, + "FRIDAY_9" to 1.2171558028785991, + "FRIDAY_10" to 1.182722399785398, + "FRIDAY_11" to 1.137345538963285, + "FRIDAY_12" to 0.9999308422620752, + "FRIDAY_13" to 0.8055000309055653, + "FRIDAY_14" to 0.5667135273493851, + "FRIDAY_15" to 0.4081529603000651, + "FRIDAY_16" to 0.3987031354907009, + "FRIDAY_17" to 0.5030075499003412, + "FRIDAY_18" to 0.6518159532641841, + "FRIDAY_19" to 0.8733483414970974, + "FRIDAY_20" to 1.0496224913080463, + "FRIDAY_21" to 1.1820684558591705, + "FRIDAY_22" to 1.2561688567574458, + "FRIDAY_23" to 1.3204704912328773, + "SATURDAY_0" to 1.3832230236620218, + "SATURDAY_1" to 1.4632908341022142, + "SATURDAY_2" to 1.5019230781315296, + "SATURDAY_3" to 1.5437332506007084, + "SATURDAY_4" to 1.5934153179751855, + "SATURDAY_5" to 1.6245578072557723, + "SATURDAY_6" to 1.6294919789890665, + "SATURDAY_7" to 1.6027665451672717, + "SATURDAY_8" to 1.6068061069158674, + "SATURDAY_9" to 1.624257927970777, + "SATURDAY_10" to 1.5996112411089, + "SATURDAY_11" to 1.5659672993092648, + "SATURDAY_12" to 1.5333537902522736, + "SATURDAY_13" to 1.445292929996356, + "SATURDAY_14" to 1.2966021477035259, + "SATURDAY_15" to 1.250999408961155, + "SATURDAY_16" to 1.2535364828163025, + "SATURDAY_17" to 1.2736456128871074, + "SATURDAY_18" to 1.3348268054897328, + "SATURDAY_19" to 1.4571388900094875, + "SATURDAY_20" to 1.5073787902995706, + "SATURDAY_21" to 1.5605139580010123, + "SATURDAY_22" to 1.5885303316932382, + "SATURDAY_23" to 1.6169891066719597 +) diff --git a/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV1.kt b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV1.kt new file mode 100644 index 00000000000..f9ac7b9438a --- /dev/null +++ b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV1.kt @@ -0,0 +1,48 @@ +package net.consensys.zkevm.coordinator.app.config + +import net.consensys.linea.traces.TracesCountersV1 +import net.consensys.linea.traces.TracingModuleV1 + +val expectedTracesCountersV1 = TracesCountersV1( + mapOf( + // EVM Arithmetization Limits + TracingModuleV1.ADD to 1U, + TracingModuleV1.BIN to 2U, + TracingModuleV1.BIN_RT to 3U, + TracingModuleV1.EC_DATA to 4U, + TracingModuleV1.EXT to 5U, + TracingModuleV1.HUB to 6U, + TracingModuleV1.INSTRUCTION_DECODER to 7U, + TracingModuleV1.MMIO to 8U, + TracingModuleV1.MMU to 9U, + TracingModuleV1.MMU_ID to 10U, + TracingModuleV1.MOD to 11U, + TracingModuleV1.MUL to 12U, + TracingModuleV1.MXP to 13U, + TracingModuleV1.PHONEY_RLP to 14U, + TracingModuleV1.PUB_HASH to 15U, + TracingModuleV1.PUB_HASH_INFO to 16U, + TracingModuleV1.PUB_LOG to 17U, + TracingModuleV1.PUB_LOG_INFO to 18U, + TracingModuleV1.RLP to 19U, + TracingModuleV1.ROM to 20U, + TracingModuleV1.SHF to 21U, + TracingModuleV1.SHF_RT to 22U, + TracingModuleV1.TX_RLP to 23U, + TracingModuleV1.WCP to 24U, + // Block Limits + TracingModuleV1.BLOCK_TX to 25U, + TracingModuleV1.BLOCK_L2L1LOGS to 26U, + TracingModuleV1.BLOCK_KECCAK to 27U, + // Precompile Limits + TracingModuleV1.PRECOMPILE_ECRECOVER to 28U, + TracingModuleV1.PRECOMPILE_SHA2 to 29U, + TracingModuleV1.PRECOMPILE_RIPEMD to 30U, + TracingModuleV1.PRECOMPILE_IDENTITY to 31U, + TracingModuleV1.PRECOMPILE_MODEXP to 32U, + TracingModuleV1.PRECOMPILE_ECADD to 32U, + TracingModuleV1.PRECOMPILE_ECMUL to 34U, + TracingModuleV1.PRECOMPILE_ECPAIRING to 35U, + TracingModuleV1.PRECOMPILE_BLAKE2F to 36U + ) +) diff --git a/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV2.kt b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV2.kt new file mode 100644 index 00000000000..82f6447f907 --- /dev/null +++ b/coordinator/app/src/test/kotlin/net/consensys/zkevm/coordinator/app/config/ExpectedTracesLimitsV2.kt @@ -0,0 +1,60 @@ +package net.consensys.zkevm.coordinator.app.config + +import net.consensys.linea.traces.TracesCountersV2 +import net.consensys.linea.traces.TracingModuleV2 + +val expectedTracesLimitsV2 = TracesCountersV2( + mapOf( + TracingModuleV2.ADD to 1u, + TracingModuleV2.BIN to 2u, + TracingModuleV2.BLAKE_MODEXP_DATA to 3u, + TracingModuleV2.BLOCK_DATA to 4u, + TracingModuleV2.BLOCK_HASH to 5u, + TracingModuleV2.EC_DATA to 6u, + TracingModuleV2.EUC to 7u, + TracingModuleV2.EXP to 8u, + TracingModuleV2.EXT to 9u, + TracingModuleV2.GAS to 10u, + TracingModuleV2.HUB to 11u, + TracingModuleV2.LOG_DATA to 12u, + TracingModuleV2.LOG_INFO to 13u, + TracingModuleV2.MMIO to 14u, + TracingModuleV2.MMU to 15u, + TracingModuleV2.MOD to 16u, + TracingModuleV2.MUL to 18u, + TracingModuleV2.MXP to 19u, + TracingModuleV2.OOB to 20u, + TracingModuleV2.RLP_ADDR to 21u, + TracingModuleV2.RLP_TXN to 22u, + TracingModuleV2.RLP_TXN_RCPT to 23u, + TracingModuleV2.ROM to 24u, + TracingModuleV2.ROM_LEX to 25u, + TracingModuleV2.SHAKIRA_DATA to 26u, + TracingModuleV2.SHF to 27u, + TracingModuleV2.STP to 28u, + TracingModuleV2.TRM to 29u, + TracingModuleV2.TXN_DATA to 30u, + TracingModuleV2.WCP to 31u, + // Reference table limits, set to UInt.MAX_VALUE + TracingModuleV2.BIN_REFERENCE_TABLE to 32u, + TracingModuleV2.INSTRUCTION_DECODER to 33u, + TracingModuleV2.SHF_REFERENCE_TABLE to 34u, + // Precompiles limits + TracingModuleV2.PRECOMPILE_BLAKE_EFFECTIVE_CALLS to 35u, + TracingModuleV2.PRECOMPILE_BLAKE_ROUNDS to 36u, + TracingModuleV2.PRECOMPILE_ECADD_EFFECTIVE_CALLS to 37u, + TracingModuleV2.PRECOMPILE_ECMUL_EFFECTIVE_CALLS to 38u, + TracingModuleV2.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS to 39u, + TracingModuleV2.PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS to 40u, + TracingModuleV2.PRECOMPILE_ECPAIRING_MILLER_LOOPS to 41u, + TracingModuleV2.PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS to 42u, + TracingModuleV2.PRECOMPILE_MODEXP_EFFECTIVE_CALLS to 43u, + TracingModuleV2.PRECOMPILE_RIPEMD_BLOCKS to 44u, + TracingModuleV2.PRECOMPILE_SHA2_BLOCKS to 45u, + // Block limits + TracingModuleV2.BLOCK_KECCAK to 46u, + TracingModuleV2.BLOCK_L1_SIZE to 47u, + TracingModuleV2.BLOCK_L2_L1_LOGS to 48u, + TracingModuleV2.BLOCK_TRANSACTIONS to 49u + ) +) diff --git a/coordinator/app/src/test/resources/configs/coordinator-traces-v2-override.config.toml b/coordinator/app/src/test/resources/configs/coordinator-traces-v2-override.config.toml new file mode 100644 index 00000000000..c9e01f473a1 --- /dev/null +++ b/coordinator/app/src/test/resources/configs/coordinator-traces-v2-override.config.toml @@ -0,0 +1,40 @@ +[prover] +[prover.execution] +fs-requests-directory = "/data/prover/v3/execution/requests" +fs-responses-directory = "/data/prover/v3/execution/responses" +[prover.blob-compression] +fs-requests-directory = "/data/prover/v3/compression/requests" +fs-responses-directory = "/data/prover/v3/compression/responses" +[prover.proof-aggregation] +fs-requests-directory = "/data/prover/v3/aggregation/requests" +fs-responses-directory = "/data/prover/v3/aggregation/responses" + +[zk-traces] +eth-api="http://traces-node-v2:8545" + +[traces] +switch-to-linea-besu=true +blob-compressor-version="V1_0_1" +expected-traces-api-version-v2="v0.8.0-rc8" +[traces.counters-v2] +endpoints=["http://traces-node-v2:8545/"] +request-limit-per-endpoint=1 +request-retry.backoff-delay="PT1S" +request-retry.failures-warning-threshold=2 +[traces.conflation-v2] +endpoints=["http://traces-node-v2:8545/"] +request-limit-per-endpoint=1 +request-retry.backoff-delay="PT1S" +request-retry.failures-warning-threshold=2 + +[l2-network-gas-pricing.json-rpc-pricing-propagation] +geth-gas-price-update-recipients=[ + "http://l2-node:8545/" +] + +[l2-network-gas-pricing.legacy.sample-transaction-gas-pricing] +plain-transfer-cost-multiplier=1.0 +# Ratio of 350 / 29400 is based on data from Mainnet. Only 0.3% of transactions are less profitable than this +# Meaning 99.7% of transactions will be includable if priced using eth_gasPrice +compressed-tx-size=350 +expected-gas=29400 diff --git a/coordinator/app/src/test/resources/configs/coordinator-web3signer-override.config.toml b/coordinator/app/src/test/resources/configs/coordinator-web3signer-override.config.toml new file mode 100644 index 00000000000..b5fd4ef3565 --- /dev/null +++ b/coordinator/app/src/test/resources/configs/coordinator-web3signer-override.config.toml @@ -0,0 +1,13 @@ +[finalization-signer] +# Web3j/Web3signer +type="Web3Signer" + +[data-submission-signer] +# Web3j/Web3signer +type="Web3Signer" + +[l2-signer] +# Web3j/Web3signer +type="Web3Signer" + + diff --git a/coordinator/app/src/test/resources/configs/coordinator.config.toml b/coordinator/app/src/test/resources/configs/coordinator.config.toml new file mode 100644 index 00000000000..62ce6851fbd --- /dev/null +++ b/coordinator/app/src/test/resources/configs/coordinator.config.toml @@ -0,0 +1,292 @@ +testL1Disabled=false + +duplicated-logs-debounce-time="PT15S" + +eip4844-switch-l2-block-number=0 + +[prover] +fs-inprogress-request-writing-suffix = ".inprogress_coordinator_writing" +fs-inprogress-proving-suffix-pattern = ".*\\.inprogress\\.prover.*" +fs-polling-interval = "PT1S" +fs-polling-timeout = "PT10M" +[prover.execution] +fs-requests-directory = "/data/prover/v2/execution/requests" +fs-responses-directory = "/data/prover/v2/execution/responses" +[prover.blob-compression] +fs-requests-directory = "/data/prover/v2/compression/requests" +fs-responses-directory = "/data/prover/v2/compression/responses" +[prover.proof-aggregation] +fs-requests-directory = "/data/prover/v2/aggregation/requests" +fs-responses-directory = "/data/prover/v2/aggregation/responses" +#[prover.new] +#switch-block-number-inclusive=1000 +#[prover.new.execution] +#fs-requests-directory = "/data/prover/v3/execution/requests" +#fs-responses-directory = "/data/prover/v3/execution/responses" +#[prover.new.blob-compression] +#fs-requests-directory = "/data/prover/v3/compression/requests" +#fs-responses-directory = "/data/prover/v3/compression/responses" +#[prover.new.proof-aggregation] +#fs-requests-directory = "/data/prover/v3/aggregation/requests" +#fs-responses-directory = "/data/prover/v3/aggregation/responses" + +[blob-compression] +blob-size-limit=102400 # 100KB +handler-polling-interval="PT1S" +# default batches limit is aggregation-proofs-limit -1 +# batches-limit must be less than or equal to aggregation-proofs-limit-1 +batches-limit=1 + +[zk-traces] +eth-api="http://traces-node:8545" +new-block-polling-interval="PT1S" + +[traces] +switch-to-linea-besu=false +blob-compressor-version="V0_1_0" +raw-execution-traces-version="0.2.0" +expected-traces-api-version="0.2.0" +[traces.counters] +endpoints=["http://traces-api:8080/"] +request-limit-per-endpoint=2 +request-retry.backoff-delay="PT1S" +request-retry.failures-warning-threshold=2 +[traces.conflation] +endpoints=["http://traces-api:8080/"] +request-limit-per-endpoint=2 +request-retry.backoff-delay="PT1S" +request-retry.failures-warning-threshold=2 + + +[traces.file-manager] +traces-file-extension="json.gz" +raw-traces-directory="/data/traces/raw" +non-canonical-raw-traces-directory="/data/traces/raw-non-canonical" +create-non-canonical-directory=true +polling-interval="PT1S" +traces-file-creation-wait-timeout="PT2M" + +[state-manager] +version="2.3.0" +endpoints=["http://shomei:8888/"] +request-limit-per-endpoint=2 +request-retry.backoff-delay="PT2S" +request-retry.failures-warning-threshold=2 + +[type2-state-proof-provider] +endpoints=["http://shomei-frontend:8888/"] +request-retry.backoff-delay="PT1S" +request-retry.failures-warning-threshold=2 + +[api] +observability_port=9545 + +[l1] +rpc-endpoint="http://l1-el-node:8545" +zk-evm-contract-address="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +finalization-polling-interval="PT6S" +l1-query-block-tag="latest" +gas-limit=10000000 +fee-history-block-count=10 +fee-history-reward-percentile=15 +# Global caps of maxFeePerGas, maxFeePerBlobGas, and maxPriorityFeePerGas +# for L1 transactions regardless of L1 dynamic gas price cap is enabled or not +max-fee-per-gas-cap=100000000000 +max-fee-per-blob-gas-cap=100000000000 +max-priority-fee-per-gas-cap=20000000000 +# The multiplier of global caps for L1 finalization transaction +# E.g. if set as 2.0, it means the global caps of finalization txn +# will always be 2 times higher than that of blob submission txn +gas-price-cap-multiplier-for-finalization=2.0 +# blocks are 2s, this may catch in between blocks +send-message-event-polling-interval="PT1S" +# 10 blocks worth at 2s per block +max-event-scraping-time="PT5S" +# An optional config to define the L1 block time with default as PT12S +block-time="PT1S" # set the same as local L1 block time +block-range-loop-limit=500 +max-messages-to-collect=1000 +finalized-block-tag="latest" +# reset this once we know what to do on dev/UAT +earliest-block=0 +genesis-state-root-hash="0x072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd" +# shnarf for contract V5 +# Keccak256(parentShnarf="0x00...00", snarkHash="0x00...00", +# parentStateRootHash="0x072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd", +# evaludationClaim="0x00...00", evaludationPoint="0x00...00") +genesis-shnarf-v5="0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f" + +[l2] +rpc-endpoint="http://sequencer:8545" +message-service-address="0xe537D669CA013d86EBeF1D64e40fC74CADC91987" +gas-limit=10000000 +max-fee-per-gas-cap=100000000000 +fee-history-block-count=4 +fee-history-reward-percentile=15 +last-hash-search-window=25 +anchoring-receipt-polling-interval="PT01S" +max-receipt-retries=120 +# Number of children blocks to wait before considering a won't be reverted and elegible for conflation. +# this a workaround to mitigate Geth fork issues with Clique PoA +# Coordinator will consider block as finalized after being included in the chain wtih children blocks-to-finalization +# Recommended: Geth sequencer minimum of 2, Besu sequencer minimum of 1, 0 is safe localy +blocks-to-finalization=0 + +[blob-submission] +disabled=true +db-polling-interval="PT1S" +max-blobs-to-return=100 +proof-submission-delay="PT1S" +max-blobs-to-submit-per-tick=10 +# These lower and upper bounds will be effective only if L1 dynamic +# gas price cap is disabled or during fallback when there's insufficient +# cached fee history data to compute dynamic gas price caps +priority-fee-per-gas-upper-bound=2000000000 # 2 GWEI +priority-fee-per-gas-lower-bound=200000000 # 0.2 GWEI + +[aggregation-finalization] +disabled=false +db-polling-interval="PT1S" +max-aggregations-to-finalize-per-tick=1 +proof-submission-delay="PT1S" + +[proof-aggregation] +aggregation-proofs-limit=3 +aggregation-deadline="PT10S" +aggregation-coordinator-polling-interval="PT2S" +deadline-check-interval="PT8S" +target-end-blocks=[] + +[finalization-signer] +# Web3j/Web3signer +type="Web3j" + +[finalization-signer.web3j] +private-key="0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + +[finalization-signer.web3signer] +endpoint="http://web3signer:9000" +max-pool-size=10 +keep-alive=true +public-key="ba5734d8f7091719471e7f7ed6b9df170dc70cc661ca05e688601ad984f068b0d67351e5f06073092499336ab0839ef8a521afd334e53807205fa2f08eec74f4" + +[data-submission-signer] +# Web3j/Web3signer +type="Web3j" + +# The account with this private key is in genesis file +[data-submission-signer.web3j] +private-key="0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a" + +[data-submission-signer.web3signer] +endpoint="http://web3signer:9000" +max-pool-size=10 +keep-alive=true +public-key="9d9031e97dd78ff8c15aa86939de9b1e791066a0224e331bc962a2099a7b1f0464b8bbafe1535f2301c72c2cb3535b172da30b02686ab0393d348614f157fbdb" + +[l2-signer] +# Web3j/Web3signer +type="Web3j" + +[l2-signer.web3j] +private-key="0x4d01ae6487860981699236a58b68f807ee5f17b12df5740b85cf4c4653be0f55" + +[l2-signer.web3signer] +endpoint="http://web3signer:9000" +max-pool-size=10 +keep-alive=true +public-key="4a788ad6fa008beed58de6418369717d7492f37d173d70e2c26d9737e2c6eeae929452ef8602a19410844db3e200a0e73f5208fd76259a8766b73953fc3e7023" + +[message-anchoring-service] +disabled=false +polling-interval="PT1S" +max-messages-to-anchor=100 + +[l2-network-gas-pricing] +disabled = false +price-update-interval = "PT12S" + +fee-history-block-count = 50 +fee-history-reward-percentile = 15 + +blob-submission-expected-execution-gas = 213000.0 # Lower to 120k as we improve efficiency +# Defaults to expected-blob-gas +#bytes-per-data-submission=131072.0 # 2^17 +l1-blob-gas = 131072 # 2^17 + +[l2-network-gas-pricing.request-retry] +max-retries = 3 +timeout = "PT6S" +backoff-delay = "PT1S" +failures-warning-threshold = 2 + +[l2-network-gas-pricing.variable-cost-pricing] +gas-price-fixed-cost = 3000000 +legacy-fees-multiplier = 1.2 +margin = 4.0 +variable-cost-upper-bound = 10000000001 # ~10 GWEI +variable-cost-lower-bound = 90000001 # ~0.09 GWEI + +[l2-network-gas-pricing.extra-data-pricing-propagation] +extra-data-update-recipient = "http://sequencer:8545/" + +[l2-network-gas-pricing.legacy] +type="SampleTransaction" +gas-price-upper-bound = 10000000000 # 10 GWEI +gas-price-lower-bound = 90000000 # 0.09 GWEI + +[l2-network-gas-pricing.json-rpc-pricing-propagation] +geth-gas-price-update-recipients = [ + "http://l2-node:8545/" +] +besu-gas-price-update-recipients = [] + +[l1-dynamic-gas-price-cap-service] +disabled=false +[l1-dynamic-gas-price-cap-service.gas-price-cap-calculation] +adjustment-constant=25 +blob-adjustment-constant=25 +finalization-target-max-delay="PT30S" +gas-fee-percentile-window="PT1M" +gas-fee-percentile-window-leeway="PT10S" +gas-fee-percentile=10 +gas-price-caps-check-coefficient=0.9 +# The lower bound of the "historic base fee per blob gas" used in +# the L1 dynamic gas price cap equation +historic-base-fee-per-blob-gas-lower-bound=100000000 # 0.1 GWEI +# An optional config to replace the "historic average reward" used in +# the L1 dynamic gas price cap equation +historic-avg-reward-constant=100000000 # 0.1 GWEI +[l1-dynamic-gas-price-cap-service.fee-history-fetcher] +fetch-interval="PT1S" +max-block-count=1000 +reward-percentiles=[10,20,30,40,50,60,70,80,90,100] +num-of-blocks-before-latest=4 +[l1-dynamic-gas-price-cap-service.fee-history-storage] +storage-period="PT2M" + +[conflation] +blocks-limit=2 +conflation-deadline="PT6S" # =3*l2_block_time +conflation-deadline-check-interval="PT3S" +conflation-deadline-last-block-confirmation-delay="PT2S" # recommended: at least 2 * blockInterval + +# This is to prevent inflight trasactions that may change Smart contract state while coordinator is restarted. +# Queries SMC for last finalised block, and keeps polling until this number of blocks observe the same state. +# If state is updated meanwhile, it resets counter and restarts the polling. +consistent-number-of-blocks-on-l1-to-wait=1 +fetch-blocks-limit=4000 + +[database] +host="postgres" +port="5432" +username="postgres" +password="postgres" +schema="linea_coordinator" +read_pool_size=10 +read_pipelining_limit=10 +transactional_pool_size=10 + +[persistence-retry] +#max-retries = 10 commented as can be null +backoff-delay = "PT1S" diff --git a/coordinator/app/src/test/resources/configs/gas-price-cap-time-of-day-multipliers.toml b/coordinator/app/src/test/resources/configs/gas-price-cap-time-of-day-multipliers.toml new file mode 100644 index 00000000000..36155bd6b61 --- /dev/null +++ b/coordinator/app/src/test/resources/configs/gas-price-cap-time-of-day-multipliers.toml @@ -0,0 +1,184 @@ +## +# Time of day multipliers for dynamic gas price cap calculation: +# +# TDM stands for "Time of Day Mutliplier" and has a range of values between 0.25 - 1.75. +# +# When we expect the L1 gas price to be low, for example on a Saturday night, the TDM will be at it's highest because +# we want to increase the rate at which we increase the threshold to try and settle within this time window. +# The value will be at it's lowest during peak L1 gas price times, for example, on a Tuesday afternoon, because we +# know it is likely to be expensive during this window. +# +# The values for the TDM based on the 90D of L1 gas price real world data. It is expected that every few months +# we will update this table with the latest data to account for any notable changes in the trends of L1 gas prices. +# It does not account for public holidays yet. +## + +[gas-price-cap-time-of-day-multipliers] +SUNDAY_0 = 1.7489178377946066 +SUNDAY_1 = 1.7494632175198737 +SUNDAY_2 = 1.75 +SUNDAY_3 = 1.733166295438555 +SUNDAY_4 = 1.6993775444542885 +SUNDAY_5 = 1.6350086618091364 +SUNDAY_6 = 1.5627740860151331 +SUNDAY_7 = 1.4831149222064164 +SUNDAY_8 = 1.4101476768256929 +SUNDAY_9 = 1.370085278922007 +SUNDAY_10 = 1.3516015544068651 +SUNDAY_11 = 1.3482404546676368 +SUNDAY_12 = 1.3580905751578942 +SUNDAY_13 = 1.3775497419563296 +SUNDAY_14 = 1.3700255667542938 +SUNDAY_15 = 1.2642948506461285 +SUNDAY_16 = 1.2794806131912935 +SUNDAY_17 = 1.2750892256476676 +SUNDAY_18 = 1.2919720208955585 +SUNDAY_19 = 1.317984990098603 +SUNDAY_20 = 1.4433501639513178 +SUNDAY_21 = 1.4705921238901998 +SUNDAY_22 = 1.515043370430801 +SUNDAY_23 = 1.5556742617266397 +MONDAY_0 = 1.5381562278760164 +MONDAY_1 = 1.5423761828433993 +MONDAY_2 = 1.539015963719092 +MONDAY_3 = 1.487676153648977 +MONDAY_4 = 1.430973985132037 +MONDAY_5 = 1.4656765439056292 +MONDAY_6 = 1.4484298622828233 +MONDAY_7 = 1.4459076216659752 +MONDAY_8 = 1.4899061835032241 +MONDAY_9 = 1.5249733712852067 +MONDAY_10 = 1.511367489481033 +MONDAY_11 = 1.4225695658047797 +MONDAY_12 = 1.2887291896624584 +MONDAY_13 = 1.1460926897291355 +MONDAY_14 = 1.0004897955233254 +MONDAY_15 = 0.8694664537368378 +MONDAY_16 = 0.8270273375962802 +MONDAY_17 = 0.7868289022833883 +MONDAY_18 = 0.7780303121746551 +MONDAY_19 = 0.7756215256634205 +MONDAY_20 = 0.7984895728860915 +MONDAY_21 = 0.8918589268832423 +MONDAY_22 = 0.9967716668541272 +MONDAY_23 = 1.0973334887144106 +TUESDAY_0 = 1.2233064209957951 +TUESDAY_1 = 1.3238883432855082 +TUESDAY_2 = 1.3874518307497257 +TUESDAY_3 = 1.463621147171298 +TUESDAY_4 = 1.4975989065490154 +TUESDAY_5 = 1.481679186141442 +TUESDAY_6 = 1.452778387763161 +TUESDAY_7 = 1.3414858185569951 +TUESDAY_8 = 1.2869454637983988 +TUESDAY_9 = 1.249347290389873 +TUESDAY_10 = 1.196488297386161 +TUESDAY_11 = 1.1136140507034202 +TUESDAY_12 = 0.9867528660797885 +TUESDAY_13 = 0.8018989158195754 +TUESDAY_14 = 0.6173048748109258 +TUESDAY_15 = 0.46718586671750373 +TUESDAY_16 = 0.4103633833041902 +TUESDAY_17 = 0.4871260756989506 +TUESDAY_18 = 0.5667378483016126 +TUESDAY_19 = 0.6464203510900723 +TUESDAY_20 = 0.7780268325299871 +TUESDAY_21 = 0.8995921101255763 +TUESDAY_22 = 1.0077600114996088 +TUESDAY_23 = 1.1109769960680498 +WEDNESDAY_0 = 1.2097668746150059 +WEDNESDAY_1 = 1.2631002319009361 +WEDNESDAY_2 = 1.2912775191940549 +WEDNESDAY_3 = 1.3229785939630059 +WEDNESDAY_4 = 1.3428607301494424 +WEDNESDAY_5 = 1.3750788517823973 +WEDNESDAY_6 = 1.3752344527256497 +WEDNESDAY_7 = 1.3505490078766218 +WEDNESDAY_8 = 1.2598503219367945 +WEDNESDAY_9 = 1.2051668977452374 +WEDNESDAY_10 = 1.0320896222195326 +WEDNESDAY_11 = 0.8900138031631949 +WEDNESDAY_12 = 0.6341155208698448 +WEDNESDAY_13 = 0.48337590254714624 +WEDNESDAY_14 = 0.2903189399226416 +WEDNESDAY_15 = 0.25 +WEDNESDAY_16 = 0.25711039485046006 +WEDNESDAY_17 = 0.37307641907591793 +WEDNESDAY_18 = 0.45280799454961196 +WEDNESDAY_19 = 0.5631397823847637 +WEDNESDAY_20 = 0.6285005244224133 +WEDNESDAY_21 = 0.6671897537279405 +WEDNESDAY_22 = 0.7268406397452634 +WEDNESDAY_23 = 0.8068904097486369 +THURSDAY_0 = 0.9021601102971811 +THURSDAY_1 = 1.023741688964238 +THURSDAY_2 = 1.1340689935096755 +THURSDAY_3 = 1.2530130345819006 +THURSDAY_4 = 1.3163421664973542 +THURSDAY_5 = 1.3536343767230727 +THURSDAY_6 = 1.3432290485306728 +THURSDAY_7 = 1.2864983218982178 +THURSDAY_8 = 1.2320488534113174 +THURSDAY_9 = 1.1984530721079034 +THURSDAY_10 = 1.0877338251341975 +THURSDAY_11 = 0.9999324929016475 +THURSDAY_12 = 0.87536726762619 +THURSDAY_13 = 0.6560822412167919 +THURSDAY_14 = 0.44836474861432074 +THURSDAY_15 = 0.36145134935025247 +THURSDAY_16 = 0.2695997829759713 +THURSDAY_17 = 0.2898426312618241 +THURSDAY_18 = 0.3970093434340387 +THURSDAY_19 = 0.5193273246848977 +THURSDAY_20 = 0.6426415257034419 +THURSDAY_21 = 0.800685718218497 +THURSDAY_22 = 0.9215516833839711 +THURSDAY_23 = 1.053701659160912 +FRIDAY_0 = 1.149649788723893 +FRIDAY_1 = 1.2046315447861193 +FRIDAY_2 = 1.2724031281576726 +FRIDAY_3 = 1.3525693456352732 +FRIDAY_4 = 1.3746126314960814 +FRIDAY_5 = 1.3744591862592468 +FRIDAY_6 = 1.3297812543035683 +FRIDAY_7 = 1.2762064429631657 +FRIDAY_8 = 1.235662409263294 +FRIDAY_9 = 1.2171558028785991 +FRIDAY_10 = 1.182722399785398 +FRIDAY_11 = 1.137345538963285 +FRIDAY_12 = 0.9999308422620752 +FRIDAY_13 = 0.8055000309055653 +FRIDAY_14 = 0.5667135273493851 +FRIDAY_15 = 0.4081529603000651 +FRIDAY_16 = 0.3987031354907009 +FRIDAY_17 = 0.5030075499003412 +FRIDAY_18 = 0.6518159532641841 +FRIDAY_19 = 0.8733483414970974 +FRIDAY_20 = 1.0496224913080463 +FRIDAY_21 = 1.1820684558591705 +FRIDAY_22 = 1.2561688567574458 +FRIDAY_23 = 1.3204704912328773 +SATURDAY_0 = 1.3832230236620218 +SATURDAY_1 = 1.4632908341022142 +SATURDAY_2 = 1.5019230781315296 +SATURDAY_3 = 1.5437332506007084 +SATURDAY_4 = 1.5934153179751855 +SATURDAY_5 = 1.6245578072557723 +SATURDAY_6 = 1.6294919789890665 +SATURDAY_7 = 1.6027665451672717 +SATURDAY_8 = 1.6068061069158674 +SATURDAY_9 = 1.624257927970777 +SATURDAY_10 = 1.5996112411089 +SATURDAY_11 = 1.5659672993092648 +SATURDAY_12 = 1.5333537902522736 +SATURDAY_13 = 1.445292929996356 +SATURDAY_14 = 1.2966021477035259 +SATURDAY_15 = 1.250999408961155 +SATURDAY_16 = 1.2535364828163025 +SATURDAY_17 = 1.2736456128871074 +SATURDAY_18 = 1.3348268054897328 +SATURDAY_19 = 1.4571388900094875 +SATURDAY_20 = 1.5073787902995706 +SATURDAY_21 = 1.5605139580010123 +SATURDAY_22 = 1.5885303316932382 +SATURDAY_23 = 1.6169891066719597 diff --git a/coordinator/app/src/test/resources/configs/smart-contract-errors.toml b/coordinator/app/src/test/resources/configs/smart-contract-errors.toml new file mode 100644 index 00000000000..1de93403e76 --- /dev/null +++ b/coordinator/app/src/test/resources/configs/smart-contract-errors.toml @@ -0,0 +1,10 @@ +## +# Smart contract error codes from: +# https://www.notion.so/consensys/Smart-Contracts-Error-Code-Registry-bb4bd68f8ddf4b0ba90000d1136e42ef +## + +[smart-contract-errors] +# L1 Linea Rollup +"0f06cd15" = "DataAlreadySubmitted" +"c01eab56" = "EmptySubmissionData" +"abefa5e8" = "DataStartingBlockDoesNotMatch" diff --git a/coordinator/app/src/test/resources/configs/traces-limits-v1.toml b/coordinator/app/src/test/resources/configs/traces-limits-v1.toml new file mode 100644 index 00000000000..e7c727a80ec --- /dev/null +++ b/coordinator/app/src/test/resources/configs/traces-limits-v1.toml @@ -0,0 +1,40 @@ +[traces-limits] +# EVM Arithmetization Limits +ADD = 1 +BIN = 2 +BIN_RT = 3 +EC_DATA = 4 +EXT = 5 +HUB = 6 +INSTRUCTION_DECODER = 7 +MMIO = 8 +MMU = 9 +MMU_ID = 10 +MOD = 11 +MUL = 12 +MXP = 13 +PHONEY_RLP = 14 +PUB_HASH = 15 +PUB_HASH_INFO = 16 +PUB_LOG = 17 +PUB_LOG_INFO = 18 +RLP = 19 +ROM = 20 +SHF = 21 +SHF_RT = 22 +TX_RLP = 23 +WCP = 24 +# Block Limits +BLOCK_TX = 25 +BLOCK_L2L1LOGS = 26 +BLOCK_KECCAK = 27 +# Precompile Limits +PRECOMPILE_ECRECOVER = 28 +PRECOMPILE_SHA2 = 29 +PRECOMPILE_RIPEMD = 30 +PRECOMPILE_IDENTITY = 31 +PRECOMPILE_MODEXP = 32 +PRECOMPILE_ECADD = 32 +PRECOMPILE_ECMUL = 34 +PRECOMPILE_ECPAIRING = 35 +PRECOMPILE_BLAKE2F = 36 diff --git a/coordinator/app/src/test/resources/configs/traces-limits-v2.toml b/coordinator/app/src/test/resources/configs/traces-limits-v2.toml new file mode 100644 index 00000000000..5ece38b4bfa --- /dev/null +++ b/coordinator/app/src/test/resources/configs/traces-limits-v2.toml @@ -0,0 +1,53 @@ +[traces-limits] +# Arithmetization module limits +ADD = 1 +BIN = 2 +BLAKE_MODEXP_DATA = 3 +BLOCK_DATA = 4 +BLOCK_HASH = 5 +EC_DATA = 6 +EUC = 7 +EXP = 8 +EXT = 9 +GAS = 10 +HUB = 11 +LOG_DATA = 12 +LOG_INFO = 13 +MMIO = 14 +MMU = 15 +MOD = 16 +MUL = 18 +MXP = 19 +OOB = 20 +RLP_ADDR = 21 +RLP_TXN = 22 +RLP_TXN_RCPT = 23 +ROM = 24 +ROM_LEX = 25 +SHAKIRA_DATA = 26 +SHF = 27 +STP = 28 +TRM = 29 +TXN_DATA = 30 +WCP = 31 +# Reference table limits, set to UInt.MAX_VALUE +BIN_REFERENCE_TABLE = 32 +INSTRUCTION_DECODER = 33 +SHF_REFERENCE_TABLE = 34 +# Precompiles limits +PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 35 +PRECOMPILE_BLAKE_ROUNDS = 36 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 37 +PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 38 +PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 39 +PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 40 +PRECOMPILE_ECPAIRING_MILLER_LOOPS = 41 +PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 42 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 43 +PRECOMPILE_RIPEMD_BLOCKS = 44 +PRECOMPILE_SHA2_BLOCKS = 45 +# Block limits +BLOCK_KECCAK = 46 +BLOCK_L1_SIZE = 47 +BLOCK_L2_L1_LOGS = 48 +BLOCK_TRANSACTIONS = 49