主页 > 最新imtoken官网 > 使用java实现以太坊的并发发送交易
使用java实现以太坊的并发发送交易
最新imtoken官网 2023-11-20 05:07:07
大家都知道web3j是用来实现以太坊的功能的。
找了很多文章,完全自动发送交易的文章很少,尤其是一个账户同时发送多笔交易的方法。 (简单的 nonceto 低错误)
这里我简单谈谈我的想法。
基础知识:以太坊发送带有随机数的交易。 如果nonce小于已经发送成功的交易的nonce,则交易失败。 每笔交易成功后,获得的nonce会比上一笔交易的nonce多1(其实交易是自增的。)如果nonce大于现有交易,则当前的nonce交易会等待上一笔交易的nonce完全的
单个钱包可以同时发送多笔交易:如果是内部账户,可以使用DefaultBlockParameterName.PENDING方法维护nonce自增。 一般来说以太坊钱包怎么交易,该方法可以获得待处理交易的nonce。 为了实现交易的nonce自增
String address = /* 发送交易的地址 */;
BigInteger nonce = web3j.ethGetTransactionCount(address , DefaultBlockParameterName.PENDING).send().getTransactionCount();
如果使用web3j封装的方法进行交易,根本不知道TxHash以太坊钱包怎么交易,很容易出现网络超时错误。 而当你发送多笔交易时,你甚至不知道你是否已经将币发送到那个地址。
因此,自行维护TXHash以确保您能够正确发送交易是非常重要的。 并且您可以自己查看交易状态。
获取交易哈希
如何获取普通以太币交易的TxHash
public EthSendTransaction ethSendTransaction(BigInteger gasPrice, Credentials credentials,String toAddress, BigInteger nonce, String hexData, BigInteger value) throws IOException {
byte[] signedMessage = TransactionEncoder.signMessage(
RawTransaction.createTransaction(
nonce,
gasPrice, gasLimit(),
toAddress,
value,
hexData == null ? "" : hexData
),
credentials
);
String hexValue = Numeric.toHexString(signedMessage);
EthSendTransaction transactionHash = web3j.ethSendRawTransaction(hexValue).send();
// 交易发送失败
// 会返回错误信息的
// 其实web3j只是封装了以太坊的接口
if (transactionHash.hasError()) {
logger.error("transactionHash error -> code :{} \n message:{} \n data:{}", transactionHash.getError().getCode(), transactionHash.getError().getMessage(), transactionHash.getError().getData());
return null;
}
// 这个就是TXHash 可以通过这个查询交易状态
String txHash = transactionHash.getTransactionHash()
return transactionHash;
}
代币发送方式
protected EthSendTransaction sendErc20Transfer(Credentials credentials,String toAddress,BigInteger tokens, BigInteger gasPrice, BigInteger nonce) throws IOException {
String erc20Address = /* 合约地址 */;
// 看web3j生成的合约怎么实现的交易方法
// 复制粘贴过来就可以了
Function function = new Function(
"transfer",
Arrays.asList(new Address(toAddress), new Uint256(tokens)),
Collections.emptyList());
RawTransaction transaction = RawTransaction.createTransaction(
nonce,
gasPrice, gasLimit(),
erc20Address ,
BigInteger.ZERO,
FunctionEncoder.encode(function));
String hexValue = Numeric.toHexString(TransactionEncoder.signMessage(transaction, credentials));
EthSendTransaction transactionHash = web3j.ethSendRawTransaction(hexValue).send();
if (transactionHash.hasError()) {
logger.error("transactionHash error -> code :{} \n message:{} \n data:{}", transactionHash.getError().getCode(), transactionHash.getError().getMessage(), transactionHash.getError().getData());
return null;
}
return transactionHash;
}
检查 TxHash
protected void check(Transaction transaction) {
try {
EthGetTransactionReceipt ethGetTransactionReceipt = web3j.ethGetTransactionReceipt(transaction.getTxHash()).send();
TransactionReceipt result = ethGetTransactionReceipt.getResult();
if (result != null) {
if (result.isStatusOK()) {
// 交易成功
// 可以获取到交易信息
} else {
// 交易失败
// 错误信息
String errorMsg = String.format(
"Transaction has failed with status: %s. "
+ "Gas used: %d. (not-enough gas?)",
result.getStatus(),
result.getGasUsed())
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
通过以上所有,您可以自己维护自己的交易。 如果交易有问题,也可以直接查看交易tx
分享一个免费获取当前时间安全gas的API接口
https://ethgasstation.info/json/ethgasAPI.json