全面理解复杂类型的存储布局
完全理解函数调用的 ABI 编码
本文详细介绍了Solidity中两种调用合约的方法:通过合约接口的高级调用和使用`call`方法的低级调用,解释了为什么低级调用不会回滚而高级调用可能会回滚,并对比了这两种方法在调用空地址时的不同行为。
Try Catch 和 Solidity 可以回滚的所有方式
本文详细介绍了如何通过内联汇编更高效地实现 Solidity 中的回滚操作,深入探讨了 `mstore` 和 `mstore8` 操作码的使用方式,并通过示例代码展示了如何在汇编中实现无消息回滚、自定义错误回滚以及带有原因字符串的回滚。
本文详细介绍了EVM中的delegatecall操作码,解释了其工作原理、使用场景及潜在问题,并提供了多个代码示例帮助理解。
本文详细介绍了代理合约的概念及其在智能合约中的重要性,特别是如何通过代理合约实现智能合约的升级性和降低部署成本。文章通过示例代码和图解,深入解析了代理合约的工作原理和实现方法,并探讨了存储冲突问题及其解决方案。
EIP 1967 是一个关于代理合约存储信息位置的标准,用于解决代理合约与实现合约之间的存储冲突问题。文章详细介绍了实现地址和管理员地址的存储位置,并解释了如何防止存储冲突及如何使用 EIP 1967 来识别代理合约。
文章详细解释了透明可升级代理模式,该模式旨在升级代理时消除函数选择器冲突的可能性。文章介绍了代理合约的基本需求、函数选择器冲突问题及其解决方案,并通过代码示例和图表深入探讨了OpenZeppelin的实现细节。
UUPS:通用可升级代理标准(ERC-1822)
详解 ERC-7201 存储命令空间
可初始化的智能合约设计模式
Beacon Proxy Pattern
本文详细介绍了EIP-1167标准,即最小代理合约,用于廉价创建代理克隆。文章深入解析了其工作原理、字节码结构、初始化函数及实际应用示例,帮助开发者理解如何高效部署相似合约。
本文详细介绍了MetaProxy标准,它是一种用于创建智能合约克隆的最小字节码实现,允许每个克隆附加不可变的元数据。文章还展示了如何使用MetaProxy标准创建ERC20合约,并解释了字节码的结构和如何操作元数据。
这篇文章介绍了一种名为 fallback-extension 的模式,该模式可以解决 Solidity 智能合约 24kb 大小限制的问题。通过将某些函数放置在扩展合约中,并利用回调函数将调用转发至扩展合约,开发者可以增添更多的功能。此外,文中还讨论了存储布局一致性、函数选择器碰撞的风险及其对应的气体成本等重要注意事项。
在 Foundry 使用 OpenZeppelin 插件进行智能合约升级
本文介绍了Solidity中的`nodelegatecall`修饰符,用于防止合约使用`delegatecall`来调用函数,并通过代码示例详细展示了其实现和测试方法,同时讨论了Uniswap V3使用该技术的动机。
代理模式可能是学习 Solidity 开发中最令人困惑的方面之一,因为在其他软件开发领域几乎没有类似的类比。进一步复杂化的问题是——尽管从概念上讲,delegatecall 是容易理解的——完全掌握其细微差别需要对 EVM(以太坊虚拟机)和 Solidity 编译器的工作原理有一定的背景知识。这些细微差别并不是简单的“你知道吗”的琐事,而是对智能合约的运行方式有重要影响。此外,代理模式的标准仍在发展中——截至撰写本文时,ERC-7201 到现在还不到一年的时间。
任何合格的 Solidity 开发者或审计员,都应该对 delegatecall 及其所依赖的代理模式有全面的理解。代理模式并不简单,一个错误就可能破坏可升级性,或者更糟,导致灾难性错误。
本书旨在帮助这样的读者高效且全面地掌握这一主题,同时深入探讨在其他文献中省略或忽视的细节。与此同时,我们力求范围明确;本书不是关于 EVM 的完整课程——我们仅讨论与正确理解 delegatecall 及现有模式设计相关的部分。
详解 Compound V3
零知识证明之书
Uniswap V2 之书
Solana 60 天课程