快速搭建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 是也. ...
随机推荐
- MySQL多数据源笔记4-Mycat中间件实战
Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务.由于前面讲的对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集 群构成了整个完整的 ...
- Flume - Kafka日志平台整合
1. Flume介绍 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供 ...
- Python3数据库模块(sqlite3,SQLite3)
一.sqlite命令 创建数据库:在控制台sqlite3 name .databases 查看数据库 .tables 查看表格名 databaseName .dump & ...
- Java设计模式(五)Prototype原型模式
一.场景描述 创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理. 例如,在“仪器数据采集器”的子类/对象“PDF文件数据 ...
- dot watch+vs code提成asp.net core开发效率
在园子中,已经又前辈介绍过dotnet watch的用法,但是是基于asp.net core 1.0的较老版本来讲解的,在asp.net core 2.0的今天,部分用法已经不太一样,所以就再写一篇文 ...
- 基于hi-nginx的web开发(python篇)——动态路由和请求方法
hi.py的提供的路由装饰器接受两个参数,第一个参数指定动态路由的正则模式,第二个参数指定同意的http请求方法列表. 比如: @app.route(r"^/client/?$", ...
- 【Bootstrap】优秀小插件收集
Bootstrap中不乏很多优秀的小插件来让界面更加漂亮.比如之前做过笔记的bootstrap-fileinput,select2,datetimepicker等都是属于这一系列的.这些相对而言比较大 ...
- react 实用的性能优化方式
react 组件渲染分为初始化渲染和更新渲染,当我们更新某个组件的时候,只是想关键路径上组件的render,但react的默认做法是调用所以组件的reder,再生成虚拟dom进行对比,如不变则不进行更 ...
- bug单的生命周期
测试工程师发现了软件的缺陷(bug),那修复bug的整个流程是怎么样的呢? 1.发现bug 2.和开发确认是否是bug 3.如果是bug则提bug单到测试经理,如果不是则放过 4.测试经理把bug单走 ...
- linux scp 命令
scp 命令 scp 命令 意思是 secure copy 即安全拷贝,可以把它看做是 cp 命令的高级版,可以跨主机拷贝. 经常用来在局域网内不同主机之间分享文件,或者在本机与远程主机中分享文件. ...