超级账本——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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python那些实用且不为人知的技巧
- 实现接口的契约测试
- java泛型总结
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录
- openGauss备机追数Catchup过程中主库写入阻塞问题