Java Web3j nonce 获取

Web3j 获取 nonce 的参考代码

public static BigInteger getNonce(Web3j web3j, String address) {
    try {
        EthGetTransactionCount nonceObject = web3j.ethGetTransactionCount(address, DefaultBlockParameterName.PENDING).send();
        if (nonceObject == null){
            throw new RuntimeException("net error");
        }
        return nonceObject.getTransactionCount();
    } catch (IOException e) {
        throw new RuntimeException("net error");
    }
}

获取一个 address nonce 值的时候,其中有一个参数为 DefaultBlockParameter,上面代码中采用的是 DefaultBlockParameterName 类,它有 3 个值,分别为

EARLIEST("earliest")

LATEST("latest")

PENDING("pending")

earliest:创世区块

latest:最新区块 (区块链的头号区块)

pending:正要挖到的区块 (包括待处理交易)

举例:假设 address 最后一个已经打包的 Transaction 的 nonce 为 100

earliest 返回的始终是: 0

latest 返回的始终是: 最后一个已经打包的 Transaction 的 nonce,+ 1,即 101

pending: 如果 address 没有 pending 状态的 Transaction,则返回 101;如果有 1 条 pending 状态的 Transaction,则返回 102;如果有 2 条 pending 状态的 Transaction,则返回 103

值得注意的是,如果获取 nonce 采取的是 pending 方式,则如果 address 前面的 Transaction 由于较低的 Gas Price 被卡住,则该钱包之后所有的交易都会被卡住,即使后面交易的 Gas Price 足够高。直到前面较低 nonce 代表的交易被打包,之后的交易才会被打包

如果采用 latest 的方式获取 nonce,则有可能多个 Transaction 获取到相同的 nonce,一旦其中一条成功,则其它所有采用相同 nonce 的 Transaction 全部都会失败。

猜你喜欢

转载自blog.csdn.net/qq_36263544/article/details/128482389
今日推荐