链上监听
监听代币
以 USDT 为例
代币地址:https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7
过去转账事件
监听事件的方法:https://web3js.readthedocs.io/en/v1.8.1/web3-eth-contract.html#contract-events
1 |
|
实时转账事件
订阅事件:https://web3js.readthedocs.io/en/v1.8.1/web3-eth-subscribe.html#
1 |
|
所有持币人的余额
web3js
第一种方法
查询到过去区块的event,拿到to地址之后,查询balanceOf来获取余额
1 |
|
但是这种方法有一些问题
- 一个地址多次接收到转账,account 地址重复
- 查询 balanceOf 会受到网络速度以及provider rate limit的限制,比较低效
第二种方法
拿到所有的 usdt 的address和amount,拉取从合约部署开始到现在的所有 Transfer event,并自己计算出所涉及到地址的余额
首先是最近一万个区块,可以在本机上完成
由于 alchemy 等节点的限制,每次获取的事件不能过多,于是写了一个循环来分批获取
1 |
|
从初始区块开始的拉取和计算,需要借助服务器来进行
但在本机,拉取仍然可以克服 js 的 memory 限制
做法是每拉取一万个区块的数据,就对 json 文件进行一次写入,并清除 js 中数组存储的数据,防止 memory 溢出
1 |
|
监听账户
所有交易活动
利用 web3.eth.getBlock 来扫块
1 |
|
底部的间隔功能每7秒检查一次当前区块。我选择此数字是因为以太坊的平均出块时间为15秒,我们不想错过任何区块。该程序的问题在于它不依赖统计异常值。例如如果一个区块在7秒内被挖掘,则可能会完全丢失该区块。而且如果我们尝试通过减少轮询间隔来缓解这种情况,则会发现我们需要一个非常快速的Internet连接来处理所有异步网络I/O。
1 |
|
余额
结合合约和js的库:Ethereum Balance Checker
获取地址余额
参数
provider: Web3 | Ethers.Provider
- 用于合约调用的提供者。address: string
- 查询余额的地址tokens: string[]
- 代币合约地址数组。仅支持 ERC20 代币。options?: Options
- 合约选项,选项见上。
退货
1 |
|
例子
1 |
|
待处理交易
要在以太坊网络编写或者更新任何内容,需要有人创建,签署和发送交易。交易是外部世界与以太坊网络通信的方式。当发送到以太坊网络时,交易会停留在称为“mempool”的队列中,交易等待旷工被处理——- 处于这种等待交易称为待处理交易。发送交易所需要的少量费用称为gas;交易被旷工包含在一个区块中,并且根据它们包含的给旷工的gas 价格来确定优先级 。
查看这里, 将得到关于内存池和待处理交易的更多信息。
通过检查待处理的交易,可以执行以下操作:
- 估计gas:理论上我们可以查看待处理的交易来预测下一个区块的最优gas价格。
- 用于交易分析:我们可以分析去中心化交易所中的待处理交易,以便预测市场趋势。
- 交易抢跑:在 DeFi 中,你可以预览即将到来的与价格(预言机)相关的交易,并可能对 MKR、COMP 和其他协议的保险库发出清算。
应用此方法我们可以完成一个简单的套利机器人
ether.js
订阅事件:ether.js Event
我们将使用WebSockets处理这些待处理的交易流
1 |
|
web3.js
订阅事件:https://web3js.readthedocs.io/en/v1.8.1/web3-eth-subscribe.html#
1 |
|
参考资料
- web3js 监控以太坊代币交易
- 以太坊交易确认数如何获取
- Web3-js的学习(5)-实现合约事件监听
- 使用Web3.js监视以太坊地址活动状态 原文:https://medium.com/coinmonks/monitoring-an-ethereum-address-with-web3-js-970c0a3cf96d
- 捕捉智能合约中的 event 实战
- 用web3.js追踪区块链交易
- ethereum扫描区块,获取区块内的交易记录
- 如何使用 Web3.js 监控 ETH 交易
- Web3.js:如何跟踪 ERC-20 代币传输(+ 特定地址/代币)
- 订阅活动
- Web3js:如何在自定义区块链上显示未决交易