超级账本——Hyperledger Fabric

时间:2022-07-23
本文章向大家介绍超级账本——Hyperledger Fabric,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

简介

Hyperledger Fabric是一个开放源代码企业级许可分布式账本技术(DLT)平台,旨在用于企业环境中,是第一个支持以通用编程语言(例如Java,Go和Node.js)而非受约束的领域特定语言(DSL)编写的智能合约编写的分布式分类帐平台。

基础概念

陶老师的博客——https://blog.csdn.net/russell_tao/article/details/80459698 官方文档——https://hyperledger-fabric.readthedocs.io/zh_CN/latest/membership/membership.html

  • ChainCode——链码,也称智能合约。自动判断条件满足,执行的回调脚本(如补偿扣款,自动还款)
  • MSP——Membership Service Provider,基于CA认证的身份信息验证服务。它定义了对于自己所在的 Peer 节点的信任域 (比如,组织) 节点本地 MSP 定义了节点的权限(比如,谁是节点管理员),同时也包含了对已注销过期的信息 用户的本地 MSP 允许用户在交易中证明自己是通道的成员(比如在链码交易中),或者系统中指定角色的所有者(比如,在配置交易中的组织管理员) 同属于一个Channel中的组织,将需要参与到Channel中的交易的所有身份MSP共享到Channel里,不在Channel全局MSP信任下的交易将会被Channel拒绝
  • channel——私有的子网络,也就是子网络中的各个peer各自维护一份同步的全局MSP,互相信任。每个Channel里会部署有多套合约,供channel里的peer去签订
  • world state——世界状态,每个peer上面的联盟实时状态数据副本
  • endorsement——背书,即peer为提案添加验证通过的peer签名
  • endorsement policy——背书策略,智能合约相关的配置,决定要签订该合约需要哪些peer参与背书
  • peer——存放区块链数据的结点,同时还有endorse和commit功能
  • Orderer——排序结点,提供共识服务
  • transaction——交易,每条指令都是一次交易
  • org——orginazation,管理一系列合作企业的组织
  • OUS——organizationUnits,组织下的多个企业单位,一般会为不同的organizationUnit定义不同的MSP进行区分,如下为官方示意图

MSP

MSP分级

MSP结构如下为官方图

MSP struct

  • 网络 MSP:网络配置通过定义参与组织的 MSP 定义了谁是这个网络的成员,并且定义了授权哪些成员执行管理任务(比如,创建通道)
  • Channel MSP:通道单独维护着它的成员的 MSP,也即子网络。通道在指定的一系列组织间提供了私有的通信方式,这些组织又管理着这个通道。在通道 MSP 上下文中的通道策略定义了谁有能力参与通道上的某些操作,比如,添加组织,或者实例化链码
  • Peer 节点MSP:由一个单独组织所有,每个 Peer 节点都有一个单独的 MSP 实例维护在本地文件系统。概念上讲,它同通道 MSP 执行着完全一样的操作,但是具有这些操作只能应用到它被定义的那个 Peer 节点上。使用 Peer 节点本地 MSP 来判定谁被授权操作的例子就是在 Peer 节点上安装链码
  • Orderer节点 MSP:就像 Peer 节点,排序节点也是由一个单独的组织所有,因此具有一个单独的 MSP保存在本地文件系统, 来列出它所信任的操作者或者节点,信任应用于自己节点上的操作

MSP中保存的对于其他信任结点在Intermediate CAS中,结点权限声明在Administrators中的,一般为对应结点的X509 证书。TLS文件夹对应为相关的TLS版本证书 结构中,private keys是peer结点和orderer结点必须有的,用于投票加签名,signingCert是对应的公钥。而对于通道MSP则不是必须的

fabric2.2部署环境

此处以windows为开发环境,Linux环境后续更新在其他文章 windows10专业版 docker desktop 最新版 golang 最新版 gitbash 最新版 1.运行docker,确保在gitbash下可以使用docker命令 2.配置go环境变量gopath,确保在gitbash下可以使用go命令 3.下载fabric仓库的scripts/bootstrap.sh 4.执行bootstrap.sh 具体会做:

  • git clone sample仓库
  • 下载二进制文件到sample仓库下面的bin目录 (fabric代码编译后的本平台可执行文件,也可以通过自己编译源码得到,编译依赖的环境比较麻烦配置)
  • pull fabric示例网络的docker镜像
  • 生成两个peerer一个orderer的ca证书
  • 配置测试域名的host解析

5.下载fabric仓库的sampleConfig目录下全部内容到sample仓库的config目录下 6.进入sample仓库的test-network目录 7.执行./network.sh up 启动区块链网络 8.执行docker ps查看到启动的三个node,分别代表一个orderer和两个组织的peer 0.执行./network.sh down 停止区块链网络

Channel

Channel是通信的基本网络,作为整个区块链系统的子网络 使用官方命令./network.sh createChannel -c testchannel 可以直接将当前network中的两个结点创建并加入一个channel,名称为testchannel 另外还有可以通过进入每个结点,手动创建并加入channel的过程:

  • 进入peer的docker cli命令行
  • 执行peer help查看全部帮助命令
  • peer channel create创建通道,参数如下
          -o: orderer容器的域名和端口,如orderer.exmaple.com:7050
          -c: 指定通道名,利用configtxgen生成Channel配置区块文件channel.tx时指定的通道名
          -f: 指定通道配置交易文件(channel.tx)
          --tls:开启TLS验证
         --cafile:指定了orderer的ca根证书在peer本地的存放路径
  • peer channel fetch newest filename -c testchannel --orderer orderer.example.com:7050 从orderer上,fetch下来testchannel的最新的创世区块的信息存放到filename路径代表的文件
  • peer channel join filename 加入对应文件指向的channel
  • peer channel signconfigtx -f 配置文件名 给对应的通道配置文件加上当前peer的签名
  • peer channel update -c testchannel -f 配置文件名 给对应的通道配置文件加上当前peer的签名,并发送配置文件到Channel,更新Channel的配置 通道配置文件编写教程见官方文档——https://hyperledger-fabric.readthedocs.io/zh_CN/release-2.2/configtx.html
  • configtxgen 与 configtx.yaml 因为编写go代码生成较麻烦,可以使用官方提供的工具configtxgen,通过configtx.yaml配置文件生成对应的配置文件的区块编码文件(一般命名为configtx.tx)。官方文档——https://hyperledger-fabric.readthedocs.io/zh_CN/release-2.2/commands/configtxgen.html
  • AnchorPeers 锚节点,是通道配置文件中比较重要的配置,指定一个peer,作为组织间的通信代表,负责转发所有组织间交易给内部其他peer

ChainCode

链码,又称智能合约

  • peer chaincodeinstall -n name -v ver -p path 把path对应的链码打包为CDS(Chaincode Deployment Spec)格式,命名为name,版本为ver,安装到当前节点上
  • peer chaincode instantiate -n name -v ver -o orderer.example.com:7050 -C channelName 初始化name对应的CDS格式链码,通过orderer节点安装到channelName上
  • peer chaincode invoke -n name -o orderer.example.com:7050 -C channelName 提交事务执行链码
  • peer chaincode query -C channelName -n name -c '{"Args":["query","a"]}' 查询channelName通道中,name链码上,变量a的值
  • peer chaincode upgrade -o orderer.example.com:7050 -C channelName -n name -v 1.2 -c '{"Args":["init","a","100","b","200","c","300"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" 在两个peer上面更新链码,升级版本为1.2,设置链码变量a,b,c,值分别为100,200,300 更多文章,请搜索公众号歪歪梯Club