什么是可升級(jí)的智能合約腰池?
你可能知道隙疚,智能合約是所有可編程區(qū)塊鏈(如以太坊上)的一個(gè)重要組成部分壤追。通過確保事情按照預(yù)定的規(guī)則運(yùn)行,智能合約強(qiáng)制執(zhí)行秩序供屉。沒有智能合約行冰,就沒有加密代幣、NFT贯卦,也沒有DApps资柔。但是,什么是可升級(jí)的智能合約撵割?嗯贿堰,首先,你需要注意啡彬,在這種情況下羹与,"可升級(jí) "這個(gè)詞并不意味著可變異。EVM的基本規(guī)則之一是庶灿,一旦合同被部署纵搁,它就不能被改變。相反往踢,可升級(jí)的智能合約使用特殊的代理模式腾誉。后者涉及部署代理合同和執(zhí)行合同(邏輯合同)。
為什么要使智能合約達(dá)到可升級(jí)
智能合約的特點(diǎn)之一就是部署到鏈上之后不能修改峻呕,這一機(jī)制使得合約的交互方都可以信任合約利职。但也帶來了一系列的問題,并且如果已部署的合約發(fā)現(xiàn)漏洞瘦癌,也是無法修復(fù)的猪贪。假如發(fā)現(xiàn)了bug,致命性的讯私,必須修復(fù)热押,那如何處理? 就是使用合約達(dá)到可升級(jí)優(yōu)化才能滿足需求斤寇。
可升級(jí)智能合約如何工作桶癣?
看上面的示意圖,你可以看到用戶通過代理合同與邏輯合同進(jìn)行互動(dòng)娘锁。由于代理合同能夠存儲(chǔ)邏輯合同的地址鬼廓,這才成為可能。然后致盟,我們通過部署一個(gè)新的邏輯合約來整合升級(jí)碎税。當(dāng)然尤慰,我們也需要在代理合同中更新邏輯合同的相關(guān)值,以實(shí)際實(shí)現(xiàn)升級(jí)雷蹂。
有許多代理模式可用伟端,它們可以用來創(chuàng)建可升級(jí)的合約。此外匪煌,雖然也有很多類型的代理模式责蝠,但大多數(shù)代理模式都使用transparent透明代理和UUPS(通用可升級(jí)代理標(biāo)準(zhǔn))。幸運(yùn)的是萎庭,這兩種類型在OpenZeppelin也有提供霜医,這讓開發(fā)者的工作變得簡(jiǎn)單了許多。此外驳规,這也是一個(gè)捷徑肴敛,在我們進(jìn)行一個(gè)例子項(xiàng)目時(shí),你會(huì)了解更多吗购。
透明代理與UUPS代理
如上所述医男,透明和UUPS代理模式是最常見的兩種類型。雖然這兩種類型都遵循相同的基本原則(如上所述)捻勉,但它們的設(shè)計(jì)卻截然不同镀梭。因此,我們需要對(duì)它們進(jìn)行快速比較踱启。以下是兩種代理模式類型各自的一些主要特征:
透明代理模式類型:
~升級(jí)由代理合同處理
~部署成本更高
~易于維護(hù)
UUPS 代理模式類型:
~升級(jí)由實(shí)施合同處理报账。這也意味著您需要將升級(jí)功能實(shí)現(xiàn)到實(shí)現(xiàn)合同中。否則埠偿,您將無法升級(jí)您的智能合約
~部署更便宜
~它使維護(hù)更具挑戰(zhàn)性
可升級(jí)智能合約案例
Params.sol 邏輯合約
部署后的合約地址:0x2CC6F64C688B0f9585B2fF4134420A5B74faD836笙什, initialize方法對(duì)應(yīng)的code為0x8129fc1c(部署代理合約的時(shí)候會(huì)用到)
ProxyAdmin.sol 管理合約
部署后的合約地址:0xcCFB00D3dd840dea0E4E258A07F870344d0fe9A4
TransparentUpgradeableProxy.sol 代理合約,DAPP直接交互的合約地址
部署需要參數(shù)胚想,如下:
~_LOGIC:邏輯合約地址,這里為 0x2CC6F64C688B0f9585B2fF4134420A5B74faD836 (Params.sol 合約部署地址)
~ADMIN_:管理合約地址芽隆,這里為 0xcCFB00D3dd840dea0E4E258A07F870344d0fe9A4 (ProxyAdmin.sol 合約部署地址)
~_DATA:邏輯合約初始化方法調(diào)用數(shù)據(jù)浊服,這里為0x8129fc1c(Params.sol initialize方法code)(只調(diào)用initialize方法,initialize方法沒有入?yún)⑴哂酰绻袇?shù)也是支持的)
部署后地址為:0xfa01ae0B2854E1F7496F879b82547a7091Bd74d5
可以使用web3測(cè)試合約是否部署成功:
至此可升級(jí)合約部署完成牙躺。
合約升級(jí)
ParamsV2.sol 升級(jí)后的邏輯合約
部署后的合約地址:0xeC05F7fFf671ae6c8368432AA8d3499D53B4F967
調(diào)用ProxyAdmin進(jìn)行升級(jí)
ProxyAdmin提供兩個(gè)方法進(jìn)行升級(jí)
~upgrade,需要傳入proxy地址腕扶,新的邏輯實(shí)現(xiàn)地址
~upgradeAndCall孽拷,需要傳入roxy地址,新的邏輯實(shí)現(xiàn)地址半抱,初始化調(diào)用數(shù)據(jù)
本例中脓恕,由于數(shù)據(jù)是保存在代理合約中膜宋,這份數(shù)據(jù)已經(jīng)初始化過了,不需要再初始化炼幔,所以調(diào)用upgrade方法即可秋茫,參數(shù)如下:
~proxy: 0xfa01ae0B2854E1F7496F879b82547a7091Bd74d5
~implementation: 0xeC05F7fFf671ae6c8368432AA8d3499D53B4F967
至此,合約升級(jí)完畢乃秀。
測(cè)試升級(jí)后的合約肛著,同理使用代理合約調(diào)用新的合約
dapp鏈接:https://www.chainpip.com/dapp-view/6752
原文鏈接(含可復(fù)制代碼):https://www.chainpip.com/dynamic/234