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

一、安装开发环境

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

我安装的是:

2.集成开发框架truffle

那么Truffle(官网:https://www.trufflesuite.com/truffle)是什么,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/ganache ,下载后的文件后缀是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/test.git

三、编译部署

打开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,选择我们喜欢的颜色即可哦。。

文章持续更新,可以微信搜一搜「 码咖 」第一时间阅读

Let's Do 本地开发智能合约的更多相关文章

  1. 以太坊系列之十一: 零起步使用remix开发智能合约

    一步一步使用remix开发智能合约 最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要FQ才能访问(自行解决). 1.打开remix 注意地址如果是htt ...

  2. vscode开发智能合约

    开发工具 EOS 开发终极神器-vscode (你绝对找不到的干货) lome · 2018年04月19日 · 最后由 18636292520 回复于 2018年09月15日 · 15672 次阅读 ...

  3. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

  4. 搭建智能合约开发环境Remix IDE及使用

    目前开发智能的IDE, 首推还是Remix, 而Remix官网, 总是由于各种各样的(网络)原因无法使用,本文就来介绍一下如何在本地搭建智能合约开发环境remix-ide并介绍Remix的使用. 写在 ...

  5. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  6. hyperledger fabric 智能合约开发

    开发步奏: 1.创建教育联盟 2.区块链服务平台自动生成通道id 3.区块链网络服务人员通过命令行在区块链网络中创建对应通道 4.创建相关教育组织 5.邀请相关组织加入联盟 6.区块链网络管理人员通过 ...

  7. 以太坊智能合约开发工具 Truffle 入门1

    Truffle是以太坊(Ethereum)智能合约开发的瑞士军刀,小巧好用,上手简单. 本篇文章主要展示如何用Truffle 开发第一个Ethereum智能合约. 1.准备工作:(本人针对window ...

  8. ETH智能合约测试

    ETH的智能合约一般用Solidity语言编写,懂点基本solidity语法会更好地测试 测试中需要用到的工具: 一份智能合约 Remix(一个在线IDE,用来编译.编辑.部署智能合约,需要FQ才能使 ...

  9. EOS基础全家桶(十一)智能合约IDE-EOS_Studio

    简介 我们马上要进入智能合约的开发了,以太坊最初提供了智能合约的功能,并宣告区块链进入2.0时代,而EOS的智能合约更进一步,提供了更多的便利性和可能性.为了进一步了解智能合约,并进行开发,我们需要先 ...

随机推荐

  1. 运行Apache时出现the requested operation has failed

    在修改自己主机E:\wamp\apache\conf中的httpd.conf中的站点位置后,重新运行Apache时,出现对话框提示"the requested operation has f ...

  2. git提交后文件夹显示灰色无法打开的解决办法

    上传完本地文件到gitee线上后发现如下情况,文件夹显示为灰色并且无法访问. xxx@xxx 的灰色文件 问题原因 : 无法点击的灰色文件夹中含有 .git 文件 即在本地初始化的仓库(使用 git ...

  3. 探索G1垃圾回收器

    前言 最近王子因为个人原因有些忙碌,导致文章更新比较慢,希望大家理解,之后也会持续和小伙伴们一起共同分享技术干货. 上篇JVM的文章中我们对ParNew和CMS垃圾回收器已经有了一个比较透彻的认识,感 ...

  4. GANSS 87C键盘在Linux无法正常使用的解决办法

    前几天在狗东入手可以一把GANSS的87C键盘,满心欢喜拆开来用却发现在开发电脑(Deepin和ubuntu)上F1-F12都不能正常使用,这对一个搞web开发的人来说,无疑是要了我的老命,无奈找各种 ...

  5. kafka的基本安装与使用

    kafka的基本安装与使用 1.上官网下载tar包 2.解压 3.运行zookeeper 4.运行kafka服务器 5.创建topic 6.发送消息 7.监听消息 1.上官网下载tar包 https: ...

  6. 三十二张图告诉你,Jenkins构建Spring Boot 有多简单~

    持续原创输出,点击上方蓝字关注我 目录 前言 如何安装Jenkins? 环境准备 开始安装Jenkins 初始化配置 访问首页 输入管理员密码 安装插件 创建管理员 实例配置 配置完成 构建Sprin ...

  7. Entity Fremework以及Fluentapi学习

    一.Entity Framework的入门  我这里采用的方式是数据库自己建立  然后模型类自己建立 数据库上下文类自己建立的方式 目的在于弄懂原理 其他的数据库优先等方式这里就不写了  教程有很多. ...

  8. ImpalaTest

    package com.niewj.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  9. 分布式文档存储数据库之MongoDB备份与恢复

    前文我们聊了下mongodb的访问控制以及用户创建和角色分配,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13974656.html:今天我们来了解下mong ...

  10. const常量与define宏定义的区别(转)

    #define RADIUS 100; const  float   RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...