<aside> 📘 Relates:
Solidity layout and access of storage state variables simply explained
Solidity delegatecall usage and pitfalls
Understanding Smart Contract Vulnerabilities
</aside>
更精简,适合速成
合约运行于 EVM 上,所有的状态存储于 ETH 链上。虽然合约是分布式运行,但是最终的链是唯一的,所以可以认为 EVM 是一个单线程机器,不存在任何并发和 data racing,当你的代码运行时,你就是整个 Ethereum 上唯一在运行的代码。
要编写 PRD-ready 的合约代码,可以参考 OpenZeppelin 的框架:
推荐一个学习 OpenZeppelin 的方法,在它的代码生成器页面,逐一查阅每一个选项和文档。可以形成系统性的理解。
合约一旦发布就不能更改,再次发布会生成一个新的合约。为了实现合约的升级,多使用 Proxy 模式。简而言之,就是将合约的实现拆分为 Interface 和 Implementation。Interface 作为 Proxy,决定了合约的外部交互,但是所有的内部实现,都在 Implementation 中,Owner 可以为 Proxy 设置不同的 Implementation。因为重要的数据都存放于 Proxy 中,Proxy 的地址也不会变化,这样就实现了在保留原合约地址和数据不变的前提下,对合约的代码逻辑进行更新。
Proxy 的功能依赖于如下机制: