diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt index 36645862..95bb9807 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt @@ -8,27 +8,41 @@ data class ChainsConfig(private val chains: Map, val curr fun default(): ChainsConfig = ChainsConfig(emptyMap(), RawChainConfig.default()) } - data class RawChainConfig(val syncingLagSize: Int?, val laggingLagSize: Int?) { + data class RawChainConfig( + var syncingLagSize: Int? = null, + var laggingLagSize: Int? = null, + var options: UpstreamsConfig.PartialOptions? = null + ) { + companion object { @JvmStatic - fun default() = RawChainConfig(6, 1) + fun default() = RawChainConfig( + syncingLagSize = 6, + laggingLagSize = 1 + ) } } - data class ChainConfig(val syncingLagSize: Int, val laggingLagSize: Int) { + data class ChainConfig( + val syncingLagSize: Int, + val laggingLagSize: Int, + val options: UpstreamsConfig.PartialOptions + ) { companion object { @JvmStatic - fun default() = ChainConfig(6, 1) + fun default() = ChainConfig(6, 1, UpstreamsConfig.PartialOptions()) } } fun resolve(chain: Chain): ChainConfig { val default = currentDefault ?: panic() val raw = chains[chain] ?: default + val options = default.options?.merge(raw.options) ?: raw.options ?: UpstreamsConfig.PartialOptions() return ChainConfig( laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: panic(), syncingLagSize = raw.syncingLagSize ?: default.syncingLagSize ?: panic(), + options = options ) } @@ -42,7 +56,8 @@ data class ChainsConfig(private val chains: Map, val curr patch: RawChainConfig? ) = RawChainConfig( syncingLagSize = patch?.syncingLagSize ?: current.syncingLagSize, - laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize + laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize, + options = patch?.options ?: current.options ) private fun merge( diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt index 4240fafe..8d1ac411 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt @@ -5,7 +5,9 @@ import org.yaml.snakeyaml.nodes.CollectionNode import org.yaml.snakeyaml.nodes.MappingNode import java.io.InputStream -class ChainsConfigReader : YamlConfigReader() { +class ChainsConfigReader( + private val upstreamsConfigReader: UpstreamsConfigReader +) : YamlConfigReader() { private val defaultConfig = this::class.java.getResourceAsStream("/chains.yaml")!! @@ -41,12 +43,20 @@ class ChainsConfigReader : YamlConfigReader() { } private fun readChain(node: MappingNode): ChainsConfig.RawChainConfig? { - return getMapping(node, "lags")?.let { - return ChainsConfig.RawChainConfig( - getValueAsInt(it, "syncing"), - getValueAsInt(it, "lagging") - ) + val rawConfig = ChainsConfig.RawChainConfig() + getMapping(node, "lags")?.let { lagConfig -> + getValueAsInt(lagConfig, "syncing")?.let { + rawConfig.syncingLagSize = it + } + getValueAsInt(lagConfig, "lagging")?.let { + rawConfig.laggingLagSize = it + } } + upstreamsConfigReader.tryReadOptions(node)?.let { + rawConfig.options = it + } + + return rawConfig } private fun readChains(node: CollectionNode): List> { diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt index 6548a0a2..9fa6cf85 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt @@ -32,7 +32,7 @@ class MainConfigReader( private val healthConfigReader = HealthConfigReader() private val signatureConfigReader = SignatureConfigReader(fileResolver) private val compressionConfigReader = CompressionConfigReader() - private val chainsConfigReader = ChainsConfigReader() + private val chainsConfigReader = ChainsConfigReader(upstreamsConfigReader) override fun read(input: MappingNode?): MainConfig { val config = MainConfig() diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt index 6dcf14e2..99e1b2be 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt @@ -102,7 +102,9 @@ open class ConfiguredUpstreams( log.error("Chain is unknown: ${up.chain}") return@forEach } - val options = (defaultOptions[chain] ?: UpstreamsConfig.PartialOptions.getDefaults()) + val chainConfig = chainsConfig.resolve(chain) + val options = chainConfig.options + .merge(defaultOptions[chain] ?: UpstreamsConfig.PartialOptions.getDefaults()) .merge(up.options ?: UpstreamsConfig.PartialOptions()) .buildOptions() val upstream = when (BlockchainType.from(chain)) { @@ -112,7 +114,7 @@ open class ConfiguredUpstreams( up.cast(UpstreamsConfig.EthereumPosConnection::class.java), chain, options, - chainsConfig.resolve(chain) + chainConfig ) } BlockchainType.EVM_POW -> { @@ -121,7 +123,7 @@ open class ConfiguredUpstreams( up.cast(UpstreamsConfig.EthereumConnection::class.java), chain, options, - chainsConfig.resolve(chain) + chainConfig ) } BlockchainType.BITCOIN -> { @@ -129,7 +131,7 @@ open class ConfiguredUpstreams( up.cast(UpstreamsConfig.BitcoinConnection::class.java), chain, options, - chainsConfig.resolve(chain) + chainConfig ) } } diff --git a/src/main/resources/chains.yaml b/src/main/resources/chains.yaml index 17e89041..6f7df75c 100644 --- a/src/main/resources/chains.yaml +++ b/src/main/resources/chains.yaml @@ -15,18 +15,26 @@ chain-settings: syncing: 20 lagging: 10 - id: arbitrum + options: + validate-peers: false lags: syncing: 20 lagging: 10 - id: arbitrum-testnet + options: + validate-peers: false lags: syncing: 20 lagging: 10 - id: optimism + options: + validate-peers: false lags: syncing: 20 lagging: 10 - id: optimism-testnet + options: + validate-peers: false lags: syncing: 20 lagging: 10 diff --git a/src/test/groovy/io/emeraldpay/dshackle/config/ChainsConfigReaderSpec.groovy b/src/test/groovy/io/emeraldpay/dshackle/config/ChainsConfigReaderSpec.groovy index 529a36b8..e30f1e76 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/config/ChainsConfigReaderSpec.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/config/ChainsConfigReaderSpec.groovy @@ -17,11 +17,14 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.Chain +import io.emeraldpay.dshackle.FileResolver import spock.lang.Specification class ChainsConfigReaderSpec extends Specification { - ChainsConfigReader reader = new ChainsConfigReader() + ChainsConfigReader reader = new ChainsConfigReader( + new UpstreamsConfigReader(Stub(FileResolver)) + ) def "Parse standard config"() { setup: @@ -41,6 +44,7 @@ class ChainsConfigReaderSpec extends Specification { opt.laggingLagSize == 3 opt.syncingLagSize == 20 + opt.options.validatePeers == false sep.laggingLagSize == 1 sep.syncingLagSize == 10 diff --git a/src/test/kotlin/io/emeraldpay/dshackle/config/ChainsConfigTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/config/ChainsConfigTest.kt index 534aea36..a6b25a80 100644 --- a/src/test/kotlin/io/emeraldpay/dshackle/config/ChainsConfigTest.kt +++ b/src/test/kotlin/io/emeraldpay/dshackle/config/ChainsConfigTest.kt @@ -10,20 +10,20 @@ internal class ChainsConfigTest { fun patch() { val orig = ChainsConfig( mapOf( - Chain.BITCOIN to ChainsConfig.RawChainConfig(0, 0), - Chain.ETHEREUM to ChainsConfig.RawChainConfig(1, 2), - Chain.POLYGON to ChainsConfig.RawChainConfig(3, 4) + Chain.BITCOIN to createRawChainConfig(0, 0), + Chain.ETHEREUM to createRawChainConfig(1, 2), + Chain.POLYGON to createRawChainConfig(3, 4) ), - ChainsConfig.RawChainConfig(1, 2) + createRawChainConfig(1, 2) ) val patch = ChainsConfig( mapOf( - Chain.BITCOIN to ChainsConfig.RawChainConfig(null, 10000), - Chain.POLYGON to ChainsConfig.RawChainConfig(10, 11), - Chain.ARBITRUM to ChainsConfig.RawChainConfig(999, 999) + Chain.BITCOIN to createRawChainConfig(null, 10000), + Chain.POLYGON to createRawChainConfig(10, 11), + Chain.ARBITRUM to createRawChainConfig(999, 999) ), - ChainsConfig.RawChainConfig(100, null) + createRawChainConfig(100, null) ) val res = orig.patch(patch) @@ -31,14 +31,21 @@ internal class ChainsConfigTest { assertEquals( ChainsConfig( mapOf( - Chain.BITCOIN to ChainsConfig.RawChainConfig(0, 10000), - Chain.ETHEREUM to ChainsConfig.RawChainConfig(1, 2), - Chain.POLYGON to ChainsConfig.RawChainConfig(10, 11), - Chain.ARBITRUM to ChainsConfig.RawChainConfig(999, 999) + Chain.BITCOIN to createRawChainConfig(0, 10000), + Chain.ETHEREUM to createRawChainConfig(1, 2), + Chain.POLYGON to createRawChainConfig(10, 11), + Chain.ARBITRUM to createRawChainConfig(999, 999) ), - ChainsConfig.RawChainConfig(100, 2) + createRawChainConfig(100, 2) ), res ) } + + private fun createRawChainConfig(syncingLagSize: Int?, laggingLagSize: Int?) = + ChainsConfig.RawChainConfig() + .apply { + this.syncingLagSize = syncingLagSize + this.laggingLagSize = laggingLagSize + } }