Fabric系列 - 知识点整理
知识点
- 源码编译
- 主机编译
- 容器编译
- 手动部署(docker-compose)
- 单peer
- 多peer
- 中途加peer
- 多主机多peer
- 链码
- 语法, 接口 (go版)
- 命令行调用
- ca server
- 在DApp中使用SDK调用 (js版)
部署的几个阶段
- 部署1排序和1节点, 1组织1通道
- 光部署
- 能Dapp
- 带ca server (每个组织一个)
- 带TLS
- 部署1排序和2节点, 1组织1通道
- 一开始就是2节点
- cryptogen
- 能Dapp
- 带ca server(每个组织一个)
- 带TLS
- 新节点中途加入
- ca server
- 一开始就是2节点
名词解释
-
Transaction:⼀次Chaincode函数的运⾏。
Transaction存储chaincode执⾏的相关信息,⽐如chaincodeID、函数名称、参数等,并不包含操作的数据。 -
World State:Fabric区块链系统中所有变量的值的集合。
Transaction实际操作的是数据,每个chaincode都有⾃⼰的数据。
Fabric使⽤Rocksdb存储数据,⼀个key-value数据库。Key -> 变量,value -> 值。
Fabric将每⼀对key-value叫做⼀个state,⽽所有的chaincode的state的合集就是World State。 -
锚节点Anchor
- 通道中每个组织(Org)都有一个锚节点,用于同一通道中不同组织的Peer节点发现通道内所有Peer节点。
-
Fabric的账号体系,Fabric的有两种方法获取账号,分别是:
- cryptogen模块根据配置文件生成账号
- Fabric-ca-server服务器生成账号
-
一般只有网络组件配备了 TLS 服务器证书,而网络用户(例如 Admin、User1)没有。因为 TLS 中大多数只需要设置服务器身份验证(单向身份验证)。
模块组成
组织和证书生成器cryptogen
我们将使用该cryptogen
工具为我们的各种网络实体生成加密材料(x509 证书和签名密钥)。这些证书代表身份,它们允许在我们的实体进行通信和交易时进行签名/验证身份验证。
Cryptogen
使用一个文件——crypto-config.yaml
它包含网络拓扑,并允许我们为组织和属于这些组织的组件生成一组证书和密钥。每个组织都提供了一个唯一的根证书 ( ca-cert
),它将特定组件(对等节点和排序节点)绑定到该组织。通过为每个组织分配一个唯一的 CA 证书,我们模拟了一个典型的网络,在该网络中,参与成员将使用自己的证书颁发机构。Hyperledger Fabric 中的交易和通信由实体的私钥 ( keystore
)签名,然后通过公钥 ( ) 进行验证signcerts
。
区块和交易生成器configtxgen
该configtxgen
工具用于创建四个配置工件:
- orderer
genesis block
, - channel
configuration transaction
, - and two
anchor peer transactions
- one for each Peer Org.
orderer块是ordering服务的Genesis Block,通道配置交易文件在Channel创建时广播给orderer 。顾名思义,锚点交易指定了该通道上每个组织的锚点。
Fabric-ca

- fabric-ca server
- root
- intermediate
- cluster
- fabric-ca client
- db
- sqlite3
- postgres
- mysql
系统组织架构图
(1)Fabric系统组织架构图
(2) 应收账款融资业务场景系统架构图
Fabric项目开发流程图
上图中每个步骤分为3个部分,分别表示当前步骤需要的Fabric模块、配置文件以及需要完成的工作。
链码chaincode
和以太坊相比,Fabric链码和底层账本是分开的,升级链码时并不需要迁移账本数据到新链码当中,真正实现了逻辑与数据的分离。
链码被编译成一个独立的应用程序,fabric用Docker容器来运行chaincode,里面的base镜像都是经过签名验证的安全镜像,包括OS层和开发chaincode的语言、runtime和SDK层。一旦chaincode容器被启动,它就会通过gRPC与启动这个chaincode的Peer节点连接。
Fabric的智能合约称为链码(chaincode),分为系统链码和用户链码。
系统链码
-
系统链码: 包括系统的配置, 仅支持Go语言, 在Peer节点启动时会自动完成注册和部署
- 配置系统链码CSCC:负责管理记账节点上的配置信息,加入通道等
- 背书系统链码ESCC:对读写集转换和签名背书(msp管理). 背书节点执行用户链码之后会执行ESCC
- 生命周期系统链码LSCC:负责管理链码的生命周期,如安装、实例化、升级、查询
- 验证系统链码VSCC:负责签名验证/策略验证. 节点写入账本之前需要运行VSCC。
- 查询系统链码QSCC:负责ledger查询,如区块、交易数据、区块链信息等
- MVCC: 比对读写集的版本
用户链码
-
用户链码: 用户链码用于实现用户的功能,真正实现了逻辑与数据的分离。
- 运行在链码容器中,通过Fabric提供的接口与账本平台进行交互。
- 开发语言:go、java、python、node.js, 目前fabric对go语言的链码支持的最好
链码的生命周期
1. 链码的安装是单次单节点的。
2. 链码的存储(install)是可以多个链共享的,实例化(instantiate)的时候才会记录到不同链的账本数据里,不同链的数据是独立隔离的。
3. Chaincode**必须**安装在对等方上,才能成功地对账本执行读/写操作。此外,直到`init`对该链代码执行或传统事务(读/写)(例如查询“a”的值)之前,不会为对等方启动链代码容器。模拟执行事务时会容器启动。
链码内常用的系统方法
shim.ChaincodeStubInterface APIs 分为五类
• State 操作:
GetState(key string) ([]byte, error)
PutState(key string, value []byte) error
DelState(key string) error
RangeQueryState(startKey, endKey string) (StateRangeQueryIteratorInterface, error)
• Chaincode相互调⽤:
InvokeChaincode(chaincodeName string, args [][]byte) ([]byte, error)
QueryChaincode(chaincodeName string, args [][]byte) ([]byte, error)
• Table 操作:
CreateTable(name string, columnDefiniGons []*ColumnDefiniGon) error
GetTable(tableName string) (*Table, error)
DeleteTable(tableName string) error
InsertRow(tableName string, row Row) (bool, error) ReplaceRow(tableName string, row Row) (bool, error)
GetRow(tableName string, key []Column) (Row, error)
GetRows(tableName string, key []Column) (<-chan Row, error)
DeleteRow(tableName string, key []Column) error
• TransacGon操作:
GetArgs() [][]byte
GetStringArgs() []string
GetTxID() string
ReadCertAttribute(attributeName string) ([]byte, error) GetCallerCerGficate() ([]byte, error)
GetCallerMetadata() ([]byte, error)
GetBinding() ([]byte, error)
GetPayload() ([]byte, error)
GetTxTimestamp() (*Gmestamp.Timestamp, error)
VerifyAttribute(attributeName string, attributeValue []byte) (bool, error)
VerifyAttributes(attrs ...*attt.Attribute) (bool, error)
VerifySignature(cerGficate, signature, message []byte) (bool, error)
• Event操作:
SetEvent(name string, payload []byte) error
如何调用链码
-
终端里输入命令调用
- 更改:
peer chaincode invoke
- 查询:
peer chaincode query
- 更改:
-
应用程序(DApp)使用sdk(HFC - HyperledgerFabricClient)提供的接口调用 (API包含了交易处理、 安全的成员管理服务、 区块链查询和事件处理等)
-
fabric-client
- NewChannel: 接口可以创建通道
- sendTransactionProposal: 可以调用链码里的函数
-
fabric-ca
- enroll: 用户登录 (如:用Admin登录)
- register: 新用户注册 (如: 用Admin登录后, 注册一个新用户User1)
-
fabric-network
evaluateTransaction
: 读数据- 它只是选择连接配置文件中定义的对等点并将请求发送给它,在那里对其进行评估。
- 此交互不会导致更新分类帐
submitTransaction
: 写数据- SDK 不会与单个对等点交互,而是将
submitTransaction
提案发送 到区块链网络中每个所需组织的对等点。这些节点中的每一个都将使用这个提议执行请求的智能合约,以生成一个交易响应,它签名并返回给 SDK。SDK 将所有已签名的交易响应收集到单个交易中,然后将其发送给排序节点。排序节点收集来自每个应用程序的交易并将其排序为一个交易块。然后它将这些块分发到网络中的每个对等点,在那里验证和提交每个事务。最后,SDK 会收到通知,允许其将控制权返回给应用程序。
- SDK 不会与单个对等点交互,而是将
-
SDK调用链码示例 (老版本, 1.4版本之前)
var Fabric_Client = require('fabric-client'); //加载sdk模块 var channel = fabric_client.newChannel('mychannel'); //创建通道 var peer = fabric_client.newPeer('grpc://localhost:7051'); //连接peer节点 channel.addPeer(peer); var order = fabric_client.newOrderer('grpc://localhost:7050') //连接排序节点 channel.addOrderer(order);var request = {chaincodeId: 'myChaincode', //调用哪个链码fcn: 'testFunc', //调用链码里的哪个函数args: ['arg1', 'arg2', 'arg3'], //参数chainId: 'mychannel', //哪个通道的链码txId: tx_id}; channel.sendTransactionProposal(request); //发送交易
-
开发链码主要用到的语言是golang,因为fabric对它的支持目前最好。而应用层使用sdk的开发其它语言也可以,nodejs是比较通用和快速的选择。
部署和调用链码之前需要先创建通道、加入通道、更新锚节点,然后才能进行有关链码的操作,比如安装链码、实例化链码、invoke和query等。
往现有网络中添加新 Peer 的步骤
channel创建时可指定允许哪些组织内的peer加入, 但组织内的peer仍需手动加入channel
将向Org1添加一个peer1.org1.example.com。目标是这个新的 peer 将成为通道的一部分,并且能够在需要时处理链码查询和背书。
- 为peer1.org1.example.com生成加密材料
- 可使用
**cryptogen**
- 推荐使用
**fabric-ca**
- 可使用
- 创建一个包含此新peer的 docker compose 文件
- 将此新对等点加入现有频道
peer channel join
- 将链码安装到该节点
peer chaincode install
- 但不需要再次实例化
构建多主机多节点部署
不同的order由谁来布, 中途怎么加order?
构建多节点部署的挑战之一是 docker 容器之间的通信。
extra_hosts
Hyperledger Fabric 中三节点双通道设置演示
Hyperledger-fabric 区块链多主机
-
简单,不需要依赖任何外部组件
-
不利的一面是IP是静态配置的
-
操作方法
-
docker-compose.yaml
中为每个组件增加extra_hosts:- "orderer.example.com:127.0.0.1"- "peer0.org1.example.com:127.0.0.1"- "peer1.org1.example.com:127.0.0.1"
-
Docker Swarm
多台主机上的 Hyperledger Fabric 使用 Docker Swarm 和 Compose
使用基于 RAFT 的订购服务进行多主机设置
- 好的一面,显然是原始配置只需少量修改即可使用,并且配置中没有编码IP等静态信息。
- 结构网络依赖于外部组件(Docker Swarm),这可能会使设置和操作复杂化
Kubernetes (k8s)
- 实现起来似乎比前两种机制更具挑战性
相关文章:

Fabric系列 - 知识点整理
知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版) 部署的几个阶段 部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)…...

多目标优化算法之樽海鞘算法(MSSA)
樽海鞘算法的主要灵感是樽海鞘在海洋中航行和觅食时的群聚行为。相关文献表示,多目标优化之樽海鞘算法的结果表明,该算法可以逼近帕雷托最优解,收敛性和覆盖率高。 通过给SSA算法配备一个食物来源库来解决第一个问题。该存储库维护了到目前为…...

阿里云轻量应用服务器使用教程_创建配置_远程连接_网站上线
阿里云轻量应用服务器怎么使用?阿里云百科分享轻量应用服务器从选择创建、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程: 目录 阿里云轻量应用服务器使用教程 步骤一:购买一台轻量应用服务器 步骤二:…...
自监督学习的概念
Self-Supervised Learning (SSL)的主要思想是解决先验任务来学习特征提取器,在不使用标签的情况下生成有用的表示。 这里先验任务是指, 先使用原始数据和特征提取器来提取出 数据的有效表示. 对比方法(即对比学习, Contrastiv…...

C#多线程开发详解
C#多线程开发详解 持续更新中。。。。。一、为什么要使用多线程开发1.提高性能2.响应性3.资源利用4.任务分解5.并行计算6.实时处理 二、多线程开发缺点1.竞态条件2.死锁和饥饿3.调试复杂性4.上下文切换开销5.线程安全性 三、多线程开发涉及的相关概念常用概念(1)lock(2)查看当前…...

Linux 基础篇(六)sudo和添加信任用户
一、sudo 1.是什么? 给被信任的普通用户授权,让被信任的普通用户能执行root用户才能执行的命令的一个命令。 2.为什么? 很多时候我们要在被信任的普通用户下执行一些root用户才能执行的命令,如 yum… 所以需要有一个命令能给普通用…...

【Linux】程序地址空间
程序地址空间 首先引入地址空间的作用什么是地址空间为什么要有地址空间 首先引入地址空间的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…...

springboot 设置自定义启动banner背景图 教程
springboot banner Spring Boot中的banner是在应用程序启动时显示的一个ASCII艺术字符或文本。它被用来给用户展示一些关于应用程序的信息,例如名称、版本号或者公司标志等。 使用Spring Boot的默认设置,如果项目中有一个名为“banner.txt”的文件放置…...

CSS的引入方式有哪些?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 内联样式(Inline Styles)⭐ 内部样式表(Internal Stylesheet)⭐ 外部样式表(External Stylesheet)⭐ 导入样式表(Import Stylesheet)⭐ 写在最…...

.net core的Knife4jUI,让swagger更精致
要在 .NET Core 中使用 IGeekFan.AspNetCore.Knife4jUI,您可以按照以下步骤进行配置: 首先,安装 IGeekFan.AspNetCore.Knife4jUI NuGet 包。可以通过 Visual Studio 的 NuGet 包管理器或者 .NET CLI 进行安装。 在 Startup.cs 文件的 Config…...
Android 开发中需要了解的 Gradle 知识
作者:wkxjc Gradle 是一个基于 Groovy 的构建工具,用于构建 Android 应用程序。在 Android 开发中,了解 Gradle 是非常重要的,因为它是 Android Studio 默认的构建工具,可以帮助我们管理依赖项、构建应用程序、运行测试…...

Linux之【进程间通信(IPC)】-总结篇
Linux之【进程间通信(IPC)】-总结篇 管道System V共享内存System V消息队列System V信号量IPC资源的管理方式 往期文章 1.进程间通信之管道 2.进程间通信之System V共享内存 管道 进程之间具有独立性,拥有自己的虚拟地址空间,因…...

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序
文章目录 创建一个基于Qt Widget的应用程序创建Text Finder项目素材文件 填补缺失的部分设计用户界面完成头文件完成源文件创建资源文件 编译和运行程序 参考文章 创建一个基于Qt Widget的应用程序 本教程介绍如何使用Qt Creator创建一个小型Qt应用程序,名为Text F…...

手机商城网站的分析与设计(论文+源码)_kaic
目录 摘 要 1 1 绪论 2 1.1选题背景意义 2 1.2国内外研究现状 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.3研究内容 3 2 网上手机商城网站相关技术 4 2.1.NET框架 4 2.2Access数据库 4 2.3 JavaScript技术 4 3网上手机商城网站分析与设…...

vue2 封装 webSocket 开箱即用
第一步: 下载 webSocket npm install vue-native-websocket --save 第二步: 需要在 main.js 中 引入 import websocket from vue-native-websocket; Vue.use(websocket, , {connectManually: true, // 手动连接format: json, // json格式reconnection:…...

使用fopen等标准C库来操作文件
fopen 需要的头文件: #include <stdio.h> 函数原型: FILE *fopen(const char *pathname, const char *mode); 参数: pathname: 文件路径mode: “r” :以只读方式打开文件,该文件必须存在。“w” ÿ…...
Spring-Cloud-Loadblancer详细分析_1
背景 从SpringCloud 2020 版本之后,组件移除了除 Eureka 以外,所有 Netflix 的相关,包括最常用的 Ribbon Hystrix 等,所以 SpringCloud 在 spring-cloud-commons 提供了Loadbalancer 用来替代 Ribbon。本系列就来介绍Loadbalance…...
键盘键码keyCode对照表
字母和数字键的键码值(KeyCode)按键键码按键键码A65J74B66K75C67L76D68M77E69N78F70O79G71P80H72Q81I73R82 字母和数字键的键码值(KeyCode)按键键码按键键码S83149T84250U85351V86452W87553X88654Y89755Z90856048957 数字键盘上的键的键码值(KeyCode)按键键码按键键码0968104…...

jupyter切换conda虚拟环境
环境安装 conda install nb_conda 进入你想使用的虚拟环境: conda activate your_env_name 在你想使用的conda虚拟环境中: conda install -y jupyter 在虚拟环境中安装jupyter: conda install -y jupyter 重启jupyter 此时我们已经把该安装…...
【数据结构•堆】经典问题:k路归并
题目描述 k路归并问题: 把k个有序表合并成一个有序表。( k < 10^4 ) 输入输出格式 输入格式: 输入数据共有 2*k1 行。 第一行,一个整数k( k < 10^4 ),表示有k个有序…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...