快速搭建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 是也. ...
随机推荐
- Windows下Python环境的搭建
我刚开始接触Python没多久,当然这也是为初学者来更好的去入门Python,我电脑上既跑着Windows也跑着Red Hat的Linux,相比较而言,开发我还是更青睐于Linux系统,很多开发工具红 ...
- [转] SDP协议
[转] SDP协议 http://blog.csdn.net/dxpqxb/article/details/18706471 1.SDP协议概述 SDP(Session Description Pro ...
- celery学习之入门
Celery 简介 Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具.它是一个专注于实时处理的任务队列,同时也支持任务调度. broker:一个消息 ...
- 分享python分析wave, pcm音频文件
最近研究的,我用的是python3.3, 用matplotlib画图, 下面代码演示分析pcm文件,如果是wave文件,把wave的文件头去掉就是pcm文件了. 代码如下 # -*- coding:u ...
- C语言第九次博客作业--指针
一.PTA实验作业 题目1:两个4位正整数的后两位互换 1. 本题PTA提交列表 2. 设计思路 定义循环变量i,两个数组a[4],b[4] for i=0 to 3 a[i]*p取各个位 *p/=1 ...
- springMVC正确使用GET POST PUT和DELETE方法,如何传递参数
1. 向服务器请求数据:GET 这是标准的http的GET最擅长的, 应该使用GET请求,但是在使用时候我们会需要传递一个或多个参数给服务器, 这些出参数可能是基本数据类型页可能是对象,get方法可以 ...
- String类详解
看了很多文章事实证明之前的通过new创建String对象只有一个是错误的,实际上创建一个或者创建两个对象,一个在堆区,一个在常量池,当常量池中已经存在就不会创建.看了一篇非常好的文章http://ww ...
- Oracle 12c(12.1.0.5) oem agent silent install(静默安装agent)
注释: 文章自oracle support 文档 ID 1360083.1,静默安装agent采用的是把OMS服务端(即oem server端)的agent用压缩包download,远程传到agent ...
- 分析 webpack 打包后的代码
写在前面的:使用的 webpack 版本 3.0.0 一.开始 1. 准备 当前只创建一个文件 index.js,该文件作为入口文件,代码如下. console.log('hello, world') ...
- 关于ORM,以及Python中SQLAlchemy的scoped_session
orm(object relational mapping):对象关系映射. python面向对象,而数据库是关系型. orm是将数据库关系映射为Python中的对象,不用直接写SQL. 缺点是性能略 ...