本文参考了fabric官方文档:http://hyperledger-fabric.readthedocs.io/en/latest/peer-chaincode-devmode.html?highlight=peer-chaincodedevhtml
在fabric中peer节点有一个chaincodedev模式,在这个模式下面你能够不须要去实例化一个docker容器再去执行智能合约,能够在本地直接运行,这样更加方便你调试。git
为了避免重复造轮子,做者创建了一个github工程:https://github.com/luckydogchina/fabric-v1.1.0-chaincodedevgithub
==================================================================================docker
注意:执行前请保证本地的7050~7053端口没有被其余进程所占用。服务器
#开启一个终端窗口A,进入 fabric-v1.1.0-chaincodedev/chaincodedev网络
cd $fabric-v1.1.0-chaincodedev/chaincodedev区块链
#枚举当前已经存在的channelui
FABRIC_CFG_PATH=./sampleconfig peer channel list
显示结果以下:阿里云
能够清楚的看到,此时已经建立了两个channel test一、test2;spa
这里以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;
#在终端窗口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中运行的智能合约打印的日志:
正式环境下:
invoke proposal--> endorser -->docker container-->chaincode
dev环境下:
invoke proposal --> endorser --> chaincode
注意:在执行过程当中chaincode要一直保持运行。
只要简单的浏览如下fabric的源码你就会发现,fabric中主要有如下几个grpc通信服务:
eventhub:用于事件流服务,客户端调用此服务向peer注册监听事件;
broadcast:用于交易的广播,client向orderer提交交易的时候用的就是这个服务;
deliver:提交区块,peer节点经过这个服务从orderer节点拉取新生成的块;
chaincode:智能合约与endorser之间通信服务;
gossip:流言服务,用于同一个组织下的peer之间进行数据的同步(Anchor节点向其余节点同步区块帐本).
为何智能合约和fabric之间还有一个grpc通信服务?这是由于智能合约一般有读取和写入区块链帐本的行为,区块链帐本是在endorser节点本地保存的,而智能合约是在endorser节点的docker容器中运行的,它没法直接endorser节点本地从读取数据,只有经过endorser节点中转才能完成读写数据的动做。chaincodes server的端口默认为7052,因此咱们在模拟运行的时候要告诉智能合约peer chaincode server的服务地址是 127.0.0.1:7052。那么有同志要问了,在本文的环境中peer也是在容器里面运行的,为何你指定的地址是127.0.0.1,很简单,peer容器的7052端口绑定的是本地的7052端口,因此你向本地地址发送就能够了。
另外在阿里云服务器上运行docker-compose环境,尤为是涉及到容器之间交互通信的,可能发生没法通信的状况,这时你要修改一下云服务的网络配置: