以太坊开发(二)使用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(''),得到我们想要的结果。

测试成功!

参考:Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约
作者:迦壹

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容