概述合约部署在链上之后,代码是不可变的,这样做既有优点也是缺点 优点:安全,用户知道合约内容,会知道发生什么;(合约开源) 缺点:如果合约中有Bug,既不能修改也不能升级,只能部署新合约,但是新合约和旧合约的地址不一样,而且合约的数据也需要花费大量的gas进行迁移,成本相对较大! 那么有没有办法合约部署之后进行修改和升级呢,答案就是代理模式。原理代理模式将合约数据和逻辑分开,分别保存在不同的合约中。以下的图可以看出,数据(状态变量)保存在代理合约中,而逻辑函数保存在逻辑合约中。代理合约通过delegatecall,将函数调用全权委托给逻辑合约(Implementation)执行,再把最终的结果返回给调用者(caller)优势可升级:当我们需要升级合约的逻辑时,只需要将代理合约指向新的逻辑合约省gas: 如果多个合约复用一套逻辑,我们只需要部署一个逻辑合约,然后在部署多个只保存数据的代理合约,指向逻辑合约。代码演示// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.20; // 代理合约 contract Proxy {...