译文出自:登链翻译计划[1] 译者:darren[2] 校对:Tiny 熊[3]
概述
如果你喜欢观看而不是阅读,这里有一个视频指南:https://www.youtube.com/embed/YjQj6uk9M98
在以太坊上,在形成一个区块中之前,交易会保留在待处理交易队列、交易池或内存池中——它们的意义相同。然后,矿工从这个队列中选择待处理交易池的子集进行出块——对于交易者、想要节省 gas 费用的人等能够访问和分析这些信息将会得到很多好处。
在这份指南中,我们将学会如何在以太坊和相似链使用 ethers.js[4] 处理待处理交易流
准备条件
- 在你的电脑上安装 Nodejs
- 一个文本编辑器
- 命令行终端
- 一个以太坊节点
什么是待处理交易
要在以太坊网络编写或者更新任何内容,需要有人创建,签署和发送交易。交易是外部世界与以太坊网络通信的方式。当发送到以太坊网络时,交易会停留在称为“mempool”的队列中,交易等待旷工被处理----- 处于这种等待交易称为待处理交易。发送交易所需要的少量费用称为 gas;交易被旷工包含在一个区块中,并且根据它们包含的给旷工的 gas 价格来确定优先级 。
查看这里[5], 将得到关于内存池和待处理交易的更多信息。
我为什么需要查看未处理的交易呢?
通过检查待处理的交易,可以执行以下操作:
- 估计 gas:理论上我们可以查看待处理的交易来预测下一个区块的最优 gas 价格。
- 用于交易分析:我们可以分析去中心化交易所中的待处理交易,以便预测市场趋势。
- 交易抢跑:在 DeFi 中,你可以预览即将到来的与价格(预言机)相关的交易,并可能对 MKR、COMP 和其他协议的保险库发出清算。
处理待处理交易流可能有很多案例——我们不会在这里全部介绍。
我们将使用 ethers.js[6], - (中文文档[7]) 通过 WebSockets 处理这些待处理的交易流。在编写代码之前, 看看如何安装 ethers.js。
安装 ethers.js
我们的第一步是检查系统上是否安装了 node.js。为此,请将以下内容复制粘贴到你的终端
代码语言:javascript复制$ node -v
如果没有安装,可以从 官网[8]下载 LTS 版本的 NodeJS。
现在我们已经安装了 node.js,让我们使用 node.js 附带的 npm(节点包管理器)安装 ethers.js 库。
代码语言:javascript复制$ npm i ethers
此步骤中最常见的问题是 node-gyp
的内部故障。你可以按照 node-gyp 安装说明在这里[9]。
注意:如果遇到 node-gyp 问题,你需要让你的 python 版本与上述说明中列出的兼容版本之一匹配。
另一个常见问题是缓存过时。只需在终端中键入以下内容即可清除 npm 缓存:
代码语言:javascript复制$ npm cache clean
如果一切是正常的,ethers.js 将安装到了你的操作系统。
启动我们的以太坊节点
对于我们今天的目的,我们几乎可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum (之前称为 Parity)。由于要处理传入的新待处理的交易流,节点连接必须稳定可靠;维护一个节点是一项具有挑战性的任务,我们只需 从 QuickNode 获取一个免费的端点[10] 来简化这项工作。创建免费的以太坊端点后,复制你的 WSS (WebSocket) Provider 端点。
你以后会需要它的,因此这会复制并且保存它。
处理待处理交易流
创建一个脚本文件 pending.js,它将对传入的待处理交易进行交易过滤。将以下内容复制粘贴到文件中:
代码语言:javascript复制var ethers = require("ethers");
var url = "ADD_YOUR_ETHEREUM_NODE_WSS_URL";
var init = function () {
var customWsProvider = new ethers.providers.WebSocketProvider(url);
customWsProvider.on("pending", (tx) => {
customWsProvider.getTransaction(tx).then(function (transaction) {
console.log(transaction);
});
});
customWsProvider._websocket.on("error", async () => {
console.log(`Unable to connect to ${ep.subdomain} retrying in 3s...`);
setTimeout(init, 3000);
});
customWsProvider._websocket.on("close", async (code) => {
console.log(
`Connection lost with code ${code}! Attempting reconnect in 3s...`
);
customWsProvider._websocket.terminate();
setTimeout(init, 3000);
});
};
init();
所以继续用上面部分中的 WSS (WebSocket) Provider 替换 ADD_YOUR_ETHEREUM_NODE_WSS_URL
。
以上代码解释如下:
第 1 行:导入 ethers 库。
第 2 行:设置我们的以太坊节点 URL。
第 4 行:创建 init 函数。
第 5 行:实例化一个 ethers WebSocketProvider 实例。
第 7 行:为待处理的交易创建一个事件侦听器,每次从节点发送新的交易哈希时都会运行该事件侦听器。
第 8-10 行:使用从上一步获得的交易哈希获取整个交易,并在控制台中打印交易。
第 13-16 行:如果连接遇到错误,则重新启动 WebSocket 连接的函数。
第 17-21 行:如果连接终止,则重新启动 WebSocket 连接的函数。
第 24 行:调用 init 函数。
现在 ,让我一起运行这段脚本:
代码语言:javascript复制$ node pending
如果一切执行得顺利, 你会看到传入的待处理交易,像这样:
使用 Ctrl c 来停止这段脚本的运行。
结论
在这里,我们看到了如何使用 ethers.sjs 从以太坊网络获取待处理的交易,这里有相应的文档[11]。
订阅我们的 newsletter[12] 以获取有关以太坊的更多文章和指南。如果你有任何反馈,请随时通过 Twitter[13] 与我们联系。你可以随时在我们的 Discord[14] 社区服务器上与我们聊天,其中包含你将遇到的一些最酷的开发人员 :)
本翻译由 Duet Protocol[15] 赞助支持。
原文:https://www.quicknode.com/guides/defi/how-to-stream-pending-transactions-with-ethers-js
参考资料
[1]
登链翻译计划: https://github.com/lbc-team/Pioneer
[2]
darren: https://learnblockchain.cn/people/4859
[3]
Tiny 熊: https://learnblockchain.cn/people/15
[4]
ethers.js: https://docs.ethers.io/v5/
[5]
这里: https://www.quicknode.com/guides/defi/how-to-access-ethereum-mempool
[6]
ethers.js: https://docs.ethers.io/v5/
[7]
中文文档: https://learnblockchain.cn/docs/ethers.js/
[8]
官网: https://nodejs.org/en/
[9]
node-gyp 安装说明在这里: https://github.com/nodejs/node-gyp#installation
[10]
从 QuickNode 获取一个免费的端点: https://www.quicknode.com/?utm_source=internal&utm_campaign=guides
[11]
文档: https://docs.ethers.io/v5/single-page/#/v5/api/providers/provider/-#-Provider--events
[12]
newsletter: https://www.getrevue.co/profile/quiknode
[13]
Twitter: https://twitter.com/QuickNode
[14]
Discord: https://discord.gg/ahckhyA
[15]
Duet Protocol: https://duet.finance/?utm_souce=learnblockchain