比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads

CON:【翻譯】編寫可升級的智能合約

Author:

Time:1900/1/1 0:00:00

原文鏈接

當使用OpenZeppelinUpgrades編寫可升級合約時,有一些在編寫Solidity代碼時需要記住一些注意事項。

值得一提的是,這些限制源于以太坊虛擬機的工作方式,并且適用于所有使用可升級合約的項目,而不僅僅是OpenZeppelinUpgrades。

初始化器

在編寫Solidity合約使用OpenZeppelinUpgrades,無需任何修改,只需要修改構造函數。由于基于代理的可升級性系統的要求,可升級合約中不能使用構造函數。要了解這個限制背后的原因,請查看代理。

這意味著,當使用OpenZeppelin可升級的合約時,您需要將其構造函數改為一個常規函數,通常命名為initialize,在那里執行所有的初始化邏輯。

//NOTE:Donotusethiscodesnippet,it'sincompleteandhasacriticalvulnerability!pragmasolidity^0

}

然而,雖然Solidity確保一個構造函數constructor在合約的生命周期內只被調用一次,但一個普通函數可以被多次調用。為了防止一個合約被多次初始化,你需要添加一個檢查來確保初始化函數只被調用一次。

數據:zkSync Era總交易數已超1億筆:8月28日消息,據zkSync Era區塊瀏覽器數據顯示,zkSync Era網絡總交易數已超1億筆,現為101,490,589筆。[2023/8/28 13:00:33]

//contracts/MyContract

}

由于這種模式在編寫可升級合約時非常常見,OpenZeppelinUpgrades提供了一個Initializable基礎合約,它有一個initializermodifier來處理這個問題。

//contracts/MyContract

}

構造函數constructor和普通函數的另一個區別是,Solidity負責自動調用一個合約的所有基類的構造函數。在編寫初始化器initializer時,你需要特別注意手動調用所有父合約的初始化器initializer。

//contracts/MyContract

}contractMyContractisBaseContract{uint256publicx;functioninitialize(uint256_x)publicinitializer{BaseContract

}

使用可升級的智能合約庫

加密錢包Giddy完成690萬美元融資:4月27日消息,加密錢包 Giddy 宣布完成 690 萬美元新一輪融資,本輪融資由 Pelion Venture Partners、Peak Capital Partners、Clarke Capital 等參投,其中包括來自 Fortnite 聯合創始人 Geremy Mustard 的戰略投資。Pelion 在 2022 年領投了 Giddy 的 800 萬美元融資,迄今為止,該公司的總投資已超過 1500 萬美元。

Giddy 表示,新資本的收益將用于推進其戰略,通過其可恢復的自我保管智能錢包技術將加密技術普及到大眾。[2023/4/27 14:31:21]

請記住,這個限制不僅會影響你的合約,還會影響你從庫中導入的合約。例如考慮OpenZeppelin合約中的ERC20:該合約在其構造函數中初始化了token的名稱、符號和小數位數。

//

這意味著你不應該在你的OpenZeppelinUpgrades項目中使用這些合約。相反,請確保使用...}

無論是使用OpenZeppelin合約還是其他智能合約庫,都要確保軟件包被設置為處理可升級合約。

在合約中了解更多關于OpenZeppelin合約可升級的信息:Contracts:UsingwithUpgrades。

摩根大通CEO:美國銀行業危機的影響將持續數年:金色財經報道,摩根大通首席執行官杰米戴蒙(Jamie Dimon)在一份長達 43 頁的年度報告中表示,美國銀行業危機的影響將持續數年。當前的危機尚未結束,即使它已經過去,也會在未來幾年產生影響。市場出現衰退的可能性增加了,雖然這與 2008 年完全不同,但目前尚不清楚當前的危機何時結束。它在市場上引起了很多不安,并且隨著銀行和其他貸方變得更加保守,將導致金融狀況有所收緊。根據戴蒙的說法,目前還不確定這些干擾是否會阻礙推動美國經濟發展的消費者支出。

戴蒙強調,導致當前危機的風險是顯而易見的,例如硅谷銀行的利率風險和無保險存款。但他淡化了與 2008 年全球金融危機的相似之處,指出當前的銀行業危機涉及的金融參與者和需要解決的問題較少。[2023/4/23 14:22:19]

避免在字段聲明中使用初始值

Solidity允許在合約中聲明字段時為其定義初始值。

contractMyContract{uint256publichasInitialValue=42;//equivalenttosettingintheconstructor}

這相當于在構造函數中設置了這些值,因此,對于可升級的合約是無效的。請確保所有初始值都在如下所示初始化函數中設置;否則,任何可升級的實例都不會設置這些字段。

PeckShield:BNB Chain上一未驗證合約遭到攻擊,黑客獲利超22萬美元:金色財經報道,據 PeckShield 監測,BNB Chain 上一未驗證合約(0x6D8981847Eb3cc2234179d0F0e72F6b6b2421a01),黑客獲利約 22.5 萬美元。目前黑客已將盜取的約 22.5 萬枚 DAI 以及少量以太坊通過 Multichain 跨鏈至以太坊并最終轉入 RAILGUN。[2023/2/27 12:31:56]

contractMyContractisInitializable{uint256publichasInitialValue;functioninitialize()publicinitializer{hasInitialValue=42;//setinitialvalueininitializer}}

注意定義_常量_狀態變量還是可以的,因為編譯器并沒有為這些變量預留存儲槽,每出現一次就會被相應的常量表達式所替代。所以下面的內容在OpenZeppelinUpgrades中仍然可以使用:

contractMyContract{uint256publicconstanthasInitialValue=42;//defineasconstant}

從合約代碼中創建新實例

以太坊側鏈Gnosis執行層網絡與共識層網絡成功合并:金色財經報道,以太坊側鏈Gnosis宣布在區塊高度6,306,357上,Gnosis 執行層網絡與共識層網絡成功合并。Gnosis Merge 將由 20 個驗證者保護的權威證明 (PoA) 共識替換為支持新 PoS 網絡的更有彈性的 100,000 個驗證者。[2022/12/15 21:45:12]

當從合約代碼中創建一個新的合約實例時,這些創建直接由Solidity處理,而不是由OpenZeppelinUpgrades處理,這意味著這些合約將無法升級。

例如,在下面的例子中,即使MyContract被部署為可升級,創建的token合約也是不可升級的:

//contracts/MyContract

}

潛在的不安全操作

在使用可升級的智能合約時,你將始終與合約實例進行交互,而不是底層邏輯合約。然而我們卻無法阻止惡意行為者直接向邏輯合約發送交易。這不會構成威脅,因為邏輯合約狀態的任何變化都不會影響你的合約實例,因為你的項目中從未使用過邏輯合約的存儲。

然而,有一個例外。如果對邏輯合約的直接調用觸發了自毀操作selfdestruct,那么邏輯合約就會被銷毀,你的所有合約實例最終都會將所有的調用委托給一個地址,而不會有任何代碼。這會破壞你項目中的所有合約實例。

如果邏輯合約中包含委托調用delegatecall操作,也可以達到類似的效果。如果可以將delegatecall變成一個包含自毀的惡意合約,那么調用合約將被破壞。

因此,在你的合約中不允許使用selfdestruct或delegatecall。

修改你的合約

在編寫新版本的合約時,無論是由于新功能還是bug修復,都有一個額外的限制需要遵守:你不能改變合約狀態變量的聲明順序,也不能改變它們的類型。你可以通過了解Proxies來閱讀更多關于這個限制背后的原因。

警告違反這些存儲布局限制中的任何一項,都會導致升級版的合約的存儲值被混淆,并可能導致你的應用程序出現關鍵錯誤。這意味著,如果初始合約看起來像這樣:

contractMyContract{uint256privatex;stringprivatey;}

那么不可以修改合約變量類型:

contractMyContract{stringprivatex;stringprivatey;}

也無法改變變量的聲明順序:

contractMyContract{stringprivatey;uint256privatex;}

不能在現有變量之前引入新的變量:

contractMyContract{bytesprivatea;uint256privatex;stringprivatey;}

也不能刪除現有變量:

contractMyContract{stringprivatey;}

如果需要引入新的變量,請確保添加到原有變量的后面:

contractMyContract{uint256privatex;stringprivatey;bytesprivatez;}

注意,如果重命名一個變量,那么在升級后,它將保持與之前相同的值。如果新變量和舊變量的語義相同,那么這可能是我們所希望的行為:

contractMyContract{uint256privatex;stringprivatez;//startswiththevaluefrom`y`}

而如果你在合約的最后刪除了一個變量,請注意存儲不會被清除。隨后的更新中如果增加一個新的變量,會導致該變量從被刪除的變量中讀取遺留的值:

contractMyContract{uint256privatex;}

升級到:

contractMyContract{uint256privatex;stringprivatez;//startswiththevaluefrom`y`}

注意,你也可能會因為改變合約的父合約而無意中改變合約的存儲變量。例如,如果你有以下合約:

contractA{uint256a;}contractB{uint256b;}contractMyContractisA,B{}

然后通過調換基礎合約的聲明順序或引入新的基礎合約來修改MyContract,將改變變量的實際存儲方式:

contractMyContractisB,A{}

如果集成合約有任何自己的變量,你也不能在基礎合約中添加新的變量。鑒于以下情況:

contractBase{uint256base1;}contractChildisBase{uint256child;}

如果修改Base,增加一個額外的變量:

contractBase{uint256base1;uint256base2;}

然后,變量base2將被分配到上一個版本中那個child的槽位。一個變通的辦法是在基礎合約上聲明未使用的變量,你可能會在未來想要擴展,作為"保留"這些槽位的一種手段。請注意,這個技巧不會增加gas使用量。

請戳↓“閱讀原文”↓獲取文中鏈接

免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/9579149.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

幣安為何推出第三條鏈?這對BNB意味著什么?

Tags:CONCONTONTACTmcontent幣有銷毀機制么ContractNetKamaleontExtractoDAO Bull

火幣網下載官方app
比特幣:比特幣破4萬美金 | 交易平臺間的博弈之戰

談起2020年的“亂世魔王”,第一反應居多的應當是“新冠病”莫屬。從新冠病第一次被發現,到公開抗疫,時至今日已達一年之久,本以為這只黑天鵝會在國內日漸平息,各行各業的運營將逐步恢復正常,奈何.

1900/1/1 0:00:00
數字貨幣:檢察日報刊文:建議增設擅自發行數字貨幣罪

為了維護貨幣的發行和流通秩序,世界上大多數國家都通過刑法來規范與貨幣相關的行為,同時用刑罰來懲罰涉及貨幣的犯罪行為,甚至以重罪予以打擊.

1900/1/1 0:00:00
ISA:VISA放棄收購Plaid:DeFi通路被截斷 53億美元并購黃了

據外媒消息,今日VISA正式宣布放棄對Plaid的收購,這場從2020年初就開啟的收購經歷重重阻礙,終于投降在了反壟斷的鐵錘之下.

1900/1/1 0:00:00
GATE:Gate.io 將上線 Nord Finance (NORD) 交易的公告

Gate.io將于2021年1月13日16:00上線NordFinance(NORD)交易。NordFinance是先進的去中心化金融生態系統,旨在通過將傳統金融的關鍵功能引入DeFi生態系統來.

1900/1/1 0:00:00
區塊鏈:吃貨大陸三周年,資產上鏈萬億市場開閘

2021年1月5日,“與時間結盟”吃貨大陸三周年年會在杭州千島湖舉辦,來自傳統餐飲行業及前沿區塊鏈行業的百余位企業家共聚一堂,以吃貨大陸資產上鏈成果為研究對象,共同探討餐飲資產上鏈的趨勢及機遇.

1900/1/1 0:00:00
DEX:XT關于恢復 XTZ、BSV、DOT充提的公告

尊敬的XT用戶: XTZ、BSV、DOT錢包升級維護已完成,XT已恢復XTZ、BSV、DOT的充值與提幣業務。給您帶來的不便,請您諒解。感謝您對XT.com的支持與信任.

1900/1/1 0:00:00
ads