主页 > 最新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