Let's Do 本地开发智能合约

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

1、安装开发环境

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

我安装的是:java

1605342364352

2.集成开发框架truffle

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

  • 内置的智能合约编译,连接,部署和二进制管理。
  • 自动化合约测试,可快速发展。
  • 可编写脚本的,可扩展的部署和迁移框架。
  • 用于部署到任意数量的公共和专用网络的网络管理。
  • 包管理与EthPM&NPM,使用ERC190标准。
  • 用于直接合约通讯的交互式控制台。
  • 可配置的构建管道,支持紧密集成。
  • 外部脚本运行程序,在Truffle环境中执行脚本。
$ npm install truffle -g

注:-g是全局安装webpack

安装完成后,查看truffle版本git

$ truffle version

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

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端口上运行一个开发链。web

下载地址:https://www.trufflesuite.com/... ,下载后的文件后缀是appx,安装须要一点时间,第一次安装后,后面直接启动便可,启动依然是点击 下载的appx安装包,而后点击启动,愚笨的我刚开始居然不知道怎么启动,还一直傻乎乎的在找安装目录。npm

1605342711168

Ganache 启动以后是这样:windows

1605346811925

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

  • 帐户:默认会有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

1605343125845

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

2、建立一个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目录

1605345299462

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

  • contracts/ 智能合约的文件夹,全部的智能合约文件都放置在这里,里面包含一个重要的合约Migrations.sol(稍后再讲)
  • migrations/ 用来处理部署(迁移)智能合约 ,迁移是一个额外特别的合约用来保存合约的变化。(注意:每一个migration文件前面有序号,这个序号表示migration文件的执行顺序)
  • test/ 智能合约测试用例文件夹
  • truffle.js/ 配置文件,配置不一样网络

其余代码能够暂时不用管。

另外,咱们看到.sol 文件中的solidity版本不是咱们安装的版本,因此,改为咱们刚刚安装的版本,改为^0.5.16,

1605434111302

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

1605345283701

代码的理解都比较简单,我几乎都加上了注释,这里就不讲解了,代码下载地址:https://github.com/joeBeckham...

1605347808271

3、编译部署

打开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

从新执行编译命令:

1605347533591

编译完成后,咱们会看到在项目中出现了build文件夹,里面会有 abi、bytecode、network。

1605347631640

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合约。

1605433161852

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

执行部署结果比较长,我只贴出一部分:

1605433444283

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

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

1605433635464

区块确实产生了4个:

1605433727346

还产生了5笔交易:

1605433802907

都展现的比较清楚。

3.测试

truffle test

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

1605434329249

全部测试合约必须以 Test 开头,使用大写的 T 。这样的命名方式就将测试合约和普通合约区分开来了,
让测试运行器知道哪一个合约表明测试套件。

跟测试合约相似,全部的测试方法,都必须以小写单词 test 开头。每一个测试方法都会被看成一个独立的交易,
根据在测试文件中定义的顺序执行。

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

1605434703997

咱们看到两个test都经过了,说明是部署合约的帐户里面的余额是10000。

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

另外,若是你和我同样不喜欢黑色背景的话,那么咱们切换背景色,ctrl+k, ctrl+t,选择咱们喜欢的颜色便可哦。

文章持续更新,能够微信搜一搜「 码咖 」第一时间阅读
相关文章
相关标签/搜索