市值: $2.2043T 0.58%
成交额(24h): $56.8553B 3.76%
恐惧与贪婪指数:

39 - 恐惧

  • 市值: $2.2043T 0.58%
  • 成交额(24h): $56.8553B 3.76%
  • 恐惧与贪婪指数:
  • 市值: $2.2043T 0.58%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

如何从智能合约中读取存储变量?

Ethereum smart contracts store state in 32-byte slots; layout depends on variable order, types, inheritance, and compiler version—critical for accurate off-chain reads via `eth_getStorageAt`.

2026/01/21 11:00

了解以太坊智能合约中的存储布局

1. 部署在以太坊上的每个智能合约都在持久存储槽中维护其状态,每个槽宽 32 字节,从槽 0 开始按顺序索引。

2. 编译器根据状态变量的声明顺序分配存储位置,并考虑类型大小和打包规则以提高效率。

3. 结构体、数组和映射引入了复杂性:动态数组将长度存储在其槽中,并将数据存储在 keccak256 计算的偏移量处;映射使用 keccak256(key, slot) 来导出存储位置。

4. 0.8.0 之前的 Solidity 版本允许跨变量边界进行更紧密的打包,而较新的版本则强制执行更严格的对齐,从而影响手动槽计算的准确性。

5. 合约继承影响布局——来自基础合约的变量占据较低的位置,其次是来自派生合约的变量(按线性顺序排列)。

通过 eth_getStorageAt 直接链上读取

1. JSON-RPC 方法eth_getStorageAt使用合约地址、槽索引和块标识符从特定存储槽检索原始 32 字节值。

2. 槽索引必须手动计算或从编译工件中提取,例如在合约的元数据或构建信息文件中找到的 Solidity 生成的存储布局 JSON。

3.hardhat -storage-layoutslither-print-storage等工具通过解析AST和字节码来自动进行插槽映射,减少人为错误。

4. 使用 infura 或 Alchemy 端点进行查询时,速率限制和存档节点要求适用,特别是对于合约升级或自毁之前的历史槽值。

5. 十六进制编码的响应需要解码:uint256 值显示为左填充,地址在最后 20 个字节中右对齐,布尔值映射到 0x01 或 0x00。

手动解码复杂类型

1、对于静态数组,每个元素如果适合就占用一个槽位;否则,元素会按照标准对齐规则溢出到连续的槽中。

2. 动态数组数据从 keccak256(slot) 开始,其中前 32 个字节保存数组长度,后续槽存储从 keccak256(slot)+1 开始连续的元素。

3. 映射要求为每个键重新计算 keccak256:对于映射(address => uint256) 公共余额,地址 0xAbc… 的槽是 keccak256(abi.encodePacked(0xAbc…, slot_index))。

4. 嵌套结构增加了复杂性——例如,映射到结构需要首先计算映射槽,然后应用相对于该基数的结构字段偏移量。

5. 结构体内部的偏移量遵循与顶级变量相同的规则:uint128 + uint128 打包到一个槽中,但由于对齐限制,添加 uint256 会强制使用一个新槽。

使用铸造和铸造进行实际检查

1.cast存储命令接受合约地址和槽号,如果提供了 ABI 或布局,则自动获取并可选择解码值。

2. 使用--watch ,cast 监视跨块的存储变化,对于实时观察重入或闪贷副作用很有用。

3. Foundry 的forge 检查输出完整的存储布局,包括变量名称、类型、槽号和字节偏移量,无需手动 ABI 解析。

4. 当源代码不可用时,逆向工程就变得必要:分析事务跟踪中的 SSTORE 操作码可以揭示哪些槽被写入以及何时被写入。

5. 利用 web3.py 或 ethers.js 的自定义脚本可以批量查询多个槽,将输出格式化为表格,并与透明或 UUPS 等已知代理模式进行交叉引用。

常见问题解答

问:我可以在不知道合约源代码的情况下从合约中读取存储吗?答:是的——使用字节码分析、操作码跟踪或启发式方法,例如 OpenZeppelin 代理或 ERC-20 余额的常见插槽模式。然而,如果没有上下文,解释仍然含糊不清。

问:为什么 eth_getStorageAt 对于我知道存在的非零值返回零?答:可能的原因包括查询错误的槽、使用过时的块号、针对代理而不转发到实现,或读取未初始化的内存(默认为零)。

问:在链下执行存储读取时会消耗gas吗?答:否 — eth_getStorageAt是免费的 RPC 调用。 Gas 成本仅适用于在交易或查看函数中执行的链上读取。

问:跨编译器版本依赖存储槽编号是否安全?答:不保证——Solidity 更新可能会改变布局算法。始终验证部署期间使用的确切编译器版本和优化设置。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

为什么 Solana 期货交易者使用高杠杆? SOL 合同风险解释

为什么 Solana 期货交易者使用高杠杆? SOL 合同风险解释

2026-08-04 19:19:51

为什么 Solana 期货交易者青睐高杠杆1. Solana 的原生代币 SOL 表现出明显的日内波动,通常在单个交易时段内波动超过 8%,创造了频繁的短期定向机会。 2. SOL 合约的平均永续资金费率在结构上仍低于 BTC 或 ETH 等价物,从而降低了长期持有杠杆头寸的成本。 3. Raydi...

Solana 期货追加保证金通知如何运作? SOL 合同警告级别解释

Solana 期货追加保证金通知如何运作? SOL 合同警告级别解释

2026-08-05 02:20:25

市场波动模式1. Bitcoin 在重大宏观经济公告期间,24 小时内价格波动往往超过 10%。 2. 2024 年第三季度,山寨币与 BTC 的相关性已飙升至 0.92 以上,表明独立走势有所减弱。 3. 衍生品数据显示,在级联清算期间,永续资金利率经常在几分钟内从正值转变为负值。 4. 在纳斯达...

什么是以太坊期货合约融资成本? ETH 交易费用明细

什么是以太坊期货合约融资成本? ETH 交易费用明细

2026-08-05 01:39:54

市场波动模式1. Bitcoin的价格走势往往反映宏观经济信号,例如美联储利率决定和通胀数据发布。 2. 在高流动性时期,山寨币的估值经常与 BTC 脱钩,导致去中心化交易所的日内大幅波动。 3. 通过链上分析平台跟踪的鲸鱼钱包活动已证明与 Binance 和 Bybit 订单簿上 15-30 分钟...

如何计算Bitcoin期货收益率? BTC合约投资分析

如何计算Bitcoin期货收益率? BTC合约投资分析

2026-08-05 23:00:15

了解 Bitcoin 期货合约机制1. Bitcoin 期货合约是在指定的未来日期以预定价格买卖 BTC 的标准化协议。 2. 这些工具在 CME、CBOE 和 Binance Futures 等受监管交易所进行交易,每个交易所都有不同的保证金要求和结算程序。 3. 合约可以以美元或BTC计价,反向...

为什么XRP期货交易量激增? XRP合约行情说明

为什么XRP期货交易量激增? XRP合约行情说明

2026-08-06 15:20:28

价格停滞期间期货成交量激增1. XRP 期货未平仓合约在 2026 年 8 月上旬攀升至 24 亿美元,较 6 月份的平均水平增长 43%,尽管该代币交易价格接近 1.14 美元,仅比 52 周低点高出 5%。 2. 衍生品交易所报告称,过去 30 天的 XRP 永续掉期日成交量增长了 68%,是现...

什么是 Solana 期货基差利率? SOL 合同保费如何变化?

什么是 Solana 期货基差利率? SOL 合同保费如何变化?

2026-08-06 11:39:33

Solana 期货基础机制1. Solana 期货基差率代表 SOL 永续掉期价格与现货指数价格之间的百分比差异,计算公式为(永续价格 - 现货指数)/现货指数 × 100%。 2. 该指标反映了市场参与者对主要衍生品交易所近期 SOL 价格方向、流动性深度和融资成本预期的集体情绪。 3. 正基差表...

为什么 Solana 期货交易者使用高杠杆? SOL 合同风险解释

为什么 Solana 期货交易者使用高杠杆? SOL 合同风险解释

2026-08-04 19:19:51

为什么 Solana 期货交易者青睐高杠杆1. Solana 的原生代币 SOL 表现出明显的日内波动,通常在单个交易时段内波动超过 8%,创造了频繁的短期定向机会。 2. SOL 合约的平均永续资金费率在结构上仍低于 BTC 或 ETH 等价物,从而降低了长期持有杠杆头寸的成本。 3. Raydi...

Solana 期货追加保证金通知如何运作? SOL 合同警告级别解释

Solana 期货追加保证金通知如何运作? SOL 合同警告级别解释

2026-08-05 02:20:25

市场波动模式1. Bitcoin 在重大宏观经济公告期间,24 小时内价格波动往往超过 10%。 2. 2024 年第三季度,山寨币与 BTC 的相关性已飙升至 0.92 以上,表明独立走势有所减弱。 3. 衍生品数据显示,在级联清算期间,永续资金利率经常在几分钟内从正值转变为负值。 4. 在纳斯达...

什么是以太坊期货合约融资成本? ETH 交易费用明细

什么是以太坊期货合约融资成本? ETH 交易费用明细

2026-08-05 01:39:54

市场波动模式1. Bitcoin的价格走势往往反映宏观经济信号,例如美联储利率决定和通胀数据发布。 2. 在高流动性时期,山寨币的估值经常与 BTC 脱钩,导致去中心化交易所的日内大幅波动。 3. 通过链上分析平台跟踪的鲸鱼钱包活动已证明与 Binance 和 Bybit 订单簿上 15-30 分钟...

如何计算Bitcoin期货收益率? BTC合约投资分析

如何计算Bitcoin期货收益率? BTC合约投资分析

2026-08-05 23:00:15

了解 Bitcoin 期货合约机制1. Bitcoin 期货合约是在指定的未来日期以预定价格买卖 BTC 的标准化协议。 2. 这些工具在 CME、CBOE 和 Binance Futures 等受监管交易所进行交易,每个交易所都有不同的保证金要求和结算程序。 3. 合约可以以美元或BTC计价,反向...

为什么XRP期货交易量激增? XRP合约行情说明

为什么XRP期货交易量激增? XRP合约行情说明

2026-08-06 15:20:28

价格停滞期间期货成交量激增1. XRP 期货未平仓合约在 2026 年 8 月上旬攀升至 24 亿美元,较 6 月份的平均水平增长 43%,尽管该代币交易价格接近 1.14 美元,仅比 52 周低点高出 5%。 2. 衍生品交易所报告称,过去 30 天的 XRP 永续掉期日成交量增长了 68%,是现...

什么是 Solana 期货基差利率? SOL 合同保费如何变化?

什么是 Solana 期货基差利率? SOL 合同保费如何变化?

2026-08-06 11:39:33

Solana 期货基础机制1. Solana 期货基差率代表 SOL 永续掉期价格与现货指数价格之间的百分比差异,计算公式为(永续价格 - 现货指数)/现货指数 × 100%。 2. 该指标反映了市场参与者对主要衍生品交易所近期 SOL 价格方向、流动性深度和融资成本预期的集体情绪。 3. 正基差表...

查看所有文章

User not found or password invalid

Your input is correct