以太坊作为全球领先的智能合约平台,其上的交易数据对于开发者、分析师和普通用户来说都具有重要的价值,无论是开发去中心化应用(DApp)、追踪资金流向,还是进行数据分析,掌握如何使用 JavaScript 获取以太坊交易都是一项核心技能,本文将详细介绍几种主流的 JavaScript 方法来获取以太坊交易数据,从简单的 Web3.js 到强大的 Ethers.js,再到直接与区块链节点交互。
准备工作:连接以太坊网络
在开始编写 JavaScript 代码之前,我们需要一种方式来连接到以太坊网络,主要有以下几种途径:
- Infura (推荐初学者和开发者使用):Infura 是一个提供以太坊节点服务的平台,你可以免费创建一个账户,获得一个节点 URL,无需自己搭建和维护节点。
- Alchemy (功能强大的节点服务):与 Infura 类似,Alchemy 也提供高性能的以太坊节点服务,并附带一些开发者工具和分析功能。
- 本地节点 (如 Geth 或 Nethermind):如果你在自己的计算机上运行了一个以太坊全节点,可以直接连接到本地节点(通常是
http://localhost:8545)。 - MetaMask 集成:如果你的应用需要与用户交互,可以通过 MetaMask 浏览器插件,让用户授权连接他们的钱包,从而间接访问以太坊网络。
使用 Web3.js 获取以太坊交易
Web3.js 是最经典、使用最广泛的以太坊 JavaScript API 库,它允许你与以太坊节点进行交互。
安装 Web3.js
npm install web3
初始化 Web3 实例
你需要使用 Infura、Alchemy 或本地节点的 URL 来初始化 Web3 实例。
const Web3 = require('web3');
// 使用 Infura URL (替换为你的 Infura 项目 ID)
const INFURA_URL = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID';
const web3 = new Web3(INFURA_URL);
// 或者连接到本地节点
// const web3 = new Web3('http://localhost:8545');
获取交易的方法
Web3.js 提供了多种方法来获取交易:
a) 通过交易哈希 (Transaction Hash) 获取单笔交易
这是最直接的方式,如果你已经知道某笔交易的哈希。
async function getTransactionByHash(txHash) {
try {
const tx = await web3.eth.getTransaction(txHash);
console.log('Transaction Details:', tx);
return tx;
} catch (error) {
console.error('Error fetching transaction:', error);
}
}
// 替换为你想查询的交易哈希
const transactionHash = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
getTransactionByHash(transactionHash);
getTransaction 方法返回一个交易对象,包含发送方、接收方、金额、 gas 使用情况、输入数据等详细信息。
b) 获取地址的交易列表 (Transactions by Address)
如果你想获取某个地址(如某个钱包合约)的所有交易记录,可以使用 getTransactionsByAddress 相关方法,注意,Web3.js v1.x 中没有直接名为 getTransactionsByAddress 的方法,但可以通过 eth.getPastLogs 实现,或者使用更高级的库如 ethers.js(后文会介绍)。
一个替代方案是使用 eth.subscribe('newBlockHeaders') 监听新区块,然后遍历区块中的交易来查找目标地址,但这比较复杂。
c) 获取特定区块中的所有交易
async function getTransactionsInBlock(blockNumber) {
try {
const block = await web3.eth.getBlock(blockNumber, true); // true 表示获取交易详情
console.log(`Transactions in block ${blockNumber}:`, block.transactions);
return block.transactions;
} catch (error) {
console.error('Error fetching block transactions:', error);
}
}
// 替换为你想查询的区块号
const blockNumber = 15800000;
getTransactionsInBlock(blockNumber);
使用 Ethers.js 获取以太坊交易
Ethers.js 是一个相对较新但设计更优雅、功能更强大的以太坊库,近年来广受欢迎,它提供了更清晰的 API 和更好的错误处理。
安装 Ethers.js
npm install ethers
初始化 Ethers 提供者 (Provider)
Provider 是连接到以太坊网络的抽象,类似于 Web3.js 的 web3 实例。
const { ethers } = require('ethers');
// 使用 Infura URL (替换为你的 Infura 项目 ID)
const INFURA_URL = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID';
const provider = new ethers.providers.JsonRpcProvider(INFURA_URL);
// 或者连接到本地节点
// const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545');
获取交易的方法
a) 通过交易哈希获取单笔交易
async function getTransactionByHashEthers(txHash) {
try {
const tx = await provider.getTransaction(txHash);
console.log('Transaction Details (Ethers.js):', tx);
return tx;
} catch (error) {
console.error('Error fetching transaction with Ethers.js:', error);
}
}
// 替换为你想查询的交易哈希
const transactionHash = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
getTransactionByHashEthers(transactionHash);
b) 获取地址的交易列表 (Transactions by Address)
Ethers.js 提供了更便捷的方法来获取地址的交易历史。
async function getTransactionsByAddress(address) {
try {
// 获取地址的所有交易(发送和接收)
const history = await provider.getHistory(address);
console.log(`Transaction history for address ${address}:`, history);
return history;
} catch (error) {
console.error('Error fetching transaction history with Ethers.js:', error);
}
}
// 替换为你想查询的地址
const address = '0x742d35Cc6634C0532925a3b844Bc9e7595f8bE8c';
getTransactionsByAddress(address);
getHistory 方法会返回一个交易数组,包含了该地址作为发送方或接收方的所有交易。
c) 获取特定区块中的所有交易
async function getTransactionsInBlockEthers(blockNumber) {
try {
const block = await pro
vider.getBlockWithTransactions(blockNumber);
console.log(`Transactions in block ${blockNumber} (Ethers.js):`, block.transactions);
return block.transactions;
} catch (error) {
console.error('Error fetching block transactions with Ethers.js:', error);
}
}
// 替换为你想查询的区块号
const blockNumber = 15800000;
getTransactionsInBlockEthers(blockNumber);
使用以太坊 JSON-RPC API 直接获取
如果你不想引入额外的库,也可以直接通过 HTTP 请求调用以太坊节点的 JSON-RPC API,大多数节点服务(如 Infura, Alchemy)和本地节点都支持。
常用的方法包括:
eth_getTransactionByHash: 根据交易哈希获取交易。eth_getBlockByNumber: 获取区块信息,可以设置true来获取包含的交易详情。eth_getLogs: 获取日志,通过过滤地址可以间接获取交易列表(对于合约交互尤其有用)。
示例 (使用 Node.js 的 axios 库):
const axios = require('axios');
const INFURA_URL = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID';
async function getTxViaRPC(txHash) {
try {
const response = await axios.post(INFURA_URL, {
jsonrpc: "2.0",
method: "eth_getTransactionByHash",
params: [txHash],
id: 1
});
console.log('Transaction Details (RPC):', response.data.result);
return response.data.result;
} catch (error) {
console.error('Error fetching transaction via RPC:', error);
}
}
const transactionHash = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
getTxViaRPC(transactionHash);
注意事项
- 网络选择:以太坊有主网 (Mainnet)、测试网 (如 Ropsten, Goerli, Sepolia) 等,确保你