部署OpenZeppelin可升级合约

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

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

配置开发环境

创建一个新的npm项目

mkdir mycontract && cd mycontract
npm init -y

安装并初始化Truffle

npm i --save-dev truffle
npx truffle init

安装Truffle升级插件

npm i --save-dev @openzeppelin/truffle-upgrades

创建可升级合约

注意,可升级合约使用initialize函数而不是构造函数来初始化状态。

Box.sol

// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
 
contract Box {
    uint256 private value;
 
    // Emitted when the stored value changes
    event ValueChanged(uint256 newValue);
 
    // Stores a new value in the contract
    function store(uint256 newValue) public {
        value = newValue;
        emit ValueChanged(newValue);
    }
 
    // Reads the last stored value
    function retrieve() public view returns (uint256) {
        return value;
    }
}

将合约部署到公共网络

我们将使用Truffle迁移来部署Box合约。Truffle升级插件提供了一个 deployProxy功能来部署可升级合约。它将部署我们实现的合约,ProxyAdmin会作为项目代理和代理管理员,并调用初始化函数。

在migrations目录中创建以下2_deploy_contracts.js脚本。

在本文中,我们还没有initialize函数,因此将使用store 函数来初始化状态。

2_deploy_contracts.js

// migrations/2_deploy_box.js
const Box = artifacts.require('Box');
 
const { deployProxy } = require('@openzeppelin/truffle-upgrades');
 
module.exports = async function (deployer) {
  await deployProxy(Box, [42], { deployer, initializer: 'store' });
};

使用Rinkeby网络运行truffle migration进行部署。 我们可以看到3 个合约:Box.sol、ProxyAdmin 和 代理合约TransparentUpgradeableProxy。

truffle migrate --network rinkeby

...
2_deploy_contracts.js
===============

   Deploying 'Box'
   ---------------
   > transaction hash:    0x1e5a61c2d4560d6ffe5cc60d7badbfef6d5e420708eebff6dc580bb3f9f9f3e1
   > Blocks: 1            Seconds: 14
   > contract address:    0x7f7dc11961fCD81f53e9F45D9DfBb745832c0657
...

   Deploying 'ProxyAdmin'
   ----------------------
   > transaction hash:    0x298b429391c5a98701bf79df00f4f5526c61570f3091b3d6693e3a4f12a88409
   > Blocks: 1            Seconds: 14
   > contract address:    0x7Bd40e62aEe2c5e232152351f57068038761E20F
...

   Deploying 'TransparentUpgradeableProxy'
   ---------------------------------------
   > transaction hash:    0x7a0043dbe9a35ab9eab8cf0eac1856418cd0c359e330448df016150d293e6716
   > Blocks: 2            Seconds: 26
   > contract address:    0xc2ea7DE43F194bB397761a30a05CEDcF28835F24
...

发布验证合约

truffle run verify Box --network rinkeby

我们可以使用Truffle控制台(truffle console)与我们的合约进行交互。

注意: Box.deployed() 是我们的代理合约的地址。

truffle console --network rinkeby

truffle(rinkeby)> box = await Box.deployed()
truffle(rinkeby)> box.address
'0xc2ea7DE43F194bB397761a30a05CEDcF28835F24'
truffle(rinkeby)> (await box.retrieve()).toString()
'42'

当前代理的管理员(可以执行升级)是ProxyAdmin合约。 只有ProxyAdmin的所有者可以升级代理。 警告:ProxyAdmin 所有权转移时请确保转到我们控制的地址上。

在migrations目录中创建以下3_transfer_ownership.js脚本。

3_transfer_ownership.js

// migrations/3_transfer_ownership.js
const { admin } = require('@openzeppelin/truffle-upgrades');
 
module.exports = async function (deployer, network) {
  // 使用你的 钱包 地址
  const admin = '0x1c14600daeca8852BA559CC8EdB1C383B8825906';
 
  // Don't change ProxyAdmin ownership for our test network
  if (network !== 'test') {
    // The owner of the ProxyAdmin can upgrade our contracts
    await admin.transferProxyAdminOwnership(admin);
  }
};

在Rinkeby网络上运行迁移

truffle migrate --network rinkeby

...
3_transfer_ownership.js
=======================

   > Saving migration to chain.
   -------------------------------------
...

实现一个新的升级版本

一段时间后,我们决定要向合约添加功能。 在本文中,我们将添加一个increment函数。

注意:我们无法更改之前合约实现的存储布局,有关技术限制的更多详细信息,请参阅升级。

使用以下Solidity代码在你的contracts目录中创建新的实现BoxV2.sol 。

BoxV2.sol

// contracts/BoxV2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
 
contract BoxV2 {
    uint256 private value;
 
    // Emitted when the stored value changes
    event ValueChanged(uint256 newValue);
 
    // Stores a new value in the contract
    function store(uint256 newValue) public {
        value = newValue;
        emit ValueChanged(newValue);
    }
    
    // Reads the last stored value
    function retrieve() public view returns (uint256) {
        return value;
    }
    
    // Increments the stored value by 1
    function increment() public {
        value = value + 1;
        emit ValueChanged(value);
    }
}

部署新的升级版本

一旦测试了新的实现,就可以准备升级。 这将验证并部署新合约。 注意:我们仅是准备升级。

在migrations目录中创建以下4_prepare_upgrade_boxv2.js脚本。

4_prepare_upgrade_boxv2.js

// migrations/4_prepare_upgrade_boxv2.js
const Box = artifacts.require('Box');
const BoxV2 = artifacts.require('BoxV2');
 
const { prepareUpgrade } = require('@openzeppelin/truffle-upgrades');
 
module.exports = async function (deployer) {
  const box = await Box.deployed();
  await prepareUpgrade(box.address, BoxV2, { deployer });
};

在Rinkeby网络上运行迁移,以部署新的合约实现

truffle migrate --network rinkeby

...
4_prepare_upgrade_boxv2.js
==========================

   Deploying 'BoxV2'
   -----------------
   > transaction hash:    0x078c4c4454bb15e3791bc80396975e6e8fc8efb76c6f54c321cdaa01f5b960a7
   > Blocks: 1            Seconds: 17
   > contract address:    0xEc784bE1CC7F5deA6976f61f578b328E856FB72c
...

部署后地址 

 进入truffle控制台

truffle console --network rinkeby

truffle(rinkeby)> box = await Box.deployed()
truffle(rinkeby)> boxV2 = await BoxV2.deployed()
truffle(rinkeby)> box.address
'0xF325bB49f91445F97241Ec5C286f90215a7E3BC6'
truffle(rinkeby)> boxV2.address
'0xEc784bE1CC7F5deA6976f61f578b328E856FB72c'

升级合约

执行ProxyAdmin合约的upgrade方法

部署OpenZeppelin可升级合约

proxy:TransparentUpgradeableProxy合约的地址

implementation:BoxV2合约的地址

然后需要在MetaMask(或你正使用的钱包)中签署交易。

现在,我们可以与升级后的合约进行交互。 我们需要使用代理地址与BoxV2进行交互。 然后,我们可以调用新的“增量”功能,观察到整个升级过程中都保持了状态。

进入truffle控制台

truffle console --network rinkeby

truffle(rinkeby)> box = await Box.deployed()
truffle(rinkeby)> boxV2 = await BoxV2.at(box.address)
truffle(rinkeby)> (await boxV2.retrieve()).toString()
'42'
truffle(rinkeby)> await boxV2.increment()
{ tx:
...
truffle(rinkeby)> (await boxV2.retrieve()).toString()
'43'文章来源地址https://www.toymoban.com/news/detail-403113.html

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

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

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

相关文章

  • 【区块链技术开发】OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速去中心化应用DApp的开发与部署。

    专栏:【区块链技术开发】 前期文章: 【区块链技术开发】使用Infura连接以太坊节点和OpenZeppelin库来构建安全、可靠的智能合约 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码 【区块链技术开发】 Solidity使用truffle工具创建

    2023年04月24日
    浏览(57)
  • 使用VSCode引用OpenZeppelin库编写solidity合约时报错解决办法

    本文针对的 调试 Solidity 代码的插件为 最近在使用 VS Code 编写 solidity 合约的时候,引用 OpenZeppelin 库之后出现了如下错误: 报错为: Expected string literal (path), \\\"*\\\" or alias list. 或者还有可能会出现这样的错误: 报错为: Source \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\" not found: File i

    2024年02月02日
    浏览(36)
  • 11M 以太坊 ethereum OpenZeppelin : 开发智能合约

    • 设置项目 • 第一份合同 • 编译 Solidity • 添加更多合约 • 使用 OpenZeppelin 合约 • OpenZeppelin Tutorials 教程 • Contact 联系方式 创建项目后的第一步是安装开发工具。 以太坊最流行的开发框架是Hardhat,我们用ethers.js介绍了它最常见的用途。下一个最受欢迎的是使用web3.js的

    2024年02月11日
    浏览(40)
  • 智能合约升级原理02---UUPS升级部署示例

    在“智能合约升级原理01---起源”中介绍了合约升级的主要有三种方式: Diamond Implementation        Transparent Implementation    UUPS Implementation              我们将只关注最常用的Transparent和UUPS,本文通过一个代码示例学习UUPS方式,最后还将给出合约升级的注意事项。 示例说明

    2024年02月15日
    浏览(30)
  • 如何使用hardhat进行合约uups模式升级

    id:BSN_2021 公众号:BSN研习社 背景: 在开发或维护solidity语言的智能合约时,经常会因为业务逻辑变动而变动合约内的逻辑,这就要考虑在不影响以前智能合约中已上链的数据的同时,修改或扩展新的业务逻辑,所以合约第一次开发时就需要考虑其本身支持可升级功能 目的:

    2024年02月16日
    浏览(31)
  • 如何使用Truffle来对智能合约实现并部署?

    Truffle是一个广受欢迎的以太坊智能合约开发框架,支持快速构建、测试以及发布智能合约,本文将介绍使用Truffle框架实现一个完整的智能合约的步骤详情和具体代码实现。 步骤详情: 安装Truffle框架并创建项目 首先需要在本地安装Truffle框架,在命令行中执行以下代码进行安

    2023年04月20日
    浏览(45)
  • 使用python3编译并部署solidity合约

    我c了,Mac配置半天一直报错,windows随便配置就ok Os:Windows PythonVersion:3.9.8(python3.10会报错,建议不要使用python3.10)  注释solc源码中 clone-bin,否则会报错

    2024年02月12日
    浏览(33)
  • 使用Truffle for Vscode插件部署本地智能合约

    Truffle Truffle简介 Truffle是使用以太坊虚拟机(EVM)的世界级区块链开发环境、测试框架和资产管道,旨在让开发人员的开发效率更高。Truffle工具套件(truffle suite)分为四个部分Truffle、Ganache,dirzzle,Truffle for Vscode。其中Ganache提供了“One click blockchain”功能,只要点击运行ganache就能

    2024年02月07日
    浏览(71)
  • 使用MetaMask + Ganache搭建本地私有网络并实现合约部署与互动

    我使用Remix编写合约,MetaMask钱包工具和Ganache搭建了一个私有网络,并且实现了合约的部署和互动。 在前面的博客中提到了 Remix在线环境及钱包申请 以及 Solidity的基本语法 ,没看过的小伙伴可以点击链接查看一下,都是在本专栏下,觉得有用的伙伴记得点个关注哦。 remix:

    2024年02月04日
    浏览(82)
  • conflux开发NFT智能合约(ERC721 & 工厂合约 & 可升级合约)

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

    2024年01月17日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包