Lesson 1:使用Truffle部署DApps
系列课程Advanced Solidity: Get In-depth Knowledge
使用Truffle部署以太坊DApps将引导您完成使用Truffle部署智能合约的过程。
前言
还记得我们承诺教你如何部署智能合约吗?
已经有一段时间了,但时机终于来了!
在本课中,我们将教你如何使用Truffle部署到以太坊。
这还不是全部。您还将学习如何将智能合约部署到Loom😎。
为什么部署到Loom?毕竟,以太坊是最安全的网络。
是的,我们完全同意。但是在以太坊上,每笔交易都需要gas,所以你的用户必须为每笔交易支付费用。此外,他们必须等待至少10秒才能确认每笔交易。
简而言之,在以太坊上,所有交易都受益于相同的安全保证。对于面向用户的DApp或游戏,这种级别的安全性并不总是必需的。事实上,它只会损害用户体验。
在Loom上,用户可以进行更快、更省gas的交易。这使得Loom更适合游戏或面向用户的DApp。
话不多说!我们开始吧😉
Chapter 1: 介绍
如果您是CryptoZombies的新手,强烈建议您在开始本课程之前先学习前六课。请花时间熟悉编写智能合约。否则,你将很难领会这一课。
The Missing Piece
所以你已经学习了我们之前的课程。太棒了!这意味着你几乎掌握了构建dapp的艺术。
但这个谜题的一个重要部分仍然缺失。
这是正确的…你仍然需要学习如何部署智能合约
。
现在,如果您有前端开发背景,那么您可能已经习惯了Webpack、Gulp或Browserify等众多工具,它们使开发人员的工作变得更加简单。
但是,solid开发人员使用什么工具呢?
Truffle
Truffle
是最受欢迎的区块链开发框架,这是有充分理由的——它包含了许多有用的功能:
- 简单的智能合约编译
- 自动生成ABI
- 集成智能合约测试-甚至支持摩卡和Chai!
- 支持多个网络——代码可以部署到Rinkeby、Ethereum甚至Loom。稍后我们将引导您完成此操作😉
如果npm
和node
已经安装在您的计算机上,我们希望您安装Truffle并使其在全局可用。
实战演练
我们将从基础开始。打开一个新的终端窗口,创建一个名为CryptoZombies
的目录,并cd
到其中。
现在,让我们安装Truffle并使其在全球可用。
注意:下面是如何使用npm来安装一个包并使其全局可用:
npm install package_name -g
代码
Chapter 2: 开始Truffle
现在我们已经安装了Truffle,是时候通过运行Truffle init
来初始化我们的新项目了。它所做的就是用以下结构创建一组文件夹和配置文件:
├── contracts
├── Migrations.sol
├── migrations
├── 1_initial_migration.js
└── test
truffle-config.js
truffle.js
合约、迁移、测试……这很复杂😟
别担心,学会使用Truffle不会吃掉你的大脑。本章将带您了解Truffle的默认项目结构,一旦您知道如何使用Truffle,部署智能合约将是轻而易举的事情。
Truffle 默认目录结构
因此,在CryptoZombies目录下运行truffle init命令,应该会创建几个目录和一些JavaScript和Solidity文件。让我们仔细看看:
- 合约:这是truffle希望找到我们所有智能合约的地方。为了保持代码的组织性,我们甚至可以创建嵌套文件夹,比如合约/令牌。漂亮整洁的😉。
注意:
truffle init
应该自动创建一个名为Migrations.sol的合约和相应的迁移文件。我们稍后会解释它们。
- migrations: migration是一个JavaScript文件,它告诉Truffle如何部署智能合约。
- test:这里我们需要放置单元测试,它将是JavaScript或Solidity文件。请记住,一旦部署了合约,它就不能被更改,因此它是有效的
truffle.js
和truffle-config.js
:用于存储部署网络设置的配置文件。Truffle需要两个配置文件,因为在Windows上,将Truffle .js
和Truffle .exe
放在同一个文件夹中可能会产生冲突。长话短说-如果你运行的是Windows,建议删除truffle.js,并使用truffle-config.js作为默认配置文件。查看Truffle的官方文档,进一步了解。
但是我为什么要使用这种目录结构呢?我不习惯,而且它看起来很复杂……
好吧,有几个很好的理由。首先,如果您更改这些文件夹的名称,那么Truffle将无法像预期的那样工作。
其次,通过遵守这个惯例,您的项目将很容易被其他开发人员理解。简而言之,使用标准的文件夹结构和代码约定可以使您在将来扩展或更改团队时更容易。
Chapter 3: truffle-hdwallet-provider
在本课中,我们将使用Infura将代码部署到以太坊。这样,我们就可以运行应用程序,而无需设置我们自己的以太坊节点或钱包。然而,为了保证安全,Infura不管理私钥,这意味着它不能代表我们签署交易。由于部署智能合约需要Truffle签署交易,因此我们将需要一个名为Truffle -hdwallet-provider
的工具。它的唯一用途是处理事务签名。
注意:也许你会问为什么我们在上一章中不使用如下代码选择安装truffle-hdwallet-provider:
npm install truffle truffle-hdwallet-provider
truffle init
命令期望找到一个空目录。如果那里有任何文件,就会出错。因此,我们需要按照正确的顺序执行所有操作,并在运行truffle init
后安装truffle-hdwallet-provider
。
实战演练
Run truffle init
. This command generates the directory structure that we’ve discussed.
Run npm install truffle-hdwallet-provider
.
代码展示
编译源码
恭喜你!现在我们已经将项目结构放置到位并设置了truffle-hdwallet-provider,让我们来编译我们的合同。
你会问,为什么我们需要编译?
以太坊虚拟机不能直接理解我们编写的Solidity源代码。因此,我们需要运行一个编译器,将我们的智能合约“翻译”成机器可读的字节码。然后虚拟机执行字节码,并完成我们的智能合约所要求的操作。
想知道字节码是什么样的吗?让我们一起来看看
"0x60806040526010600155600154600a0a6002556201518060035566038d7ea4c6800060085560006009556046600a55336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1..."
正如你所看到的,人类读字节码的能力和现实生活中的僵尸差不多!
使用Solidity编译器
既然我们正在谈论Solidity编译器,我们应该提到开发人员设法融入了一些漂亮的功能。
假设我们想要修改SafeMath中包含的add函数的定义:
function add(uint16 a, uint16 b) internal returns (uint16) {
uint16 c = a + b;
assert(c >= a);
return c;
}
如果我们要编译这个函数,Solidity编译器会抛出一个警告
safemath.sol:110:11: Warning: Function state mutability can be restricted to pure
function add(uint16 a, uint16 b) internal returns (uint16) {
^ (Relevant source part starts here and spans across multiple lines).
编译器试图说的是,我们的函数不读取或写入区块链,我们应该使用pure
修饰符。
为什么这很重要?
让函数pure
或者view
可以节省我们的精力。由于这些函数不会修改区块链的状态,因此矿工不需要执行它们。简而言之,pure
函数和view
函数都可以免费call
。
CryptoZombies- The Game
请记住,我们已经将我们的逻辑嵌入到一个名为ZombieOwnership.sol
的智能合约中。
嗯…对游戏来说不是个好名字。
幸运的是,这不是问题。我们可以使用继承来创建一个具有相同操作和特性的智能合约,无论我们选择什么名称。
让我们创建一个名为CryptoZombies
的新智能合约,它继承了ZombieOwnership.sol
:
pragma solidity ^0.4.24;
import "./zombieownership.sol";
contract CryptoZombies is ZombieOwnership
{
}
.
├── contracts
├── Migrations.sol
├── CryptoZombies.sol
├── erc721.sol
├── ownable.sol
├── safemath.sol
├── zombieattack.sol
├── zombiefactory.sol
├── zombiefeeding.sol
├── zombiehelper.sol
├── zombieownership.sol
├── migrations
└── test
Everything is set up properly. Let’s compile our project.
实战演练
执行Truffle编译。该命令应该创建构建构件,并将它们放在./build/contracts
目录中。
注意:构建工件由智能合约的“字节码”版本、abi和一些内部数据组成,Truffle使用这些数据来正确部署代码。避免编辑这些文件,否则Truffle可能会停止正常工作。
代码
Chapter 4: Migrations
通常在这一点上,在部署到以太坊之前,您希望在本地测试您的智能合约。您可以使用名为Ganache
的工具来完成此操作,该工具可以设置本地以太坊网络。
然而,虽然测试非常重要,但它需要一整节课来涵盖——所以我们在这一课中只坚持部署。如果你想了解更多关于测试的知识,我推荐我们自己的Testing Smart Contracts with Truffle课程。
要部署到以太坊,我们必须创建一个 Migrations.sol
。
Migrations
是帮助Truffle将代码部署到的JavaScript文件,请注意,truffle init
创建了一个名为Migrations
的特殊合约。它可以跟踪您对代码所做的更改。它的工作方式是将更改的历史保存在链上。因此,不可能将相同的代码部署两次。
Creating a New Migration
我们将从已经为我们创建的truffle init
文件- ./contracts/1_initial_migration.js
开始。让我们看看里面有什么
var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
};
很简单,不是吗?
首先,脚本告诉Truffle
我们希望与Migrations
合约进行交互。
接下来,它导出一个函数,该函数接受名为deployer
的对象作为参数。该对象充当您(开发人员)和Truffle部署引擎之间的接口。即使deployer
提供了大量有用的功能,我们也不会在本课的范围内使用它们。一旦你完成了,如果你想了解更多关于Truffle的能力,请随意查看Truffle的文档。
为了准备好部署,我们已经创建了一个新文件./contracts/2_crypto_zombies.js
,并复制粘贴了./contracts/1_initial_migration.js
中的内容。
实战演练
- 修改
./contracts/2_crypto_zombies.js
:
var CryptoZombies = artifacts.require("./CryptoZombies.sol");
module.exports = function(deployer) {
deployer.deploy(CryptoZombies);
};
代码更新
./contracts/2_crypto_zombies.js
var CryptoZombies = artifacts.require("./CryptoZombies.sol");
module.exports = function(deployer) {
deployer.deploy(CryptoZombies);
};
Chapter 5: 配置文件
太棒了!您已经成功编译了源代码并创建了一个迁移文件。
在我们部署之前还有一件事要做。我们必须编辑配置文件来告诉Truffle
我们想要部署到的网络。
等等,我以为只有一个以太坊网络。我遗漏了什么?
Ethereum Test Networks
共以太坊测试网络允许您在将合约部署到主网之前免费测试合约(记住,一旦将合约部署到主网,它就无法更改)。这些测试网络使用不同于主网的共识算法(通常是PoA),以太坊是免费的,可以鼓励彻底的测试。
在本课中,我们将使用由以太坊基金会创建的公共测试网络Rinkeby。
truffle.js配置文件
现在,让我们来看看默认的Truffle
配置文件:
$ cat truffle.js
/*
* NB: since truffle-hdwallet-provider 0.0.5 you must wrap HDWallet providers in a
* function when declaring them. Failure to do so will cause commands to hang. ex:
*
* mainnet: {
* provider: function() {
* return new HDWalletProvider(mnemonic, 'https://mainnet.infura.io/<infura-key>')
* },
* network_id: '1',
* gas: 4500000,
* gasPrice: 10000000000,
* },
*/
它只是一个空壳。因此,我们需要更新此文件,以允许我们将合约部署到Rinkeby和以太坊主网。
truffle的HD钱包提供商
还记得第二章吗?
我们要求您安装一个名为Truffle -hdwallet-provider
的附加包,它可以帮助Truffle签署交易。
现在,我们要编辑配置文件以使用HDWalletProvider
。为了让它工作,我们将在文件的顶部添加一行:
const HDWalletProvider = require("truffle- HDWalletProvider .
接下来,我们将创建一个新变量来存储助记符:
const mnemonic = "onions carrots beans ...";
请注意,我们不建议在配置文件中存储助记符或私钥等秘密。
…但是为什么呢?
配置文件经常被推送到GitHub,在那里任何人都可以看到它们,让你大开攻击😱!为了避免泄露您的助记符(或您的私钥!),您应该从一个文件中读取它,并将该文件添加到.gitignore中。稍后我们将向您展示如何做到这一点。
为了简单起见,我们复制了助记符并将其存储在一个变量中。
Set up Truffle for Rinkeby and Ethereum main net
接下来,为了确保Truffle“知道”我们想要部署的网络,我们必须创建两个单独的对象——一个用于Rinkeby,另一个用于以太坊主网:
networks: {
// Configuration for mainnet
mainnet: {
provider: function () {
// Setting the provider with the Infura Mainnet address and Token
return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
},
network_id: "1"
},
// Configuration for rinkeby network
rinkeby: {
// Special function to setup the provider
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
},
// Network id is 4 for Rinkeby
network_id: 4
}
注意:提供程序值被封装在一个函数中,这确保了它在需要之前不会被初始化。
封装起来
现在,让我们把这些片段放在一起,看看我们的配置文件应该是什么样子:
// Initialize HDWalletProvider
const HDWalletProvider = require("truffle-hdwallet-provider");
// Set your own mnemonic here
const mnemonic = "YOUR_MNEMONIC";
// Module exports to make this configuration available to Truffle itself
module.exports = {
// Object with configuration for each network
networks: {
// Configuration for mainnet
mainnet: {
provider: function () {
// Setting the provider with the Infura Mainnet address and Token
return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
},
network_id: "1"
},
// Configuration for rinkeby network
rinkeby: {
// Special function to setup the provider
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
},
// Network id is 4 for Rinkeby
network_id: 4
}
}
};
实战演练
我们已经为您更新了大部分配置文件。让我们来填补缺失的部分:
在文件的顶部,添加初始化truffle-hdwallet-provider的代码行。
填写Rinkeby网络的network_id。如果您不记得这个参数的值,请查看上面的代码片段。
代码更新
//1. Initialize `truffle-hdwallet-provider`
const HDWalletProvider = require("truffle-hdwallet-provider");
// Set your own mnemonic here
const mnemonic = "YOUR_MNEMONIC";
// Module exports to make this configuration available to Truffle itself
module.exports = {
// Object with configuration for each network
networks: {
// Configuration for mainnet
mainnet: {
provider: function () {
// Setting the provider with the Infura Mainnet address and Token
return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
},
network_id: "1"
},
// Configuration for rinkeby network
rinkeby: {
// Special function to setup the provider
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
},
network_id: 4 //Fill in the `network_id` for the Rinkeby network.
}
}
};
Chapter 6: 部署我们的智能合约
太棒了!这是困难的部分——实际上部署到Rinkeby将是直截了当的。为了做到这一点,Truffle依靠的是一种叫做migration
的东西。
migration
migration听起来像是涉及到很多东西,但在实践中,migration只不过是一个JavaScript文件,它告诉Truffle如何修改我们智能合约的状态。
显然,第一次迁移只是部署智能合约。其他一些迁移部署新版本的代码来添加特性或修复错误。
简而言之,migration提供了一种方便的方法来跟踪对代码所做的更改。
如果要部署多个合约,则必须为每个合约创建单独的迁移文件。迁移总是按顺序执行——1、2、3,等等。
在这一课中,我们将只部署到Rinkeby。部署到主网将需要真正的钱来支付gas,一旦部署,我们将无法修改代码。因此,最好先部署到Rinkeby,并彻底测试代码。
Get some Ether
在进行部署之前,请确保您的帐户中有足够的Ether。为了测试目的,获得以太币最简单的方法是通过一个被称为水龙头的服务。我们推荐在Rinkeby上运行的认证水龙头。按照说明操作,几分钟后,您的地址将被记入一些以太币。
实战演练
- 现在一切都设置好了,是时候部署到Rinkeby了。为此,在终端的右侧运行truffle migrate——network rinkeby。注意迁移是如何按顺序执行的😉。
注意:
truffle deploy
只是truffle migrate
的别名。但是,由于我们的命令行解释器非常基础,除非使用migrate
,否则它不会认为答案是正确的。
部署到主网一点也不复杂。一旦智能合约被测试,你只需要运行: truffle migrate --network mainnet
。别忘了你得付油钱!我们相信你能做到。
如果一切顺利,你会看到一个类似于右边的响应。
代码更新
Chapter 7: Use Truffle with Loom!
这可能看起来不多,但你刚刚部署了CryptoZombies
智能合约!
即使Truffle帮助很大,这也不是一件小事,所以拍拍自己的背吧
Loom Basechain
现在,如果你想在以太坊上构建dapp,有一件事你应该知道——在主网上,用户需要为每笔交易支付gas费。但这对于面向用户的DApp或游戏来说并不理想。它很容易破坏用户体验。
相反,在Loom上,你的用户可以进行更快速、更省油的交易,这使得它更适合游戏和其他非金融应用。
这意味着你的Loom僵尸将是快速僵尸!
这还不是全部——部署到Loom与部署到Rinkeby或以太坊主网没有什么不同。如果你知道如何做一件事,你也知道如何做另一件事。
在接下来的章节中,我们将引导您部署到Loom。
loom-truffle-provider
我们Loom正在使用Truffle来构建、测试和部署我们的智能合约。为了让我们的生活更轻松,我们开发了一个名为提供商的东西,它可以让truffle部署到Loom上,就像部署到Rinkeby或以太坊主网上一样。
无需深入研究太多细节,提供者就像一座桥梁,使Web3调用与Loom兼容。它的美妙之处在于,要使用它,你不需要了解它是如何工作的。
实战演练
- 我们已经将
loom-truffle-provider
作为一个npm
包提供。让我们来安装它。
注意:这一次,不需要使包全局可用。
代码更新![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/c8be48cc9997e49d435973438d5eff6c.png)
Chapter 8: Deploy to Loom Testnet
在本章中,我们将把智能合约部署到Loom测试网,但在部署之前,需要做一些准备工作。
首先,我们应该创建自己的Loom私钥。最简单的方法是根据本教程下载并安装Loom。
接下来,创建私钥就像这样简单:
$./loom genkey -a public_key -k private_key
local address: 0x42F401139048AB106c9e25DCae0Cf4b1Df985c39
local address base64: QvQBE5BIqxBsniXcrgz0sd+YXDk=
$cat private_key
/i0Qi8e/E+kVEIJLRPV5HJgn0sQBVi88EQw/Mq4ePFD1JGV1Nm14dA446BsPe3ajte3t/tpj7HaHDL84+Ce4Dg==
注意:千万不要泄露你的私钥!我们这样做只是为了简单起见。
Updating truffle.js
我们需要做的第一件事是初始化loom-truffle-provider。语法类似于我们已经为HDWalletProvider使用的语法:
const LoomTruffleProvider = require('loom-truffle-provider');
接下来,就像我们在第5章中所做的那样,我们必须让Truffle知道如何在Loom测试网上部署。为此,让我们向truffle.js添加一个新对象
loom_testnet: {
provider: function() {
const privateKey = 'YOUR_PRIVATE_KEY'
const chainId = 'extdev-plasma-us1';
const writeUrl = 'http://extdev-plasma-us1.dappchains.com:80/rpc';
const readUrl = 'http://extdev-plasma-us1.dappchains.com:80/query';
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
},
network_id: '9545242630824'
}
实战演练
代码更新
实战演练
代码更新
// Initialize HDWalletProvider
const HDWalletProvider = require("truffle-hdwallet-provider");
// 1. Initialize LoomTruffleProvider
const LoomTruffleProvider = require('loom-truffle-provider');
// Set your own mnemonic here
const mnemonic = "YOUR_MNEMONIC";
// Module exports to make this configuration available to Truffle itself
module.exports = {
// Object with configuration for each network
networks: {
// Configuration for mainnet
mainnet: {
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
},
network_id: "1"
},
// Configuration for rinkeby network
rinkeby: {
// Special function to setup the provider
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
},
// Network id is 4 for Rinkeby
network_id: 4
},
// 2. Put here the configuration for loom_dapp_chain
loom_testnet: {
provider: function() {
const privateKey = 'YOUR_PRIVATE_KEY'
const chainId = 'extdev-plasma-us1';
const writeUrl = 'http://extdev-plasma-us1.dappchains.com:80/rpc';
const readUrl = 'http://extdev-plasma-us1.dappchains.com:80/query';
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
},
network_id: '9545242630824'
}
}
};
Chapter 9: Deploy to Loom- continued
现在我们已经准备好了,只需一个命令就可以部署到Loom测试网。
实战演练
运行truffle migrate——network loom_testnet
并检查输出。
是的,它看起来很简单!💪🏻
代码更新
Chapter 10: Deploy to Basechain
恭喜你!您已经成功部署到Loom测试网。但你能猜到接下来会发生什么吗?🤔
是的,你说得对!本章将引导您完成部署到Basechain(即我们的主网)的过程。
以下是你在本章要做的事情的简要概述:
- 创建新的私钥。
- 创建一个新的私钥非常简单。但既然我们讨论的是部署到主网,那么是时候更认真地考虑安全问题了。因此,我们将向您展示如何安全地将私钥传递给Truffle。
- 告诉Truffle如何通过在Truffle .js配置文件中添加一个新对象来部署到Basechain。
- 将部署密钥列入白名单,以便可以部署到Basechain。
- 最后,我们通过实际部署智能合约来结束所有内容。
创建新的私钥
您已经知道如何创建私钥。但是,我们必须更改要保存它的文件的名称:
./loom genkey -a mainnet_public_key -k mainnet_private_key
local address: 0x07419790A773Cc6a2840f1c092240922B61eC778
local address base64: B0GXkKdzzGooQPHAkiQJIrYex3g=
将私钥安全地传递给Truffle
我们要做的下一件事是防止私钥文件被推送到GitHub。为此,让我们创建一个名为.gitignore的新文件:
touch .gitignore
现在,让我们“告诉”GitHub,我们希望它忽略我们保存私钥的文件,输入以下命令:
echo mainnet_private_key >> .gitignore
现在我们已经确保我们的秘密不会被推送到GitHub,我们必须编辑Truffle .js配置文件,让Truffle从这个文件中读取私钥。
让我们从导入一些东西开始:
const { readFileSync } = require('fs')
const path = require('path')
const { join } = require('path')
接下来,我们想要定义一个从文件中读取私钥并初始化一个新的LoomTruffleProvider的函数:
function getLoomProviderWithPrivateKey (privateKeyPath, chainId, writeUrl, readUrl) {
const privateKey = readFileSync(privateKeyPath, 'utf-8');
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
}
很简单,不是吗?
告诉Truffle如何部署到Basechain
现在,我们必须让Truffle知道如何部署到Basechain。为此,让我们向truffle.js添加一个新对象
basechain: {
provider: function() {
const chainId = 'default';
const writeUrl = 'http://basechain.dappchains.com/rpc';
const readUrl = 'http://basechain.dappchains.com/query';
const privateKeyPath = path.join(__dirname, 'mainnet_private_key');
const loomTruffleProvider = getLoomProviderWithPrivateKey(privateKeyPath, chainId, writeUrl, readUrl);
return loomTruffleProvider;
},
network_id: '*'
}
此时,你的truffle.js文件应该如下所示:
// Initialize HDWalletProvider
const HDWalletProvider = require("truffle-hdwallet-provider");
const { readFileSync } = require('fs')
const path = require('path')
const { join } = require('path')
// Set your own mnemonic here
const mnemonic = "YOUR_MNEMONIC";
function getLoomProviderWithPrivateKey (privateKeyPath, chainId, writeUrl, readUrl) {
const privateKey = readFileSync(privateKeyPath, 'utf-8');
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
}
// Module exports to make this configuration available to Truffle itself
module.exports = {
// Object with configuration for each network
networks: {
// Configuration for mainnet
mainnet: {
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/YOUR_TOKEN")
},
network_id: "1"
},
// Configuration for rinkeby network
rinkeby: {
// Special function to setup the provider
provider: function () {
// Setting the provider with the Infura Rinkeby address and Token
return new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/YOUR_TOKEN")
},
// Network id is 4 for Rinkeby
network_id: 4
},
basechain: {
provider: function() {
const chainId = 'default';
const writeUrl = 'http://basechain.dappchains.com/rpc';
const readUrl = 'http://basechain.dappchains.com/query';
const privateKeyPath = path.join(__dirname, 'mainnet_private_key');
const loomTruffleProvider = getLoomProviderWithPrivateKey(privateKeyPath, chainId, writeUrl, readUrl);
return loomTruffleProvider;
},
network_id: '*'
}
}
};![请添加图片描述](https://img-blog.csdnimg.cn/direct/d25744635306481aa54f0c5469fb35b2.png)
Whitelist your deployment keys
在部署到Basechain
之前,您需要按照我们的部署到 Deploy to Mainnet中的说明将密钥列入白名单。现在不要担心,但请记住,您必须在完成本教程后进行此操作。
我们已经执行了所有这些步骤,现在我们准备部署到Basechain!
实战演练
Run truffle migrate --network basechain
.
太棒了,你刚刚把你的智能合约部署到Basechain了!👏🏻
代码更新
Ending
做得好!👏🏻👏🏻👏🏻
您掌握了使用Truffle部署智能合约的艺术!
请记住,在Loom之上构建将为您带来更快,无gas的交易,使其成为创建区块链游戏和面向用户的dapp的完美选择。同时,您的用户将享受以太坊提供的安全保障!
另一件要记住的事情是,部署到Loom与部署到以太坊主网是多么相似。现在您知道了如何同时使用这两种方法,只是要注意如何为下一个项目😉选择使用哪一种方法。
无论如何,这只是一个例子——我们做了几个决定来简化事情,使课程更容易理解。
要进一步了解,请转到开发人员文档页面。
编码快乐!