JavaScript 获取以太坊交易全指南,从基础到实践

投稿 2026-07-25 6:51 点击数: 3

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

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

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

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