Ethereum/Core API/eth_getBlockReceipts

eth_getBlockReceipts

eth_getBlockReceipts 方法在单次调用中返回给定区块的所有交易收据。当您需要同一区块中多个交易的数据时,这种高效方法比请求单个收据的性能显著更高,使其对区块链索引器和分析平台至关重要。

使用场景

  • Gas 使用分析和优化
  • 交易成功/失败监控
  • 批量交易验证和处理
  • 索引的日志和事件收集
  • 智能合约执行分析和调试
  • 区块浏览器和分析平台
  • 代币转账跟踪和钱包更新
  • MEV(最大可提取价值)分析
  • 历史数据聚合
  • 批处理事件处理

方法详情

该方法检索指定区块中所有交易的综合结果,包括状态、gas 使用情况、日志和事件。

参数:

十六进制格式的区块号或标签:latest, earliest, pending, safe, finalized

返回值:

交易收据对象数组,每个包含:

包含此交易的区块哈希

十六进制格式的区块号

创建的合约地址(如果是合约创建),否则为 null

区块中包括此交易在内的所有交易使用的总 gas

实际支付的每单位 gas 价格,以 wei 为单位(十六进制)

发送者地址

此特定交易使用的 gas

此交易生成的日志对象数组

轻客户端用于快速检索相关日志的布隆过滤器

1(成功)或 0(失败)

接收者地址,或合约创建时为 null

交易哈希

交易在区块中的索引位置

交易类型(0=传统, 1=EIP2930, 2=EIP1559)

响应示例

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": [
		{
			"blockHash": "0xb5876cd604e2234f800817ef7d744b55e3de0750679923ad3c8f3a3439f8095c",
			"blockNumber": "0x112bde2",
			"contractAddress": null,
			"cumulativeGasUsed": "0x21880",
			"effectiveGasPrice": "0x4940d0306",
			"from": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
			"gasUsed": "0x21880",
			"logs": [
				{
					"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
					"topics": [
						"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
						"0x00000000000000000000000095222290dd7278aa3ddd389cc1e1d165cc4bafe5",
						"0x000000000000000000000000333cb957ceaab5a7d2fd1f046f6a4481a52d7378"
					],
					"data": "0x000000000000000000000000000000000000000000000000000000000513cafb",
					"blockNumber": "0x112bde2",
					"transactionHash": "0x4e7c53bec74550e8c4bb3642c21708134f434994b122a3d6321ec718e743281d",
					"transactionIndex": "0x0",
					"blockHash": "0xb5876cd604e2234f800817ef7d744b55e3de0750679923ad3c8f3a3439f8095c",
					"logIndex": "0x0",
					"removed": false
				}
			],
			"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000020000000004000000000000000000000000000000000000000000000000000000000",
			"status": "0x1",
			"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
			"transactionHash": "0x4e7c53bec74550e8c4bb3642c21708134f434994b122a3d6321ec718e743281d",
			"transactionIndex": "0x0",
			"type": "0x2"
		},
		{
			"blockHash": "0xb5876cd604e2234f800817ef7d744b55e3de0750679923ad3c8f3a3439f8095c",
			"blockNumber": "0x112bde2",
			"contractAddress": null,
			"cumulativeGasUsed": "0x36f10",
			"effectiveGasPrice": "0x484c172f0",
			"from": "0xE4395bc3d18B93D5F22e75bA15704e7a5B0ca77f",
			"gasUsed": "0x15690",
			"logs": [
				{
					"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
					"topics": [
						"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
						"0x000000000000000000000000e4395bc3d18b93d5f22e75ba15704e7a5b0ca77f",
						"0x00000000000000000000000001d1d3b37d6a73adcbe2d6c4a330b6b244f48d5a"
					],
					"data": "0x0000000000000000000000000000000000000000000000000000000016be7dbf",
					"blockNumber": "0x112bde2",
					"transactionHash": "0x87c3f77d7c2755c9a3b94985c17b97cedd96b2afb2a916e50e4357e2188a46ec",
					"transactionIndex": "0x1",
					"blockHash": "0xb5876cd604e2234f800817ef7d744b55e3de0750679923ad3c8f3a3439f8095c",
					"logIndex": "0x1",
					"removed": false
				}
			],
			"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000",
			"status": "0x1",
			"to": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
			"transactionHash": "0x87c3f77d7c2755c9a3b94985c17b97cedd96b2afb2a916e50e4357e2188a46ec",
			"transactionIndex": "0x1",
			"type": "0x2"
		}
		// 其他收据...
	]
}

关键收据字段解释

  • status: 成功交易为 0x1,失败交易为 0x0
  • logs: 包含所有发出的事件(对跟踪代币转账和状态变化至关重要)
  • gasUsed: 该交易实际消耗的 gas(对成本分析很重要)
  • cumulativeGasUsed: 区块中包括此交易在内的运行总 gas 使用量
  • effectiveGasPrice: 每单位 gas 实际支付的价格(对 EIP-1559 交易特别重要)
  • contractAddress: 仅在合约创建交易中填充
  • type: 表示交易类型(传统、访问列表或 EIP-1559)

常见事件签名

日志中最常见的事件签名:

  • ERC-20 Transfer: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
  • ERC-20 Approval: 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
  • ERC-721 Transfer: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef(与 ERC-20 相同)
  • ERC-1155 TransferSingle: 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62
  • ERC-1155 TransferBatch: 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb

性能优势

与单独的收据请求相比,该方法提供显著的性能优势:

  1. 减少网络开销: 一次请求替代多个单独的 API 调用
  2. 更低延迟: 最小化客户端和节点之间的往返延迟
  3. 降低资源使用: 客户端和节点都需要更少的处理
  4. 更好的缓存利用: 数据可以从单一缓存查找中返回
  5. 简化错误处理: 单一请求意味着简化的重试逻辑

实用示例

// 示例:分析区块中的代币转账
async function analyzeTokenTransfers(blockNumber) {
	const receipts = await provider.send('eth_getBlockReceipts', [blockNumber]);

	// 常见 ERC-20 Transfer 事件签名
	const transferTopic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';

	// 跟踪所有代币转账
	const tokenTransfers = {};

	receipts.forEach((receipt) => {
		// 跳过失败的交易
		if (receipt.status !== '0x1') return;

		receipt.logs.forEach((log) => {
			if (log.topics[0] === transferTopic) {
				const token = log.address;
				const from = '0x' + log.topics[1].slice(26);
				const to = '0x' + log.topics[2].slice(26);
				const value = BigInt(log.data);

				if (!tokenTransfers[token]) {
					tokenTransfers[token] = [];
				}

				tokenTransfers[token].push({ from, to, value });
			}
		});
	});

	return tokenTransfers;
}

// 使用
const transfers = await analyzeTokenTransfers('0x112BDE2');
console.log(`Found transfers for ${Object.keys(transfers).length} different tokens`);

另请参阅

帮助我们变得更好!
分享此页面并帮助我们为您创建更好的产品。