Rewrite eth_syncing handling for ethereum networks

This commit is contained in:
msizov
2024-06-17 19:54:52 +07:00
committed by GitHub
parent 96f796978c
commit 46e48f4e3d
5 changed files with 9 additions and 150 deletions

View File

@@ -1,62 +0,0 @@
/*
* Copyright (c) 2016-2019 Igor Artamonov, All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.emeraldpay.dshackle.upstream.ethereum.json;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonDeserialize(using = SyncingJsonDeserializer.class)
@JsonSerialize(using = SyncingJsonSerializer.class)
public class SyncingJson {
private boolean syncing;
private Long startingBlock;
private Long currentBlock;
private Long highestBlock;
public boolean isSyncing() {
return syncing;
}
public void setSyncing(boolean syncing) {
this.syncing = syncing;
}
public Long getStartingBlock() {
return startingBlock;
}
public void setStartingBlock(Long startingBlock) {
this.startingBlock = startingBlock;
}
public Long getCurrentBlock() {
return currentBlock;
}
public void setCurrentBlock(Long currentBlock) {
this.currentBlock = currentBlock;
}
public Long getHighestBlock() {
return highestBlock;
}
public void setHighestBlock(Long highestBlock) {
this.highestBlock = highestBlock;
}
}

View File

@@ -1,41 +0,0 @@
/*
* Copyright (c) 2016-2019 Igor Artamonov, All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.emeraldpay.dshackle.upstream.ethereum.json;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
public class SyncingJsonDeserializer extends EtherJsonDeserializer<SyncingJson> {
@Override
public SyncingJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.readValueAsTree();
SyncingJson resp = new SyncingJson();
if (node.isBoolean()) {
resp.setSyncing(node.asBoolean());
} else {
resp.setSyncing(true);
resp.setStartingBlock(getLong(node, "startingBlock"));
resp.setCurrentBlock(getLong(node, "currentBlock"));
resp.setHighestBlock(getLong(node, "highestBlock"));
}
return resp;
}
}

View File

@@ -1,39 +0,0 @@
/*
* Copyright (c) 2016-2019 Igor Artamonov, All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.emeraldpay.dshackle.upstream.ethereum.json;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class SyncingJsonSerializer extends EtherJsonSerializer<SyncingJson> {
@Override
public void serialize(SyncingJson value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null) {
gen.writeNull();
} else if (value.isSyncing()) {
gen.writeStartObject();
writeField(gen, "startingBlock", value.getStartingBlock());
writeField(gen, "currentBlock", value.getCurrentBlock());
writeField(gen, "highestBlock", value.getHighestBlock());
gen.writeEndObject();
} else {
gen.writeBoolean(false);
}
}
}

View File

@@ -30,7 +30,6 @@ import io.emeraldpay.dshackle.upstream.UpstreamAvailability
import io.emeraldpay.dshackle.upstream.ValidateUpstreamSettingsResult
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
import io.emeraldpay.dshackle.upstream.ethereum.hex.HexData
import io.emeraldpay.dshackle.upstream.ethereum.json.SyncingJson
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionCallJson
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.springframework.scheduling.concurrent.CustomizableThreadFactory
@@ -58,7 +57,15 @@ open class EthereumUpstreamValidator @JvmOverloads constructor(
override fun validateSyncingRequest(): ValidateSyncingRequest {
return ValidateSyncingRequest(
ChainRequest("eth_syncing", ListParams()),
) { bytes -> objectMapper.readValue(bytes, SyncingJson::class.java).isSyncing }
) { bytes ->
val raw = Global.objectMapper.readTree(bytes)
if (raw.isBoolean) {
raw.asBoolean()
} else {
log.warn("Received syncing object ${raw.toPrettyString()} for upstream ${upstream.getId()}")
true
}
}
}
override fun validatePeersRequest(): ValidatePeersRequest {