truffle部署合约 if合约是什么意思

发布时间:2025-12-01 10:40:02 浏览:4 分类:比特币资讯
大小:509.7 MB 版本:v6.141.0
欧易官网正版APP,返佣推荐码:61662149

一、详解Truffle Migrations(迁移)- 合约部署不再困惑

迁移(Migrations)是开发人员自动化部署数据及其支持结构的一套方法,它对于管理新软件版本的部署非常有用,不仅限于区块链开发。Truffle Migrations允许我们将合约推送到以太坊链上,无论是本地网络、测试网络还是主网,并且可以与其它合约链接或使用初始化合约数据。

迁移(Migrations)的亮点在于对区块链上合约地址的管理。Truffle几乎完全抽象化了这项乏味的工作。准备阶段,确保安装了Truffle Framework和 Ganache CLI。初始化Truffle项目,使用`truffle init`命令。创建项目目录,运行`truffle init`,输出类似于初始化文件夹结构。在`contracts`目录下创建合约文件,如`Storage.sol`。

初始迁移文件和部署规则:运行`truffle init`时,生成了`Migrations.sol`和`1_initial_migration.js`。初始迁移合约一般不需要修改,主要跟踪部署在区块链上的合约地址。修改`Migrations.sol`可以实现高级迁移管理,但需要保留初始化接口。`1_initial_migration.js`文件说明如何将`Migrations.sol`合约部署到对应的链上。文件名的序号表示运行迁移文件的顺序,用于追踪部署历史。

迁移(Migrations)管理数据:创建迁移文件,如`2_deploy_contracts.js`,用于部署合约。迁移文件读取合约的artifacts(构建),这些构建文件描述了合约部署的网络、地址及函数等信息。artifacts的数据存储在`build`目录下的`Migrations.json`和`Storage.json`文件中。使用`truffle compile`命令编译合约后,`build`目录将生成这些文件。

编写迁移文件:创建迁移文件,例如`2_deploy_contracts.js`,描述如何部署合约。运行`truffle migrate`命令执行迁移脚本。为了运行迁移脚本,启动本地模拟区块链环境。配置`truffle-config.js`文件以部署到本地网络。运行`truffle migrate`后,合约将被迁移到网络,并在构建目录的`Storage.json`文件中保存构件信息。

部署多合约:迁移文件允许部署多个合约并调用合约函数,实现复杂逻辑。添加新合约`InfoManager.sol`,依赖于`Storage`合约。修改迁移文件`2_deploy_contracts.js`,使其可以部署`InfoManager`。部署语法与使用`deploy(...)`方法返回的Promise。在部署后调用自定义函数。迁移文件还可以根据网络进行部署,实现开发与上线的差异性。

选择账号和链接库:迁移文件中可以公开账号参数,通过`deployer.link(...)`链接已存在的库。通过这些技术,大部分区块链部署工作实现自动化,减少了开发去中心化应用程序的重复工作。

使用Truffle Migrations,可以高效地管理合约部署,减少开发过程中的繁琐步骤,提高开发效率。

二、Truffle学习部署测试网合约

本文旨在对学习开发编程的同学提供便利!!!仅学习开发测试功能本文旨在对学习开发编程的同学提供便利!!!哪里不符合规范了?服了本文旨在对学习开发编程的同学提供便利!!!开始学习Truffle框架,希望尽快把一整套走通,欢迎大家来一起交流;

开发前的准备工作:

VS Code,

Node.js

Truffle:

npm install-g truffle

Infura: (一个仅可供学习的免费节点服务)

我们免费注册好以后新建一个项目,选择ropsten测试网络,会为我们生成一个链接,后面会用到

MetaMask获取Ropsten测试币

钱包助记词

项目开始,新建一个空的文件夹,终端运行

truffle init

之后在vscode中打开,首先看truffle-config.js,有一些说明可以看一下

其中有讲到如果用Infura,需要安装@truffle/hdwallet-provider这个库,

我们下载一下:

npm install@truffle/hdwallet-provider

然后把这三行注释解开:

再看一下networks里面,我们需要把rppsten的注释解开,这里我们需要用到两个参数:

一个是mnemonic,上面我们已经定义过了,所以我们需要新建一个.secret的文件,把账户的助记词拷贝到里面就可以了(注意不要把助记词文件上传到github上面)

另外一个链接就是上面我们在 Infura上面生成出来的链接节点,copy过来,然后运行:

truffle compile

再运行

truffle migtate--network ropsten

加载好之后,就代表我们用truffle部署测试网合约成功了,可以在Etherscan上面查看到了

原文:

三、使用OpenZeppelin Truffle升级插件升级合约

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

本文将展示使用OpenZeppelin Truffle升级插件和Gnosis Safe的生命周期,包含从创建合约,测试合约、部署合约一直到使用Gnosis Safe进行升级整个过程:

配置开发环境:我们将从创建一个新的npm项目开始。安装并初始化 Truffle。注意:我们需要使用Truffle 5.1.35或更高版本。安装Truffle升级插件。

创建可升级合约:我们将使用 OpenZeppelin学习指南中最受欢迎的Box合约。使用以下 Solidity代码在你的Contracts目录中创建Box.sol。注意,可升级合约使用 initialize函数而不是构造函数来初始化状态。为了保持简单,任何帐户都可以多次调用的公开的store函数来初始化状态(而不是受保护的一次性 initialize函数)。

本地测试合约:我们的合约应该始终有相应的测试。要测试合约,我们应该为合约实现创建单元测试。我们将在测试中使用chai(一个 Js测试框架),因此首先需要安装它。我们将为合约实现创建单元测试。使用以下JavaScript在你的test目录中创建Box.test.js。我们还可以通过(升级)代理创建测试进行交互。注意:我们不需要在此处重复单元测试,这是为了测试代理交互和测试升级。

将合约部署到公共网络:我们将使用 Truffle迁移来部署Box合约。 Truffle升级插件提供了一个 deployProxy功能来部署可升级合约。它将部署我们实现的合约,ProxyAdmin会作为项目代理和代理管理员,并调用(任何的)初始化函数。在migrations目录中创建以下2_deploy_box.js脚本。在本文中,我们还没有initialize函数,因此我们将使用store函数来初始化状态。然后,我们可以运行测试。

转移升级权限到 Gnosis Safe多签:我们将使用Gnosis Safe来控制合约的升级。首先,我们需要在Rinkeby网络上为自己创建一个Gnosis Safe。为了简单起见,在本文中,本例使用1/1,在正式产品中,你应考虑使用至少2/3。在Rinkeby上创建Gnosis Safe之后,请复制地址,以便我们转移所有权。当前代理的管理员(可以执行升级)是ProxyAdmin合约。只有ProxyAdmin的所有者可以升级代理。警告:ProxyAdmin所有权转移时请确保转到我们控制的地址上。

实现一个新的升级版本:一段时间后,我们决定要向合约添加功能。在本文中,我们将添加一个increment函数。注意:我们无法更改之前合约实现的存储布局,有关技术限制的更多详细信息,请参阅升级。使用以下Solidity代码在你的contracts目录中创建新的实现BoxV2.sol。本地测试升级的版本:为了测试我们的升级版本,我们应该为新的合约创建单元测试,并为通过代理测试交互,并检查升级之间是否保持状态。我们将为新的合约实现创建单元测试。我们可以在已经创建的单元测试中添加新测试,以确保高覆盖率。使用以下JavaScript在你的test目录中创建BoxV2.test.js。

部署新的升级版本:一旦测试了新的实现,就可以准备升级。这将验证并部署新合约。注意:我们仅是准备升级。我们将在Gnosis Safe执行实际升级。使用以下JavaScript在migrations目录中创建4_prepare_upgrade_boxv2.js。我们可以在Rinkeby网络上运行迁移,以部署新的合约实现。

升级合约:要管理我们在Gnosis Safe中的升级,我们使用OpenZeppelin应用程序(找一下OpenZeppelin的 logo)。首先,我们需要代理的地址(box.address)和新实现的地址(boxV2.address)。我们可以从truffle迁移的输出或truffle console中获得。在“应用程序(APPS)”选项卡中,选择“ OpenZeppelin”应用程序,然后将代理地址粘贴到“合约地址(Contract address)”字段中,然后将新实现的地址粘贴到“新实现的地址( New implementation address)”字段中。该应用程序应显示该合约是 EIP1967兼容的。仔细检查地址,然后按“升级(Upgrade)”按钮。确认显示对话框以提交交易。然后,我们需要在MetaMask(或你正使用的钱包)中签署交易。现在,我们可以与升级后的合约进行交互。我们需要使用代理地址与BoxV2进行交互。然后,我们可以调用新的“增量”功能,观察到整个升级过程中都保持了状态。

接下来:我们已经创建了一个可升级的合约,将升级的控制权转移到了Gnosis Safe,并升级了我们的合约。可以在主网上执行相同的过程。注意:我们应该始终首先在公共测试网上测试升级。如果你对本文有任何疑问或建议的改进,请发布在 openzeppelin社区论坛中。本翻译由 Cell Network赞助支持。