我有一壶酒,足以慰平生。

0%

使用truffle部署DAPP

Introduction

如果您是CryptoZombies的新手,强烈建议您在开始本课程之前先阅读前六个课程。请花一些时间来熟悉编写智能合约。否则,将很难上这节课。

失踪的一块

因此,您已经完成了之前的课程。太棒了!这意味着您几乎已经掌握了构建DApp的技巧。

但是,这个难题的一个重要部分仍然缺失。

是的…您仍然必须学习如何部署智能合约\

现在,如果您有前端开发的背景,那么您可能已经习惯于使用Webpack,Gulp或Browserify等众多工具来简化开发人员的工作。

但是,Solidity开发人员使用哪些工具?

truffle

truffle是有理由的最受欢迎的区块链开发框架-它具有许多有用的功能:

  • 轻松编写智能合约
  • 自动ABI生成
  • 集成的智能合约测试-甚至还支持MochaChai
  • 支持多种网络-代码可以部署到Rinkeby,Ethereum\甚至Loom\。稍后我们将引导您完成😉

只要npmnode已安装在计算机上,我们会要你安装松露,并使其在全球上市。

进行测试

我们将从基础开始。启动一个新的终端窗口,创建一个名为的目录CryptoZombies,并cd进入该目录。

  1. 现在,让我们安装Truffle并使其在全球范围内可用。

    注意:以下是npm用于安装软件包并使之在全球范围内可用的方法:

    1
    npm install package_name -g

image-20200702103709631

Truffle入门

现在我们已经安装了 Truffle,是时候通过运行初始化我们的新项目了truffle init。它要做的就是创建具有以下结构的一组文件夹和配置文件:

1
2
3
4
5
6
7
├── contracts
├── Migrations.sol
├── migrations
├── 1_initial_migration.js
└── test
truffle-config.js
truffle.js

合同,迁移,测试…这非常复杂😟

别担心,学习使用松露不会吃掉你的大脑。本章将向您介绍Truffle的默认项目结构,一旦您知道如何使用Truffle,部署智能合约将变得轻而易举。

Truffle的默认目录结构

因此,truffle initCryptoZombies目录中运行命令,应创建多个目录以及一些JavaScript和Solidity文件。让我们仔细看看:

  • 合同\Truffle希望在这里找到我们所有的智能合同。为了使代码井井有条,我们甚至可以创建诸如的嵌套文件夹contracts/tokens。挺整齐的。

    注意:truffle init应自动创建一个名为的合同Migrations.sol和相应的迁移文件。我们稍后再解释。

  • 迁移\:迁移是一个JavaScript文件,可告诉 Truffle如何部署智能合约。

  • 测试\:在这里,我们希望将单元测试放在JavaScript或Solidity文件中。请记住,合同一旦部署就无法更改,因此必须在部署智能合约之前对其进行测试。

  • truffle.js\truffle\ -config.js\:用于存储用于部署的网络设置的配置文件。松露需要两个配置文件,因为在Windows上同时具有这两个文件夹truffle.js并且truffle.exe在同一文件夹中可能会产生冲突。长话短说-如果您正在运行Windows,建议将其删除truffle.jstruffle-config.js用作默认配置文件。查阅 Truffle官方文档以进一步了解。

但是,为什么要使用此目录结构?我不习惯,看起来很复杂…

好吧,有几个很好的理由。首先,如果您更改这些文件夹的名称,松露将无法正常工作。

其次,通过遵守该约定,其他开发人员将容易理解您的项目。简而言之,使用标准的文件夹结构和代码约定可以使将来扩展或更改团队变得更容易。

Truffle-hdwallet-provider

在本课程中,我们将使用Infura将代码部署到Ethereum\。这样,我们可以运行应用程序而无需设置我们自己的以太坊\节点或钱包。但是,为了确保安全,Infura不管理私钥,这意味着它无法代表我们签署交易。由于部署智能合约需要Truffle签署交易,因此我们需要一个名为的工具truffle-hdwallet-provider。它的唯一目的是处理事务签名。

注意:也许您在问为什么我们选择不truffle-hdwallet-provider使用上一章中的内容来安装:

1
npm install truffle truffle-hdwallet-provider

好吧…该truffle init命令希望找到一个空目录。如果那里有任何文件,它将出错。因此,我们需要按正确的顺序进行所有操作并truffle-hdwallet-provider在运行后安装truffle init

进行测试:

  1. 运行truffle init。该命令生成我们已经讨论过的目录结构。
  2. 运行npm install truffle-hdwallet-provider

image-20200702103851398

编译智能合约源码

恭喜你!现在,我们已经建立了项目结构并进行了设置truffle-hdwallet-provider,让我们编译合同。

您问为什么我们需要编译?

以太坊虚拟机编写时无法直接理解Solidity源代码。因此,我们需要运行一个将智能合约“翻译”成机器可读字节码的编译器\。然后,虚拟机执行字节码,并完成我们的智能合约所需的操作。

对字节码的外观感到好奇吗?让我们来看看:

1
"0x60806040526010600155600154600a0a6002556201518060035566038d7ea4c6800060085560006009556046600a55336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1..."

如您所见,人类几乎可以像现实中的僵尸一样读取字节码!

使用Solidity编译器

现在我们正在谈论Solidity编译器,我们应该提到开发人员设法引入了一些漂亮的功能。

假设我们要修改add包含在其中的函数的定义SafeMath

1
2
3
4
5
function add(uint16 a, uint16 b) internal returns (uint16) {
uint16 c = a + b;
assert(c >= a);
return c;
}

如果我们要编译此函数,Solidity编译器将发出警告\

1
2
3
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修饰符。

为什么这很重要?

好吧,发挥作用pureview节省我们的精力。由于这些功能不会修改区块链的状态,因此矿工无需执行它们。把它放在了几句话,pureview功能可以call编为免费。

CryptoZombies-游戏

请记住,我们已经将逻辑嵌入到名为的智能合约中ZombieOwnership.sol

嗯…不是游戏的好名字。

幸运的是,这不是问题。我们可以使用继承来创建具有相同操作和功能的智能合约,而无论选择什么名称。

让我们创建一个新的智能合约CryptoZombies,该合约继承自ZombieOwnership.sol

1
2
3
4
5
6
7
8
pragma solidity ^0.4.24;

import "./zombieownership.sol";

contract CryptoZombies is ZombieOwnership
{

}

接下来,我们将所有智能合约复制到该./contracts文件夹中。现在,项目结构应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── contracts
├── Migrations.sol
├── CryptoZombies.sol
├── erc721.sol
├── ownable.sol
├── safemath.sol
├── zombieattack.sol
├── zombiefactory.sol
├── zombiefeeding.sol
├── zombiehelper.sol
├── zombieownership.sol
├── migrations
└── test

一切都已正确设置。让我们编译我们的项目。

进行测试:

  1. 执行truffle compile。此命令应创建构建工件并将其放置在./build/contracts目录中。

    注意:构建工件由智能合约,ABI的“字节码”版本以及Truffle用来正确部署代码的一些内部数据组成。避免编辑这些文件,否则Truffle可能无法正常工作。

image-20200702104326875

Migrations

通常,在这一点上,在部署到以太坊\之前,您需要在本地测试智能合约。您可以使用名为Ganache的工具来进行此操作,该工具可以设置本地以太坊\网络。

但是,尽管测试非常重要,但它需要覆盖整个课程-因此,我们将在本课程中坚持部署。如果您愿意的话,想了解更多有关测试的信息,我建议您使用“松露测试智能合约”课程。

要部署到以太坊,\我们将不得不创建一种称为迁移的东西。

迁移是JavaScript文件,可帮助Truffle将代码部署到以太坊\。请注意,truffle init创建了一个特殊合同Migrations.sol,该合同跟踪您对代码所做的更改。它的工作方式是将更改历史记录保存在链上。因此,您将永远不会两次部署相同的代码。

创建一个新的迁移

我们将从truffle init为我们创建的文件开始./contracts/1_initial_migration.js。让我们看看里面是什么:

1
2
3
4
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

进行测试:

  1. 修改./contracts/2_crypto_zombies.js为此:
1
2
3
4
var CryptoZombies = artifacts.require("./CryptoZombies.sol");
module.exports = function(deployer) {
deployer.deploy(CryptoZombies);
};

image-20200702104510599

Configuration Files

太棒了!您已经成功编译了源代码并创建了迁移文件。

在部署之前,还有另外一件事要做。我们必须编辑配置文件,以告知Truffle我们要部署到的网络。

等等,我以为只有一个以太坊\网络。我在这里想念什么?

以太坊测试网络

几个公共的以太坊\测试网络可让您在将合约部署到主网上之前免费测试合约(记住,一旦将合约部署到主网上就无法更改)。这些测试网络使用与主网络不同的共识算法(通常是PoA),而Ether可以自由地鼓励进行彻底的测试。

在本课程中,我们将使用以太坊基金会创建的公共测试网络Rinkeby。

truffle.js配置文件

现在,让我们看一下默认的Truffle配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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-hdwallet-provider

还记得第二章吗?

我们要求您安装一个名为Truffle的附加软件包truffle-hdwallet-provider,以帮助进行交易。

现在,我们要编辑配置文件以使用HDWalletProvider。为了使其正常工作,我们将在文件顶部添加一行:

1
var HDWalletProvider = require("truffle-hdwallet-provider");

接下来,我们将创建一个新变量来存储助记符:

1
var mnemonic = "onions carrots beans ...";

请注意,我们不建议在配置文件中存储诸如助记符或私钥之类的机密。

…但为什么?

配置文件经常被推送到GitHub,任何人都可以看到它们,这让您很容易受到攻击😱!为避免显示助记符(或私钥!),应从文件中读取该助记符并将其添加到中.gitignore。稍后我们将向您展示如何执行此操作。

为了使这种情况简单,我们已经复制了助记符并将其存储在变量中。

为Rinkeby和以太坊主网设置Truffle

接下来,要确保Truffle``知道’’我们要部署到的网络,我们将必须创建两个单独的对象-一个用于Rinkeby,另一个用于以太坊\主网:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
}

注意:提供程序值包装在一个函数中,以确保在需要之前不会对其进行初始化。

包起来

现在,让我们将这些片段放在一起,看看我们的配置文件应如何显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 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 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
}
}
};

进行测试:

我们已经为您更新了大部分配置文件。让我们填写缺失的部分:

  1. 在文件顶部,添加用于初始化的代码行truffle-hdwallet-provider
  2. 填写network_idRinkeby网络。如果您不记得该参数的值,请从上方检查代码段。

测试

truffle.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

//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 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: 4 //Fill in the `network_id` for the Rinkeby network.
}
}
};

Deploying Our Smart Contract

棒极了!那是困难的部分-实际部署到Rinkeby将会很简单。为此,松露依赖于称为migration的东西。

迁移

听起来迁移似乎涉及很多事情,但是在实践中,迁移无非是一个JavaScript文件,该文件告诉Truffle如何修改智能合约的状态。

显然,第一次迁移将仅部署智能合约。其他一些迁移会部署新版本的代码以添加功能或修复错误。

简而言之,迁移提供了一种方便的方法来跟踪您对代码所做的更改。

如果要部署多个合同,则必须为每个合同创建一个单独的迁移文件。迁移始终以1,2,3等顺序执行。

在本课程中,我们将仅部署到Rinkeby。部署到主网将需要实际资金来支付天然气,一旦部署,我们将无法修改代码。因此,最好先部署到Rinkeby,并彻底测试代码。

得到一些Ether

在进行部署之前,请确保您的帐户中有足够的以太币。为了测试目的而获得Ether的最简单方法是通过称为的服务faucet。我们建议在Rinkeby上运行的Authenticated水龙头。按照说明进行操作,然后在几分钟之内,您的地址将被记入一些以太币。

进行测试

  1. 现在一切都已设置好,是时候部署到Rinkeby了。为此,请truffle migrate --network rinkeby在右侧的终端中运行。请注意如何按顺序执行迁移。

    注意:truffle deploy只是的别名truffle migrate。但是,由于我们的命令行解释器非常基础,因此除非您使用,否则它不会认为答案正确migrate

部署到主网根本不复杂。测试智能合约后,您只需运行:truffle migrate --network mainnet。别忘了,您将需要支付汽油费!我们相信您将能够做到。

如果一切顺利,您将看到与右边的响应类似的响应。

image-20200702110413711

Use Truffle with Loom!

看起来似乎不多,但您只是部署了CryptoZombies智能合约!

即使松露起到了很大的作用,这也不是一件容易的事,所以请轻敲自己。

织机基础链

现在,如果您想在以太坊\上构建DApp\,则需要注意一件事-在主网上,用户需要为每笔交易支付汽油费\。但这对于面向用户的DApp或游戏而言并不理想。它很容易破坏用户体验。

相反,在Loom上\,您的用户可以更快,更省钱地进行交易,从而使其更适合游戏和其他非金融应用程序。

这意味着您的织机\僵尸将是快速僵尸!

不仅如此-部署到Loom\与部署到Rinkeby或以太坊主网没有什么不同。如果您知道该怎么做,那么您也知道该如何做。

在下一章中,我们将引导您完成部署到Loom的过程\

织机松露供应商

Loom的\我们正在使用Truffle来构建,测试和部署我们的智能合约。为了使我们的生活更轻松,我们开发了一种称为提供程序的服务程序\,该服务程序\使Truffle部署到Loom\,就像部署到Rinkeby或以太坊主网一样。

无需过多研究细节,该提供程序就像一座桥梁,使Web3调用与Loom\兼容。它的优点在于,使用它时,您不必了解它是如何工作的。

进行测试:

  1. 我们已经取得了loom-truffle-provider可以作为一个npm包。让我们安装它。

    注意:这一次,无需使程序包全局可用。

image-20200702110704581

Deploy to Loom Testnet

在本章中,我们将智能合约部署到Loom\ Testnet,但是在进行部署之前,需要做一些准备工作。

首先,我们应该创建自己的Loom\私钥。最简单的方法是根据本教程下载并安装Loom\

接下来,创建私钥是如此简单:

1
2
3
4
5
$./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==

注意:切勿泄露您的私钥!为了简化起见,我们只是这样做。

更新truffle.js

我们需要做的第一件事是初始化loom-truffle-provider。语法类似于我们已经使用的语法HDWalletProvider

1
const LoomTruffleProvider = require('loom-truffle-provider');

接下来,就像在第5章中所做的那样,我们必须让Truffle\知道如何在Loom\测试网上进行部署。为此,我们将一个新对象添加到truffle.js

1
2
3
4
5
6
7
8
9
10
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'
}

进行测试:

  1. 添加初始化代码行LoomTruffleProvider
  2. 将配置loom_testnet放在文件底部附近。

测试

./truffle.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 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'
}

}
};

Deploy to Loom- continued

现在,我们只需一个命令就可以将所有内容部署到Loom\ Testnet。

进行测试:

  1. 运行truffle migrate --network loom_testnet并检查输出。

    是的,您看起来很简单!simple

image-20200702122942844

image-20200702131804011

Deploy to Basechain

恭喜你!您已成功部署到Loom\ Testnet。但是你能猜出接下来会发生什么吗?🤔

是的,你是对的!本章将引导\您完成部署到Basechain\(即我们的Mainnet)的过程。

以下是本章将要执行的操作的简要概述:

  • 创建一个新的私钥。
  • 创建一个新的私钥非常简单。但是,由于我们正在谈论部署到主网络,因此该变得更加重视安全性了。因此,我们将向您展示如何安全地将私钥传递给Truffle
  • 通过向配置文件添加新对象,告诉Truffle如何部署到Basechain\truffle.js
  • 将部署密钥列入白名单,以便您可以部署到Basechain\
  • 最后,我们通过实际部署智能合约来包装所有内容。

创建一个新的私钥

您已经知道如何创建私钥。但是,我们必须更改要在其中保存文件的文件名:

1
2
3
./loom genkey -a mainnet_public_key -k mainnet_private_key
local address: 0x07419790A773Cc6a2840f1c092240922B61eC778
local address base64: B0GXkKdzzGooQPHAkiQJIrYex3g=

安全地将私钥传递给truffle

我们要做的下一件事是防止将私钥文件推送到GitHub。为此,我们创建一个名为的新文件.gitignore

1
touch .gitignore

现在让我们“告诉” GitHub,我们希望它通过输入以下命令来忽略保存私钥的文件:

1
echo mainnet_private_key >> .gitignore

现在,我们确保不会将自己的秘密发送到GitHub,我们必须编辑truffle.js配置文件并将其创建,以便Truffle从该文件读取私钥。

让我们从导入几件事开始:

1
2
3
const { readFileSync } = require('fs')
const path = require('path')
const { join } = require('path')

接下来,我们想定义一个函数,该函数从文件中读取私钥并初始化一个新的LoomTruffleProvider

1
2
3
4
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

1
2
3
4
5
6
7
8
9
10
11
12
basechain: {
provider: function() {
const chainId = 'default';
const writeUrl = 'http://basechain.dappchains.com/rpc';
const readUrl = 'http://basechain.dappchains.com/query';
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
const privateKeyPath = path.join(__dirname, 'mainnet_private_key');
const loomTruffleProvider = getLoomProviderWithPrivateKey(privateKeyPath, chainId, writeUrl, readUrl);
return loomTruffleProvider;
},
network_id: '*'
}

此时,您的truffle.js文件应类似于以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 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';
return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey);
const privateKeyPath = path.join(__dirname, 'mainnet_private_key');
const loomTruffleProvider = getLoomProviderWithPrivateKey(privateKeyPath, chainId, writeUrl, readUrl);
return loomTruffleProvider;
},
network_id: '*'
}
}
};

将您的部署密钥列入白名单

在部署到Basechain\之前,您需要按照我们的Deploy to Mainnet指南中的说明将密钥列入白名单。现在不必担心,但是请记住,在完成本教程后,您必须这样做。

我们已经进行了所有这些步骤,现在可以部署到Basechain了\

进行测试:

  1. 运行truffle migrate --network basechain

太棒了,您刚刚将智能合约部署到了Basechain!👏🏻

image-20200702134923452

image-20200702135051581

image-20200702135127702

您的支持是我继续创作的动力