可升級(jí)合約中可以使用 immutable 變量么

前段時(shí)間 review 團(tuán)隊(duì)小伙伴合約代碼的時(shí)候像啼,提出有些變量是可以使用 immutable 來(lái)修飾的。但得到一個(gè)答復(fù):我們這是可升級(jí)合約,不能用 immutable领追,真的是這樣么?

0x01 OpenZeppelin 的警告

因?yàn)楝F(xiàn)在的可升級(jí)合約基本上都是使用的 OpenZeppelin 的合約模版响逢,估計(jì)可升級(jí)合約不能用 immutable 變量的說(shuō)法也是來(lái)源于 OpenZeppelin绒窑。
在 OpenZeppelin 的 Why can’t I use immutable variables? 這個(gè)文檔里,確實(shí)解釋了"為什么不能用 immutable 變量"舔亭,主要有下面兩個(gè)原因:

  1. 可升級(jí)合約沒(méi)有構(gòu)造函數(shù)些膨,只有初始化函數(shù),因此它們無(wú)法處理 immutable 變量钦铺。
  2. 由于不可變變量的值存儲(chǔ)在字節(jié)碼中订雾,其值將在給定合約的所有代理之間共享。

只是這兩個(gè)原因不能用 immutable 變量矛洞,我感覺(jué)是比較牽強(qiáng)的洼哎。

0x02 什么時(shí)候我們需要用 immutable 變量

immutable 是對(duì)變量的一種硬性約束,一旦初始化就不再改變沼本。其中一個(gè)常見(jiàn)的場(chǎng)景是對(duì)固定合約地址的引用噩峦,比如對(duì) USDT 合約地址的引用,我們明確知道這個(gè)合約地址在固定鏈上是不會(huì)發(fā)生改變的擅威,但是因?yàn)槲覀冇锌赡茉诓煌溕喜渴鹞覀兊暮霞s壕探,起碼要在一個(gè)網(wǎng)絡(luò)的測(cè)試網(wǎng)和主網(wǎng)上部署我們的合約,直接用常量就很不方便郊丛,這個(gè)時(shí)候使用 immutable 變量李请,通過(guò)構(gòu)造函數(shù)初始化后就不再改變,是最符合預(yù)期的厉熟。

當(dāng)然导盅,這種情況下我們也可以使用正常的變量,但這會(huì)引入額外兩個(gè)問(wèn)題:

  1. Gas 消耗更高
  2. 存在未來(lái)被惡意改變的風(fēng)險(xiǎn)
    所以對(duì)一個(gè)變量來(lái)說(shuō)揍瑟,能使用 immutable 約束的時(shí)候我們還是希望能夠盡量使用 immutable 約束白翻。

0x03 可升級(jí)合約就一定不能使用構(gòu)造函數(shù)么

非也。
這其實(shí)只是 OpenZeppelin 為了方便構(gòu)造函數(shù)誤用而額外加的規(guī)范性限制绢片,在可升級(jí)合約的實(shí)現(xiàn)合約中滤馍,使用構(gòu)造函數(shù)初始化正常變量可能會(huì)得到與預(yù)期不一致的結(jié)果,但初始化 immutable 變量得到的結(jié)果應(yīng)該是完全符合預(yù)期的底循。在實(shí)現(xiàn)合約構(gòu)造函數(shù)中初始化的 immutable 變量在可代理合約中都可以正常讀取巢株。

0x04 結(jié)論

immutable 變量在可升級(jí)合約中使用沒(méi)任何問(wèn)題:

  1. 盡管通常情況下,可升級(jí)合約的實(shí)現(xiàn)合約中我們遵循 OpenZeppelin 規(guī)范熙涤,使用初始化函數(shù) initialize 去初始化常規(guī)變量阁苞。但在需要的時(shí)候我們?nèi)匀豢梢允褂脴?gòu)造函數(shù)去初始化 immutable 變量困檩。
  2. 我們使用 immutable 變量的本意就是其初始化后就不再改變,所以同一個(gè)實(shí)現(xiàn)合約的不同代理看到同樣的值并沒(méi)啥問(wèn)題那槽。如果需要不同的值悼沿,實(shí)例化不同的實(shí)現(xiàn)合約就好了。
  3. 在使用升級(jí)插件的時(shí)候還是要注意把 unsafeAllow: constructor 和 unsafeAllow:state-variable-immutable 的開(kāi)關(guān)打開(kāi)骚灸,否則估計(jì)會(huì)報(bào)錯(cuò)糟趾。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逢唤,隨后出現(xiàn)的幾起案子拉讯,更是在濱河造成了極大的恐慌涤浇,老刑警劉巖鳖藕,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異只锭,居然都是意外死亡著恩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蜻展,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喉誊,“玉大人,你說(shuō)我怎么就攤上這事纵顾∥榍眩” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵施逾,是天一觀的道長(zhǎng)敷矫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汉额,這世上最難降的妖魔是什么曹仗? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蠕搜,結(jié)果婚禮上怎茫,老公的妹妹穿的比我還像新娘。我一直安慰自己妓灌,他們只是感情好轨蛤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著虫埂,像睡著了一般祥山。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上告丢,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天枪蘑,我揣著相機(jī)與錄音损谦,去河邊找鬼。 笑死岳颇,一個(gè)胖子當(dāng)著我的面吹牛照捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播话侧,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼栗精,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瞻鹏?” 一聲冷哼從身側(cè)響起悲立,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎新博,沒(méi)想到半個(gè)月后薪夕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赫悄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年原献,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂淮。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姑隅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倔撞,到底是詐尸還是另有隱情讲仰,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布痪蝇,位于F島的核電站鄙陡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霹俺。R本人自食惡果不足惜柔吼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丙唧。 院中可真熱鬧愈魏,春花似錦、人聲如沸想际。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胡本。三九已至牌柄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侧甫,已是汗流浹背珊佣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蹋宦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咒锻。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓冷冗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親惑艇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒿辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容