以太坊或ERC20转账查询(Java版本)
表现效果
测试用例 EthTestData.java
/*** 测试数据** @Autor Tricky* @Date 2021-04-01 22:06:36*/public class EthTestData {// {"address":"0xe81128942ed67a3b453576cad44fa9fb7f0b2098","privateKey":"8ca3edaabc0567d9555ade455bab24a27bea6ee0524e96ffac9a3cfc2b841214"}private String privateKey="8ca3edaabc0567d9555ade455bab24a27bea6ee0524e96ffac9a3cfc2b841214";private String myAddress = "0xab8ba39195bFF4D406FC62A776ce41dBA6FCf1fD";//rinkeby上面的测试币 erc20-usdt同款private String contract="0xf805ed280cadeadc2aa135808688e06fef5a9b71";private Web3j web3j ;{try{//如果这个地址不知道怎么获取 可以参考 https://blog.csdn.net/sail331x/article/details/115395131web3j = Web3j.build(new HttpService("https://rinkeby.infura.io/v3/dddddddddda74486b59041e5d83f4af1"));}catch (Throwable t){t.printStackTrace();}}/*** 创建地址*/@Testpublic void createAddress(){System.out.println("创建地址:"+JSONUtil.toJsonStr(EthUtils.createAddress()));}/*** 查询eth数量*/@Testpublic void balanceOf(){System.out.println("查询ETH:"+EthUtils.balanceOf(web3j,myAddress));}/*** 查询ERC20数量*/@Testpublic void balanceOfErc20(){System.out.println("查询ERC20:"+EthUtils.balanceOfErc20(web3j,contract,myAddress));}/*** 发送ERC20*/@Testpublic void sendErc20(){String txid = EthUtils.sendErc20(web3j, contract, privateKey, myAddress, BigInteger.valueOf(10000000));System.out.println("发送ERC20:"+txid);}/*** 发送以太坊*/@Testpublic void sendEth(){String txid = EthUtils.sendEth(web3j, privateKey, myAddress, new BigDecimal("0.001"));System.out.println("发送ETH:"+txid);}@Testpublic void getTransaction(){//合约String txid="0x29d96b351be4ab1c29912a1c26c1c8f9205fc35fb9ea2395c53c5c2e1884c421";//ethString txid2="0xef3c06f56085187d6a43edec2bb399a7fe98572aad63bcd5bd80e5e5dab153b3";EthTransaction tx = EthUtils.getTransaction(web3j, txid2);System.out.println("查询交易:"+JSONUtil.toJsonStr(tx));}
}
运行结果
工具类
EthUtils.java工具类
/*** 以太坊工具类** @Autor Tricky* @Date 2021-04-01 21:02:11*/
@Slf4j
public class EthUtils {public static final BigDecimal ETH_DECIMALS = new BigDecimal(1_000_000_000_000_000_000L);public static final BigInteger ETH_GAS_LIMIT = new BigInteger("100000");/*** 获取区块数据** @param web3j* @param block 块高* @param fullTransactionObjects 是否需要交易数据* @return*/public static EthBlock getBlock(Web3j web3j, long block, boolean fullTransactionObjects) {try {return web3j.ethGetBlockByNumber(new DefaultBlockParameterNumber(block), fullTransactionObjects).send();} catch (Throwable t) {logger.error(String.format("Get Block Error %d", block), t);}return null;}/*** 获取当前块高** @param web3j* @return*/public static long getNowBlockNumber(Web3j web3j) {try {EthBlockNumber send = web3j.ethBlockNumber().send();return send.getBlockNumber().longValue();} catch (Throwable t) {logger.error("GetBlockNumberError", t);}return -1;}/*** 发送erc20** @param web3j* @param contractAddress 合约地址* @param privateKey 私钥* @param to 收款地址* @param value 额度* @return*/public static String sendErc20(Web3j web3j, String contractAddress, String privateKey,String to, BigInteger value) {String from = getAddressByPrivateKey(privateKey);logger.info(String.format("Start:SendErc20 from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));try {//加载转账所需的凭证,用私钥Credentials credentials = Credentials.create(privateKey);//获取nonce,交易笔数BigInteger nonce = getNonce(web3j, from);if (nonce == null) {logger.error(String.format("END:GetNonceError from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));return null;}//gasPrice和gasLimit 都可以手动设置BigInteger gasPrice = getGasPrice(web3j);if (gasPrice == null) {logger.error(String.format("END:GetGasPriceError from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));return null;}//BigInteger.valueOf(4300000L) 如果交易失败 很可能是手续费的设置问题BigInteger gasLimit = BigInteger.valueOf(60000L);//ERC20代币合约方法Function function = new Function("transfer",Arrays.asList(new Address(to), new Uint256(value)),Collections.singletonList(new TypeReference<Type>() {}));//创建RawTransaction交易对象String encodedFunction = FunctionEncoder.encode(function);RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit,contractAddress, encodedFunction);//签名Transactionbyte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);String hexValue = Numeric.toHexString(signMessage);//发送交易EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();String hash = ethSendTransaction.getTransactionHash();if (hash != null) {return hash;}logger.error(String.format("END:HashIsNull from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));} catch (Throwable t) {logger.error(String.format("发送ERC20失败 from=%s to=%s erc20=%s amount=%s",from, to, contractAddress, value.toString()), t);}return null;}/*** 列出交易信息** @param block 区块高度* @param filter 过滤器* @return*/public static List<EthBlock.TransactionResult> getTransactions(Web3j web3j, long block, java.util.function.Function<EthBlock.TransactionResult, Boolean> filter) {EthBlock send = getBlock(web3j, block, true);if (send == null) {logger.error(String.format("GetBlockDataError:%d", block));return Collections.emptyList();}List<EthBlock.TransactionResult> transactions = send.getBlock().getTransactions();if (filter != null) {List<EthBlock.TransactionResult> result = new ArrayList<>();for (EthBlock.TransactionResult e : transactions) {try {if (filter.apply(e)) {result.add(e);}} catch (Throwable t) {logger.error(t.getMessage(), t);}}return result;}return transactions;}/*** 根据私钥获取地址** @param privateKey* @return*/public static String getAddressByPrivateKey(String privateKey) {ECKeyPair ecKeyPair = ECKeyPair.create(new BigInteger(privateKey, 16));return "0x" + Keys.getAddress(ecKeyPair).toLowerCase();}/*** 创建地址** @return*/public static EthAddress createAddress() {try {String seed = UUID.randomUUID().toString();ECKeyPair ecKeyPair = Keys.createEcKeyPair();BigInteger privateKeyInDec = ecKeyPair.getPrivateKey();String sPrivatekeyInHex = privateKeyInDec.toString(16);WalletFile aWallet = Wallet.createLight(seed, ecKeyPair);String sAddress = aWallet.getAddress();EthAddress address = new EthAddress();address.setAddress("0x" + sAddress);address.setPrivateKey(sPrivatekeyInHex);return address;} catch (Throwable t) {logger.error("创建地址失败", t);}return null;}/*** 查询地址以太坊数量** @param web3j* @param address 查询地址* @return*/public static BigDecimal balanceOf(Web3j web3j, String address) {try {EthGetBalance balance = web3j.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();BigInteger amount = balance.getBalance();if (amount == null || amount.compareTo(BigInteger.ZERO) <= 0) {return BigDecimal.ZERO;}return new BigDecimal(amount).divide(ETH_DECIMALS, 18, RoundingMode.FLOOR);} catch (Throwable t) {logger.error(String.format("获取以太坊数量出错 %s", address), t);}return BigDecimal.ZERO;}/*** 转换成最小单位 Wei** @param ethAmount* @return*/public static BigInteger toWei(BigDecimal ethAmount) {return ethAmount.multiply(ETH_DECIMALS).toBigInteger();}/*** wei to eth** @param wei* @return*/public static BigDecimal toEth(BigInteger wei) {return new BigDecimal(wei).divide(ETH_DECIMALS, 18, RoundingMode.FLOOR);}/*** 查询erc20的余额** @param web3j* @param contract 合约地址* @param address 查询地址* @return*/public static BigInteger balanceOfErc20(Web3j web3j, String contract, String address) {try {final String DATA_PREFIX = "0x70a08231000000000000000000000000";String value = web3j.ethCall(org.web3j.protocol.core.methods.request.Transaction.createEthCallTransaction(address,contract, DATA_PREFIX + address.substring(2)), DefaultBlockParameterName.PENDING).send().getValue();if (StrUtil.isEmptyIfStr(value)) {return BigInteger.ZERO;}return new BigInteger(value.substring(2), 16);} catch (Throwable t) {logger.error(String.format("查询ERC20失败 contract:%s address:%s", contract, address), t);}return BigInteger.ZERO;}/*** 获取gas-price** @param web3j* @return*/public static BigInteger getGasPrice(Web3j web3j) {try {EthGasPrice ethGasPrice = web3j.ethGasPrice().sendAsync().get();if (ethGasPrice == null) {logger.error("GetGasPriceError");return null;}return ethGasPrice.getGasPrice();} catch (Throwable t) {logger.error(t.getMessage(), t);}return null;}/*** 获取nonce** @param web3j* @param address* @return*/public static BigInteger getNonce(Web3j web3j, String address) {try {EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(address, DefaultBlockParameterName.PENDING).send();if (ethGetTransactionCount == null) {logger.error("GetNonceError:" + address);return null;}return ethGetTransactionCount.getTransactionCount();} catch (Throwable t) {logger.error("GetNonceError:" + address);}return null;}/*** 发送以太坊** @param web3j* @param privateKey 发送者私钥* @param to 收款地址* @param wei wei为单位的数量* @param gasPrice gas-price* @param gasLimit gas-limit* @return*/public static String sendEth(Web3j web3j, String privateKey, String to, BigInteger wei, BigInteger gasPrice, BigInteger gasLimit) {String from = getAddressByPrivateKey(privateKey);try {//加载转账所需的凭证,用私钥Credentials credentials = Credentials.create(privateKey);//获取nonce,交易笔数BigInteger nonce = getNonce(web3j, from);//创建RawTransaction交易对象RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce, gasPrice, gasLimit, to, wei);//签名Transaction,这里要对交易做签名byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);String hexValue = Numeric.toHexString(signMessage);//发送交易EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();return ethSendTransaction.getTransactionHash();} catch (Throwable t) {logger.error(String.format("发送ETH失败 from:%s to:%s amount-eth:%s", from, to, toEth(wei).toString()));}return null;}/*** 发送以太坊** @param web3j* @param privateKey 发送者私钥* @param to 收款地址* @param wei wei为单位的数量* @return*/public static String sendEth(Web3j web3j, String privateKey, String to, BigInteger wei) {return sendEth(web3j, privateKey, to, wei, getGasPrice(web3j), ETH_GAS_LIMIT);}/*** 发送以太坊** @param web3j* @param privateKey 发送者私钥* @param to 收款地址* @param eth wei为单位的数量* @param gasPrice gas-price* @param gasLimit gas-limit* @return*/public static String sendEth(Web3j web3j, String privateKey, String to, BigDecimal eth, BigInteger gasPrice, BigInteger gasLimit) {return sendEth(web3j, privateKey, to, toWei(eth), gasPrice, gasLimit);}/*** 发送以太坊** @param web3j* @param privateKey 发送者私钥* @param to 收款地址* @param eth wei为单位的数量* @return*/public static String sendEth(Web3j web3j, String privateKey, String to, BigDecimal eth) {return sendEth(web3j, privateKey, to, toWei(eth), getGasPrice(web3j), ETH_GAS_LIMIT);}/*** 根据hash获取交易信息* @param web3j* @param hash* @return*/public static EthTransaction getTransaction(Web3j web3j, String hash) {try {EthTransaction tx = web3j.ethGetTransactionByHash(hash).send();return tx;} catch (Throwable t) {logger.error("GetTransactionError:" + hash, t);}return null;}
}
写在最后
注意 这里的Web3j初始化用的url 可以到 https://infura.io/ 中去申请。
以太坊(ETH)发行ERC20代币(Rinkeby演示)
波场归集充值回调(trx/trc10/trc20版本整合)
tron(波场)trc20离线签名广播交易(Java版本)
如有任何问题或者写得不对的地方 欢迎留言评论指点下哦
以太坊或ERC20转账查询(Java版本)相关推荐
- 以太坊Solidity发布0.8.3版本
官方消息,以太坊Solidity发布0.8.3版本.官方表示,一个错误修复版本,修复了优化器如何处理Keccak256操作码的一个重要错误.此外,它还包括对优化器的两个改进. 文章链接:https:/ ...
- 以太坊天价手续费转账真相:资金盘项目GoodCycle上演误杀瞒天记!
来源:PeckShield 此前有一部改编自印度<误杀瞒天记>的电影<误杀>上映后受到了广大用户的一致好评,其讲述了主角在发生误杀行为后,通过混淆时空.伪造证据等蒙太奇的手法成 ...
- 以太坊测试链环境node.js版本
为什么80%的码农都做不了架构师?>>> MAC升级Nodejs和Npm到最新版 第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache ...
- 以太坊ETH不能转账,状态一直是pending状态原因和解决方法
有人肯定遇到跟我一样的问题,账号里还有一些eth,但是有一笔交易一直处于pending状态,导致后续的交易全部卡死.除非这一笔pending状态的交易被矿工打包.请注意nonce,由于每一个账号的每一 ...
- 以太坊转账参数java_【ETH钱包开发04】web3j转账ERC-20 Token
在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账. [ETH钱包开发03]web3j转账ETH ERC-20 Token转账的2种方式 1.直接用web3j的API 2.jav ...
- JAVA使用web3j开发以太坊实战案例
JAVA使用web3j开发以太坊实战案例 必读 1.前言 2.基础(必看) 3.web3j引入 4.创建账户(离线创建) 5.geth节点搭建.基本使用及一般问题 6.常量类 后面内容都要用到(必备! ...
- 使用 Web3.js 连接以太坊节点并查询区块链数据
Web3.js 是一个用于连接以太坊网络的 JavaScript 库.在本文中,我们将介绍如何使用 Web3.js 来连接以太坊节点,并且查询以太坊区块链上的数据. 1. 安装 Web3.js 首先, ...
- 以太坊开发入门-ERC20合约
在上一章节中完成了一个非常简单的合约,本节中将按照ERC20协议完成一个合约, 本章部分源代码参考于网络开源代码,详细了解:openzeppelin-contracts/contracts/token ...
- 为什么选择Java进行以太坊区块链开发
当有人说Java时,你会想到什么?如果没有,你可以试试old.虽然,其他人可能会说它坚固,可靠和安全.而对于Oodles Blockchain来说,Java意味着"企业级". 毫无 ...
最新文章
- 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
- python常见函数
- ELK日志管理之——logstash部署
- HTTP RTSP RTMP RTP 协议简说 流媒体学习(一)
- 系统分析师考试结束了
- CSTrackV2解读
- jqc3ff继电器引脚图_电气元件中间继电器的知识全面解读,欢迎电工朋友收藏!...
- 玩转Nodejs日志管理log4js
- automake的使用1
- 九度oj 题目1028:继续畅通工程
- 羞,Spring Bean 初始化/销毁竟然有这么多姿势
- DSP28335学习记录(二)——外部中断和定时器中断
- ISO50001认证咨询,新版标准更加强调持续改进能源绩效主要体现在以下方面
- 怎么用微信打开qq连接到服务器地址,微信上能打开的链接如何在qq上打?
- 什么叫最少拍计算机控制系统,最少拍无波纹计算机控制系统的一种综合方法.doc...
- 人脸识别 —— insightface
- 超市管理系统设计报告
- 使用机器人工具箱在matlab上进行六轴机器人(6R)运动学建模【个人简记】
- windows系统安装PhotoshopCS6出现error16问题的解决办法
- 大学生书店网页设计制作 简单静态在线书店HTML网页作品 小说书籍网页作业成品 学生期末作业网站模板
热门文章
- python去干扰线_验证码——python去除干扰线
- termius破解使用sftp
- java 除以1000,为什么24 * 60 * 60 * 1000 * 1000除以24 * 60 * 60 * 1000在Java中不等于1000?...
- 【洛谷】P1318 积水面积
- 川大计算机应用基础一次作业答案,川大《计算机应用基础第1次作业答案川大《计算机应用基础》第1次作业答案.doc...
- 合合信息IPO的喜和忧:B+C战略并行,多业务线亏损,近三年专利增长率为负值
- 1亿像素手机,4K电视,能达到人眼分辨率吗
- CC2530学习温湿度传感器DHT11
- [Linux]Cowardly refusing to create an empty archive
- Steam好友隐身玩游戏?使用SteamWebApi获取好友的游戏时长,并用钉钉推送告诉你他在不在玩