You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity中ERC1967代理偏移量为何要减1?

ERC1967合约中偏移量减1的设计目的

在OpenZeppelin的ERC1967实现里,像_IMPLEMENTATION_SLOT这类核心存储槽的计算,都是用目标字符串的keccak256哈希值减1得到的,这么做的核心目的有三个:

  • 彻底规避用户存储冲突
    Solidity合约的状态变量默认从编号0的存储槽开始顺序分配。直接用哈希值作为槽位的话,虽然碰撞概率极低,但减1操作能确保这个槽位是一个极大的数字,完全脱离用户自定义状态变量会用到的低编号槽位范围,从根源上避免代理的核心存储(比如实现合约地址、管理员地址)和逻辑合约的用户存储发生冲突。

  • 严格遵循EIP-1967规范
    EIP-1967标准本身就明确要求代理的存储槽使用「哈希值减1」的计算方式。统一的标准能让所有符合规范的代理合约共用一套存储位置规则,区块链浏览器、审计工具可以直接识别这些槽位的用途,提升了合约的兼容性和可审计性。

  • 预留未来扩展空间
    减1后的槽位编号仍然处于极高区间,即使未来Solidity或以太坊协议有新的内置存储需求,也几乎不会触及到这些位置,为代理合约的长期稳定性和扩展性提供了保障。

内容的提问来源于stack exchange,提问作者Nikita Duginets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:05:42