Ethereum/Core API/eth_getStorageAt

eth_getStorageAt

eth_getStorageAt 方法返回给定智能合约地址的特定存储位置存储的值。这个低级方法允许直接访问合约的状态变量,对合约分析和调试至关重要。

使用场景

  • 智能合约调试和分析
  • 代币余额验证
  • 协议治理检查
  • 代理实现验证
  • 合约状态审计
  • 存储布局验证
  • DAO 提案状态检查
  • 合约升级验证

方法详情

此方法提供对合约存储中任何存储槽的原始访问。

参数:

智能合约的地址

存储位置的整数(十六进制字符串)

十六进制格式的区块号或区块标签

返回值:

指定存储位置的值(32 字节,十六进制编码)

响应示例

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": "0x000000000000000000000000000000000000000000000000000000000000000a"
}

理解 Solidity 存储布局

Solidity 的存储布局遵循特定规则:

  1. 状态变量:从槽 0 开始按顺序存储
// 存储槽 0
uint256 firstVariable;
// 存储槽 1
address secondVariable;
  1. 映射:槽本身不包含数据,但作为计算位置的种子
// 存储槽 2(空)
mapping(address => uint256) balances;
// 值存储在 keccak256(abi.encode(userAddress, 2))
  1. 动态数组:槽包含数组长度,数据从 keccak256(slot) 开始
// 存储槽 3 存储长度
uint256[] myArray;
// 值存储在 keccak256(3) + index
  1. 小于 32 字节的变量:多个变量打包在一起
// 都在存储槽 4
uint128 a;
uint64 b;
uint64 c;

常见存储槽

  • ERC20 总供应量:通常在槽 0 或 2
  • ERC20 余额映射:通常在槽 1 或 3
  • ERC20 授权映射:通常在槽 2 或 4
  • 代理实现地址:对于 EIP-1967 代理,在 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc

存储检查工具

对于复杂合约,考虑使用专用工具:

  • Slither:可以生成存储布局的静态分析器
  • Tenderly:带有存储检查的可视化调试器
  • Hardhat:带有存储访问的控制台调试
  • Etherscan:有时提供已验证合约的存储布局

另请参阅

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