閱讀時間 4 分鐘
概覽
On Ethereum, before being included in a block, transactions remain in what is called a pending transaction queue, tx pool, or mempool - they all mean the same thing. Miners then select a subset of all pending transactions from this queue to mine - there are a lot of benefits to being able to access and analyze this information for traders, people who want to save fees on gas, and more.
In this guide, we will learn how to stream pending transactions from Ethereum and similar chains with ethers.js.
Prefer a video walkthrough? Follow along with Noah and learn how to stream pending transactions with Ethers.js in 8 minutes.
先決條件
- Node.js installed on your system
- 文字編輯器
- 終端機(又稱命令列)
- An Ethereum node
What is a Pending Transaction?
To write or update any on the Ethereum network, someone needs to create, sign and send a transaction. Transactions are how the external world communicates with the Ethereum network. When sent to the Ethereum network, a transaction stays in a queue known as mempool where transactions wait to be processed by miners - the transactions in this waiting state are known as pending transactions. The small fee required to send a transaction is known as a gas; Transactions get included in a block by miners, and they are prioritized based on the amount of gas price they include which goes to the miner.
You can get more information on mempool and pending transactions here.
Why do we want to see pending transactions?
By examining pending transactions, one can do the following:
- Estimate gas: We can theoretically look at pending transactions to predict the next block's optimal gas price.
- For Trading analytics: We can analyze pending transactions on decentralized exchanges. To predict market trends using the analysis.
- Front running: In DeFi, you can preview upcoming oracle related transactions related to price and potentially issue a liquidation for a vault on MKR, COMP, and other protocols.
There can be many use cases for streaming pending transactions - we won't cover them all here.
We’ll use ethers.js to stream these pending transactions with WebSockets. Let’s see how to install ethers.js before writing our code.
Installing ethers.js
Our first step here would be to check if node.js is installed on the system or not. To do so, copy-paste the following in your terminal/cmd:
$ 節點 -v
若尚未安裝,您可以從官方網站下載 NodeJS 的 LTS 版本。
Now that we have node.js installed let’s install the ethers.js library using npm (Node Package Manager), which comes with Node.js.
$ npm i ethers@5.7
Make sure that your Ethers.js installation version is 5.7
此步驟中最常見的問題是 `node-gyp` 發生內部錯誤。您可以參閱此處的 node-gyp 安裝說明。
注意:若您遇到 node-gyp 相關問題,請確保您的 Python 版本與上述說明中列出的相容版本之一相符。
Another common issue is a stale cache; clear your npm cache by simply typing the below into your terminal:
$ npm 清除快取
如果一切順利,ethers.js 將會安裝到您的系統上。
設定您的 Quicknode 以太坊端點
We could use pretty much any Ethereum client, such as Geth or OpenEthereum (fka Parity), for our purposes today. Since to stream incoming new pending transactions, a node connection must be stable and reliable; it’s a challenging task to maintain a node, we'll just create a free Quicknode account here and easily set up an Ethereum endpoint. After you've created your free Ethereum endpoint, copy your WSS (WebSocket) Provider endpoint:

稍後你會需要這個,所以請複製並儲存下來。
Streaming pending transactions
Create a short script file pending.js, which will have a transaction filter on incoming pending transactions. Copy-paste the following in the file:
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();
So go ahead and replace `ADD_YOUR_ETHEREUM_NODE_WSS_URL` with the WSS (WebSocket) provider from the section above.
上述程式碼的說明。
第 1 行:導入 ethers 函式庫。
Line 2: Setting our Ethereum node URL.
Line 4: Creating the init function.
Line 5: Instantiating an ethers WebSocketProvider instance.
Line 7: Creating an event listener for pending transactions that will run each time a new transaction hash is sent from the node.
Line 8-10: Getting the whole transaction using the transaction hash obtained from the previous step and printing the transaction in the console.
Line 13-16: A function to restart the WebSocket connection if the connection encounters an error.
Line 17-21: A function to restart the WebSocket connection if the connection ever dies.
Line 24: Calling the init function.
Now, let’s run our script.
$ node pending
If everything goes right, you must see incoming pending transactions. Something like this

Use Ctrl+c to stop the script.
結論
Here we saw how to get pending transactions from the Ethereum network using ethers,js. Learn more about Event filters and Transaction filters in ethers.js in their documentation.
訂閱我們的電子報,獲取更多關於以太坊的文章與指南。如有任何意見回饋,歡迎透過Twitter 聯絡我們。您隨時都可以在我們的Discord社群伺服器上與我們聊天,那裡聚集了您這輩子見過最酷的開發者們 :)
