本文作者:bixia1994
參考鏈接:UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity
EIP-1967
在UUPS中,其實現了EIP-1967
作為一個實現EIP-897的代理合約,其在代理合約中會實現這兩個函數。
UUPSEIP-1822
EIP-1822討論的合約升級模式與Openzeppelin的透明合約升級模式的不同點在于:EIP-1822的代理合約只讀取實現合約的地址,并將所有的方法都代理給實現合約,包括修改實現合約地址的邏輯部分也在實現合約里。而透明合約升級模式中,proxy合約管理著實現合約的地址,要實現合約升級,只需要在proxy合約中更改實現合約的地址即可。其他的邏輯代理給實現合約。
也就是說EIP-1822的實現合約既包含了普通的業務邏輯處理,更包含了自身的升級邏輯處理。簡單來講就是EIP-1822的實現合約部分,都需要繼承自一個公共的可升級實現合約:proxiable
Shen ZhouUnion特邀嘉賓Anthony:構建基于實體商業的數字經濟生態是化解當前市場窘境的最佳答案:據官方消息,2020年12月10日由神州交易所所舉辦的神州交易所“CNU公鏈上線發布會”杭州站正式啟動。
作為此次會議的主題“CNU公鏈上線發布會”,Shen ZhouUnion特邀嘉賓Anthony表示,區塊鏈4.0時代開創者,未來將會在Shenzhou Union底層交易所技術平臺上實現普及性區塊鏈去中心化商業落地應用,互聯網文明和實體商業有機結合是數字經濟的時代特色,充分發揮節點經濟和數字經濟雙重定位,讓實體商業與數字市場實現真正融合,構建基于實體商業的數字經濟生態,通過技術、資金、資源等多元扶持,打造區塊鏈項目新標桿,是化解當前市場窘境的最佳答案,也是Shenzhou Union的初衷所在。[2020/12/10 14:49:53]
functionupgradeToAndCall(addressnewImplementation,bytesmemorydata)externalpayablevirtual{}function_authorizeUpgrade(addressnewImplementation)internalonlyOwner(){}
動態 | Tuur Demeester:影響力不等于洞察力:數字貨幣經濟學家Tuur Demeester發布推文評價Coindesk評選的2018年度加密行業最有影響力的十大人物。Demeester稱,要注意,影響力并不等于洞察力。學習基礎知識、做盡職調查和運用嘗試才是最重要的事。[2019/1/2]
其中,openzeppelin通過回滾檢測,來檢查是否升級成功,避免了EIP-1822中遇到的問題:
function_upgradeToAndCallSecure(addressnewImplementation,bytesmemorydata,boolforceCall)internal{//第一步:設置newImpl地址到實現合約地址addressoldImplementation=_getImplementation();_setImplementation(newImplementation);//第二步:針對新的實現合約地址進行初始化if(data
聲音 | Tuur Demeester:以太坊是烏托邦 無法解決任何實質性問題:據CCN報道,數字貨幣經濟學家Tuur Demeester近日在社交網站上表示,他認為以太坊無法提供任何安全性,也無法解決其可擴展性問題,Casper協議至多是一種理論上的解決方案。雖然以太坊開發人員正在探索第二層解決方案,類似于比特幣的Lightning Network解決方案。但是,他懷疑主鏈發行的ERC20型令牌是否能與以太坊的第二層方案兼容。而對于以太坊意圖由PoW向PoS轉變,他表示,升級會改變系統的經濟性,PoW實際上是使比特幣成為可能的最大創新之一,因為審查漏洞導致PoS是不切實際的。V神向以太坊的追隨者們承諾了一個烏托邦,一個未經證實的未來。[2018/12/29]
//第三步:執行回滾檢查//PerformrollbacktestifnotalreadyinprogressStorageSlot
}
Openzepplin的實現漏洞分析
聲音 | Tuur Demeester:熊市中想買進的人很吵 被迫出售的人很安靜:數字貨幣經濟學家Tuur Demeester在推特上表示,熊市中想要 (別人) 買進的人很吵,被迫出售的人是很安靜的。[2018/10/16]
在上述的Openzeppelin的實現中,其通過回滾檢測避免了EIP-1822中遇到的問題:即升級到一個不滿足EIP-1822規范的合約時,此時代理合約和實現合約就完全被鎖死,無法繼續升級。但是其又引入了一個新的問題,即:回滾操作中事實上模擬了一遍新的實現合約地址中的upgradeTo操作,并且是通過delegatecall方式來進行調用。
通過delegatecall調用新合約地址的upgradeTo方法有什么問題呢?
查看黃皮書中關于delegatecall的定義為:
Message-callintothisaccountwithanalternativeaccounts'code,butpersistingthecurrentvaluesforsenderandvalue
聲音 | 經濟學家Tuur Demeester:區塊鏈是具有里程碑意義的發明:今日,經濟學家Tuur Demeester轉發趙長鵬推文消息稱:“在我的理解中,區塊鏈是一個高冗余數據庫,它可以永久存儲所有內容,并通過工作證明機制進行保護。我相信這是一項具有里程碑意義的發明,只是目前它的第一層應用有限。”趙長鵬此前所發推文內容為,“我還沒有遇到過理解區塊鏈技術但不相信它的人,你是區塊鏈的信徒嗎?”[2018/9/10]
thismeansthatthereceipientisinfactthesameaccountasatpersent,simplythatthecodeisoverwrittenandthecontextisalmostentirelyidentical
從黃皮書的定義來看,delegatecall事實上保存了當前賬戶的余額和msg
functionmint(addressto,uint256amount)publiconlyOwner{_mint(to,amount);}function_authorizeUpgrade(addressnewImplementation)internalonlyOwneroverride{}}
注意這里的TestToken是UUPS升級合約的實現合約部分,而不是代理合約部分。那么應該如何去做這個TestToken的POC呢?
POC
這里不能直接在malicious合約中的upgradeTo方法中寫selfdestruct,而是應該利用ForceCall部分的delegatecall,并通過寫入rollbackTesting
function_authorizeUpgrade(addressnewImplementation)internal{}}
討論
那么在openzeppelin的UUPS實現中,使用delegatecall來進行回滾測試有什么問題呢?
問題就是:
Address
}
上述openzeppelin實現的代碼中,最為核心的一條是理解:當delegatecall到一個selfdestruct方法后,程序所有的代碼都會被直接清空,不會繼續往下執行,也就不會去執行后面的require判斷條件。
然而在remix中執行時,發現delegatecall之后的require語句還是執行了:
這是不對的,需要進一步理解黃皮書中關于selfdestruct這個opcode的定義:
selfdestruct:Haltexecutionandregisteraccountforlaterdeletion
function_functionDelegateCall(addresstarget,bytesmemorydata)privatereturns(bytesmemory){require(AddressUpgradeable
當delegatecall到一個selfdestruct的方法時,其返回值為0,然后代碼繼續運行。如果此筆交易在后續的執行過程中成功,則上下文地址上的代碼將會被清空。如果該筆交易在后續的執行過程中失敗,則整體狀態會回滾。
參考資料
bixia1994-互聯網小工:https://learnblockchain.cn/people/3295
UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity:https://forum.openzeppelin.com/t/uupsupgradeable-vulnerability-post-mortem/15680
ContractsWizard-OpenZeppelinDocs:https://docs.openzeppelin.com/contracts/4.x/wizard
免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。
本文來源于非小號媒體平臺:
登鏈社區
現已在非小號資訊平臺發布105篇作品,
非小號開放平臺歡迎幣圈作者入駐
入駐指南:
/apply_guide/
本文網址:
/news/10378667.html
免責聲明:
1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場
上一篇:
每周編輯精選WeeklyEditors'Picks
鏈聞消息,據LedgerInsights報道,企業區塊鏈軟件公司R3在CordaCon2021大會上宣布,公司正在開發新的DeFi協議Obscuro.
1900/1/1 0:00:00COFIX/USDT新版流動性礦池模式)已正式上線,交易市場50%手續費收益將新增投入到流動獎金池中;Taker和Maker手續費即日起調整至0.3%.
1900/1/1 0:00:00尊敬的用戶: MEXC已按照計劃自2019年7月份起將平臺所有交易對交易手續費盈利部分的100%拿出來不定時從二級市場回購MX並在次月月初進行集中銷毀和公示.
1900/1/1 0:00:00自JAT上線以來,全球用戶、礦工以及生態合作伙伴規模迅速并持續增大,主鏈網絡全面升級勢在必行。為更好支持JAT全球用戶和JAT于全球的落地應用發展,全球區塊鏈公鏈網絡JAT(JumboAdver.
1900/1/1 0:00:00尊敬的用戶: BKEX平臺運營一切正常,所有服務都可正常使用,且用戶資產安全,請用戶以BKEX官方公告為準.
1900/1/1 0:00:00閃電網絡和雷電網絡看起來非常相近,它們有著基本相同的技術基因和奮斗目標,但又演繹著各自的生命軌跡,為不同的老板服務,閃電網絡是當之無愧的哥哥,老板是比特幣,而雷電網絡的主子是以太坊.
1900/1/1 0:00:00