{"content":{"title":"什么是可升级合约","body":"# **什么是可升级的智能合约？**\r\n你可能知道，智能合约是所有可编程区块链（如以太坊上）的一个重要组成部分。通过确保事情按照预定的规则运行，智能合约强制执行秩序。没有智能合约，就没有加密代币、NFT，也没有DApps。但是，什么是可升级的智能合约？嗯，首先，你需要注意，在这种情况下，\"可升级 \"这个词并不意味着可变异。EVM的基本规则之一是，**一旦合同被部署，它就不能被改变**。相反，可升级的智能合约使用特殊的代理模式。后者涉及部署代理合同和执行合同（逻辑合同）。\r\n\r\n![图片1.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/VFTODkAM6349239ee87eb.png)\r\n\r\n# **为什么要使智能合约达到可升级**\r\n智能合约的特点之一就是部署到链上之后不能修改，这一机制使得合约的交互方都可以信任合约。但也带来了一系列的问题，并且如果已部署的合约发现漏洞，也是无法修复的。假如发现了bug，致命性的，必须修复，那如何处理？ 就是使用合约达到可升级优化才能满足需求。\r\n\r\n# **可升级智能合约如何工作？**\r\n看上面的示意图，你可以看到用户通过代理合同与逻辑合同进行互动。由于代理合同能够存储逻辑合同的地址，这才成为可能。然后，我们通过部署一个新的逻辑合约来整合升级。当然，我们也需要在代理合同中更新逻辑合同的相关值，以实际实现升级。\r\n有许多代理模式可用，它们可以用来创建可升级的合约。此外，虽然也有很多类型的代理模式，但大多数代理模式都使用transparent 透明代理和UUPS（通用可升级代理标准）。幸运的是，这两种类型在OpenZeppelin也有提供，这让开发者的工作变得简单了许多。此外，这也是一个捷径，在我们进行一个例子项目时，你会了解更多。\r\n\r\n![图片2.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/mSZ03gFV634923aadb153.png)\r\n\r\n\r\n# **透明代理与UUPS代理**\r\n如上所述，透明和 UUPS 代理模式是最常见的两种类型。虽然这两种类型都遵循相同的基本原则（如上所述），但它们的设计却截然不同。因此，我们需要对它们进行快速比较。以下是两种代理模式类型各自的一些主要特征：\r\n\r\n**透明代理模式类型：**\r\n升级由代理合同处理\r\n部署成本更高\r\n易于维护\r\n\r\n**UUPS 代理模式类型：**\r\n升级由实施合同处理。这也意味着您需要将升级功能实现到实现合同中。否则，您将无法升级您的智能合约\r\n部署更便宜\r\n它使维护更具挑战性\r\n\r\n![图片3.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/Gg57lmw2634923b776ef2.png)\r\n\r\n# **可升级智能合约案例**\r\n**Params.sol 逻辑合约**\r\n\r\n![图片4.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/bXdRpgQ3634923c4e890b.png)\r\n\r\n部署后的合约地址：0x2CC6F64C688B0f9585B2fF4134420A5B74faD836， initialize方法对应的code为0x8129fc1c（部署代理合约的时候会用到）\r\n**ProxyAdmin.sol 管理合约**\r\n\r\n![图片5.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/uwlfWBd4634923d12205c.png)\r\n\r\n![图片6.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/qiOJ0qPd634923d14fb00.png)\r\n\r\n![图片7.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/UGOTJk1J634923d150d4c.png)\r\n\r\n\r\n部署后的合约地址：0xcCFB00D3dd840dea0E4E258A07F870344d0fe9A4\r\n**TransparentUpgradeableProxy.sol 代理合约，DAPP直接交互的合约地址**\r\n\r\n\r\n![图片8.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/F84MktPg634923e12e49b.png)\r\n\r\n![图片9.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/e5g98LVd634923e11efd6.png)\r\n\r\n![图片10.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/ikXHqpVu634923e132cf6.png)\r\n\r\n![图片11.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/WO7A1dWh634923e158a4a.png)\r\n\r\n部署需要参数，如下:\r\n_LOGIC: 逻辑合约地址，这里为 0x2CC6F64C688B0f9585B2fF4134420A5B74faD836 （Params.sol 合约部署地址）\r\nADMIN_：管理合约地址，这里为 0xcCFB00D3dd840dea0E4E258A07F870344d0fe9A4 (ProxyAdmin.sol 合约部署地址)\r\n_DATA：逻辑合约初始化方法调用数据，这里为0x8129fc1c(Params.sol initialize方法code)（只调用initialize方法，initialize方法没有入参，如果有参数也是支持的）\r\n部署后地址为：0xfa01ae0B2854E1F7496F879b82547a7091Bd74d5\r\n可以使用web3测试合约是否部署成功：\r\n\r\n\r\n![图片12.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/hP0jrHTB634923f15ab9f.png)\r\n\r\n![图片13.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/ea25GXFL634923f175d6b.png)\r\n\r\n![图片14.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/5W92el7Q634923f15bc73.png)\r\n\r\n![图片15.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/bJWAwVN9634923f16f479.png)\r\n\r\n\r\n至此可升级合约部署完成。\r\n\r\n# **合约升级**\r\n**ParamsV2.sol 升级后的逻辑合约**\r\n\r\n![图片16.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/2wmg9ZY8634923fd2ffbf.png)\r\n部署后的合约地址：0xeC05F7fFf671ae6c8368432AA8d3499D53B4F967\r\n\r\n**调用ProxyAdmin进行升级**\r\nProxyAdmin提供两个方法进行升级\r\nupgrade，需要传入proxy地址，新的逻辑实现地址\r\nupgradeAndCall，需要传入roxy地址，新的逻辑实现地址，初始化调用数据\r\n\r\n本例中，由于数据是保存在代理合约中，这份数据已经初始化过了，不需要再初始化，所以调用upgrade方法即可，参数如下:\r\nproxy: 0xfa01ae0B2854E1F7496F879b82547a7091Bd74d5\r\nimplementation: 0xeC05F7fFf671ae6c8368432AA8d3499D53B4F967\r\n至此，合约升级完毕。\r\n**测试升级后的合约，同理使用代理合约调用新的合约**\r\n\r\n![图片17.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/HUQi0xIv6349240b94ab6.png)\r\n\r\n![图片18.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/9hLtBiXk6349240b9416e.png)\r\n\r\ndapp链接：https:\/\/www.chainpip.com\/dapp-view\/6752\r\n\r\n原文链接（含可复制代码）：https:\/\/www.chainpip.com\/dynamic\/234"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/7546","address":null},"history":null,"timestamp":1665737970,"version":1}