• 生活的道路一旦选定,就要勇敢地走到底,决不回头。——左拉
  • 坚强的信心,能使平凡的人做出惊人的事业。——马尔顿
  • 人不可有傲气,但不可无傲骨。 --徐悲鸿
  • 古之立大志者,不惟有超世之才,亦必有坚韧不拔之志。 --苏轼
  • 时间像海绵里的水,只要你愿意挤,总还是有的。 --鲁迅

Fabric区块链

工作随笔 zkinogg 10个月前 (01-29) 298次浏览 0个评论

1.1概述

Hyperledger Fabric(后文简称Fabric)是其中发展最好的一个企业级区块链平台,最初由Digital Asset和IBM贡献,目前已经应用于沃尔玛的食物溯源链(Foodtrust)和马士基的物流跟踪链(TradeLens)中,代表了当下企业级区块链应用的最高水平。可以认为Fabric是一种联盟链(Consortium Blockchain)平台,它适合构建跨越多个企业边界的去中心化应用。

由于Fabric项目的目标是应用于相对可信的企业联盟环境,因此其设计思路与比特币、以太坊等公链平台有明显的差异。Fabric借鉴了区块链的数据结构,但引入了相当多的身份验证与权限控制机制,以及数据隐私保护机制,以适应企业级应用的要求。同时由于企业联盟环境要比完全开放的公链环境可控,因此Fabric没有强调其共识体系对拜占庭容错的实现,允许使用 非拜占庭容错算法建立共识,从而可以达到相当实用的交易吞吐量。

1.2 定位与特点

1.2.1Fabric的定位与特点

Fabric是受到比特币的启发而诞生的,因此它借鉴了比特币、以太坊这些公链中的一些核心特性,例如采用不可篡改的区块链结构来保存数据、采用非对称加密技术来进行身份识别 与认证、支持智能合约等等。

但是Fabric定位于企业级的分布式账本技术(DLT – Distributed Ledger Technology)平台,它的主要目的是为跨越多个企业边界的活动提供不可篡改的分布式记账平台。例如在食物溯源应用中,为了让消费者可以了解到所购买食物是否安全,就必须将从农场到加工商、分销商、 零售商乃至监管机构等各个环节的检验与放行信息记录到区块链上,以保证溯源信息的透明与可信。

因此Fabric是一种联盟链(Consortium Blockchain),它适合在多个企业间实现分布式记账,这一 定位使Fabric的实现与以太坊这样的公链有了明显的差异:

1.2.2分布式账本 vs. 区块链

分布式账本是比区块链更加宽泛的概念,可以认为区块链只是分布式账本的一种实现技术, 其他的分布式账本实现还包括哈希图等。

1.2.3去中心化 vs. 分布式

Fabric淡化了去中心化(Decentralized),而以分布式(Distributed)代替,这一思路带来了系统设计 与实现上的巨大影响。 例如,在Fabric中,采用中心化的CA机制来发放证书,只有持有有效证书的节点和用户才可以访问区块链 上的账本数据。因此Fabric是许可制 / Permissioned的区块链,这与不需要许可 / Permissionless 的以太坊这样的公链形成了鲜明的对比。

1.2.4拜占庭容错 vs. 崩溃容错

由于采用许可机制,Fabric也淡化了对不可信(Trustless)环境下共识达成的依赖性,而假设 联盟链中的企业有可能是值得信赖的,因此并不依赖于工作量证明这样的拜占庭容错算法 —— 虽然 Fabric模块化的设计可以支持引入不同的共识算法实现,但目前的产品化方案是Raft共识,它显然 是不能对抗拜占庭错误的 —— 不过对不可信环境支持的淡化处理有利于提高交易的吞吐量,这对于企 业级应用也是有益的。

1.2.5数据隐私保护

在另一方面,Fabric强化了隐私保护能力。例如,Fabric支持在同一套企业网络上建立多个不同 的通道 / Channel,每一个通道都有自己的区块链和访问控制,彼此互不影响,这有利于 复用基础设施,例如不同企业间的销售部门可以建立一个通道来分享市场数据,而这些企业间的 研发部门可以建立另一个通道来分享技术数据。

Fabric并不是唯一的联盟链解决方案,但目前可以说是最复杂的企业联盟链实现,这种复杂性 源于设计者对应用场景的假设和推演,以及对Fabric广泛适用性的考量,这是我们在学习过程 中需要换位思考的一点。

2.1搭建步骤

2.1.1 安装GO

2.1.1.2 下载go

下载指令:

[root@localhost ~] # wget https:``//storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz 

如果没有安装wget,需要先安装wget。命令:

[root@localhost ~] # yum install wget  

等待下载完成..

2.1.1.3解压

[root@localhost ~] # sudo tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz

2.1.1.4 配置环境变量

[root@localhost ~] # vi /etc/profile  

在文件最底部,添加如下内容: 

export PATH=$PATH:/usr/local/go/bin``export GOROOT=/usr/local/go``export GOPATH=$HOME/go``export PATH=$PATH:$HOME/go/bin  

 退出文件,保存生效。

[root@localhost ~] # source /etc/profile

2.1.1.5 验证

笔者建议使用如下指令,更详细。

[root@localhost ~] # go env 

效果如下图,则安装成功。

img

2.1.2.安装docker

由于操作过多,请按照步骤来。

2.1.2.1 查看内核版本

[root@localhost ~] # uname -r

2.1.2.2更新yum包

[root@localhost ~] # sudo yum update

2.1.2.3移除docker旧版本

[root@localhost ~] # sudo yum remove docker docker-common docker-selinux docker-engine

2.1.2.4 安装需要的软件包

[root@localhost ~] # sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2.1.2.5 设置镜像资源

[root@localhost ~] # sudo yum-config-manager --add-repo http:``//mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.1.2.6 查看所有docker版本

[root@localhost ~] # yum list docker-ce --showduplicates | sort -r

输出如下图:

img

笔者在运行fabric网络时,就遇到一个问题(具体问题,忘记记录),百度了一下说是docker和docker-compose版本问题,所以笔者在这里推荐docker版本是:17.12.0-ce。

2.1.2.7 安装docker

[root@localhost ~] # sudo yum install 版本号 ## sudo yum install docker-ce-17.12.0.ce

2.1.2.8 验证是否安装成功

[root@localhost ~] # docker version  

如下显示:

img

2.1.2.10 启动并且加入开机启动

[root@localhost ~] # sudo systemctl start docker``[root@localhost ~] # sudo systemctl enable docker

2.1.2.11 添加阿里的镜像

[root@localhost ~] # yum-config-manager --add-repo http:``//mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  

2.1.3.安装docker-compose  

2.1.3.1 使用pip安装

[root@localhost ~] # yum -y install epel-release  

这个版本应该是8.的,安装docker-compose需要升级到18.

2.1.3.2 安装组件python-pip。指令如下:

[root@localhost ~] # yum -y install python-pip

2.1.3.3 升级pip版本

[root@localhost ~] # pip install --upgrade pip  

如下图显示:

img

2.1.3.4 安装docker-compose

[root@localhost ~] # pip install docker-compose

2.1.3.5 验证。指令如下:

[root@localhost ~] # docker-compose version

img

2.1.4. Fabric资源及镜像下载

2.1.4.1 创建目录

[root@localhost ~] # mkdir /root/go/src/github.com/hyperledger -p

img

2.1.4.2 下载Fabric

[root@localhost hyperledger] # git clone https:``//github.com/hyperledger/fabric.git

如果git不可用,下载git。指令如下:

[root@localhost hyperledger] #  yum install git

2.1.4.3 设置资源版本号:v1.0.0

[root@localhost ~] # cd ~/go/src/github.com/hyperledger/fabric
[root@localhost fabric] # git checkout v1.0.0

  

2.1.4.4 Fabric Docker 镜像下载

[root@localhost ~] # cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
[root@localhost e2e_cli] # source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0  

2.1.4.5 查看镜像文件列表

[root@localhost e2e_cli] # docker images  

如下图显示:

img

2.1.4.6 启动 Fabric 网络环境

[root@localhost e2e_cli] # ./network_setup.sh up  

该脚本启动的服务解释如下(摘自网络):

编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin` `基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。` `基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。` `基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。  

稍等一会,出现文章开头的截图。再次截取,如果如下图显示,那就恭喜,你的网络也通了。

img

2.1.4.7查看容器运行

[root@localhost ~] # docker stats  

容器显示截图如下:

img

2.1.4.8 网络关闭

新开session窗口。指令如下(如下指令可以先不执行,后续步骤会用到):

[root@localhost ~] # cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
[root@localhost e2e_cli] # ./network_setup.sh down

3.1测试Fabric网络

3.1.1 新起session窗口,打开客户端

[root@localhost ~] # docker exec -it cli bash  

进入目录下,如下图所示:

img

3.1.2查询a账户余额

peer chaincode query -C mychannel -n mycc -c ``'{"Args":["query","a"]}'

截图如下显示:

img

3.1.3转账,a 账户给 b 转 50

peer chaincode invoke -o orderer.example.com:7050 --tls ``true` `--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c ``'{"Args":["invoke","a","b","50"]}'

 查询余额,截图如下:

a账号余额:

img

到此,所有的步骤都结束了,可以执行 “8.7关闭网络”。

4.1踩坑总结

1.在运行e2e_cli例子时,执行./network_setup.sh up,出现错误:网络搭建之network e2ecli_default not found

问题原因:

End-2-End例子的目录是e2e_cli,启动后会创建一个docker network的名字为e2e_cli_default,但是配置中设置了e2ecli_default这个与生成的network名对应不上。

解决方法:

修改e2e_cli/base目录下的peer-base.yaml中的配置,如下:

-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default

2.在运行e2e_cli例子时,执行./network_setup.sh up,出现错误:Error: Error endorsing chaincode: rpc error: code = Unknown desc = Timeout expired while starting chaincode mycc:1.0(networkid:dev,peerid:peer0.org2.example.com,tx:d6902b58171dd3b9bafb981885959c263589fb66d475cff79a7b5c519c24a603)

问题原因:

由于dev-peer0.org2.example.com-mycc-1.0 docker 镜像存在问题,需要删除。

解决方法:

执行如下命令:

1)删除旧的链码镜像

# docker stop $(docker ps -a -q)

# docker rm $(docker ps -a -q)

# docker rmi -f $(docker images |grep "dev-" |awk '{print $3}')

2)重启Fabric网络

# ./network_setup.sh up

极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Fabric区块链
喜欢 (12)
[17551054905]
分享 (0)

您必须 登录 才能发表评论!