ETH离线交易

maven:

 <dependency>
            <groupId>org.web3j</groupId>
            <artifactId>core</artifactId>
            <version>2.2.1</version>
        </dependency>

直接上码:

  Map<String,String> result = new HashMap<>();
//        BigInteger nonce = GetWeb3jConnection.getInstance().ethGetTransactionCount(mainAddress, DefaultBlockParameterName.PENDING)
//                .send().getTransactionCount();  ---这里获取最新的nonce

        String amountStr = qty.toString();
        BigInteger amountWei = Convert.toWei(amountStr, Convert.Unit.ETHER).toBigInteger();//默认为18位小数
	// amountWei = Convert.toWei(amountStr, Convert.Unit.MWEI).toBigInteger(); --看你币种的小数位为多少
	
        //封装转账交易
        Function function = new Function(
                "transfer",
                Arrays.<Type>asList(new org.web3j.abi.datatypes.Address(toAddress),
                        new org.web3j.abi.datatypes.generated.Uint256(amountWei)),
                Collections.<TypeReference<?>>emptyList());
                //data内容
        String data = FunctionEncoder.encode(function);

        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,//nonce
                ERC20_GAS_PRICE, //GasPrice--自己设置自己喜欢的值,
                erc20GasLimit,//GasLimit--自己设置自己喜欢的值,必须大于21000
                contractAddress,//合约地址
                data);//inputdata,--如果是eth交易 直接设置为""就行
        //手续费= (gasPrice * gasLimit ) / 10^18 ether --最大手续费

        Credentials credentials = Credentials.create(privatekey);//加载凭证

        byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);//对原始数据签名

        String signMessageStr = Numeric.toHexString(signMessage);//封装签名

        EthSendTransaction ethSendTransaction = GetWeb3jConnection.
                getInstance().
                ethSendRawTransaction(signMessageStr).sendAsync().get();//发送交易

        if(ethSendTransaction.hasError()){
            log.error("transfer error:{},转入地址:{}", ethSendTransaction.getError().getMessage(),toAddress);
            throw new MyException("转账失败");
        }else{
            String txHashId = ethSendTransaction.getTransactionHash();//获取hash
            log.info("transfer Success:{}", txHashId);
            BigInteger gasPrice = ERC20_GAS_PRICE.divide(new BigInteger("10").pow(9));//拿到了Gwei价格
            result.put("txHashId", txHashId);
            result.put("nonce", nonce +"");//这个交易的nonce
            result.put("gas", erc20GasLimit+"");//当前交易的gasLimit
            result.put("gasPrice", gasPrice+"");//当前交易的GasPrice
            return result;
        }

无论是eth还是token都可以直接用了。直接上就行。
害怕的就先去infura注册一个链接,去Ropsten 领取测试币,以及发布一个erc20的代币就行(erc20Usdt的精准度为6, 其他基本都18)

自己去试试就好了。
喜欢点个赞 谢谢。

原创文章 25 获赞 10 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42195162/article/details/105786834
ETH