基于HyperLedger的Fabric实现私有链–Doing

一、Fabric的架构

Fabric的架构我觉得下面这张图描述的还是比较清楚的。

Fabric的节点类型主要有Peer和Orderer两类。Peer负责背书(Endorser)、向帐本(区块链,Ledger)提交(Committer)、执行智能合约(Chaincode)、维护帐本(Ledger)。Orderer节点负责对交易进行排序(有人把这个过程叫完成共识)。

其他的MemberShip节点实际上就是个CA(证书中心),负责发证书。Fabric的各节点之间是靠数字证书来实现权限管理和身份认证的。

用户(或者客户端)完成一次调用智能合约的过程如下:

(1)生成一次智能合约调用请求(这里叫Proposal),发送给背书节点(Endorser ,包含在Peer节点上)。

(2)背书节点验证请求的正确性,并且调用智能合约(ChainCode)来模拟执行,生成执行操作过程集合(就是把对数据的读写操作过程和结果记录下来),背书节点对其进行签名(就是开个证明说这次调用的过程和结果是正确的),然后返回给请求发起方。

(3)请求发起方再把背书节点返回的结果发给Orderer节点去进行排序(因为同时会有很多人发起请求,需要有人对其排序,然后才能按顺序写入帐本)。

(4)Orderer节点对请求进行排序后,把排序后的请求发送给Peer节点上的Commiter,Commiter负责把这些交易通过Ledger记录下来。

这样就完成了一次智能合约的调用。

从上述过程来看,Fabric实际上适合应用在小范围内的私有环境或者联盟环境中,不适合公链。

Fabric的智能合约实际上就是一个程序,部署在一个docker中,背书节点在需要时调用它执行。

Fabric用一个数据库(类型可选)来用key-value的方式存储智能合约的数据。

二、Fabric的部署

Fabric的部署十分依赖Docker。要部署Fabric,需要先在机器上装Docker。如何装Docker请自行查找资料。因为每个人用的操作系统和版本都不同,所以安装docker时遇到的问题也可能不同。我遇到的最讨厌的问题就是docker安装完成之后一启动dockerd,就报错:

time=”2018-03-07T11:06:03.573781204+08:00″ level=error msg=”[graphdriver] prior storage driver devicemapper failed: devicemapper: Error running deviceCreate (CreatePool) dm_task_run failed”

最后发现是我的Slackware-Current版本使用的是kernel-huge内核,其中对devicemapper的支持有点问题。有人说使用kernel-generic内核就可以了,我懒得改,最后在/etc/default/docker中加入:

DOCKER_OPTS=”$DOCKER_OPTS -s overlay”

使用overlay模式搞定。

装好Docker之后,

(1)mkdir -p go/src/github.com/hyperledger

(2)cd go/src/github.com/hyperledger

(3)git clone https://github.com/hyperledger/fabric.git

(4)cd go/src/github.com/hyperledger/fabric

(5)make orderer

(6)make peer

(7)make configtxgen

(8)make cryptogen

(9)make configtxlator

(10)make orderer-docker

(11)make peer-docker

(12)make tools-docker

(13)make docker

上述过程会有很多坑,折腾吧。主要都是缺少依赖库引起的。有遇到问题可以google/baidu或者在评论区留言。

如果一切顺利,最后执行docker images,会出现:

这表明你的安装差不多对了。

下面开始运行fabric来测试你的部署吧。

(1)cd go/src/github.com/hyperledger/fabric/examples/e2e_cli

(2)sh network_setup.sh

如果最后看到如下的结果,表明你的部署应该对了:

这是个fabric的例子,用命令行cli的方式来实现部署go语言实现的chaincode_example2,为了帮助对fabric的理解,你可以执行:

docker exec -it cli bash

进入cli的docker,然后在docker里执行:

peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,”a”]}’

这条操作的目的是在chaincode上执行查询a有多少币。执行结果类似:

我的这个改过了,所以显示query result: 910

如果你还想了解更多如何用cli来部署合约、初始化合约、执行合约(invoke),你可以看一下go/src/github.com/hyperledger/fabric/examples/e2e_cli/scripts/script.sh文件,仔细研究一下它的各个命令。

三、智能合约的实现

实际上,链只解决了智能合约(ChainCode)的管理框架、状态数据的存储框架、帐本的记录框架等基础功能。真正实现链的功能多样化要靠各种智能合约才行。

Fabric 1.0 支持Go/Java开发的智能合约。据说今后要支持Python等语言。

下面我们试图要实现一个消息订阅的智能合约。

1、业务逻辑

(1)消息发布者A可以发布接受订阅的智能合约,表明消息的类别等简要说明以及订阅价格。

(2)消息订阅者B可以支付费用成为A的订阅用户,订阅者B的信息保存在智能合约中

(3)当B想阅读A发布的消息时,A的消息订阅服务从智能合约中查询B是否是消息订阅者,如果是,则允许阅读,如果否,则拒绝阅读。

2、与以太坊的代币的交互

B支付费用使用以太坊发行的代币支付。(如何在ChainCode中与以太坊交互部分还在找资料调研中)

3、实现细节

具体的chaincode会发布到github中。