快速搭建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 是也. ...
随机推荐
- Cannot find class: BaseResultMap
版权声明:本文为博主原创文章,转载请注明出处. model对应的mapping中将resultType改成resultMap即可. 什么是相应的model的xml配置文件呢? 可以理解为: 一直都可以 ...
- 如何为开发项目编写规范的README文件(windows),此文详解
为什么要写这篇博客? 其实我是一个入坑已经半年的程序员,因为不是计算机专业,只能自己摸索,所以我深知博客的重要性.每次我的学习笔记啊,项目的,面试题啊,有的,只要有时间,我肯定上传上来,一方面自己可以 ...
- loadrunner 录制中文出现乱码的解决办法
- tp框架的url模式
tp框架url地址可以由以下四种 http://网址/index.php?m=XX&c=XX&a=XX 基本get模式 http://网址/index.php/模块/控制器/操作方 ...
- FNV算法实战
HASH算法介绍 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长 ...
- 使用guava实现找回密码的tokenCache以及LRU算法
源码包的简单说明: com.google.common.annotations:普通注解类型. com.google.common.base:基本工具类库和接口. com.google.common. ...
- Batch update returned unexpected row count from update [0] 异常处理
在one-to-many时遇到此异常,本以为是配置出错.在使用s标签开启debug模式,并在struts2主配置文件中添加异常映射,再次提交表单后得到以下异常详情. org.springframewo ...
- npm5 packag-lock.json
前几天升级了 Node.js v8.0 后,自带的 npm 也升级到了5.0,第一次使用的时候确实惊艳到了:原本重新安装一次模块要十几秒到事情,现在一秒多就搞定了.先不要激动,现在我来大概讲一下 np ...
- spring-data-redis使用哨兵配置一主多从
redis自带的哨兵确实简化了高可用性的配置,使用起来也比较简单. 首先是spring-redis-sentinel.xml(文件名可以随意命名)配置文件: <?xml version=&quo ...
- MyEclipse安装Eclipse Memory Analyzer插件以及使用例子
一 :安装 1.Memory Analyzer 插件下载地址:http://www.eclipse.org/mat/downloads.php 2.将下载的文件解压到MyEclipse的 dropi ...