Calculate lower bounds inside range + adaptive update (#485)

This commit is contained in:
KirillPamPam
2024-05-23 15:25:14 +04:00
committed by GitHub
parent 100578dc6d
commit 75d6fb397a
21 changed files with 301 additions and 28 deletions

View File

@@ -0,0 +1,73 @@
package io.emeraldpay.dshackle.upstream.error
import io.emeraldpay.dshackle.upstream.ChainRequest
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.Arguments.of
import org.junit.jupiter.params.provider.MethodSource
import org.mockito.Mockito.anyLong
import org.mockito.Mockito.mock
import org.mockito.kotlin.any
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
class EthereumStateLowerBoundErrorHandlerTest {
@ParameterizedTest
@MethodSource("requests")
fun `update lower bound`(request: ChainRequest) {
val upstream = mock<Upstream>()
val handler = EthereumStateLowerBoundErrorHandler
handler.handle(upstream, request, "missing trie node d5648cc9aef48154159d53800f2f")
verify(upstream).updateLowerBound(213229736, LowerBoundType.STATE)
}
@Test
fun `no update lower bound if error is not about state`() {
val upstream = mock<Upstream>()
val request = ChainRequest(
"eth_getTransactionCount",
ListParams("0x343", "0xCB5A0A8"),
)
val handler = EthereumStateLowerBoundErrorHandler
handler.handle(upstream, request, "strange error")
verify(upstream, never()).updateLowerBound(anyLong(), any())
}
@Test
fun `no update lower bound if there is a non-state method`() {
val upstream = mock<Upstream>()
val request = ChainRequest(
"eth_getBlockByNumber",
ListParams("0xCB5A0A8", true),
)
val handler = EthereumStateLowerBoundErrorHandler
handler.handle(upstream, request, "missing trie node d5648cc9aef48154159d53800f2f")
verify(upstream, never()).updateLowerBound(anyLong(), any())
}
companion object {
@JvmStatic
fun requests(): List<Arguments> =
listOf(
of(ChainRequest("eth_getTransactionCount", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("eth_getCode", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("eth_estimateGas", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("eth_getBalance", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("debug_traceCall", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("eth_call", ListParams("0x343", "0xCB5A0A8"))),
of(ChainRequest("eth_getProof", ListParams("0x343", "test", "0xCB5A0A8"))),
of(ChainRequest("eth_getStorageAt", ListParams("0x343", "test", "0xCB5A0A8"))),
)
}
}

View File

@@ -0,0 +1,25 @@
package io.emeraldpay.dshackle.upstream.error
import io.emeraldpay.dshackle.upstream.ChainRequest
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mock
import org.mockito.kotlin.verify
class UpstreamErrorHandlerTest {
@Test
fun `use lower bound error handler`() {
val upstream = mock<Upstream>()
val request = ChainRequest("eth_getCode", ListParams("0x343", "0xCB5A0A8"))
val handler = UpstreamErrorHandler
handler.handle(upstream, request, "missing trie node d5648cc9aef48154159d53800f2f")
Thread.sleep(100)
verify(upstream).updateLowerBound(213229736, LowerBoundType.STATE)
}
}