智能合约升级原理02---UUPS升级部署示例

这篇具有很好参考价值的文章主要介绍了智能合约升级原理02---UUPS升级部署示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在“智能合约升级原理01---起源”中介绍了合约升级的主要有三种方式:
  1. Diamond Implementation       
  2. Transparent Implementation   
  3. UUPS Implementation             
我们将只关注最常用的Transparent和UUPS,本文通过一个代码示例学习UUPS方式,最后还将给出合约升级的注意事项。
示例说明:
第一个版本的业务合约 Box,内部一个value数据,实现读、取两个方法。
第二个版本Box,稍微修改下代码。
部署后将得到代理合约地址,供应用端访问该地址。业务合约Box版本升级并不会引起代理合约地址变动,因此应用端的访问地址是稳定不变的。
1 合约代码
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
contract Box is Initializable, OwnableUpgradeable, UUPSUpgradeable {
    function initialize() public initializer {
        __Ownable_init();
        __UUPSUpgradeable_init();
    }
    uint256 private value;
                          
    event ValueChanged(uint256 value);
    function store(uint256 _value) public {
        value = _value;
        emit ValueChanged(_value);
    }
    function retrieve() public view returns (uint256) {
        return value;
    }
    function _authorizeUpgrade(address newImplementation)
        internal
        onlyOwner
        override
    {}
}
2 部署智能合约
在Remix中创建新的合约文件Box.sol, 编译器版本指定为0.8.14, 编译通过。
在部署页面,Deploy按钮下方有三个可选项:
(1)DEPLOY WITH PROXY:   使用代理部署
(2)UPGRADE WITH PROXY: 使用代理升级
(3)PUBLISH TO IPFS:             发布到IPFS上
我们选择使用第一项,将自动创建代理合约,并使用代理合约部署业务合约。
uups proxy 布置,智能合约,1024程序员节,区块链
点击Deploy按钮后弹出提示框,含义是部署一个实现合约,连接到一个ERC1967代理合约,并且完成实现合约的初始化。直接点击“Proceed”。
uups proxy 布置,智能合约,1024程序员节,区块链

 文章来源地址https://www.toymoban.com/news/detail-607229.html

部署成功,在debug区域看到两笔交易,在左侧栏看到两个合约地址:
uups proxy 布置,智能合约,1024程序员节,区块链
BOX合约地址: 0xf8e81D47203A594245E36C48e151709F0C19fBe8
代理合约地址: 0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B
3测试代理合约
现在我们来测试下代理合约,看看是否能读写一个基本数据:
调用代理合约的store方法, 设置value=100
调用代理合约的retrieve方法, value=100
结果是成功的。这里就证实了我们只用操作代理合约就好,不再直接操作业务合约啦!
uups proxy 布置,智能合约,1024程序员节,区块链
4 升级业务合约
Box合约做个小小改动:
function retrieve() public view returns (uint256) { 
    // 修改方法 
    return value + 100; 
}
在部署页面,Deploy按钮下方有三个可选项,升级就选择第二项:
(2)UPGRADE WITH PROXY: 使用代理升级
第二项下方的“Use last deployed ERC1967 contract”,含义是使用最后一次部署的代理合约,这样就不用你手动填写代理合约地址啦。
uups proxy 布置,智能合约,1024程序员节,区块链
部署成功, 左侧任务栏看到又多出了两个合约地址,一个是新版本的Box合约,一个是原来的ERC1967代理合约,这个代理合约的地址是不会改变的。
uups proxy 布置,智能合约,1024程序员节,区块链
读取代理合约的retrieve方法,得到的数据是200,表明新的业务合约代码生效,原有数据也被保留下来了。
uups proxy 布置,智能合约,1024程序员节,区块链
大功告成,成功的实现了业务合约的UUPS升级测试。

到了这里,关于智能合约升级原理02---UUPS升级部署示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • conflux开发NFT智能合约(ERC721 & 工厂合约 & 可升级合约)

    以下场景可借鉴本文内容 需要创建很多合约 需要使用conflux代付机制(只需将工厂合约设置为代付,即可无限创建新合约) 合约想要有可升级的能力(如:特殊玩法 or 代码有bug) ERC-721 NFT 基于以上场景,需要三个主要合约实现 工厂合约 代理合约 逻辑合约 想要完全掌握本文

    2024年01月17日
    浏览(49)
  • 部署OpenZeppelin可升级合约

    使用OpenZeppelin升级插件部署的合约具备可升级的特性:可以升级以修改其代码,同时保留其地址,状态和余额。 可以迭代地向项目中添加新功能,或修复在线上版本中可能发现的任何错误。 创建一个新的npm项目 安装并初始化Truffle 安装Truffle升级插件 注意,可升级合约使用

    2023年04月08日
    浏览(34)
  • remix 在线编译部署合约示例

    一 准备工作 1.打开 Remix - Ethereum IDE 2. 启用或关闭需要的工具 1.选择需要编译的合约 2.进入编译页面,版本号选择必须大于等于当前合约使用的版本,点击Compile 3. 编译成功页面如图 三.部署 页面选择injected web3 即可连接本机的metamask(前提matemask已连接)

    2024年02月05日
    浏览(34)
  • 设计模式- 代理模式(Proxy Pattern)结构|原理|优缺点|场景|示例

                                        设计模式(分类)        设计模式(六大原则)        创建型(5种)         工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式     结构型(7种)      

    2024年04月24日
    浏览(42)
  • 基于openzeppelin编写solidity可升级的智能合约

            现代软件的设计原则是“敏捷开发,迅速迭代”,功能升级或bug修复是所有软件系统都要面对的问题。甚至可以说软件质量在很大程度上依赖于升级和修补源代码的能力。当然Dapp(去中心化应用)也不例外,尤其Dapp一切都是透明的,这使得任何级别的bug都会被成

    2024年01月18日
    浏览(48)
  • 11U 以太坊 ethereum OpenZeppelin : 升级智能合约

    • 升级中有什么 • 使用升级插件升级 • 升级如何运作 • 初始化 • 升级 • 测试 • OpenZeppelin Tutorials 教程 • Contact 联系方式 使用OpenZeppelin 升级插件部署的智能合约可以升级以修改其代码,同时保留其地址、状态和余额。这使您可以迭代地向项目添加新功能,或修复您在

    2023年04月08日
    浏览(47)
  • 区块链java开发智能合约nf(部署第一个NFT智能合约)

    手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约) 刚搞区块链开发真的是太累了,自己摸石头过河,动不动就报错,网上搜索错误,一律看不出什么问题,或者报错的信息太少,问同事同事不鸟,问领导,领导也烦,无奈,对于英文不好的我,只能被迫

    2024年02月12日
    浏览(52)
  • 部署智能合约到公链

    🍁 博主简介 :         🏅云计算领域优质创作者         🏅2022年CSDN新星计划python赛道第一名         🏅2022年CSDN原力计划优质作者         🏅阿里云ACE认证高级工程师         🏅阿里云开发者社区专家博主 💊 交流社区 :CSDN云计算交流社区欢迎您的

    2024年01月17日
    浏览(38)
  • BSC测试链部署智能合约

    在火狐浏览器下载一个小狐狸钱包插件 添加BSC测试网络 创建个账号即有了自己的钱包地址 链上部署合约或交易等都需要燃料,需要gas费,即需要有测试代币 复制刚才的钱包地址去领取地址领取测试代币 BNB Smart Chain (BSC) Testnet Faucet - BNB Chain 打开网页写一个自己的智能合约

    2024年03月16日
    浏览(41)
  • 开发和部署 Tezos 智能合约

    Tezos 是最古老的智能合约区块链之一,以太坊是第一个。 虽然以太坊是开发人员开发和部署智能合约的热门选择,但由于费用高且交易缓慢,其应用程序的可扩展性并不高。相比之下,Tezos 应用程序的设置非常高效且成本低廉。 在本指南中,您将学习如何使用 SmartPy CLI 在

    2023年04月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包