以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约
在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合约。
本文我们使用另一个客户端Ganache,搭建并运行自己的智能合约HelloWorld。

本文环境:

Mac OS 10.13.3

Node v9.5.0

Truffle v4.0.6

Ganache CLI v6.0.3 (ganache-core: 2.0.2)

Ganache
Ganache(取代了EtherumJS TestRPC)
官方GitHub:(https://github.com/trufflesuite/ganache-cli)

Ganache介绍
Ganache这个名字比较陌生,但是它的前身TestRPC却是大名鼎鼎,网上的很多老文章里都是用TestRPC。Ganache是奶油巧克力的意思,据说是很久之前有个学徒做巧克力的放多了牛奶,师傅正要骂他,结果一尝发现味道还真不错,于是一种新的巧克力就诞生了~ Truffle是松露巧克力,一般是以Ganache为核,然后上面撒上可可粉,所以这两个产品的名字还是很贴切的。

Ganache是一个运行在个人桌面上的以太坊开发者的个人区块链。Ganache是Truffle Suite的一部分,通过把合约和交易放到前面来简化dapp的开发。通过使用Ganache,你可以快速的看到你的应用是如何影响区块链的。其中细节:如你的账户、余额、合约及Gas成本。你也可以调整Ganache的采矿控制来更好的适用你的应用。

Ganache 还为那些不在图形化界面工作的人提供了一个命令行工具。非常适合自动化测试和持续集成的环境, Ganache CLI可以配置为满足你所有的开发需求,Ganache CLI快速的处理交易而不是等待默认的区块时间,因此,你的代码测试可以非常的快。当你的智能合约遇到错误时,它也可立刻告诉你,而且,与其它的客户端比较起来,使用truffle的直接集成可以减少测试时间90%以上。

Ganache下载安装
Ganache现在有两个版本,一个是带图形界面的版本,下载地址:
https://github.com/trufflesuite/ganache/releases

还有一个就是命令行版本了,下载安装方法:
$ sodu npm install -g ganache-cli
sodu为获取管理员权限,如果提示需要权限才可安装,请在指令前加上sudo。

安装完成后命令行输入$ ganache-cli,查看是否安装成功。
注意:启动ganache-cli也是此指令。

使用Truffle编写测试自己的智能合约HelloWorld
初始化一个 Truffle 项目
通过truffle init命令, 可以初始化一个新的智能合约项目,后面我们会在其中进行改动:

yuyangdeMacBook-Pro:~ yuyang$ mkdir TestTruffle
yuyangdeMacBook-Pro:~ yuyang$ cd TestTruffle
yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
完成后的文件目录如下:

contracts 智能合约目录
migrations 发布脚本目录
test 存放测试文件
truffle.js Truffle的配置文件
truffle-config.js Truffle的配置文件
当使用Windows的命令行时,默认的配置文件名与truffle冲突。这种情况下,我们推荐使用Windows的power Shell或Git BASH。你也可以将配置文件重命名为truffle-config.js来避免冲突。

创建一个 HelloWorld合约并编译
在contracts目录中新建一个HelloWorld.sol文件,代码如下

pragma solidity ^0.4.17;

contract HelloWorld {

//say hello world
function say() public pure returns (string) {
return "Hello World";
}

//print name
function print(string name) public pure returns (string) {
return name;
}
}
代码中有两个方法:say()方法是输出一段文字Hello World;print(string name)方法是输出传入的内容。

编辑migrations/1_initial_migration.js部署脚本,将我们刚才创建的HelloWorld.sol文件设置到发布配置文件中,内容如下:

var Migrations = artifacts.require("./Migrations.sol");
var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
deployer.deploy(HelloWorld);
};

编辑truffle.js配置文件,设置我们稍后要部署智能合约的位置,内容如下:

module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*"
}
}
};
Ganache CLI默认运行在8545端口。

如果要部署到指定的网络,可以使用--network参数,例如:

truffle migrate --network live

多个网络的配置格式如下:

networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // match any network
},
live: {
host: "178.25.19.88", // Random IP for example purposes (do not use)
port: 80,
network_id: 1, // Ethereum public network
// optional config values:
// gas Gas limit used for deploys. Default is 4712388
// gasPrice Gas price used for deploys. Default is 100000000000 (100 Shannon).
// from - default address to use for any transaction Truffle makes during migrations
// provider - web3 provider instance Truffle should use to talk to the Ethereum network.
// - if specified, host and port are ignored.
}
}
代码准备就绪,输入truffle compile开始编译:

yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle compile
Compiling ./contracts/HelloWorld.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts
部署智能合约并测试
首先启动Ganache CLI,新开一个命令窗口,输入命令ganache-cli,如果刚才已经启动过,就不需要再次启动了。

yuyangdeMacBook-Pro:~ yuyang$ ganache-cli
Ganache CLI v6.0.3 (ganache-core: 2.0.2)

Available Accounts

(0) 0x4d28ad69565755cbbbffc1bfe1a22d38a9b4ba0e

(1) 0x8397d0237d6914e73431ffb0142f03b127cad0e6

(2) 0x5d3734b6ded152c4bab10f3dbc5ed88dfc268398

(3) 0x1b260263c3cee01066a84d991fbee6f2cc032fd1

(4) 0x9beeae2bbb5b22246a8a3dbf904a101fae3b5cd9

(5) 0x88cf2c5217158ab7dea66559d984e75f8af80b33

(6) 0x86115774dfeed84fc323c647239be55c68eaafb2

(7) 0xf40258b02e062fd17577448fcc48397d4353e4c6

(8) 0xb61de9e25b489fc71a1b453dc4a7fb14b386b7d1

(9) 0x9cd927b6fc6895ef45b3403a235c7655acc8da03

Private Keys

(0) f0fa5f7a5d964f62b3026420b6299efa211e77d0b97d4aca4862f8e1a7ed0a16

(1) dd7448bd36d3ff54d04c1414fef1e3784161a1abc0fa3eb0bdb1cd632656f508

(2) 486badbbb825ec12a979954ebd6d859ef89a6a01a8c9dfd8a114e49830305dae

(3) 3fb62557d117469ea401f32a849948a3282f8e8c5d3f56096ef79085c37a02fa

(4) 57f0126392cef4ece5178ca9cb99555beeb2622db070488df3793ef5c61f8464

(5) 42623a994471a2de78ce676cb2b04207bc17a8b25b5f82670e9b2a7740243288

(6) 23e939fd093c36da5514c4e2226004f5f450a2b9fac4515e7eed88a91bf6b55c

(7) 37a54f648931e2d10c61f774b274761f8095c6ab721c13952d8ce29cb10c20ac

(8) 28fbb80910cad2a77e27eb29fa3c10bd1e6a2379c735215332252c970f3dd71d

(9) 3844ff83ba5c093c4d2119d2bb3cde80338f736077e7926f92b6713f41c541fe

HD Wallet

Mnemonic: swamp earth core still general anxiety blood naive ostrich dumb orphan off
Base HD Path: m/44'/60'/0'/0/{account_index}

Listening on localhost:8545

然后回到Truffle,输入truffle migrate开始部署

yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle migrate
Using network 'development'.

Network up to date.

如果出现上面的结果,说明没有部署成功,输入truffle migrate --reset重新执行所有脚本进行部署,暂时不清楚原因。

如果部署成功,会显示以下结果:

yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle migrate --reset
Using network 'development'.

Running migration: 1_initial_migration.js
Deploying Migrations...
... 0x65c302e5352bb8cd4827a3bca2f32dc2ba12b313e052557da95007b14498722f
Migrations: 0xb4a51cdc0825ca7c73b945286eeff9187d7447ca
Deploying HelloWorld...
... 0x2f2215adb9ee2133aa3c721b8eb9c0fd1c4358508dd24cc7fbffbcc56b0511de
HelloWorld: 0xd361639454d67a8b8abbf5e5835df297de03ef23
Saving successful migration to network...
... 0xb8bf30b665ec39918051e0059d13a373d46a6c55cf84b1135574f7b8938ff67f
Saving artifacts...

开始测试,输入truffle console打开truffle控制台,测试刚才我们部署的HelloWorld合约:

yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle console
truffle(development)> var contract
undefined
truffle(development)> HelloWorld.deployed().then(function(instance){contract= instance;});
undefined
truffle(development)> contract.say()
'Hello World'
truffle(development)> contract.print("Hello World!")
'Hello World!'

var contract和javascript语法一样,表示声明一个contract变量。HelloWorld.deployed().then(function(instance){contract= instance;});表示,将HelloWorld合约主体,传递给contract变量。
后面我们就可以直接使用变量contract分别调用say()方法和print(''),得到我们想要的结果。

测试成功!

作者:yuyangray
链接:https://www.jianshu.com/p/9233c214e205
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约的更多相关文章

  1. 区块链开发学习第三章:私有链上部署helloBlockchain简单合约

    前面讲了部署私有链以及新增账户,现在进行到了部署合约了,此操作真是踩了无数无数无数的坑,到写文章为止确实是已经部署好了,但是还有些坑是还没有解决的! 一.Solidity编译器 开始的时候用的http ...

  2. 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

    很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...

  3. 以太坊开发DApp入门教程——区块链投票系统(一)

    概述 对初学者,首先要了解以太坊开发相关的基本概念.   学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...

  4. 基于以太坊开发的类似58同城的DApp开发与应用案例

    今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...

  5. 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)

    第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...

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

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

  7. 以太坊开发教程(二) 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten

    1.环境安装 1) node安装 设置镜像地址: curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -下载安装 ...

  8. Ubuntu 16.04 以太坊开发环境搭建

    今天我们来一步一步从搭建以太坊智能合约开发环境. Ubuntu16.04 安装ubuntu16.04.下载链接 //先update一下(或者换国内源再update) sudo apt-get upda ...

  9. android和java以太坊开发区块链应用使用web3j类库

    如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建.钱包创建.交易转账,交易与状态.智能合约开发与交互.过滤器和 ...

随机推荐

  1. python3带tkinter窗口的ftp服务器,并使用pyinstaller打包成exe

    python带tkinter窗口的ftp服务器,使用python3编写,打包使用pyinstaller,命令 pyinstaller -F .\ftpserver.py 代码也可在我的github上下 ...

  2. oracle整理

    1.安装oracle数据库2.创建数据库实例(可选)3.创建用户.角色.授权(可选) 查询数据库名:select name,dbid from v$database;查询实例名 :select ins ...

  3. 浅谈HashMap与线程安全 (JDK1.8)

    HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.HashMap 继承自 AbstractMap 是基于哈希表的 Map 接口的实现,以 Key-Value 的形式存在,即 ...

  4. 在IOS端点击数字后会调起系统拨号界面

    在IOS端点击数字后会调起系统拨号界面,解决方案: <meta name="format-detection" content="telephone=no" ...

  5. laravel 安装添加多站点

    官方文档如下 https://learnku.com/laravel/t/1160/laravel-nginx-multi-site-configuration

  6. 嵌入式LInux之C语言提升篇---Skr Skr Up Up

    嵌入式C语言提升 致敬:每一个奋斗的人! Up Up UpC语言常见编译错误1.预处理错误 -E    1-1 找不到源文件错误         自己定义头文件 使用 “xxx.h” 搜索的目录 ./ ...

  7. ruby中的extend 和 include

    include include是把module中定义的instance_method给mixin,然后当做类的实例方法使用(是因为module本身不能使用module的实例方法),给类进行实例化一个对 ...

  8. 成都Uber优步司机奖励政策(3月14日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 杭州优步uber司机第二组奖励政策

    -8月9日更新- 优步杭州第二组: 定义为激活时间在2015/6/8之后2015/8/3之前的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com ...

  10. ASCII、Unicode、UTF-8编码关系

    由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122.但是要 ...