表现效果

测试用例 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版本)相关推荐

  1. 以太坊Solidity发布0.8.3版本

    官方消息,以太坊Solidity发布0.8.3版本.官方表示,一个错误修复版本,修复了优化器如何处理Keccak256操作码的一个重要错误.此外,它还包括对优化器的两个改进. 文章链接:https:/ ...

  2. 以太坊天价手续费转账真相:资金盘项目GoodCycle上演误杀瞒天记!

    来源:PeckShield 此前有一部改编自印度<误杀瞒天记>的电影<误杀>上映后受到了广大用户的一致好评,其讲述了主角在发生误杀行为后,通过混淆时空.伪造证据等蒙太奇的手法成 ...

  3. 以太坊测试链环境node.js版本

    为什么80%的码农都做不了架构师?>>>    MAC升级Nodejs和Npm到最新版 第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache ...

  4. 以太坊ETH不能转账,状态一直是pending状态原因和解决方法

    有人肯定遇到跟我一样的问题,账号里还有一些eth,但是有一笔交易一直处于pending状态,导致后续的交易全部卡死.除非这一笔pending状态的交易被矿工打包.请注意nonce,由于每一个账号的每一 ...

  5. 以太坊转账参数java_【ETH钱包开发04】web3j转账ERC-20 Token

    在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账. [ETH钱包开发03]web3j转账ETH ERC-20 Token转账的2种方式 1.直接用web3j的API 2.jav ...

  6. JAVA使用web3j开发以太坊实战案例

    JAVA使用web3j开发以太坊实战案例 必读 1.前言 2.基础(必看) 3.web3j引入 4.创建账户(离线创建) 5.geth节点搭建.基本使用及一般问题 6.常量类 后面内容都要用到(必备! ...

  7. 使用 Web3.js 连接以太坊节点并查询区块链数据

    Web3.js 是一个用于连接以太坊网络的 JavaScript 库.在本文中,我们将介绍如何使用 Web3.js 来连接以太坊节点,并且查询以太坊区块链上的数据. 1. 安装 Web3.js 首先, ...

  8. 以太坊开发入门-ERC20合约

    在上一章节中完成了一个非常简单的合约,本节中将按照ERC20协议完成一个合约, 本章部分源代码参考于网络开源代码,详细了解:openzeppelin-contracts/contracts/token ...

  9. 为什么选择Java进行以太坊区块链开发

    当有人说Java时,你会想到什么?如果没有,你可以试试old.虽然,其他人可能会说它坚固,可靠和安全.而对于Oodles Blockchain来说,Java意味着"企业级". 毫无 ...

最新文章

  1. 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
  2. python常见函数
  3. ELK日志管理之——logstash部署
  4. HTTP RTSP RTMP RTP 协议简说 流媒体学习(一)
  5. 系统分析师考试结束了
  6. CSTrackV2解读
  7. jqc3ff继电器引脚图_电气元件中间继电器的知识全面解读,欢迎电工朋友收藏!...
  8. 玩转Nodejs日志管理log4js
  9. automake的使用1
  10. 九度oj 题目1028:继续畅通工程
  11. 羞,Spring Bean 初始化/销毁竟然有这么多姿势
  12. DSP28335学习记录(二)——外部中断和定时器中断
  13. ISO50001认证咨询,新版标准更加强调持续改进能源绩效主要体现在以下方面
  14. 怎么用微信打开qq连接到服务器地址,微信上能打开的链接如何在qq上打?
  15. 什么叫最少拍计算机控制系统,最少拍无波纹计算机控制系统的一种综合方法.doc...
  16. 人脸识别 —— insightface
  17. 超市管理系统设计报告
  18. 使用机器人工具箱在matlab上进行六轴机器人(6R)运动学建模【个人简记】
  19. windows系统安装PhotoshopCS6出现error16问题的解决办法
  20. 大学生书店网页设计制作 简单静态在线书店HTML网页作品 小说书籍网页作业成品 学生期末作业网站模板

热门文章

  1. python去干扰线_验证码——python去除干扰线
  2. termius破解使用sftp
  3. java 除以1000,为什么24 * 60 * 60 * 1000 * 1000除以24 * 60 * 60 * 1000在Java中不等于1000?...
  4. 【洛谷】P1318 积水面积
  5. 川大计算机应用基础一次作业答案,川大《计算机应用基础第1次作业答案川大《计算机应用基础》第1次作业答案.doc...
  6. 合合信息IPO的喜和忧:B+C战略并行,多业务线亏损,近三年专利增长率为负值
  7. 1亿像素手机,4K电视,能达到人眼分辨率吗
  8. CC2530学习温湿度传感器DHT11
  9. [Linux]Cowardly refusing to create an empty archive
  10. Steam好友隐身玩游戏?使用SteamWebApi获取好友的游戏时长,并用钉钉推送告诉你他在不在玩