以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约
以太坊开发(二)使用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在私有链上搭建智能合约的更多相关文章
- 区块链开发学习第三章:私有链上部署helloBlockchain简单合约
前面讲了部署私有链以及新增账户,现在进行到了部署合约了,此操作真是踩了无数无数无数的坑,到写文章为止确实是已经部署好了,但是还有些坑是还没有解决的! 一.Solidity编译器 开始的时候用的http ...
- 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始
很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...
- 以太坊开发DApp入门教程——区块链投票系统(一)
概述 对初学者,首先要了解以太坊开发相关的基本概念. 学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...
- 基于以太坊开发的类似58同城的DApp开发与应用案例
今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)
第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...
- 搭建智能合约开发环境Remix IDE及使用
目前开发智能的IDE, 首推还是Remix, 而Remix官网, 总是由于各种各样的(网络)原因无法使用,本文就来介绍一下如何在本地搭建智能合约开发环境remix-ide并介绍Remix的使用. 写在 ...
- 以太坊开发教程(二) 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten
1.环境安装 1) node安装 设置镜像地址: curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -下载安装 ...
- Ubuntu 16.04 以太坊开发环境搭建
今天我们来一步一步从搭建以太坊智能合约开发环境. Ubuntu16.04 安装ubuntu16.04.下载链接 //先update一下(或者换国内源再update) sudo apt-get upda ...
- android和java以太坊开发区块链应用使用web3j类库
如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建.钱包创建.交易转账,交易与状态.智能合约开发与交互.过滤器和 ...
随机推荐
- MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询
支持的 JDBC 类型为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型. BITFLOATCHARTIMESTAMPOTHERUNDEFINEDTINY ...
- MyBatis之Mapper XML 文件详解(二)-sql和入参
sql 这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中.它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如: <sql id="use ...
- Subclass UICollectionViewFlowLayout,自定义流布局
需求:为实现第一行显示一个,第二行以后显示两个 方案1:用系统自带的流布局,实现的效果是,若第二行只有一个,则系统默认会居中显示,不是左对齐(如下图),不符合项目要求. 方案2:自定义系统的UICol ...
- Mysql 之 MERGE 存储引擎
MERGE 存储引擎把一组 MyISAM 数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个 MERGE 数据表结构的各成员 MyISAM 数据表必须具有完全一样的表结构.每一个成员 ...
- 原生js实现简单轮播的淡入淡出效果
实现这种淡入淡出的轮播关键在于css的一种设置 首先它不能像传统的轮播显示隐藏 或者左右浮动 他应该让其固定定位使其重叠在一起 达到这种效果 然后设置c3动画属性 transition:1s; ...
- Delphi 拦截滚轮事件不响应滚轮的上下滚动
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 数据仓库和Hadoop大数据平台有什么差别?
广义上来说,Hadoop大数据平台也可以看做是新一代的数据仓库系统, 它也具有很多现代数据仓库的特征,也被企业所广泛使用.因为MPP架构的可扩展性,基于MPP的数据仓库系统有时候也被划分到大数据平台类 ...
- 2.3 摄像头驱动_vivi驱动程序分析
学习目标:熟悉vivi的调用过程,分析vivi程序源码的ioctl函数: 一.vivi虚拟视频驱动测试方法 当我们接上usb摄像头设备时,系统会自动给我们安装对应的usb设备驱动程序.如果下次直接测试 ...
- flask的查询,一对多,多对多
模型的关联: 一对多 class Role(db.Model): us = db.relationship('User',backref='role',lazy='dynamic') class Us ...
- Python值集合操作
list_l1 = [12,1,4,6,9,5,4,2,11] list_l1 = set(list_l1) print(list_l1,type(list_l1)) #集合也是无序的 list_2 ...