Ethereum/Debug API/debug_storageRangeAt

debug_storageRangeAt

debug_storageRangeAt 方法返回指定范围内的合约存储。此方法主要用于调试目的,允许开发人员检查和分析链上存储数据。它通常被 Remix 等开发工具用来实现调试功能,并提供对智能合约原始存储槽的直接访问。

使用场景

  • 智能合约调试:检查特定存储值以识别合约中与状态相关的错误
  • 合约状态分析:分析在执行不同函数期间合约状态如何变化
  • 存储布局验证:验证合约的存储布局是否符合您的预期
  • 合约审计:检查存储槽以查找安全漏洞或意外的状态变化
  • 开发工具集成:构建可视化合约状态和内存的调试工具
  • 事后分析:调查失败或漏洞利用后的合约状态
  • 代理合约验证:验证可升级代理模式中的槽分配
  • 治理检查:检查 DAO 或治理合约的存储状态
  • 历史状态分析:比较不同区块间的存储值以跟踪状态演变

方法详情

此方法返回指定范围内合约的存储条目。

参数:

获取存储的区块哈希

区块内的交易索引

要检索其存储的合约地址

起始存储键的哈希

返回的最大存储条目数

返回值:

包含键值对存储条目的对象

每个存储条目的对象

十六进制字符串形式的存储键

十六进制字符串形式的存储值

用于下一次范围查询的键,如果没有更多条目则不存在

响应示例

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": {
		"storage": {
			"0x0000000000000000000000000000000000000000000000000000000000000000": {
				"key": "0x0000000000000000000000000000000000000000000000000000000000000000",
				"value": "0x0000000000000000000000000000000000000000000000000000000000000001"
			},
			"0x0000000000000000000000000000000000000000000000000000000000000001": {
				"key": "0x0000000000000000000000000000000000000000000000000000000000000001",
				"value": "0x000000000000000000000000d7acd2a9fd159e69bb102a1ca21c9a3e3a5f771b"
			},
			"0x0000000000000000000000000000000000000000000000000000000000000002": {
				"key": "0x0000000000000000000000000000000000000000000000000000000000000002",
				"value": "0x0000000000000000000000000000000000000000000000000000000000000064"
			}
		},
		"nextKey": "0x0000000000000000000000000000000000000000000000000000000000000003"
	}
}

响应字段说明

  • storage:包含每个存储条目作为键值对的对象。
  • 键是存储槽的 keccak256 哈希。
  • 每个条目包含:
  • key:原始存储键(槽号)。
  • value:存储在该键的值。
  • nextKey:检索下一批数据时开始的下一个存储键,若无更多条目则不存在。

理解存储槽

在以太坊智能合约中,存储以 32 字节的槽组织:

  • 槽 0, 1, 2, ...:简单状态变量按顺序存储。
  • 映射:存储在 keccak256(key . slot) 位置,其中 . 是连接。
  • 动态数组:长度在 slot,数据在 keccak256(slot) + index
  • 嵌套映射:使用多个哈希步骤。

性能考虑

  • 查询大范围存储可能导致响应大小显著增加
  • 对于存储广泛的合约,请考虑使用较小的限制
  • 使用精确的 startKey 有助于减少不必要的数据传输
  • 此方法比基本存储查询更消耗资源

重要说明

  • 此方法主要由 Remix 和其他以太坊 IDE 等开发工具使用
  • 需要在以太坊节点上启用调试 API
  • 并非所有以太坊客户端都支持此方法(在 Geth 和一些其他客户端中完全支持)
  • 为获得准确结果,请使用反映所需状态的区块哈希和交易索引
  • limit 参数有助于管理具有大型存储的合约的响应大小
  • 一些归档节点可能对存储范围查询施加限制
  • 该方法返回可能需要额外解析的复杂数据类型的原始存储值
  • 无法直接读取私有变量,因为它们可能打包到同一个存储槽中
  • 历史查询需要归档节点;非归档节点仅支持最近的区块

另请参阅

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