From 7c4d061fd036fa5478e7acb26119cf774abfcf41 Mon Sep 17 00:00:00 2001 From: a10zn8 Date: Wed, 25 Sep 2024 17:03:40 +0300 Subject: [PATCH] listunspent only in case of balances is provided (#575) --- .../dshackle/startup/configure/BitcoinUpstreamCreator.kt | 2 +- .../dshackle/startup/configure/GenericUpstreamCreator.kt | 2 +- .../dshackle/startup/configure/UpstreamCreator.kt | 7 ++++--- .../io/emeraldpay/dshackle/upstream/CallTargetsHolder.kt | 9 +++++---- .../dshackle/upstream/bitcoin/BitcoinMultistream.kt | 2 +- .../dshackle/upstream/bitcoin/BitcoinUpstream.kt | 2 +- .../dshackle/upstream/calls/DefaultBitcoinMethods.kt | 9 ++++++--- .../emeraldpay/dshackle/test/GenericUpstreamMock.groovy | 2 +- 8 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/BitcoinUpstreamCreator.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/BitcoinUpstreamCreator.kt index 3591b678..8ba11072 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/BitcoinUpstreamCreator.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/BitcoinUpstreamCreator.kt @@ -63,7 +63,7 @@ class BitcoinUpstreamCreator( MergedHead(listOf(rpcHead, zeroMqHead), MostWorkForkChoice(), headScheduler) } ?: rpcHead - val methods = buildMethods(config, chain) + val methods = buildMethods(config, chain, options) val upstream = BitcoinRpcUpstream( config.id ?: "bitcoin-${seq.getAndIncrement()}", diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/GenericUpstreamCreator.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/GenericUpstreamCreator.kt index 82c9496f..b1bbfbe8 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/GenericUpstreamCreator.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/GenericUpstreamCreator.kt @@ -72,7 +72,7 @@ open class GenericUpstreamCreator( if (it.connectorMode == GenericConnectorFactory.ConnectorMode.RPC_REQUESTS_WITH_MIXED_HEAD.name) it.rpc?.url ?: it.ws?.url else it.ws?.url ?: it.rpc?.url } val hash = getHash(nodeId, hashUrl!!, hashes) - val buildMethodsFun = { a: UpstreamsConfig.Upstream<*>, b: Chain -> this.buildMethods(a, b) } + val buildMethodsFun = { a: UpstreamsConfig.Upstream<*>, b: Chain -> this.buildMethods(a, b, options) } val upstream = GenericUpstream( config, diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/UpstreamCreator.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/UpstreamCreator.kt index ab3841bf..314d848b 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/UpstreamCreator.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/configure/UpstreamCreator.kt @@ -6,6 +6,7 @@ import io.emeraldpay.dshackle.config.ChainsConfig import io.emeraldpay.dshackle.config.IndexConfig import io.emeraldpay.dshackle.config.UpstreamsConfig import io.emeraldpay.dshackle.foundation.ChainOptions +import io.emeraldpay.dshackle.foundation.ChainOptions.Options import io.emeraldpay.dshackle.upstream.CallTargetsHolder import io.emeraldpay.dshackle.upstream.calls.CallMethods import io.emeraldpay.dshackle.upstream.calls.ManagedCallMethods @@ -70,7 +71,7 @@ abstract class UpstreamCreator( chainConf: ChainsConfig.ChainConfig, ): UpstreamCreationData - protected fun buildMethods(config: UpstreamsConfig.Upstream<*>, chain: Chain): CallMethods { + protected fun buildMethods(config: UpstreamsConfig.Upstream<*>, chain: Chain, options: Options): CallMethods { return if (config.methods != null || config.methodGroups != null) { if (config.methodGroups == null) { config.methodGroups = UpstreamsConfig.MethodGroups(setOf("filter"), setOf()) @@ -82,7 +83,7 @@ abstract class UpstreamCreator( } ManagedCallMethods( - delegate = callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain)), + delegate = callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain), options), enabled = config.methods?.enabled?.map { it.name }?.toSet() ?: emptySet(), disabled = config.methods?.disabled?.map { it.name }?.toSet() ?: emptySet(), groupsEnabled = config.methodGroups?.enabled ?: emptySet(), @@ -98,7 +99,7 @@ abstract class UpstreamCreator( } } } else { - callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain)) + callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain), options) } } } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/CallTargetsHolder.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/CallTargetsHolder.kt index dcb1d249..f4b5f46a 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/CallTargetsHolder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/CallTargetsHolder.kt @@ -10,6 +10,7 @@ import io.emeraldpay.dshackle.BlockchainType.SOLANA import io.emeraldpay.dshackle.BlockchainType.STARKNET import io.emeraldpay.dshackle.BlockchainType.UNKNOWN import io.emeraldpay.dshackle.Chain +import io.emeraldpay.dshackle.foundation.ChainOptions import io.emeraldpay.dshackle.upstream.calls.CallMethods import io.emeraldpay.dshackle.upstream.calls.DefaultBeaconChainMethods import io.emeraldpay.dshackle.upstream.calls.DefaultBitcoinMethods @@ -23,13 +24,13 @@ import org.springframework.stereotype.Component class CallTargetsHolder { private val callTargets = HashMap() - fun getDefaultMethods(chain: Chain, hasLogsOracle: Boolean): CallMethods { - return callTargets[chain] ?: return setupDefaultMethods(chain, hasLogsOracle) + fun getDefaultMethods(chain: Chain, hasLogsOracle: Boolean, options: ChainOptions.Options): CallMethods { + return callTargets[chain] ?: return setupDefaultMethods(chain, hasLogsOracle, options) } - private fun setupDefaultMethods(chain: Chain, hasLogsOracle: Boolean): CallMethods { + private fun setupDefaultMethods(chain: Chain, hasLogsOracle: Boolean, options: ChainOptions.Options): CallMethods { val created = when (chain.type) { - BITCOIN -> DefaultBitcoinMethods() + BITCOIN -> DefaultBitcoinMethods(options.providesBalance == true) ETHEREUM -> DefaultEthereumMethods(chain, hasLogsOracle) STARKNET -> DefaultStarknetMethods(chain) POLKADOT -> DefaultPolkadotMethods(chain) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinMultistream.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinMultistream.kt index e495da82..01029a08 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinMultistream.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinMultistream.kt @@ -51,7 +51,7 @@ open class BitcoinMultistream( private var reader = BitcoinReader(this, head, esplora) private var addressActiveCheck: AddressActiveCheck? = null private var xpubAddresses: XpubAddresses? = null - private var callRouter: LocalCallRouter = LocalCallRouter(DefaultBitcoinMethods(), reader) + private var callRouter: LocalCallRouter = LocalCallRouter(DefaultBitcoinMethods(sourceUpstreams.any { it.getOptions().providesBalance == true }), reader) override fun getUpstreams(): MutableList { return sourceUpstreams } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinUpstream.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinUpstream.kt index da3813a5..3d775c39 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinUpstream.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/bitcoin/BitcoinUpstream.kt @@ -41,5 +41,5 @@ abstract class BitcoinUpstream( options: ChainOptions.Options, role: UpstreamsConfig.UpstreamRole, chainConfig: ChainsConfig.ChainConfig, - ) : this(id, chain, options, role, DefaultBitcoinMethods(), QuorumForLabels.QuorumItem.empty(), null, chainConfig) + ) : this(id, chain, options, role, DefaultBitcoinMethods(options.providesBalance == true), QuorumForLabels.QuorumItem.empty(), null, chainConfig) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/calls/DefaultBitcoinMethods.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/calls/DefaultBitcoinMethods.kt index c366bef7..6a1691b8 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/calls/DefaultBitcoinMethods.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/calls/DefaultBitcoinMethods.kt @@ -23,7 +23,7 @@ import io.emeraldpay.dshackle.quorum.NotNullQuorum import io.emeraldpay.dshackle.upstream.ethereum.rpc.RpcException import java.util.Collections -class DefaultBitcoinMethods : CallMethods { +class DefaultBitcoinMethods(balances: Boolean) : CallMethods { private val networkinfo = Global.objectMapper.writeValueAsBytes( mapOf( @@ -49,7 +49,6 @@ class DefaultBitcoinMethods : CallMethods { "getbestblockhash", "getblocknumber", "getblockcount", - "listunspent", "getreceivedbyaddress", "getblockchaininfo", ).sorted() @@ -63,8 +62,12 @@ class DefaultBitcoinMethods : CallMethods { "sendrawtransaction", ).sorted() + private val withBalances = listOf( + "listunspent", + ) + private val allowedMethods = - (freshMethods + anyResponseMethods + headVerifiedMethods + broadcastMethods).sorted() + (freshMethods + anyResponseMethods + headVerifiedMethods + broadcastMethods + if (balances) withBalances else listOf()).sorted() override fun createQuorumFor(method: String): CallQuorum { return when { diff --git a/src/test/groovy/io/emeraldpay/dshackle/test/GenericUpstreamMock.groovy b/src/test/groovy/io/emeraldpay/dshackle/test/GenericUpstreamMock.groovy index 52621d6f..63be21b2 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/test/GenericUpstreamMock.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/test/GenericUpstreamMock.groovy @@ -39,7 +39,7 @@ class GenericUpstreamMock extends GenericUpstream { static CallMethods allMethods() { new AggregatedCallMethods([ new DefaultEthereumMethods(Chain.ETHEREUM__MAINNET, false), - new DefaultBitcoinMethods(), + new DefaultBitcoinMethods(true), new DirectCallMethods(["eth_test"]) ]) }