以太坊作为全球领先的智能合约平台,其上的交易数据对于开发者、分析师和普通用户来说都具有重要的价值,无论是开发去中心化应用(DApp)、追踪资金流向,还是进行数据分析,掌握如何使用 JavaScript 获取以太坊交易都是一项核心技能,本文将详细介绍几种主流的 JavaScript 方法来获取以太坊交易数据,从简单的 Web3.js 到强大的 Ethers.js,再到直接与区块链节点交互。

准备工作:连接以太坊网络

在开始编写 JavaScript 代码之前,我们需要一种方式来连接到以太坊网络,主要有以下几种途径:

  1. Infura (推荐初学者和开发者使用):Infura 是一个提供以太坊节点服务的平台,你可以免费创建一个账户,获得一个节点 URL,无需自己搭建和维护节点。
  2. Alchemy (功能强大的节点服务):与 Infura 类似,Alchemy 也提供高性能的以太坊节点服务,并附带一些开发者工具和分析功能。
  3. 本地节点 (如 Geth 或 Nethermind):如果你在自己的计算机上运行了一个以太坊全节点,可以直接连接到本地节点(通常是 http://localhost:8545)。
  4. 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);

注意事项

  1. 网络选择:以太坊有主网 (Mainnet)、测试网 (如 Ropsten, Goerli, Sepolia) 等,确保你