flashblocks detection (#687)

This commit is contained in:
a10zn8
2025-07-16 19:28:23 +03:00
committed by GitHub
parent 4b0650b8dc
commit 323d23a126
2 changed files with 33 additions and 1 deletions

View File

@@ -28,9 +28,34 @@ class EthereumUpstreamSettingsDetector(
detectNodeType(),
detectArchiveNode(notArchived),
detectGasLabels(),
detectFlashBlocks(),
)
}
private fun detectFlashBlocks(): Mono<Pair<String, String>>? {
return upstream.getIngressReader().read(
ChainRequest(
"eth_getBlockByNumber",
ListParams(
"pending",
false,
),
),
).flatMap {
it.requireResult()
}.flatMap {
val json = Global.objectMapper.readValue(it, JsonNode::class.java)
if (json.get("stateRoot")?.asText() == "0x0000000000000000000000000000000000000000000000000000000000000000") {
Mono.just(Pair("flashblocks", "true"))
} else {
Mono.just(Pair("flashblocks", "false"))
}
}.onErrorResume {
log.error("Error during flashblocks detection", it)
Mono.empty()
}
}
override fun mapping(node: JsonNode): String {
return node.asText()
}

View File

@@ -35,6 +35,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
"code": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c806351be4eaa14602d575b600080fd5b60336047565b604051603e91906066565b60405180910390f35b60005a905090565b6000819050919050565b606081604f565b82525050565b6000602082019050607960008301846059565b9291505056fea26469706673582212201c0202887c1afe66974b06ee355dee07542bbc424cf4d1659c91f56c08c3dcc064736f6c63430008130033",
],
]], gas)
answer("eth_getBlockByNumber", ["pending", false], null)
}
)
def detector = new EthereumUpstreamSettingsDetector(up, Chain.ETHEREUM__MAINNET)
@@ -52,6 +53,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
if (extragas != null) {
result.expectNext(new Pair<String, String>("extra_gas_limit", extragas))
}
result.expectNext(new Pair<String, String>("flashblocks", "false"))
result.expectComplete().verify(Duration.ofSeconds(1))
where:
response | gas | gasv | extragas | clientType | version
@@ -69,6 +71,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
answer("eth_blockNumber", [], "0x10df3e5")
answer("eth_getBalance", ["0x0000000000000000000000000000000000000000", "0x10dccd5"], "")
answer("eth_getBalance", ["0x0000000000000000000000000000000000000000", "0x2710"], null)
answer("eth_getBlockByNumber", ["pending", false], null)
}
)
def detector = new EthereumUpstreamSettingsDetector(up, Chain.ETHEREUM__MAINNET)
@@ -82,6 +85,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
new Pair<String, String>("client_version", "v0.4.0"),
new Pair<String, String>("archive", "false")
)
.expectNext(new Pair<String, String>("flashblocks", "false"))
.expectComplete()
.verify(Duration.ofSeconds(1))
}
@@ -112,7 +116,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
def "Only default label"() {
setup:
def up = Mock(DefaultUpstream) {
5 * getIngressReader() >> Mock(Reader) {
6 * getIngressReader() >> Mock(Reader) {
1 * read(new ChainRequest("web3_clientVersion", new ListParams())) >>
Mono.just(new ChainResponse('no/v1.19.3+e8ac1da4/linux-x64/dotnet7.0.8'.getBytes(), null))
1 * read(new ChainRequest("eth_blockNumber", new ListParams())) >>
@@ -133,6 +137,8 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
],
))) >>
Mono.just(new ChainResponse("".getBytes(), null))
1 * read(new ChainRequest("eth_getBlockByNumber", new ListParams(["pending", false]))) >>
Mono.just(new ChainResponse("{}".getBytes(), null))
}
getLabels() >> []
}
@@ -142,6 +148,7 @@ class EthereumUpstreamSettingsDetectorSpec extends Specification {
then:
StepVerifier.create(act)
.expectNext(new Pair<String, String>("archive", "false"))
.expectNext(new Pair<String, String>("flashblocks", "false"))
.expectComplete()
.verify(Duration.ofSeconds(1))
}