Web3j通过合约地址监听transfer事件获取以太坊交易数据

We3j

web3j是一个轻量级的Java库,用于在Ethereum网络上集成客户端(节点)。

核心特性

  • 通过Java类型的JSON-RPC与Ethereum客户端进行交互
  • 支持所有的JSON-RPC方法类型
  • 支持所有Geth和Parity方法,用于管理账户和签署交易
  • 同步或异步的发送客户端请求
  • 可从Solidity ABI文件自动生成Java只能合约功能包

业务需求: 分析区块链转账记录,获取交易信息进一步分析。

原创代码,用web3j接入以太坊全节点,通过合约地址监听transfer事件,获取交易记录。

注意:注意版本问题。不同版本event的构造参数列表是不一样的。

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

GitHub: link. 欢迎star

@Service
public class MonitorTransferService {private static final Logger LOG = LoggerFactory.getLogger(MonitorTransferService.class);private Web3j web3j;private ThreadLocal<Set<BigInteger>> blockNumberSet = ThreadLocal.withInitial(HashSet::new);@Value("${ipcSocketPath}")private String ipcSocketPath;@PostConstructpublic void init() {//        web3j = Web3j.build(new HttpService()); //RPC方式web3j = Web3j.build(new UnixIpcService(ipcSocketPath)); //IPC方式}/*** 监听合约(分步)*/public void contractFilterOfStep(MonitorTransferRequest monitorTransferRequest) {new Thread(() -> {try {BigInteger blockNumber = getBlockNumber();LOG.info("BlockChainNumber={}", blockNumber);BigInteger startBlock = new BigInteger(monitorTransferRequest.getFirstBlock());BigInteger step = new BigInteger("100");assert blockNumber != null;int num = Integer.parseInt(String.valueOf(blockNumber.subtract(startBlock).divide(step)));for (int i = 0; i < num; i++) {// 监听合约(分步)contractFilterStep(monitorTransferRequest, startBlock, startBlock.add(step));startBlock = startBlock.add(step);}// 监听合约contractFilter(monitorTransferRequest, startBlock);} catch (NumberFormatException e) {LOG.error("监控合约异常终止,e={}", e.getMessage());}}).start();}/*** 监听合约*/private void contractFilter(MonitorTransferRequest monitorTransferRequest, BigInteger startBlock) {Event event = new Event("Transfer",Arrays.asList(new TypeReference<Address>() {},new TypeReference<Address>() {}),Collections.singletonList(new TypeReference<Uint256>() {}));EthFilter filter = new EthFilter(DefaultBlockParameter.valueOf(startBlock),DefaultBlockParameterName.LATEST,monitorTransferRequest.getContractAddress());filter.addSingleTopic(EventEncoder.encode(event));// 监听并处理contractExtract(filter);}/*** 监听并处理*/private void contractExtract(EthFilter filter) {Subscription subscription = web3j.ethLogObservable(filter).subscribe(log -> {BigInteger blockNumber = log.getBlockNumber();// 提取转账记录LOG.info("BlockNumber=", blockNumber);blockNumberSet.get().add(blockNumber);List<String> topics = log.getTopics();String fromAddress = topics.get(1);String toAddress = topics.get(2);String value = log.getData();String timestamp = "";try {EthBlock ethBlock = web3j.ethGetBlockByNumber(DefaultBlockParameter.valueOf(log.getBlockNumber()), false).send();timestamp = String.valueOf(ethBlock.getBlock().getTimestamp());} catch (IOException e) {LOG.warn("Block timestamp get failure,block number is {}", log.getBlockNumber());LOG.error("Block timestamp get failure,{}", e);}TransferRecord transferRecord = new TransferRecord();transferRecord.setFromAddress("0x" + fromAddress.substring(26));transferRecord.setToAddress("0x" + toAddress.substring(26));transferRecord.setValue(new BigDecimal(new BigInteger(value.substring(2), 16)).divide(BigDecimal.valueOf(1000000000000000000.0), 18, BigDecimal.ROUND_HALF_EVEN));transferRecord.setTimeStamp(timestamp);});
//        subscription.unsubscribe();}/*** 监听合约(分步)*/private void contractFilterStep(MonitorTransferRequest monitorTransferRequest, BigInteger startBlock, BigInteger endBlock) {Event event = new Event("Transfer",Arrays.asList(new TypeReference<Address>() {},new TypeReference<Address>() {}),Collections.singletonList(new TypeReference<Uint256>() {}));EthFilter filter = new EthFilter(DefaultBlockParameter.valueOf(startBlock),DefaultBlockParameter.valueOf(endBlock),monitorTransferRequest.getContractAddress());filter.addSingleTopic(EventEncoder.encode(event));// 监听并处理contractExtract(filter);}/*** 区块数量*/private BigInteger getBlockNumber() {EthBlockNumber send;try {send = web3j.ethBlockNumber().send();return send.getBlockNumber();} catch (IOException e) {LOG.warn("请求区块链信息异常 >> 区块数量,{}", e);}return null;}

GitHub: link. 欢迎star

Web3j通过合约地址监听transfer事件获取以太坊交易数据相关推荐

  1. vue中textarea监听粘贴事件获取图片

    html中代码: <el-inputid="textarea"v-model="value"type="textarea"maxlen ...

  2. JS 监听滚动条事件

    JS 监听滚动条事件 获取滚动条位置代码 监听滚动条方法 效果 获取滚动条位置代码 /** * 获取滚动条位置 */ function getScrollTop() {var scrollPos;if ...

  3. 浅析 postMessage 方法介绍、如何接收数据(监听message事件及其属性介绍)、使用postMessage的安全注意事项、具体使用方式(父子页面如何互发消息、接收消息)

    postMessage 是 html5 引入的API,postMessage()方法允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档.多窗口.跨域消息传递,多用于窗口间数据通信,这也 ...

  4. js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输

    百行代码实现js事件监听实现跨页面数据传输 使用场景 类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息 技术原理 跨页面通信: 基于事件监听,通过监听 storage事件监听回调机制 ...

  5. 事件绑定,事件监听,事件委托

    事件绑定,事件监听,事件委托 事件绑定 一个元素只能绑定一个事件 obj.on+事件名称=funciton(){} 事件监听 事件监听可以监听很多很多事件. this指向当前调用触发事件的主体对象. ...

  6. 使用js监听文件下载事件,解决导出excel文件名为.do的bug

    目录: 1. 简单粗暴使用XHR,不考虑IE,带下载中的灰度弹窗 2. 苟一苟,直接使用`window.location`,不过除了保存文件外,没有别的点击提醒,不能防止重复点击. 3. 下载的文件名 ...

  7. vue项目视频实现键盘快进快退,音量调大小及监听播放事件

    直接上代码 <div style="padding-top:56.25%" ><video style="width:100%;height:672px ...

  8. 【iOS-Cocos2d游戏开发之五】【1】多触点与触屏事件详解(单一监听、事件分发)...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/450.html ...

  9. chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件

    一: 概述 上两篇文章介绍了cdp协议和chromedp库,从这篇文章开始动手实战一下,我们要拿到页面上更多的网络请求,最直接的想法就是类似于开发者工具里的network,只有一有网络请求就显示在列表 ...

最新文章

  1. fcm算法c语言实现,基于特征权重的FCM算法研究及应用
  2. Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果...
  3. 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
  4. 爬数据html解析,jsoup网络爬取数据HTML解析
  5. Hadoop问题:The auxService:mapreduce_shuffle does not exist
  6. 一文带你读懂Self-Supervised Learning(自监督学习)
  7. Shell脚本实现模拟并发及并发数控制
  8. 学会这篇文章分享的知识,你就超过了90%的测试人
  9. 现浇板用弹性计算方法_自建房砖混结构现浇楼板配筋的要求和计算方法
  10. 数据库一对多做链接去重_数据库中一对多关系的数据,放到es中如何设计
  11. mysql时间设计模式_java 23种设计模式及具体例子 收藏有时间慢慢看
  12. 计算机使用快捷键大全
  13. matlab潮流计算ppt,matlab潮流计算.doc
  14. 8583:全面掌握ISO8583报文协议zz
  15. 【每天一个 Linux 命令】ssh 命令
  16. 判断一个IP地址是不是单播地址
  17. o2o模式的优势 o2o模式的劣势
  18. Access denied for user ‘bijian0530‘@‘localhost‘ (using password: YES)
  19. 经验分享 | STM32CubeMX + STM32F1系列开发时遇到的四个问题及解决方案分享
  20. 中病毒spoolsv.exe

热门文章

  1. 控制JSP页面上的文本框只能输入数字
  2. 加密密钥暴力破解所需时间
  3. 大佬说:怎么手写一个Tomcat然后给这个Tomcat 部署项目并且成功处理请求 ? 我TM当时就吓尿了!
  4. revit插件建模中墙体如何添加水平防潮层
  5. 数字证书在WEB应用中登录
  6. 银河系的暗物质在哪里
  7. Centos搭建speedtest服务器教程
  8. 屏幕输出类似LED显示屏效果的字母拼图
  9. java生产消费kafka消息
  10. 数理统计及概率论-核心知识总结