加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Ubuntu中部署并测试HyperLedger Fabric 0.6

发布时间:2020-12-16 03:56:13 所属栏目:安全 来源:网络整理
导读:最近开始研究区块链,对这个新兴的技术有了基本概念上的了解,所以打算基于一个开源项目做做实验。如果是做数字货币,那么比特币的源代码是最好的了,不过这算是区块链1.0吧,已经有很多改进的竞争币和山寨币出来了,所以打算对区块链2.0,也就是智能合约入

最近开始研究区块链,对这个新兴的技术有了基本概念上的了解,所以打算基于一个开源项目做做实验。如果是做数字货币,那么比特币的源代码是最好的了,不过这算是区块链1.0吧,已经有很多改进的竞争币和山寨币出来了,所以打算对区块链2.0,也就是智能合约入手。

智能合约比较成功的就是以太坊了。以太坊主要是公有链,其实对企业应用来说并不是特别合适,而且本身并没有权限控制功能,面向企业的,主要还是超级账本HyperLedger的Fabric和刚刚开源出来的R3的Corda。关于这些项目的应用场景和区别,我觉得这篇文章写的比较好:

经过比较,觉得Fabric目前比较合适,所以就以这个项目为基础,学习智能合约。

一、环境准备

1.1 安装VirtualBox并在其中安装好Ubuntu

这一步其实没啥好说的,下载好最新版的VirtualBox,下载Ubuntu Server,我用的是16.10 X64。在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话会很慢很慢的。具体做法是

/etc/apt/sources.list

打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入:

:%s/us./cn./g

就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。

apt-get update

更新一下源。

然后安装ssh,这样接下来就可以用putty或者SecureCRT之类的客户端远程连接Ubuntu了。

apt-get

1.2 安装Docker

安装Docker也会遇到外国网络慢的问题,幸好国内有很好的镜像,推荐DaoClound,安装Docker的命令是:

curl -sSL https:
安装完成后,运行以下脚本将当前用户添加到Docker的组中
usermod -aG docker studyzy
重新登录当前用户,接下来修改 Docker 服务配置(/etc/default/docker 文件)。
/etc/default/docker
添加以下内容:
DOCKER_OPTS=
接下来就需要设置国内的Docker镜像地址,需要注册一个账号,然后在加速器页面提供了设置Docker镜像的脚本,加速器页面是:
 我提供的脚本是:
curl -sSL https:
运行完脚本后,重启Docker服务
service docker restart

1.3 安装docker-compose

Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本:

apt-get python-pip

安装完成后,接下来从DaoClound安装Docker-compose,运行脚本:

curl -L https: ~/docker-compose ~/docker-compose /usr/local/bin/docker- +x /usr/local/bin/docker-compose

二、Fabric部署

2.1 下载Fabric镜像

Fabric的Docker镜像是在 我们要做实验主要用到peer,baseimage,membersrvc,先现在Peer和membersrvc,这两个镜像提供了latest版本,所以直接pull下来即可。

docker pull hyperledger/fabric-/fabric-membersrvc

但是baseimage是没有latest版本,所以我们可以下载一个新一点的版本,然后rename成latest。

docker pull hyperledger/fabric-baseimage:x86_64-./fabric-baseimage:x86_64-. hyperledger/fabric-baseimage:latest

现在我们运行docker images命令,可以看到我们准备好的镜像:

REPOSITORY????????????????????? TAG???????????????? IMAGE ID??????????? CREATED???????????? SIZE hyperledger/fabric-baseimage??? latest????????????? f4751a503f02??????? 7 days ago????????? 1.27 GB

hyperledger/fabric-baseimage??? x86_64-0.3.0??????? f4751a503f02??????? 7 days ago????????? 1.27 GB

hyperledger/fabric-membersrvc?? latest????????????? b3654d32e4f9??????? 3 months ago??????? 1.42 GB

hyperledger/fabric-peer???????? latest????????????? 21cb00fb27f4??????? 3 months ago??????? 1.42 GB

2.2 使用Git下载Docker-compose模板

如果没有安装Git,那么需要先安装Git,安装Git很简单:

apt-get git

感谢yeasy提供的很好的HyperLedger的模板,我们先克隆到本地:

git clone https:

2.3 以PBFT模式启动Fabric

先进入Git下载下来的Docker-compose目录:

cd docker-compose-files/hyperledger//pbft/

这里提供了多种模式的启动方案,一种是启动4个节点的Peer,没有权限认证:4-peers.yml 另一种是在4节点Peer的基础上,再加上MembershipService节点,也就是需要权限认证的:4-peers-with-membersrvc.yml 另外还有再进一步,提供了web的Explorer的:4-peers-with-membersrvc-explorer.yml

这里我们就简单点,直接忽略掉MembershipService和Explorer,只启用4个节点的PBFT:

docker-compose -f -peers.yml up

系统会打印出启动的日志:

Creating network

至此,我们的环境搭建完毕,接下来我们就可以在上面跑链上代码了。

三、测试Fabric

3.1 在CLI中测试Example02

我们前面创建了4个容器,开启另外一个命令行窗口,输入docker ps命令,可以看到当前容器的状态: CONTAINER ID??????? IMAGE??????????????????????????? COMMAND???????????? CREATED???????????? STATUS????????????? PORTS?????????????????????????????????? NAMES

2131cede4ade??????? hyperledger/fabric-peer:latest?? "peer node start"?? 3 minutes ago?????? Up 3 minutes??????? 7050-7059/tcp?????????????????????????? pbft_vp1_1

5acea88f21bc??????? hyperledger/fabric-peer:latest?? "peer node start"?? 3 minutes ago?????? Up 3 minutes??????? 7050-7059/tcp?????????????????????????? pbft_vp2_1

546b103d904d??????? hyperledger/fabric-peer:latest?? "peer node start"?? 3 minutes ago?????? Up 3 minutes??????? 7050-7059/tcp?????????????????????????? pbft_vp3_1

327ab874b2e3??????? hyperledger/fabric-peer:latest?? "peer node start"?? 3 minutes ago?????? Up 3 minutes??????? 0.0.0.0:7050->7050/tcp,7051-7059/tcp?? pbft_vp0_1

这里我们可以看到,最后一个容器pbft_vp0_1其启用了端口映射的,容器上面的7050端口会映射到Ubuntu的7050端口上。我们要执行命令行代码,需要先连接到这个容器内部:

docker exec -it pbft_vp0_1 bash

进入容器后,命令行会变为:#

这里的容器已经帮我们把测试代码都放在了容器里面,所以我们不需要再下载测试代码。

3.1.1部署Go语言的ChainCode并初始化

下面我们部署Example02到Fabric上:

peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c

这个示例是初始化两个账户a和b,a有余额100元,b有余额200元,这是运行结果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c :: [chaincodeCmd] chaincodeDeploy -> INFO Deploy result: type:GOLANG chaincodeID: name: > ctorMsg: args: args: args: args: >:: [main] main -> INFO Exiting.....

这里我们可以看到已经部署成功,并返回了ChainCode的ID:ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539

3.1.2查询ChainCode

下面我们把这个ID放入一个变量中:

CC_ID=

下面我们来查询一下a账户的余额:

peer chaincode query -n ${CC_ID} -c

这是运行结果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode query -n ${CC_ID} -c :: [chaincodeCmd] chaincodeInvokeOrQuery -> INFO Successfully queried transaction: chaincodeSpec: > ctorMsg: args: > > :: [main] main -> INFO Exiting.....

可以看到查询结果是100元。

注意:这里如果遇到了抛出异常:

那么就得看log,到底是什么地方错了,我们可以切换回docker-compose的那个窗口,那个窗口会打印错误日志,或者我们再打开一个窗口,运行命令:

docker logs -f pbft_vp0_1

查看peer日志,找到原因。我之前一直遇到这个异常,后来发现是baseimage没有latest版的造成的,所以2.1步骤不能出错。

3.1.3调用ChainCode

接下来,我们让a给b转账10元,运行命令:

peer chaincode invoke -n ${CC_ID} -c

这是调用后的结果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode invoke -n ${CC_ID} -c :: [chaincodeCmd] chaincodeInvokeOrQuery -> INFO Successfully invoked transaction: chaincodeSpec: > ctorMsg: args: args: args: > > (94c9cbd9-ea04-436f-9cf8-:: [main] main -> INFO Exiting.....

3.1.4检查调用ChainCode后的结果

现在已经转账完毕,我们再来查询一下a账户的余额:

peer chaincode query -n ${CC_ID} -c

查询结果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode query -n ${CC_ID} -c :: [chaincodeCmd] chaincodeInvokeOrQuery -> INFO Successfully queried transaction: chaincodeSpec: > ctorMsg: args: > > :: [main] main -> INFO Exiting.....

可以看到,a账户变成90元了。

3.2 在REST API中测试Example02

前面我们已经说到,容器的7050端口会映射成Ubuntu的7050端口,我们在Ubuntu下,运行ifconfig,可以看到Ubuntu的IP,然后我们回到Windows,就可以通过REST的Client来测试,这里我喜欢用Chrome的插件DHC,很好用,强烈推荐!不过要FQ才能装。

DHC

这里我Ubuntu的IP是192.168.100.129,下面就用DHC进行REST API的Example02部署。

3.2.1通过REST API部署GO语言的ChainCode

POST 192.168.100.129:7050/chaincode

Body是:

"jsonrpc": "2.0""method": "deploy""params""type": 1"chaincodeID""path":"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02""ctorMsg""function":"init""args":["a","1000","2000""id": 1

这里为了区别,我们把a账户初始化1000元,b账户初始化2000元。返回的结果是:

"jsonrpc": "2.0""result""status": "OK""message": "04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050""id": 1

这里04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050就是部署后的ChainCodeID。

3.2.2通过REST API查询ChainCode

POST 192.168.100.129:7050/chaincode

Body内容是:

"jsonrpc": "2.0""method": "query""params""type": 1"chaincodeID""name":"04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050""ctorMsg""function":"query""args":["a""id": 2

系统返回的结果是:

"jsonrpc": "2.0""message": "1000""id": 2

一切正常,返回a账户的1000元。

3.2.3通过REST API调用ChainCode

我们试着从a向b转账100元:

POST 192.168.100.129:7050/chaincode

Body内容是:

"jsonrpc": "2.0""method": "invoke""ctorMsg""function":"invoke""id": 3

返回的结果:

"jsonrpc": "2.0""message": "2ac78b5f-6d35-400d-b7c4-75ef81e14d3e""id": 3

3.2.4通过REST API检查调用ChainCode后的结果

这里我们来查询一下b账户。

POST 192.168.100.129:7050/chaincode

Body内容改为:

"jsonrpc": "2.0""args":["b""id": 4

返回结果:

"jsonrpc": "2.0""message": "2100""id": 4

一切正常,b账户果然真假了100元。

关于更多的REST API,我们可以参考这里:

3.3测试Java版Chain Code

Fabric除了支持本身的Go语言的ChainCode,也可以支持其他语言,比如最常用的Java语言。Fabric的源代码中也提供了Java示例,这里我们就用SimpleSample这个示例:

3.3.1在CLI中部署该Java代码的ChainCode到Fabric

命令是:

peer chaincode deploy -l java -p /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/java/SimpleSample -c '{"Function":"init","200"]}'

运行结果为:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode deploy -l java -p /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/java/SimpleSample -c '{"Function":"init","200"]}' 09:20:16.857 [chaincodeCmd] chaincodeDeploy -> INFO 001 Deploy result: type:JAVA chaincodeID: ctorMsg:09:20:16.857 [main] main -> INFO 002 Exiting.....

接下来的各种查询,调用都是差不多的,我就不再累述了。

3.3.2通过REST API部署Java ChainCode到Fabric

POST 192.168.100.129:7050/chaincode

Body为

"jsonrpc": "2.0""params""type": 4"chaincodeID""path":"/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/java/SimpleSample""id": 1

系统返回的结果为:

"jsonrpc": "2.0""message": "27cb2925013a5e8f27b41be748e6767c3fbc7bfdfe2453c2640f9069e75c4db38735fa3b6b8cac78e212a1c97193f3bfb2f9b810ce0a11f437a96b330d508fbd""id": 1

这里需要注意的是type:4,不再是1。1是Go语言的,而Java语言是4.接下来的操作也是类似的了,我就不累述了。

总的来说,Fabric基于Docker容器技术,部署的ChainCode在运行时会基于baseimage重新创建Docker容器,运行的链上代码越多,容器就会越多。运行docker ps会看到很多容器被创建。docker images也可以看到多了很多镜像。需要注意清理。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读