目录

我的学习分享

记录精彩的程序人生

etherscan中国结点

etherscan的中国结点的地址是:https://cn.etherscan.com/

因为某种原因,在**java-etherscan-api**项目中没有提供对中国结点的支持,而连接国外结点时经常出现连接超时的现象。那么,通过修改源码来增加对中国结点的支持。

①在EthNetwork.java中增加MAINNET_CN:

package io.api.etherscan.model;

/**
 * ! NO DESCRIPTION !
 *
 * @author GoodforGod
 * @since 28.10.2018
 */
public enum EthNetwork {

    MAINNET("api"),
    MAINNET_CN("api-cn"),
    ROPSTEN("api-ropsten"),
    KOVAN("api-kovan"),
    TOBALABA("api-tobalaba"),
    GORLI("api-goerli"),
    RINKEBY("api-rinkeby");

    private final String domain;

    EthNetwork(String domain) {
        this.domain = domain;
    }

    public String getDomain() {
        return domain;
    }
}

②在EtherScanApi.java中替换为正确的域名:

package io.api.etherscan.core.impl;

import io.api.etherscan.core.*;
import io.api.etherscan.error.ApiException;
import io.api.etherscan.error.ApiKeyException;
import io.api.etherscan.executor.IHttpExecutor;
import io.api.etherscan.executor.impl.HttpExecutor;
import io.api.etherscan.manager.IQueueManager;
import io.api.etherscan.manager.impl.FakeQueueManager;
import io.api.etherscan.manager.impl.QueueManager;
import io.api.etherscan.model.EthNetwork;
import io.api.etherscan.util.BasicUtils;
import org.jetbrains.annotations.NotNull;

import java.util.function.Supplier;

/**
 * EtherScan full API Description https://etherscan.io/apis
 *
 * @author GoodforGod
 * @since 28.10.2018
 */
public class EtherScanApi implements AutoCloseable {

    private static final Supplier<IHttpExecutor> DEFAULT_SUPPLIER = HttpExecutor::new;

    public static final String DEFAULT_KEY = "YourApiKeyToken";

    private final IQueueManager queueManager;
    private final IAccountApi account;
    private final IBlockApi block;
    private final IContractApi contract;
    private final ILogsApi logs;
    private final IProxyApi proxy;
    private final IStatisticApi stats;
    private final ITransactionApi txs;

    public EtherScanApi() {
        this(DEFAULT_KEY, EthNetwork.MAINNET);
    }

    public EtherScanApi(final EthNetwork network) {
        this(DEFAULT_KEY, network);
    }

    public EtherScanApi(final String apiKey) {
        this(apiKey, EthNetwork.MAINNET);
    }

    public EtherScanApi(final EthNetwork network,
                        final Supplier<IHttpExecutor> executorSupplier) {
        this(DEFAULT_KEY, network, executorSupplier);
    }

    public EtherScanApi(final String apiKey,
                        final EthNetwork network,
                        final IQueueManager queue) {
        this(apiKey, network, DEFAULT_SUPPLIER, queue);
    }

    public EtherScanApi(final String apiKey,
                        final EthNetwork network) {
        this(apiKey, network, DEFAULT_SUPPLIER);
    }

    public EtherScanApi(final String apiKey,
                        final EthNetwork network,
                        final Supplier<IHttpExecutor> executorSupplier) {
        this(apiKey, network, executorSupplier,
                DEFAULT_KEY.equals(apiKey)
                        ? QueueManager.DEFAULT_KEY_QUEUE
                        : new FakeQueueManager());
    }

    public EtherScanApi(final String apiKey,
                        final EthNetwork network,
                        final Supplier<IHttpExecutor> executorSupplier,
                        final IQueueManager queue) {
        if (BasicUtils.isBlank(apiKey))
            throw new ApiKeyException("API key can not be null or empty");

        if (network == null)
            throw new ApiException("Ethereum Network is set to NULL value");

        // EtherScan 1request\5sec limit support by queue manager
        final IHttpExecutor executor = executorSupplier.get();

        // MAINNET_CN: https://api-cn.etherscan.com/
        final String ending = EthNetwork.TOBALABA.equals(network) || EthNetwork.MAINNET_CN.equals(network) ? "com" : "io";
        final String baseUrl = "https://" + network.getDomain() + ".etherscan." + ending + "/api" + "?apikey=" + apiKey;

        this.queueManager = queue;
        this.account = new AccountApiProvider(queue, baseUrl, executor);
        this.block = new BlockApiProvider(queue, baseUrl, executor);
        this.contract = new ContractApiProvider(queue, baseUrl, executor);
        this.logs = new LogsApiProvider(queue, baseUrl, executor);
        this.proxy = new ProxyApiProvider(queue, baseUrl, executor);
        this.stats = new StatisticApiProvider(queue, baseUrl, executor);
        this.txs = new TransactionApiProvider(queue, baseUrl, executor);
    }

    @NotNull
    public IAccountApi account() {
        return account;
    }

    @NotNull
    public IContractApi contract() {
        return contract;
    }

    @NotNull
    public ITransactionApi txs() {
        return txs;
    }

    @NotNull
    public IBlockApi block() {
        return block;
    }

    @NotNull
    public ILogsApi logs() {
        return logs;
    }

    @NotNull
    public IProxyApi proxy() {
        return proxy;
    }

    @NotNull
    public IStatisticApi stats() {
        return stats;
    }

    @Override
    public void close() throws Exception {
        queueManager.close();
    }
}

最后打包。。收工