可升级合约中可以使用 immutable 变量么? 让我们深入探索一番
前段时间 review 团队小伙伴合约代码的时候,提出有些变量是可以使用 immutable 来修饰的。但得到一个答复:我们这是可升级合约,不能用 immutable,真的是这样么?
因为现在的可升级合约基本上都是使用的 OpenZeppelin 的合约模版,估计可升级合约不能用 immutable 变量的说法也是来源于 OpenZeppelin。
在 OpenZeppelin 的 Why can’t I use immutable
variables? 这个文档里,确实解释了"为什么不能用 immutable 变量",主要有下面两个原因:
只是这两个原因不能用 immutable 变量,我感觉是比较牵强的。
immutable 是对变量的一种硬性约束,一旦初始化就不再改变。其中一个常见的场景是对固定合约地址的引用,比如对 USDT 合约地址的引用,我们明确知道这个合约地址在固定链上是不会发生改变的,但是因为我们有可能在不同链上部署我们的合约,起码要在一个网络的测试网和主网上部署我们的合约,直接用常量就很不方便,这个时候使用 immutable 变量,通过构造函数初始化后就不再改变,是最符合预期的。
当然,这种情况下我们也可以使用正常的变量,但这会引入额外两个问题:
非也。 这其实只是 OpenZeppelin 为了方便构造函数误用而额外加的规范性限制,在可升级合约的实现合约中,使用构造函数初始化正常变量可能会得到与预期不一致的结果,但初始化 immutable 变量得到的结果应该是完全符合预期的。在实现合约构造函数中初始化的 immutable 变量在可代理合约中都可以正常读取。
immutable 变量在可升级合约中使用没任何问题:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!