国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

部署OpenZeppelin可升級合約

這篇具有很好參考價值的文章主要介紹了部署OpenZeppelin可升級合約。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用OpenZeppelin升級插件部署的合約具備可升級的特性:可以升級以修改其代碼,同時保留其地址,狀態(tài)和余額。 可以迭代地向項目中添加新功能,或修復(fù)在線上版本中可能發(fā)現(xiàn)的任何錯誤。

配置開發(fā)環(huán)境

創(chuàng)建一個新的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

創(chuàng)建可升級合約

注意,可升級合約使用initialize函數(shù)而不是構(gòu)造函數(shù)來初始化狀態(tài)。

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;
    }
}

將合約部署到公共網(wǎng)絡(luò)

我們將使用Truffle遷移來部署B(yǎng)ox合約。Truffle升級插件提供了一個 deployProxy功能來部署可升級合約。它將部署我們實現(xiàn)的合約,ProxyAdmin會作為項目代理和代理管理員,并調(diào)用初始化函數(shù)。

在migrations目錄中創(chuàng)建以下2_deploy_contracts.js腳本。

在本文中,我們還沒有initialize函數(shù),因此將使用store 函數(shù)來初始化狀態(tài)。

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網(wǎng)絡(luò)運行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
...

發(fā)布驗證合約

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'

當前代理的管理員(可以執(zhí)行升級)是ProxyAdmin合約。 只有ProxyAdmin的所有者可以升級代理。 警告:ProxyAdmin 所有權(quán)轉(zhuǎn)移時請確保轉(zhuǎn)到我們控制的地址上。

在migrations目錄中創(chuàng)建以下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網(wǎng)絡(luò)上運行遷移

truffle migrate --network rinkeby

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

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

實現(xiàn)一個新的升級版本

一段時間后,我們決定要向合約添加功能。 在本文中,我們將添加一個increment函數(shù)。

注意:我們無法更改之前合約實現(xiàn)的存儲布局,有關(guān)技術(shù)限制的更多詳細信息,請參閱升級。

使用以下Solidity代碼在你的contracts目錄中創(chuàng)建新的實現(xiàn)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);
    }
}

部署新的升級版本

一旦測試了新的實現(xiàn),就可以準備升級。 這將驗證并部署新合約。 注意:我們僅是準備升級。

在migrations目錄中創(chuàng)建以下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網(wǎng)絡(luò)上運行遷移,以部署新的合約實現(xiàn)

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'

升級合約

執(zhí)行ProxyAdmin合約的upgrade方法

部署OpenZeppelin可升級合約

proxy:TransparentUpgradeableProxy合約的地址

implementation:BoxV2合約的地址

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

現(xiàn)在,我們可以與升級后的合約進行交互。 我們需要使用代理地址與BoxV2進行交互。 然后,我們可以調(diào)用新的“增量”功能,觀察到整個升級過程中都保持了狀態(tài)。

進入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'文章來源地址http://www.zghlxwxcb.cn/news/detail-403113.html

到了這里,關(guān)于部署OpenZeppelin可升級合約的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【區(qū)塊鏈技術(shù)開發(fā)】OpenZeppelin智能合約庫:提高智能合約的安全性和可靠性,加速去中心化應(yīng)用DApp的開發(fā)與部署。

    專欄:【區(qū)塊鏈技術(shù)開發(fā)】 前期文章: 【區(qū)塊鏈技術(shù)開發(fā)】使用Infura連接以太坊節(jié)點和OpenZeppelin庫來構(gòu)建安全、可靠的智能合約 【區(qū)塊鏈技術(shù)開發(fā)】 Solidity使用Truffle Box工具實現(xiàn)預(yù)構(gòu)建模板、自動化部署、創(chuàng)建智能合約示例代碼 【區(qū)塊鏈技術(shù)開發(fā)】 Solidity使用truffle工具創(chuàng)建

    2023年04月24日
    瀏覽(92)
  • 使用VSCode引用OpenZeppelin庫編寫solidity合約時報錯解決辦法

    使用VSCode引用OpenZeppelin庫編寫solidity合約時報錯解決辦法

    本文針對的 調(diào)試 Solidity 代碼的插件為 最近在使用 VS Code 編寫 solidity 合約的時候,引用 OpenZeppelin 庫之后出現(xiàn)了如下錯誤: 報錯為: Expected string literal (path), \\\"*\\\" or alias list. 或者還有可能會出現(xiàn)這樣的錯誤: 報錯為: Source \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\" not found: File i

    2024年02月02日
    瀏覽(30)
  • 11M 以太坊 ethereum OpenZeppelin : 開發(fā)智能合約

    ? 設(shè)置項目 ? 第一份合同 ? 編譯 Solidity ? 添加更多合約 ? 使用 OpenZeppelin 合約 ? OpenZeppelin Tutorials 教程 ? Contact 聯(lián)系方式 創(chuàng)建項目后的第一步是安裝開發(fā)工具。 以太坊最流行的開發(fā)框架是Hardhat,我們用ethers.js介紹了它最常見的用途。下一個最受歡迎的是使用web3.js的

    2024年02月11日
    瀏覽(33)
  • 智能合約升級原理02---UUPS升級部署示例

    智能合約升級原理02---UUPS升級部署示例

    在“智能合約升級原理01---起源”中介紹了合約升級的主要有三種方式: Diamond Implementation? ? ? ? Transparent Implementation? ? UUPS Implementation? ? ? ? ? ? ? 我們將只關(guān)注最常用的Transparent和UUPS,本文通過一個代碼示例學(xué)習(xí)UUPS方式,最后還將給出合約升級的注意事項。 示例說明

    2024年02月15日
    瀏覽(23)
  • 如何使用hardhat進行合約uups模式升級

    如何使用hardhat進行合約uups模式升級

    id:BSN_2021 公眾號:BSN研習(xí)社 背景: 在開發(fā)或維護solidity語言的智能合約時,經(jīng)常會因為業(yè)務(wù)邏輯變動而變動合約內(nèi)的邏輯,這就要考慮在不影響以前智能合約中已上鏈的數(shù)據(jù)的同時,修改或擴展新的業(yè)務(wù)邏輯,所以合約第一次開發(fā)時就需要考慮其本身支持可升級功能 目的:

    2024年02月16日
    瀏覽(11)
  • 如何使用Truffle來對智能合約實現(xiàn)并部署?

    Truffle是一個廣受歡迎的以太坊智能合約開發(fā)框架,支持快速構(gòu)建、測試以及發(fā)布智能合約,本文將介紹使用Truffle框架實現(xiàn)一個完整的智能合約的步驟詳情和具體代碼實現(xiàn)。 步驟詳情: 安裝Truffle框架并創(chuàng)建項目 首先需要在本地安裝Truffle框架,在命令行中執(zhí)行以下代碼進行安

    2023年04月20日
    瀏覽(22)
  • 使用python3編譯并部署solidity合約

    我c了,Mac配置半天一直報錯,windows隨便配置就ok Os:Windows PythonVersion:3.9.8(python3.10會報錯,建議不要使用python3.10) ?注釋solc源碼中?clone-bin,否則會報錯

    2024年02月12日
    瀏覽(22)
  • 使用Truffle for Vscode插件部署本地智能合約

    使用Truffle for Vscode插件部署本地智能合約

    Truffle Truffle簡介 Truffle是使用以太坊虛擬機(EVM)的世界級區(qū)塊鏈開發(fā)環(huán)境、測試框架和資產(chǎn)管道,旨在讓開發(fā)人員的開發(fā)效率更高。Truffle工具套件(truffle suite)分為四個部分Truffle、Ganache,dirzzle,Truffle for Vscode。其中Ganache提供了“One click blockchain”功能,只要點擊運行g(shù)anache就能

    2024年02月07日
    瀏覽(30)
  • 使用MetaMask + Ganache搭建本地私有網(wǎng)絡(luò)并實現(xiàn)合約部署與互動

    使用MetaMask + Ganache搭建本地私有網(wǎng)絡(luò)并實現(xiàn)合約部署與互動

    我使用Remix編寫合約,MetaMask錢包工具和Ganache搭建了一個私有網(wǎng)絡(luò),并且實現(xiàn)了合約的部署和互動。 在前面的博客中提到了 Remix在線環(huán)境及錢包申請 以及 Solidity的基本語法 ,沒看過的小伙伴可以點擊鏈接查看一下,都是在本專欄下,覺得有用的伙伴記得點個關(guān)注哦。 remix:

    2024年02月04日
    瀏覽(205)
  • conflux開發(fā)NFT智能合約(ERC721 & 工廠合約 & 可升級合約)

    以下場景可借鑒本文內(nèi)容 需要創(chuàng)建很多合約 需要使用conflux代付機制(只需將工廠合約設(shè)置為代付,即可無限創(chuàng)建新合約) 合約想要有可升級的能力(如:特殊玩法 or 代碼有bug) ERC-721 NFT 基于以上場景,需要三個主要合約實現(xiàn) 工廠合約 代理合約 邏輯合約 想要完全掌握本文

    2024年01月17日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包