TGViewer
Laisky's Notes Laisky's Notes @laiskynotes · 3.34K subscribers
Post #245 1.16K
https://laisky.notion.site/Solidity-delegatecall-usage-and-pitfalls-3833eadc06ae4528bfa23d194ea8d3cb?pvs=4

前文介绍了 solidity 中变量的持久化存储方式。而我们之所以关心变量的存储位置(slot),就是因为在使用 Proxy 模式时,需要在合约间共享变量,而合约间变量的共享方式就是通过 slot 对齐的。

合约一旦发布就是只读不可更改的,如果想要修复 bug 或升级功能而发布一个新的合约,那么就会得到一个新的地址。为了在保持地址不变的同时更改合约的代码,最常见的实现方法就是使用 Proxy-Implementation 模式。发布一个 Proxy 合约作为接口,地址永远不变。但是实际的业务代码指向 Implementation 合约,implementation 合约可以不断地升级迭代,只要同步更新 Proxy 合约的指向即可。

实现 Proxy 这一功能,依赖于 solidity 的 delegatecall(),这个函数可以让 Implementation 使用 Proxy 的上下文,即内存数据和存储。而这个数据共享的前提,就要求 Proxy 和 Implementation 的变量声明按照 slot 进行严格的对齐。

按照目前最推荐使用的 UUPS Proxy 模式(UUPS 简而言之就是将升级 Implementation 的 upgrade() method 也放在 Implementation 内定义),为了减少 Proxy 和 Implementation 间的变量冲突,一个最佳实践就是不要在 Proxy 内声明任何非必需的变量,理论上 Proxy 内仅需要定义 owner(设置管理者) 和 implementation(设置 Implementation 的地址) 两个变量即可。所有的业务数据,全部仅在 Implementation 内定义。当 Proxy 使用 delegatecall() 调用 Implementation 时,Proxy 的存储空间会被共享给 Implementation,所以虽然变量仅定义在 Implementation 内,但实际上全部存储于 Proxy 的存储空间内。当 Implementation 迭代升级时,新版本的 Implementation 内的变量声明必须严格对齐于旧版本,仅允许在尾部添加新变量,不允许修改或删除旧变量(append-only)。

此文详细介绍了 delegatecall() 时,Proxy 和 Implementation 间变量对齐的注意事项和案例。 #blockchain #evm
Laisky on Notion Solidity delegatecall usage and pitfalls | Notion TL;DR;
  • 👍 1
More from @laiskynotes
  1. Oct 6, 2026https://x.com/LaiskyCai/status/2107307813727060123?s=20 codex 最近有三个完全免费的工具,结合之后可以发挥非常强大能力:…
  2. Sep 15, 2026学习了一下 OpenAI 推出的 Agents API https://openai.com/index/introducing-the-agents-api/ 众所周知 Agen…
  3. Aug 28, 2026前阵子读了本很有趣的书,侯杨方的《这才是丝绸之路》。作者抛开抽象的文本溯源,而是采用实地考察的方式,重走了真实的丝绸之路。此书给我最大的感触就是:真实而且符合常理。 在我以前的想象…
  4. Jun 5, 2026读完 Mario Puzo 的《教父 The Godfather》三部曲小说,才意识到自己当年年轻时根本完全就没看懂电影《教父》。然后又去把电影重温了一遍,才发现原来电影里有很多细…
  5. May 22, 2026记录一下最近遇到的一个糟心事儿。 最近两个月开始又开始找工作机会,总的来说很不顺利,托朋友联系了两个内推也是石沉大海。(各位要是有远程工作的机会也请联系 job@laisky.co…
  6. May 14, 2026作为一个从业十多年的程序员,我已经半年没手写过一行代码了。上个月大概提交了 20 万行,这个月大概 4 万行。 昨天认真考虑了一下这个现象,我个人认为,虽然 AI 仍然存在显然的不…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →