乐趣区

关于后端:Lets-Do-本地开发智能合约

上篇文章咱们发了个币,有人埋怨在线(remix)写代码不爽,好吧,那就来看下怎么在本地开发智能合约?

一、装置开发环境

1. 装置 Node,Node v8.9.4 或更高版本

我装置的是:

2. 集成开发框架 truffle

那么 Truffle(官网:https://www.trufflesuite.com/…)是什么,Truffle 是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简略:

  • 内置的智能合约编译,链接,部署和二进制治理。
  • 自动化合约测试,可疾速倒退。
  • 可编写脚本的,可扩大的部署和迁徙框架。
  • 用于部署到任意数量的公共和专用网络的网络管理。
  • 包治理与 EthPM&NPM,应用 ERC190 规范。
  • 用于间接合约通信的交互式控制台。
  • 可配置的构建管道,反对严密集成。
  • 内部脚本运行程序,在 Truffle 环境中执行脚本。
$ npm install truffle -g

注:- g 是全局装置

装置实现后,查看 truffle 版本

$ truffle version

后果如下,咱们能够看到 truffle、solidity、node 和 web3.js 的版本,这里的 solidity 是 0.5.16,前面咱们会用到这个版本。

Truffle v5.1.52 (core: 5.1.52)
Solidity v0.5.16 (solc-js)
Node v10.15.3
Web3.js v1.2.9

3. 下载 ganache

那么 ganache 是什么呢?咱们应用 ganache 来开启一个私链来进行开发测试,默认会在 7545 端口上运行一个开发链。

下载地址:https://www.trufflesuite.com/…,下载后的文件后缀是 appx,装置须要一点工夫,第一次装置后,前面间接启动即可,启动仍然是点击 下载的 appx 安装包,而后点击启动,愚蠢的我刚开始居然不晓得怎么启动,还始终傻乎乎的在找装置目录。

Ganache 启动之后是这样:

在第一行咱们能够看到有账户、区块、交易、合约、事件、日志。

  • 账户:默认会有 10 个账户,别离有 100 个 ETH;
  • 区块:区块只有一个,即创世区块;
  • 交易、合约、事件:刚启动是空的;

4. 下载 IDE

这里咱们应用 VSCode,下载实现后咱们须要给 VSCode 装置几个插件,solidity、solidity-windows、vscode-icons、local history。

当然 vscode-icons、local history 也能够不必装置,vscode-icons 只是将目录显示成带图标的文件夹,看起来更加不便而已。local history 只是每次批改保留文件时,都会在根目录的.history 目录生成一个批改记录文件,只是一个历史记录而已,不便代码的找回。

必备插件是 solidity、solidity-windows

好,以上咱们的筹备工作就曾经做完了,让咱们来一起开发智能合约吧,Just do it

二、创立一个 Truffle 我的项目

对于咱们初学者,咱们应用应用 Truffle Boxes,它们是示例应用程序和我的项目模板。

1. 创立一个目录

D:\workspace\solidity\test

2. 下载 metacoin

切换到刚刚创立的目录,下载 metacoin,执行:

$ truffle unbox metacoin

如果你的机器和我一样是 windows 的话,你能够会遇到这个问题,

$ truffle unbox metacoin

Starting unbox...
=================

- Preparing to download box
√ Preparing to download box
- Downloading
× Downloading
Unbox failed!
RequestError: Error: getaddrinfo ENOENT raw.githubusercontent.com raw.githubusercontent.com:443
    at new RequestError (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\errors.js:14:1)
    at Request.plumbing.callback (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\plumbing.js:87:1)
    at Request.RP$callback [as _callback] (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\plumbing.js:46:1)
    at self.callback (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request\request.js:185:1)
    at Request.emit (events.js:189:13)
    at Request.onRequestError (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request\request.js:881:1)
    at ClientRequest.emit (events.js:189:13)
    at TLSSocket.socketErrorListener (_http_client.js:392:9)
    at TLSSocket.emit (events.js:189:13)
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
Truffle v5.1.52 (core: 5.1.52)
Node v10.15.3

解决办法:

通过 https://www.ipaddress.com 查问 raw.githubusercontent.com 的地址。配置 host 文件  C:\Windows\System32\drivers\etc\host   减少地址
199.232.68.133  raw.githubusercontent.com

Linux 是进入 /etc/hosts 中增加
199.232.68.133  raw.githubusercontent.com

而后从新执行下载 metacoin 的命令。

3. 应用 VSCode 关上

应用 VSCode 关上 D:\workspace\solidity\test 目录

能够看到有三个目录,contracts、migrations、test,

  • contracts/ 智能合约的文件夹,所有的智能合约文件都搁置在这里,外面蕴含一个重要的合约 Migrations.sol(稍后再讲)
  • migrations/ 用来解决部署(迁徙)智能合约,迁徙是一个额定特地的合约用来保留合约的变动。(留神:每个 migration 文件后面有序号,这个序号示意 migration 文件的执行程序)
  • test/ 智能合约测试用例文件夹
  • truffle.js/ 配置文件,配置不同网络

其余代码能够临时不必管。

另外,咱们看到.sol 文件中的 solidity 版本不是咱们装置的版本,所以,改成咱们刚刚装置的版本,改成 ^0.5.16,

在 truffle.js 中,咱们须要去掉 networks 的正文,在这里能够定义开发环境、测试环境、生产环境的 host、port、network_id

代码的了解都比较简单,我简直都加上了正文,这里就不解说了,代码下载地址:https://github.com/joeBeckham…

三、编译部署

关上 VSCode 的命令行:

1. 编译

$ truffle compile

我 *,又报错:

PS D:\workspace\solidity\metacoin> truffle compile

truffle : 无奈加载文件 D:\Program Files\nodejs\node_global\truffle.ps1,因为在此零碎上禁止运行脚本。无关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkI
D=135170 中的 about_Execution_Policies。所在位置 行:1 字符: 1
+ truffle compile
+ ~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

起因:

是在计算机上启动 Windows PowerShell 时,执行策略是 Restricted(默认设置)。

Restricted 执行策略不容许任何脚本运行。

AllSigned 和 RemoteSigned 执行策略可避免 Windows PowerShell 运行没有数字签名的脚本。

解决办法:

查看计算机上的现用执行策略,get-executionpolicy;

管理员身份关上 PowerShell 输出 set-executionpolicy remotesigned,设置执行策略

PS D:\workspace\solidity\metacoin> get-executionpolicy
Restricted
PS D:\workspace\solidity\metacoin> set-executionpolicy remotesigned

从新执行编译命令:

编译实现后,咱们会看到在我的项目中呈现了 build 文件夹,外面会有 abi、bytecode、network。

2. 部署

truffle migration

特地阐明下,在 migrations 文件夹下曾经有一个 1_initial_migration.js 部署脚本,用来部署 Migrations.sol 合约。
Migrations.sol 用来确保不会部署雷同的合约。

而咱们最次要的部署脚本是在 2_deploy_contracts.js 中,这个脚本是为了部署 MetaCoin 合约,会按程序执行完上一步的脚本后执行。

一个简略的部署合约脚本能够用三行实现:

// 导入合约
const TestContract = artifacts.require("TestContract");

module.exports = function(deployer) {
  // 部署合约
  deployer.deploy(TestContract);
};

2_deploy_contracts.js 中的内容只是又导入了 ConvertLib,并且把 ConvertLib 部署,ConvertLib 部署后把 ConvertLib 关联到 MetaCoin 合约,而后在部署 MetaCoin 合约。

那么,咱们执行部署命令:truffle migration

执行部署后果比拟长,我只贴出一部分:

咱们能够看到有交易的 hash、打包的区块、产生的区块数量、合约地址、账号地址、账户余额、gas 费、总破费 ETH。

咱们接下来在看下 Ganache 中,账户 0x16664D3d037d041183ff998Cb218602457Aff012 的余额保留两位小数后的确是 99.99,

区块的确产生了 4 个:

还产生了 5 笔交易:

都展现的比较清楚。

3. 测试

truffle test

合约部署完了,咱们怎么测试正确性呢,总不能间接上吧,币圈不是都很多我的项目都是上线即崩盘嘛。我的项目目录中有一个 test 文件夹,文件夹中有两个文件,一个是 metacoin.js,另一个是 TestMetaCoin.sol。metacoin.js 是通过 javascript 测试,TestMetaCoin.sol 通过 solidity 来测试。这里咱们应用 第二种形式 TestMetaCoin.sol,所以删除掉 metacoin.js。TestMetaCoin.sol 中的代码也比较简单:

所有测试合约必须以 Test 结尾,应用大写的 T。这样的命名形式就将测试合约和一般合约辨别开来了,
让测试运行器晓得哪个合约代表测试套件。

跟测试合约相似,所有的测试方法,都必须以小写单词 test 结尾。每个测试方法都会被当作一个独立的交易,
依据在测试文件中定义的程序执行。

那么,咱们来执行测试命令:truffle test

咱们看到两个 test 都通过了,阐明是部署合约的账户外面的余额是 10000。

到这里,咱们的整个流程就曾经跑通了,开发环境、编码工具、本地链、代码编译、部署、测试都 ok 了。前面咱们更加深刻的介绍智能合约。

另外,如果你和我一样不喜爱彩色背景的话,那么咱们切换背景色,ctrl+k, ctrl+t,抉择咱们喜爱的色彩即可哦。

文章继续更新,能够微信搜一搜「码咖」第一工夫浏览

退出移动版