快速搭建fabric-v1.1.0的chaincode开发环境
本文参考了fabric官方文档:http://hyperledger-fabric.readthedocs.io/en/latest/peer-chaincode-devmode.html?highlight=peer-chaincodedev
在fabric中peer节点有一个chaincodedev模式,在这个模式下面你可以不需要去实例化一个docker容器再去执行智能合约,可以在本地直接运行,这样更加方便你调试。
为了不重复造轮子,作者建立了一个github工程:https://github.com/luckydogchina/fabric-v1.1.0-chaincodedev
==================================================================================
1.首先准备好fabric v1.1.0工程和相关环境,这里我就不赘述了。然后我们下载fabric-v1.1.0-chaincodedev工程,按照README.md执行,终端显示如下的结果:

2. 查看当前的channel状况:
#开启一个终端窗口A,进入 fabric-v1.1.0-chaincodedev/chaincodedev
cd $fabric-v1.1.0-chaincodedev/chaincodedev
#枚举当前已经存在的channel
FABRIC_CFG_PATH=./sampleconfig peer channel list
显示结果如下:

可以清楚的看到,此时已经创建了两个channel test1、test2;
3.编译智能合约并安装
这里以example02智能合约为例:
#开启一个新终端B,进入fabric的example目录下
cd $fabric/examples/chaincode/go/chaincode_example02
#编译出智能合约
go build
#运行智能合约在本地,注意一定要保持运行状态
CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_ADDRESS=127.0.0.1:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./chaincode_example02
#在终端窗口A中执行安装命令:
FABRIC_CFG_PATH=./sampleconfig peer chaincode install -n mycc -v 0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
#初始化智能合约,根据不同的智能合约要求,要填入不同的参数
FABRIC_CFG_PATH=./sampleconfig peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -o 127.0.0.1:7050 -C test1
注意:此时你已经在 channel test1中安装了智能合约 chaincode_example02;
4.执行智能合约
#在终端窗口A中执行以下命令:
FABRIC_CFG_PATH=./sampleconfig peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","10"]}' -o 127.0.0.1:7050 -C test1
注意:此时a向b转了10元钱,a的账户余额应为90,b的账户余额应为210;
#执行查询命令
FABRIC_CFG_PATH=./sampleconfig peer chaincode query -n mycc -c '{"Args":["query","b"]}' -o 127.0.0.1:7050 -C test1 #查询a的余额
FABRIC_CFG_PATH=./sampleconfig peer chaincode query -n mycc -c '{"Args":["query","b"]}' -o 127.0.0.1:7050 -C test1 #查询b的余额

此时我们可以看到窗口B中运行的智能合约打印的日志:

到此为止我们的示例就讲完了,最后我简单陈述一下dev模式下和正式环境下智能合约运行有什么不同:
正式环境下:
invoke proposal--> endorser -->docker container-->chaincode
dev环境下:
invoke proposal --> endorser --> chaincode
注意:在执行过程中chaincode要一直保持运行。
那么chaincode是如何与 endorser之间交互的?
只要简单的浏览以下fabric的源码你就会发现,fabric中主要有以下几个grpc通讯服务:
eventhub:用于事件流服务,运行客户端注册监听事件;
broadcast:用于交易的广播,client向orderer提交交易的时候用的就是这个服务;
deliver:提交区块,peer节点通过这个服务向orderer节点拉取新生成的块;
chaincode:智能合约与endorser之间通讯服务;
gossip:流言服务,用于同一个组织下的peer之间进行数据的同步(Anchor节点向其他节点同步区块账本).
为什么智能合约和fabric之间还有一个grpc通讯服务?这是因为智能合约通常有读取和写入区块链账本的行为,而区块链账本是在本地保存的,而智能合约是在docker容器中运行的,无法直接读取数据,只有通过peer中转才能完成请求。这个chaincodes erver的端口默认为7052,所以我们在模拟运行的时候要告诉智能合约peer chaincode server的服务地址是 127.0.0.1:7052。那么有同志要问了,我的peer也是在容器里面运行的,为什么你指定的地址是127.0.0.1,很简单,peer容器的7052端口绑定的是本地的7052端口,所以你向本地地址发送就可以了。
另外在阿里云服务器上运行docker-compose环境,尤其是涉及到容器之间交互通讯的,可能发生无法通讯的情况,这时你要修改一下云服务的网络配置:

快速搭建fabric-v1.1.0的chaincode开发环境的更多相关文章
- Yosemite 快速搭建 自带Apache+PHP5.6+MySQL 开发环境
1.安装homebrew ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)" 2.安装h ...
- Hyperledger Fabric(v1.2.0)代码分析1——channel创建
Hyperledger Fabric(v1.2.0)代码分析1--channel创建 0. e2e_cli Hyperledger Fabric提供了一个e2e的例子,该例中创建了一个基础的区块链网络 ...
- 使用docker加载已有镜像安装Hyperledger Fabric v1.1.0
背景 每次在新的服务器上安装Hyperledger Fabric网络时,通过fabric官方提供的脚本安装时,需要从网络上down下近10G的fabric相关镜像,这个过程是漫长及痛苦的,有时因网络问 ...
- Hyperledger Fabric(v1.1.0)编译时遇到的问题
Hyperledger Fabric(v1.1.0)编译时遇到的问题 0. 编译过程的坑 编译时,按照如下顺序编译 make release,编译源码生成二进制文件 make docker,生成一系列 ...
- 搭建Fabric网络(一)安装开发工具
Fabric V1.1.0已经发布了,这里准备一篇文章来介绍Fabric V1.1.0 网络怎么搭建. 安装cURL https://curl.haxx.se/download.html 安装Dock ...
- Apache Spark1.1.0部署与开发环境搭建
Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...
- SDL2.0的VS开发环境搭建
SDL2.0的VS开发环境搭建 [前言] 我是用的是VS2012,VS的版本应该大致一样. [开发环境搭建] >>>SDL2.0开发环境配置:1.从www.libsdl.org 下载 ...
- 搭建eclipse+maven+scala-ide的scala web开发环境
http://www.tuicool.com/articles/NBzAzy 江湖传闻,scala开发的最佳利器乃 JetBrains 的神作 IntelliJ IDEA ,外加构建工具sbt 是也. ...
随机推荐
- java继承与覆写小练习
最近学习java到了继承的部分,写个小程序用以巩固. import java.util.Scanner;//导入输入包public class testfather { public static v ...
- Windows Live Writer介绍及相关问题解决
今天本来想说更新一篇我的文章,更新的过程中添加了很多的内容,里面的图片太多了,导致我浏览器占用的内存不断增大,浏览器变得很卡,最后过了好久我终于更新完文章打算保存的时候居然卡住,然后所有我更新的文字和 ...
- syskey——让你的电脑更加安全
我之前介绍过一个绕过系统登录密码的工具kon-boot,今天介绍的就是可以防止这个工具的方法,也能让你的电脑更加的安全. 这个方法也是我在Youtube上看见的一个方法,还是不错. 方法: win+R ...
- VS 2017 开发安卓环境搭建 问题总结
VS 2017可以开发安卓啦,之前一直想尝试开发安卓,但是由于时间忙, Java只学了个基础,不如C#熟练所以一直没有机会接触安卓开发.既然需要利用VS2017开发安卓,那么第一步就是了解VS2017 ...
- selenium webdriver 的环境搭建时注意事项
selenium webdriver 在 eclipse中的配置,网络上应该很方便搜索到,这里只记搭建过程中容易出现的一些问题 1. selenium-java与selenium-sever-sta ...
- 什么是yum源,如何更改yum源
Yum(全称为 Yellow dog Updater, Modified) yum是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器 ...
- 5分钟spark streaming实践之 与kafka联姻
你:kafka是什么? 我:嗯,这个嘛..看官网. Apache Kafka® is a distributed streaming platform Kafka is generally used ...
- PHP之防御sql注入攻击的方式
长期以来,web的安全性存在着巨大的争议与挑战.其中,sql注入就是一种常见的一种攻击方法,开发人员普遍的做法就是不停的过滤,转义参数,可是我们php大法天生弱类型的机制,总是让黑客有机可乘,绕过防御 ...
- pycharm创建Flask项目,jinja自动补全,flask智能提示
pycharm创建Flask项目,jinja自动补全,flask智能提示 之前一直都是用在idea里创建空项目然后导入,之后就没有各种的智能提示,在选择文类,选择模板之类的地方就会很麻烦. 步骤1:用 ...
- python函数名称空间
一.命名空间概念 命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方.命名空间分三种: locals:函数内的名称空间,包括局部变量和形参 gl ...