原文鏈接
當使用OpenZeppelinUpgrades編寫可升級合約時,有一些在編寫Solidity代碼時需要記住一些注意事項。
值得一提的是,這些限制源于以太坊虛擬機的工作方式,并且適用于所有使用可升級合約的項目,而不僅僅是OpenZeppelinUpgrades。
初始化器
在編寫Solidity合約使用OpenZeppelinUpgrades,無需任何修改,只需要修改構造函數。由于基于代理的可升級性系統的要求,可升級合約中不能使用構造函數。要了解這個限制背后的原因,請查看代理。
這意味著,當使用OpenZeppelin可升級的合約時,您需要將其構造函數改為一個常規函數,通常命名為initialize,在那里執行所有的初始化邏輯。
//NOTE:Donotusethiscodesnippet,it'sincompleteandhasacriticalvulnerability!pragmasolidity^0
}
然而,雖然Solidity確保一個構造函數constructor在合約的生命周期內只被調用一次,但一個普通函數可以被多次調用。為了防止一個合約被多次初始化,你需要添加一個檢查來確保初始化函數只被調用一次。
Nansen報告:FTX和Alameda持有的大量FTT從未進入流通市場,這也成為Alameda一大弱點:11月18日消息,據Nansen于11月17日發布的《鏈上分析:Alameda與FTX的崩塌》報告,FTX和Alameda從一開始就有著緊密的聯系。FTX的平臺幣FTT,從被創建的第一天起就涉及Alameda。兩者壟斷了FTT總供應量中的大部分代幣,這部分從未真正進入流通市場。Alameda、FTX的初步成功,以及FTT的快速上漲都很可能提升了Alameda資產負債表中的資產價值。其中的FTT頭寸很可能被Alameda用作抵押借款。如果借來的資金用于非流動性投資,FTT將成為Alameda的一大弱點。
隨著5月Terra/UST的崩潰,流動性緊缺接踵而至,許多債權人在3AC和Celsius崩潰后開始收回貸款。Alameda需要依然愿意用現有的抵押品發放貸款的資金來源,來提供流動資金。Alameda在FTX上存放了價值約30億美元的FTT,其中大部分一直保留到事件發生后。[2022/11/18 13:20:42]
//contracts/MyContract
}
由于這種模式在編寫可升級合約時非常常見,OpenZeppelinUpgrades提供了一個Initializable基礎合約,它有一個initializermodifier來處理這個問題。
Arbitrum橋接存儲突破190萬枚ETH,總價值超25億美元:金色財經報道,據 Dune Analytics 數據顯示,以太坊 Layer2 擴容解決方案 Arbitrum 跨鏈橋接存儲總價值 TVB 已突破 190 萬枚 ETH,本文撰寫時為 1,900,671 ETH(按照當前ETH價格計算超過 25 億美元),參與橋接交易的用戶數量為 383,242 個。此外,當前其他以太坊 Layer2 跨鏈橋接存儲總價值分別為:Optimism(402,470枚ETH,約合530,254,225美元)、zkSync(167,114枚ETH,約合220,172,695美元)、StarkNet(1,363枚ETH,約合1,795,752.5美元)。[2022/10/9 12:50:10]
//contracts/MyContract
}
構造函數constructor和普通函數的另一個區別是,Solidity負責自動調用一個合約的所有基類的構造函數。在編寫初始化器initializer時,你需要特別注意手動調用所有父合約的初始化器initializer。
//contracts/MyContract
}contractMyContractisBaseContract{uint256publicx;functioninitialize(uint256_x)publicinitializer{BaseContract
Cream Finance:BNB Chain上流動性危機是由Boosted Savings計劃所致:8月22日消息,DeFi借貸協議Cream Finance回 BNB Chain上流動性危機事件稱,該事件是由于去年啟動的Boosted Savings計劃所致。彼時Cream Finance作為BNB Chain的驗證節點,通過將借貸池內未使用的BNB質押進驗證節點進行投票讓流動性提供者可以額外獲得驗證節點的收益,但近期幣安取消了Cream Finance驗證節點的投票權。Cream Finance表示其目前正在取消該計劃以恢復協議健康,預計需要7天時間。[2022/8/22 12:41:12]
}
使用可升級的智能合約庫
請記住,這個限制不僅會影響你的合約,還會影響你從庫中導入的合約。例如考慮OpenZeppelin合約中的ERC20:該合約在其構造函數中初始化了token的名稱、符號和小數位數。
//
這意味著你不應該在你的OpenZeppelinUpgrades項目中使用這些合約。相反,請確保使用...}
無論是使用OpenZeppelin合約還是其他智能合約庫,都要確保軟件包被設置為處理可升級合約。
在合約中了解更多關于OpenZeppelin合約可升級的信息:Contracts:UsingwithUpgrades。
加拿大養老基金已注銷2億加元的Celsius投資:金色財經報道,加拿大養老基金Caisse de dép?t et placement du Québec (CDPQ) 周三透露,它已注銷了2億加元的Celsius投資。 首席執行官Charles Emond表示,加密貨幣行業正在轉型,該基金“來得太早了”。出于謹慎考慮,他們已經注銷了投資。
此前2021年10月12日消息,加密貨幣借貸平臺Celsius Network完成4億美元股權融資,WestCap和Caisse de dép?t et placement du Québec(CDPQ)領投,投后估值超過30億美元。[2022/8/18 12:32:14]
避免在字段聲明中使用初始值
Solidity允許在合約中聲明字段時為其定義初始值。
contractMyContract{uint256publichasInitialValue=42;//equivalenttosettingintheconstructor}
這相當于在構造函數中設置了這些值,因此,對于可升級的合約是無效的。請確保所有初始值都在如下所示初始化函數中設置;否則,任何可升級的實例都不會設置這些字段。
contractMyContractisInitializable{uint256publichasInitialValue;functioninitialize()publicinitializer{hasInitialValue=42;//setinitialvalueininitializer}}
ENS NFT近24小時交易額增幅超150%:金色財經消息,據OpenSea數據顯示,以太坊域名服務(ENS)NFT近24小時交易額為567.49ETH,24小時交易額增幅達150.74%。近24小時交易額排名位列OpenSea第2。[2022/7/25 2:35:06]
注意定義_常量_狀態變量還是可以的,因為編譯器并沒有為這些變量預留存儲槽,每出現一次就會被相應的常量表達式所替代。所以下面的內容在OpenZeppelinUpgrades中仍然可以使用:
contractMyContract{uint256publicconstanthasInitialValue=42;//defineasconstant}
從合約代碼中創建新實例
當從合約代碼中創建一個新的合約實例時,這些創建直接由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:CONTRAACTNTRFalcon SwapsUnited Emirate Decentralized CoinImpactMarketINTR
尊敬的ZT用戶: ZT理幣寶將于2021年1月15日10:00上線GNS-180日理幣活動。采用“固定理幣“理幣類型,為用戶帶來長期穩定收益,用戶可根據自身需求進行參與.
1900/1/1 0:00:00我并不是一個對時事不感興趣的人,但是在這個公眾號里從來不談,因為我相信專業主義。走出校門二十年以來,我干過好幾個行業,談不上有什么成績,但深知一個道理,任何一個實踐性領域,八成以上的“真知”.
1900/1/1 0:00:00前言 本文是這系列文章的第七篇文章,第一篇文章介紹了IMF報告里的四個場景,第二篇文章分析了這些場景,第三篇文章則針對報告中的第四個場景及引起的宏觀金融后果展開討論.
1900/1/1 0:00:00尊敬的用戶: Hotbit即將在開啟VRX數字資產服務。 具體安排如下: 充值時間:2021年01月14日16:00交易時間:2021年01月14日18:00(香港時間)提現時間:2021年01.
1900/1/1 0:00:00幣海引路人:BTC早間多頭強勢反擊再上4萬能否實現行情走勢莫測,就像未卜是人生,總有跌宕起伏的時候,交易如同攀爬,只有登上絕頂,才能享受奇觀勝景;若遇難而退,中途放棄,只會與機會擦肩而過.
1900/1/1 0:00:00加密資產研究機構CryptoBriefing推出的付費會員服務「Simetri」發布報告稱,PARSIQ擁有有效的產品、企業客戶,并且在與一些最流行的DeFi協議進行集成.
1900/1/1 0:00:00