首页 > 其他分享 >合约的代理与升级

合约的代理与升级

时间:2024-02-06 15:45:36浏览次数:26  
标签:upgrade implementation 代理 升级 address msg 合约

合约主要有3种代理模式:

一、透明代理Transparent

contract TransparentAdminUpgradeableProxy {
    address implementation;
    address admin;

    fallback() external payable {
        require(msg.sender != admin);
        implementation.delegatecall.value(msg.value)(msg.data);
    }

    function upgrade(address newImplementation) external {
        if (msg.sender != admin) fallback();
        implementation = newImplementation;
    }
}

这种模式直观好理解,代理合约负责升级,实现合约负责具体逻辑。

二、UUPS

// 代理合约
contract UUPSProxy { address implementation; fallback() external payable { implementation.delegatecall.value(msg.value)(msg.data); } }
// 实现合约要extend抽象接口 abstract contract UUPSProxiable { address implementation; address admin; function upgrade(address newImplementation) external { require(msg.sender == admin); implementation = newImplementation; } }

代理合约是空的,几乎不包含任何逻辑;实现合约既要有具体业务逻辑,还要有升级逻辑。

升级时,调用代理合约的upgrade方法, 会deletegatecall到实现合约的upgrade方法; 因为delegate实现合约会运行在代理合约的上下文中,所以实现合约的upgrade方法修改implementation属性,实际上就修改了代理合约的implementation属性。

三、钻石模式

1个代理合约,会有多份实现合约

  透明代理 UUPS 钻石模式
优点 容易理解 gas费用低  
缺点

运行gas费高,每次函数调用,都要从存储中找admin

代理部署gas费高,

新代理合约必须记得实现upgrade,否则再也无法升级  
openzepplin实现方式      

 

参考:https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades

标签:upgrade,implementation,代理,升级,address,msg,合约
From: https://www.cnblogs.com/johnchow/p/18009826

相关文章

  • 通过squid将本地作为代理让不可联网的远端服务器联网
    一种方法 https://unix.stackexchange.com/questions/116191/give-server-access-to-internet-via-client-connecting-by-ssh以上方法在我这里不太行。尝试了另一种方式,连上了:1、远端服务器需要能ping到我们本地ip,windows通过ipconfig查看。2、本地的squid软......
  • H3C 设备升级与降级固件版本
    H3C设备升级与降级固件版本华三路由器软件版本为Version7.1.064,Release0809P25可通过华三官网下载中调指定版本版本软件下载地址:https://www.h3c.com/cn/d_202006/1300612_30005_40.html下载账号:yx800密码:01230123降级步骤和升级步骤一样已下载的软件版本文件可通过f......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙OTA空中升级讲解(二)
    -------------------------------------------------------------------------------------------------------------------------------------基于前面的蓝牙OTA空中升级(一)的基础上,这里将以BLE_UART为例,将BLE_UART实现带OTA功能的程序,依然是方式二不带库升级方式。并且扩大APP的......
  • 期权认购合约-买方策略
    最近将期权认购合约的买卖方策略分析了比较多的内容。本篇对买方策略进行总结。该策略可简单描述为:通过长期持有合适杠杆率、合适的综合成本的期权认购合约,来达到牛市跟踪指数涨跌的效果。为了节约成本(负Alpha),我们需要对所有期权的综合Alpha进行测算。并同时与期货策略对比,了......
  • Nginx--平滑升级
    在不中断服务的情况下,新的请求也不会丢失,使用新的nginx可执行程序替换旧的 1 查看老版本的编译选项[root@localhost~]#nginx-Vnginxversion:nginx/1.16.0builtbygcc4.8.520150623(RedHat4.8.5-44)(GCC)builtwithOpenSSL1.0.2k-fips26Jan2017TLSSNI......
  • js 用户代理检测
    Opera在用户代理字符串方面引发争议最大的一个浏览器就是Opera。Opera默认的用户代理字符串是所有现代浏览器中最符合逻辑的,因为它正确标识了自己和版本。在Opera8之前,其用户代理字符串都是这个格式:比如,WindowsXP上的Opera7.54的字符串是这样的:Opera8发布后,语言标记从......
  • 鱼和熊掌如何兼得?一文解析 RDS 数据库存储架构升级
    在2023年云栖大会上,阿里云数据库产品事业部负责人李飞飞在主题演讲中提到,瑶池数据库推出“DB+存储”一体化能力,结合人工智能、机器学习、存储等方法和创新能力,实现BufferPoolExtension能力和智能冷温热数据分层能力。在大会的《云数据库RDS年度发布与最佳实践》演讲中,阿里......
  • 如何使用Truffle在VSCode中调试solidity合约
    简介Truffle是以太坊最流行的开发框架,能够在本地编译、部署智能合约,使命是让开发更容易。本文以fibonacci作为实例进行调试参考文档https://trufflesuite.com/docs/truffle/how-to/debug-test/use-the-truffle-debugger/https://trufflesuite.com/guides/debugger-variable-i......
  • Linux服务器升级GLIBC失败导致shell不可用的问题解决经历
    转自https://blog.csdn.net/u010549608/article/details/126281354?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170696599716800182728626%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170696599716800182728626&biz_i......
  • [Java]静态代理、动态代理(基于JDK1.8)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18002823出自【进步*于辰的博客】参考笔记一,P83;笔记二,P75.4。目录1、静态代理1.1概述1.2静态代理的两种形式1.2.1面向接口1.2.2面向继承2、动态代理2.1什么是动态代......