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 全部都会失败。