码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • solidity部署和验证代理合约


    相关合约

    使用openzeppelin的两个代理辅助合约

    ProxyAdmin.sol

    TransparentUpgradeableProxy.sol

    地址

    openzeppelin-contracts/contracts/proxy/transparent at master · OpenZeppelin/openzeppelin-contracts

    部署逻辑合约

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract Web03{
        constructor() public {
    
        }
        string public constant url = 'web03.cn';
        mapping (uint => string) public names;
        uint public namesN;
        function addName(string memory _name) public {
            names[namesN++] = _name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    交易地址:

    https://rinkeby.etherscan.io/tx/0xd11215fa054742276d378917b76093b51dd74124735d8bfffe14928f25d0fc07

    合约地址:0xd37C4f32816Ac29a839ca2a854726432080D14c4

    部署管理合约ProxyAdmin.sol

    pragma solidity ^0.8.0;
    import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/transparent/ProxyAdmin.sol";
    
    contract Web03ProxyAdmin is ProxyAdmin{
        constructor() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    交易地址:https://rinkeby.etherscan.io/tx/0xfabbdfb4fc9a0c0196a04d3fd1bfceafc23cc78e0351155a71415b37b91bd4b2

    合约地址:0x60db1202a8c2d2b60d628a03741fed1920bf25f2

    部署代理合约TransparentUpgradeableProxy.sol

    pragma solidity ^0.8.0;
    import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
    
    contract Web03Proxy is TransparentUpgradeableProxy{
        constructor(address _logic,address admin_,bytes memory _data) TransparentUpgradeableProxy(_logic, admin_, _data){
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参数解析

    • address _logic 逻辑合约地址【0xd37C4f32816Ac29a839ca2a854726432080D14c4】
    • address admin_ 管理合约地址【0x60db1202a8c2d2b60d628a03741fed1920bf25f2】
    • bytes memory _data 发布逻辑合约时的参数字节码,0x表示无参数【0x】

    交易地址:https://rinkeby.etherscan.io/tx/0xbeb7bf1cae9b8c37035fd251080baefb9fb1d9d72c5498997685c2a429af1318

    合约地址:0x82f4728Aa261eBd7887367096BCA4C15356CF188

    验证合约

    为了看到直观效果,选择验证合约

    如何验证请查看往期文章《solidity合约验证》:https://web03.cn/blog/299

    验证之后区块链浏览器在代理合约看不到逻辑合约的方法?

    在 代码tab 选择More Option 再选择Is this a proxy?

    https://web03-1252477692.cos.ap-guangzhou.myqcloud.com/blog/images/QQ%E6%88%AA%E5%9B%BE20220624110056.png

    他会自动找到你的逻辑合约,点击Verify即可

    https://web03-1252477692.cos.ap-guangzhou.myqcloud.com/blog/images/QQ%E6%88%AA%E5%9B%BE20220624110026.png

    升级合约

    -调用合约存数据,预验证代理数据-

    先调用代理合约方便验证代理功能

    调用addName,往里面添加一组数据

    https://web03-1252477692.cos.ap-guangzhou.myqcloud.com/blog/images/QQ%E6%88%AA%E5%9B%BE20220624111317.png

    此时,names方法也是可以查到

    https://web03-1252477692.cos.ap-guangzhou.myqcloud.com/blog/images/QQ%E6%88%AA%E5%9B%BE20220624111309.png

    1、发布新的逻辑合约

    contract Web03V2{
        constructor() {
    
        }
        string public constant url = 'web03.cn';
        mapping (uint => string) public names;
        uint public namesN;
        uint public constant D = 1;
        function addName(string memory _name) public {
            names[namesN++] = _name;
        }
        function addD(uint _d) public pure{
           D + _d;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    交易地址:https://rinkeby.etherscan.io/tx/0x887c2d2a5f7ebdf1c1b27902a7a03b3cb4da87102797a941909b93c595b09cbb

    合约地址:0xdFEaA297C19622892a07e4Da428b377aDA10f0AD

    2、调用升级方法

    调用管理合约方法

    1. upgrade,需要传入(代理合约地址,新的逻辑合约地址)
    2. upgradeAndCall,需要传入(代理合约地址,新的逻辑合约地址,初始化调用数据,支付金额)

    当前升级未涉及初始化数据和支付金额,所以调用upgrade即可

    upgrade(0x82f4728Aa261eBd7887367096BCA4C15356CF188, 0xdFEaA297C19622892a07e4Da428b377aDA10f0AD)

    升级交易地址:https://rinkeby.etherscan.io/tx/0x9de289d9a3fb021cdb04fa08301a706c3a7e1b52da5aa5c9f13cfb812c775a9f

    -升级后,查看并验证数据-

    https://web03-1252477692.cos.ap-guangzhou.myqcloud.com/blog/images/QQ%E6%88%AA%E5%9B%BE20220624112429.png

    可以看到,升级后的合约新加的方法D和方法addD都已经出现(addD书写错误,忽略,但是不影响)

    查询names[0]=零三

    升级前的数据依旧保留,说明代理成功

    • 数据是存在代理合约的,这份数据在部署代理时初始化,后面只更改了逻辑合于地址,SO 数据一直保存着
  • 相关阅读:
    【具身智能模型2】RT-1: Robotics Transformer for Real-World Control at Scale
    iview踩坑日记(一)——DatePicker
    ifconfig、ifup和ifdown命令详解
    62. 解释一下MySQL中内连接,外连接等的区别(MySQL面试第五弹)
    jQuery、vue、小程序、uni-app中的本地存储数据和接受数据是什么?
    【database】审计/记录mysql、postgres、sqlserver、oracle数据库的ddl事件和语句
    LeetCode-328. Odd Even Linked List [C++][Java]
    《SpringCloud Alibaba》实战
    阿里云k8s环境下,因slb限额导致的发布事故
    牛客刷题记录(常见笔试题)
  • 原文地址:https://blog.csdn.net/weixin_43840202/article/details/125442756
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号