以太坊交易记录查询指南,使用Web3轻松获取链上数据
在区块链应用开发中,查询以太坊交易记录是一项非常基础且重要的操作,无论是开发钱包应用、区块浏览器、数据分析工具,还是进行审计核对,都需要与链上交易数据打交道,本文将详细介绍如何使用Web3技术栈查询以太坊交易记录,帮助你快速掌握这一核心技能。
什么是以太坊交易记录?
以太坊交易记录是指发生在以太坊区块链上的所有转账、合约调用等操作的永久记录,每笔交易包含以下关键信息:
- 交易哈希(Transaction Hash):交易的唯一标识符
- 发送方地址(from):发起交易的账户
- 接收方地址(to):交易的目标账户或合约
- 交易金额(value):转账的ETH数量
- Gas费用:交易执行所消耗的手续费
- 区块信息:交易被打包进哪个区块
- 交易状态:成功或失败
- 输入数据(input):合约调用的附加数据
Web3简介与环境准备
Web3.js是以太坊官方推荐的JavaScript库,它封装了与以太坊节点交互的JSON-RPC接口,让开发者可以用简洁的代码读取链上数据。
安装Web3.js:
npm install web3
建立连接:
const Web3 = require('web3');
// 连接节点(可以使用 Infura、Alchemy 等节点服务)
const web3 = new Web3('https://mainnet.infura.io/v3/你的项目ID');
常用的交易记录查询方法
根据交易哈希查询单笔交易
这是最常用的查询方式,通过getTransaction方法获取交易详情:
async function getTransactionInfo(txHash) {
const tx = await web3.eth.getTransaction(txHash);
console.log('交易哈希:', tx.hash);
console.log('发送方:', tx.from);
console.log('接收方:', tx.to);
console.log('金额(ETH):', web3.utils.fromWei(tx.value, 'ether'));
console.log('区块高度:', tx.blockNumber);
console.log('Gas价格:', web3.utils.fromWei(tx.gasPrice, 'gwei'), 'Gwei');
return tx;
}
getTransactionInfo('0x交易哈希...');
查询交易回执(Transaction Receipt)
交易回执包含交易的执行结果,例如是否成功、消耗了多少Gas、触发了哪些日志事件:
async function getTransactionReceipt(txHash) {
const receipt = await web3.eth.getTransactionReceipt(txHash);
if (receipt === null) {
console.log('交易尚未被确认');
return;
}
console.log('交易状态:', receipt.status ? '成功' : '失败');
console.log('区块号:', receipt.blockNumber);
console.log('实际消耗Gas:', receipt.gasUsed);
console.log('合约地址:', receipt.contractAddress); // 如果是合约创建交易
console.log('日志事件数量:', receipt.logs.length);
return receipt;
}
查询指定区块中的交易
如果你知道区块号或区块哈希,可以查询该区块内打包的所有交易:
async function getBlockTransactions(blockNumber) {
const block = await web3.eth.getBlock(blockNumber, true); // true表示返回完整交易
console.log('区块包含交易数量:', block.transactions.length);
block.transactions.forEach((tx, index) => {
console.log(`交易${index + 1}:`);
console.log(' 哈希:', tx.hash);
console.log(' from:', tx.from);
console.log(' to:', tx.to);
});
return block.transactions;
}
查询某个地址的交易记录
以太坊原生RPC并不直接支持按地址查询历史交易,常见解决方案有以下几种:
使用事件日志查询(针对合约交互)
async function getTokenTransfers(contractAddress, userAddress) {
const contract = new web3.eth.Contract(ERC20_ABI, contractAddress);
const events = await contract.getPastEvents('Transfer', {
filter: { from: userAddress }, // 筛选条件
fromBlock: 0,
toBlock: 'latest'
});
events.forEach(event => {
console.log('转账哈希:', event.transactionHash);
console.log('发送方:', event.returnValues.from);
console.log('接收方:', event.returnValues.to);
console.log('金额:', event.returnValues.value);
});
return events;
}
扫描区块(适合小范围查询)
async function scanBlocksForAddress(address, startBlock, endBlock) {
const results = [];
for (let i = startBlock; i <= endBlock; i++) {
const block = await web3.eth.getBlock(i, true);
for (const tx of block.transactions) {
if (tx.from.toLowerCase() === address.toLowerCase() ||
(tx.to && tx.to.toLowerCase() === address.toLowerCase())) {
results.push(tx);
}
}
}
return results;
}
借助第三方API
对于大规模查询,建议使用Etherscan API等第三方服务,效率更高:
const axios = require('axios');
async function getTxHistoryFromEtherscan(address) {
const url = `https://api.etherscan.io/api?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=asc&apikey=你的API密钥`;
const response = await axios.get(url);
return response.data.result;
}
实用技巧与注意事项
-
单位转换要小心:链上金额以Wei为单位(1 ETH = 10^18 Wei),务必使用
web3.utils.fromWei()转换,避免显示错误。 -
处理未确认交易:
getTransaction返回的blockNumber为null时,说明交易还在内存池中等待打包。 -
注意速率限制:免费节点服务通常有请求频率限制,批量查询时建议加入延迟或使用付费服务。
-
地址大小写问题:比较地址时建议统一转为小写,避免校验和格式导致的匹配失败。
-
使用WebSocket实时监听:如果需要监控新交易,可以建立WebSocket连接订阅事件:
const web3Ws = new Web3('wss://mainnet.infura.io/ws/v3/你的项目ID');
// 监听新打包的区块
web3Ws.eth.subscribe('newBlockHeaders', (error, result) => {
if (!error) {
console.log('新区块:', result.number);
}
});
使用Web3查询以太坊交易记录并不复杂,核心在于理解不同的查询场景:按哈希查询用getTransaction,查执行结果用getTransactionReceipt,按地址查历史则可以结合事件日志、区块扫描或第三方API来实现,掌握这些方法后,你就能够构建属于自己的区块查询工具、交易监控机器人或数据分析平台。
随着Web3生态的不断发展,链上数据查询的需求只会越来越多,建议读者在实践中多查阅Web3.js官方文档,并结合实际项目加深理解,动手试试吧,链上世界的大门正为你敞开!
发布于:2026-10-03,除非注明,否则均为原创文章,转载请注明出处。

