Fabric初探及搭建Fabric第一个网络

超级账本项目,致力于构建透明,公开,去中心化的企业级分布式应用,主要应用在银行,证券,数字资产等金融领域,减少企业间的信任成本,增加机构之间互助合作的可能性。

## 超级账本介绍 超级账本(hyperledger)项目是首个面向企业应用场景的开源分布式账本平台,于2015年12月份由Linux基金会牵头,成立项目组,推动区块链的相关协议,规范,标准的发展。 参与超级账本的规范制定,开发的企业和组织有IBM,Intel,Cisco等国际知名机构,国内参与机构有小蚁,布比,万达等企业。 超级账本项目,致力于构建透明,公开,去中心化的企业级分布式应用,主要应用在银行,证券,数字资产等金融领域,减少企业间的信任成本,增加机构之间互助合作的可能性。 ## 超级账本项目 **fabric:**由IBM发起,包括fabric,fabric-ca,fabric-sdk等子项目,是区块链的基础核心平台。github地址:https://github.com/hyperledger/fabric; **swatooth:**由Intel公司发起的项目,共识机制基于硬件芯片时间消逝证明(PoET)。github地址:https://github.com/hyperledger/sawtooth-core; **Iroha:**由Soramitsu发起,用c++语言实现,支持web端和移动端的一些分布式需求。github地址:https://github.com/hyperledger/iroha; **Cello**:由IBM发起,提供区块链平台的部署和运行时管理功能。使用Cello部署区块链,应用开发者不需要关心如何搭建和维护区块链。github地址:https://github.com/hyperledger/cello; 除以上主流项目之外,还有**Blockchain Explorer**, **Indy**, **Composer**, **Burrow**等小型项目。 ## Fabric 框架结构 架构图如下:![framework](https://img.learnblockchain.cn/2019/06/28_framework.png!wl) ### 应用程序角度 1. **身份管理** 用户注册和登陆系统后,获取到用户注册证书,所有其他的操作都需要与用户证书关联的私钥进行签名,消息接收方首先会进行签名验证,才进行后续的消息处理。 2. **账本管理** 授权的用户是可以查询账本数据的,这可以通过多种方式查询,包括根据区块号查询区块,根据区块哈希查询区块,根据交易号查询区块,根据交易号查询交易,还可以根据通道名称获取查询到的区块信息。 3. **交易管理** 账本数据只能通过执行交易才能更新,应用程序通过交易管理提交交易并获取到交易背书以后,再给排序服务节点提交交易,然后打包生成区块。 4. **智能合约** 实现“可编程的账本”,通过链码执行提交的交易,实现基于区块链的智能合约业务逻辑。 ### 底层角度 1. **成员管理(MSP)** MSP对成员管理进行了抽象,每个MSP都会建立一套根信任证书体系,利用公钥基础设施PKI对成员身份进行认证,验证成员用户提交请求的签名。结合Fabric-CA或者第三方的CA系统([Certificate Authority:证书颁发机构](https://learnblockchain.cn/2019/0717/ca/)),提供成员注册功能,并对成员身份证书进行管理。 2. **共识服务** 在分布式节点环境下,要实现同一个链上不同节点区块的一致性,同时要确保区块里的交易有效和有序。共识机制由3个阶段完成: (1) 客户端向背书节点提交提案进行背书签名; (2) 客户端将背书后的交易提交给排序服务节点进行排序,生成区块和排序服务; (3) 广播给记账节点验证交易后写入本地账本。 3. **链码服务** 智能合约的实现依赖于安全的执行环境,确保安全的执行过程和用户数据的隔离。Fabric采用Docker管理普通的链码,提供安全的沙箱环境和镜像文件仓库。 4. **安全和密码服务** Fabric定义了一个BCCSP(BlockChain Cryptographic Service Provider)的概念,使其实现密钥生成,哈希运算,签名验签,加密解密等基础功能。 ## First Network ### 环境准备 **linux(ubuntu)**:Fabric运行的系统平台; **docker, docker-compose**:部署虚拟化镜像容器,学习时减少机器开销;链码运行环境为docker容器的沙箱环境; **golang**:Fabric运行的基础环境,编译Fabric项目。 ### 源码下载和编译 * 下载 在$GOPATH/src/github.com/hyperledger目录下执行: ```bash git clone https://github.com/hyperledger/fabric ``` * 编译 ``` bash cd fabric make all ``` ### 编译中可能出现的问题及解决办法 1. 服务器访问问题 **错误信息**:package golang.org/x/tools/imports: unrecognized import path "golang.org/x/tools/imports" ![net_error](https://img.learnblockchain.cn/2019/06/28_neterror.png!wl) **原因**:golang.org/x/tools包在国内是访问不到它的服务器的 **解决方法**: (1)用VPN翻墙编译; (2)从https://github.com/golang/tools上克隆再拷贝到GOPATH的golang.org/x/tools目录; (3)从https://gopm.io/download下载解压使用 2. 缺少protobuf工具问题 **错误信息**:cp: 无法获取‘.build/docker/gotools/bin/protoc-gen-go’ 的文件状态(stat): 没有那个文件和目录 !(proto-error)[https://img.learnblockchain.cn/2019/06/28_protoerror.png!wl] **原因**:系统环境下没有protoc-gen-go工具,无法拷贝到docker镜像 **解决方法**: + 在系统终端执行go get -u github.com/golang/protobuf/protoc-gen-go,会在$GOROOT/bin生成protoc-gen-go文件; + 将$GOROOT/bin下的protoc-gen-go拷贝到.build/docker/gotools/bin目录 3. 检查dep错误 **错误信息**:./scripts/check-deps.sh: line 7: dep: command not found ![dep-error](https://img.learnblockchain.cn/2019/06/28_deperror.png!wl) **原因**:docker buildenv镜像中没有将dep包管理工具打包进去,造成找不到dep命令 **解决方法**: (1). 自己编写buildenv的Dockerfile,将dep拷贝进去; (2). 注释掉./scripts/check-deps.sh文件中的dep version和dep check两行,因为这两行命令只做了查看版本和检测的功能,在正常情况下是不需要用到的,注释掉不影响fabric的使用,如下: ![dep-modify](https://img.learnblockchain.cn/2019/06/28_depmodify.png!wl) ### 编译结果 1. 在./build/bin目录下生成了以下执行文件: ```text chaintool configtxgen configtxlator cryptogen discover idemixgen orderer peer ``` *注意:要能正常使用fabric,则需要将./build/bin中的执行文件放到环境变量$PATH中* 2. 生成了hyperledger fabric 的一批镜像,包括 ```bash hyperledger/fabric-tools hyperledger/fabric-buildenv hyperledger/fabric-ccenv hyperledger/fabric-orderer hyperledger/fabric-peer hyperledger/fabric-ca hyperledger/fabric-zookeeper hyperledger/fabric-kafka hyperledger/fabric-couchdb hyperledger/fabric-baseimage hyperledger/fabric-baseos hyperledger/fabric-ccenv ``` ### 运行first network示例程序 fabric-samples文件夹中包含了许多示例,first-network 可以快速引导一个由4个代表2个不同组织的peer节点以及一个排序服务节点的Hyperledger fabric网络, 我们来运行下. 1. 从github下载示例程序 ```bash git clone https://github.com/hyperledger/fabric-samples ``` 2. 进入fabric-samples/first-network目录执行运行脚本 ``` bash cd fabric-samples/first-network ./byfn.sh up ``` 3. 执行成功结果 出现以下标志则成功: ![end](https://img.learnblockchain.cn/2019/06/28_end.png) 在下一篇我们将介绍在这个网络上部署应用:[Fabric 链码Chaincode 的安装、初始化、调用、升级](https://learnblockchain.cn/2019/07/03/chaincode-run/) 。

超级账本介绍

超级账本(hyperledger)项目是首个面向企业应用场景的开源分布式账本平台,于2015年12月份由Linux基金会牵头,成立项目组,推动区块链的相关协议,规范,标准的发展。

参与超级账本的规范制定,开发的企业和组织有IBM,Intel,Cisco等国际知名机构,国内参与机构有小蚁,布比,万达等企业。

超级账本项目,致力于构建透明,公开,去中心化的企业级分布式应用,主要应用在银行,证券,数字资产等金融领域,减少企业间的信任成本,增加机构之间互助合作的可能性。

超级账本项目

fabric:由IBM发起,包括fabric,fabric-ca,fabric-sdk等子项目,是区块链的基础核心平台。github地址:https://github.com/hyperledger/fabric;

swatooth:由Intel公司发起的项目,共识机制基于硬件芯片时间消逝证明(PoET)。github地址:https://github.com/hyperledger/sawtooth-core;

Iroha:由Soramitsu发起,用c++语言实现,支持web端和移动端的一些分布式需求。github地址:https://github.com/hyperledger/iroha;

Cello:由IBM发起,提供区块链平台的部署和运行时管理功能。使用Cello部署区块链,应用开发者不需要关心如何搭建和维护区块链。github地址:https://github.com/hyperledger/cello;

除以上主流项目之外,还有Blockchain Explorer, IndyComposer, Burrow等小型项目。

Fabric 框架结构

架构图如下:

应用程序角度

  1. 身份管理

    用户注册和登陆系统后,获取到用户注册证书,所有其他的操作都需要与用户证书关联的私钥进行签名,消息接收方首先会进行签名验证,才进行后续的消息处理。

  2. 账本管理

    授权的用户是可以查询账本数据的,这可以通过多种方式查询,包括根据区块号查询区块,根据区块哈希查询区块,根据交易号查询区块,根据交易号查询交易,还可以根据通道名称获取查询到的区块信息。

  3. 交易管理

    账本数据只能通过执行交易才能更新,应用程序通过交易管理提交交易并获取到交易背书以后,再给排序服务节点提交交易,然后打包生成区块。

  4. 智能合约

    实现“可编程的账本”,通过链码执行提交的交易,实现基于区块链的智能合约业务逻辑。

底层角度

  1. 成员管理(MSP)

    MSP对成员管理进行了抽象,每个MSP都会建立一套根信任证书体系,利用公钥基础设施PKI对成员身份进行认证,验证成员用户提交请求的签名。结合Fabric-CA或者第三方的CA系统(Certificate Authority:证书颁发机构),提供成员注册功能,并对成员身份证书进行管理。

  2. 共识服务

    在分布式节点环境下,要实现同一个链上不同节点区块的一致性,同时要确保区块里的交易有效和有序。共识机制由3个阶段完成: (1) 客户端向背书节点提交提案进行背书签名; (2) 客户端将背书后的交易提交给排序服务节点进行排序,生成区块和排序服务; (3) 广播给记账节点验证交易后写入本地账本。

  3. 链码服务

    智能合约的实现依赖于安全的执行环境,确保安全的执行过程和用户数据的隔离。Fabric采用Docker管理普通的链码,提供安全的沙箱环境和镜像文件仓库。

  4. 安全和密码服务

    Fabric定义了一个BCCSP(BlockChain Cryptographic Service Provider)的概念,使其实现密钥生成,哈希运算,签名验签,加密解密等基础功能。

First Network

环境准备

linux(ubuntu):Fabric运行的系统平台;

docker, docker-compose:部署虚拟化镜像容器,学习时减少机器开销;链码运行环境为docker容器的沙箱环境;

golang:Fabric运行的基础环境,编译Fabric项目。

源码下载和编译

  • 下载

在$GOPATH/src/github.com/hyperledger目录下执行:

git clone https://github.com/hyperledger/fabric
  • 编译
cd fabric
make all

编译中可能出现的问题及解决办法

  1. 服务器访问问题

    错误信息:package golang.org/x/tools/imports: unrecognized import path "golang.org/x/tools/imports"

    原因:golang.org/x/tools包在国内是访问不到它的服务器的

    解决方法

    (1)用VPN翻墙编译;

    (2)从https://github.com/golang/tools上克隆再拷贝到GOPATH的golang.org/x/tools目录;

    (3)从https://gopm.io/download下载解压使用

  2. 缺少protobuf工具问题

    错误信息:cp: 无法获取‘.build/docker/gotools/bin/protoc-gen-go’ 的文件状态(stat): 没有那个文件和目录

    !(proto-error)[https://img.learnblockchain.cn/2019/06/28_protoerror.png!wl]

    原因:系统环境下没有protoc-gen-go工具,无法拷贝到docker镜像

    解决方法

    • 在系统终端执行go get -u github.com/golang/protobuf/protoc-gen-go,会在$GOROOT/bin生成protoc-gen-go文件;
    • 将$GOROOT/bin下的protoc-gen-go拷贝到.build/docker/gotools/bin目录
  3. 检查dep错误

    错误信息:./scripts/check-deps.sh: line 7: dep: command not found

    原因:docker buildenv镜像中没有将dep包管理工具打包进去,造成找不到dep命令

    解决方法

    (1). 自己编写buildenv的Dockerfile,将dep拷贝进去;

    (2). 注释掉./scripts/check-deps.sh文件中的dep version和dep check两行,因为这两行命令只做了查看版本和检测的功能,在正常情况下是不需要用到的,注释掉不影响fabric的使用,如下:

编译结果

  1. 在./build/bin目录下生成了以下执行文件:

    chaintool  configtxgen  configtxlator  cryptogen  discover  idemixgen  orderer  peer

    注意:要能正常使用fabric,则需要将./build/bin中的执行文件放到环境变量$PATH中

  2. 生成了hyperledger fabric 的一批镜像,包括

     hyperledger/fabric-tools
     hyperledger/fabric-buildenv
     hyperledger/fabric-ccenv
     hyperledger/fabric-orderer
     hyperledger/fabric-peer
     hyperledger/fabric-ca
     hyperledger/fabric-zookeeper
     hyperledger/fabric-kafka
     hyperledger/fabric-couchdb
     hyperledger/fabric-baseimage
     hyperledger/fabric-baseos
     hyperledger/fabric-ccenv

运行first network示例程序

fabric-samples文件夹中包含了许多示例,first-network 可以快速引导一个由4个代表2个不同组织的peer节点以及一个排序服务节点的Hyperledger fabric网络, 我们来运行下.

  1. 从github下载示例程序

    git clone https://github.com/hyperledger/fabric-samples
  2. 进入fabric-samples/first-network目录执行运行脚本

    cd fabric-samples/first-network
    ./byfn.sh up
  3. 执行成功结果

    出现以下标志则成功:

在下一篇我们将介绍在这个网络上部署应用:Fabric 链码Chaincode 的安装、初始化、调用、升级 。

  • 发表于 2019-06-28 06:55
  • 阅读 ( 9438 )
  • 学分 ( 20 )
  • 分类:Fabric

评论