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

img

名词解释

  • 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

image-20210722194525598
  • fabric-ca server
    • root
    • intermediate
    • cluster
  • fabric-ca client
  • db
    • sqlite3
    • postgres
    • mysql

系统组织架构图

(1)Fabric系统组织架构图

在这里插入图片描述

(2) 应收账款融资业务场景系统架构图

image-20210728142750795

Fabric项目开发流程图

image-20210725150552299

上图中每个步骤分为3个部分,分别表示当前步骤需要的Fabric模块、配置文件以及需要完成的工作。

链码chaincode

和以太坊相比,Fabric链码和底层账本是分开的,升级链码时并不需要迁移账本数据到新链码当中,真正实现了逻辑与数据的分离。

链码被编译成一个独立的应用程序,fabric用Docker容器来运行chaincode,里面的base镜像都是经过签名验证的安全镜像,包括OS层和开发chaincode的语言、runtime和SDK层。一旦chaincode容器被启动,它就会通过gRPC与启动这个chaincode的Peer节点连接。

img

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
      • _images/write_first_app.diagram.2.png
    • 查询: peer chaincode query
      • _images/write_first_app.diagram.1.png
  • 应用程序(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调用链码示例 (老版本, 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 将成为通道的一部分,并且能够在需要时处理链码查询和背书。

  1. peer1.org1.example.com生成加密材料
    1. 可使用 **cryptogen**
    2. 推荐使用 **fabric-ca**
  2. 创建一个包含此新peer的 docker compose 文件
  3. 将此新对等点加入现有频道
    1. peer channel join
  4. 将链码安装到该节点
    1. peer chaincode install
    2. 但不需要再次实例化

构建多主机多节点部署

不同的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)

  • 实现起来似乎比前两种机制更具挑战性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【1572. 矩阵对角线元素的和】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3]…

Typecho建站:腾讯云轻量应用服务器搭建网站博客方法

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

【腾讯云Cloud Studio实战训练营】使用React快速构建点餐H5

文章目录 前言一、Cloud Studio是什么二、Cloud Studio特点三、Cloud Studio使用1.访问官网2.账号注册3.模板选择4.模板初始化5.H5开发安装 antd-mobile安装 Less安装 normalize上传项目需要的素材替换App.js主文件项目启动、展示 6.发布仓库 总结 前言 随着云计算产业的发展&…

勘探开发人工智能技术:机器学习(5)

0 提纲 6.1 矩阵分解 6.2 全连接 BP 神经网络 6.3 卷积神经网络 6.4 LSTM 6.5 Transformer 6.6 U-Net 1 矩阵分解 把稀疏矩阵分解成两个小矩阵的乘积, 恢复后的矩阵用于预测. 1.1 基本概念 矩阵分解是使用数学应对机器学习问题的一类典型而巧妙的方法. 矩阵分解是把将一个…

MongoDB 分片集群

在了解分片集群之前&#xff0c;务必要先了解复制集技术&#xff01; 1.1 MongoDB复制集简介 一组Mongodb复制集&#xff0c;就是一组mongod进程&#xff0c;这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性&#xff0c;这是生产部署的基础。 1.1.1 复制集…

3D Web轻量化引擎HOOPS Communicator如何实现对BIM桌面端的支持?

HOOPS Communicator是一款简单而强大的工业级高性能3D Web轻量化渲染开发包&#xff0c;其主要应用于Web领域&#xff0c;主要加载其专有的SCS、SC、SCZ格式文件&#xff1b;HOOPS还拥有另一个桌面端开发包HOOPS Visualize&#xff0c;主要加载HSF、HMF轻量化格式文件。两者虽然…

那些年的Xposed开发经验记录

把之前写的Xposed相关文章合并到一块&#xff0c;方便查阅 目录 多进程App的Hook问题XposedHelper中的静态变量demo的AndroidManifest.xml的测试核心代码结论限制handleLoadPackage被单个进程多次执行的问题 多dex Hook问题为应用增加权限利用Xposed删除权限参考 Hook框架集锦…

Java基础入门篇——IDEA开发第一个入门程序(五)

目录 一、IDEA层级结构分类 二、IDEA层级结构介绍 三、IDEA层级关系 四、创建IDEA中的第一个代码 一、IDEA层级结构分类 IntelliJ IDEA的项目结构主要分为以下几个层级&#xff1a; Project&#xff1a; 项目Module: 模块Package: 包Class&#xff1a; 类 一个项目里面…

模拟实现消息队列项目(系列3) -- 服务器模块(硬盘管理)

目录 前言 1. 创建项目 2. 创建核心类 2.1 Exchange 2.2 MSQueue 2.3 Binding 2.4 Message 3. 数据库设计 3.1 SQLite 配置 3.2 Mapper层代码实现 3.2.1 创建表操作 3.2.2 交换机 队列 绑定的增加和删除 3.3 实现DataBaseManager 3.4 DataBaseManager单元测试 4.…

线性代数(三) 线性方程组向量空间

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

git的简单介绍和使用

git学习 1. 概念git和svn的区别和优势1.1 区别1.2 git优势 2. git的三个状态和三个阶段2.1 三个状态&#xff1a;2.2 三个阶段&#xff1a; 3. 常用的git命令3.1 下面是最常用的命令3.2 git命令操作流程图如下&#xff1a; 4. 分支内容学习4.1 项目远程仓库4.2 项目本地仓库4.3…

恒盛策略:沪指冲高回落跌0.26%,酿酒、汽车等板块走弱,燃气股拉升

10日早盘&#xff0c;两市股指盘中冲高回落&#xff0c;半日成交约4200亿元&#xff0c;北向资金净卖出超20亿元。 到午间收盘&#xff0c;沪指跌0.26%报3235.9点&#xff0c;深成指跌0.54%&#xff0c;创业板指跌0.28%&#xff1b;两市算计成交4202亿元&#xff0c;北向资金净…

【Terraform学习】保护敏感变量(Terraform配置语言学习)

实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中&#xff0c;单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分&#xff0c;为角色选择可信实体类型&#xff1a; AWS 服务 使用案例:EC2 单击下一步 添加权限&#xff1a;现在&#xff0c;您可以看到…

小白到运维工程师自学之路 第七十一集 (kubernetes网络设置)

一、概述 Master 节点NotReady 的原因就是因为没有使用任何的网络插件&#xff0c;此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。 二、安装flannel 1、master下载kube-flannel.yml&#xff0c;所…

Chrome有些网站打不开,但是火狐可以打开

Chrome有些网站打不开&#xff0c;但是火狐可以打开 问题描述火狐成功界面谷歌报错界面局域网设置使用代理服务器访问成功 解决方案参考 问题描述 开了一个tizi&#xff0c;Chrome不能使用&#xff0c;火狐可以。之前装过插件Ghelper白嫖科学上网&#xff0c;那次之后好像浏览…

领航优配:沪指震荡涨0.47%,保险、券商板块强势,互联金融概念活跃

4日早盘&#xff0c;两市股指高开高走&#xff0c;沪指一度涨逾1%打破3300点&#xff0c;随后涨幅有所收窄&#xff1b;两市半日成交超6000亿元&#xff0c;北向资金小幅净流入。 截至午间收盘&#xff0c;沪指涨0.47%报3295.91点&#xff0c;深成指涨0.67%&#xff0c;创业板指…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO&#xff08;Non-Blocking IO&#xff09;是同步非阻塞方式来处理IO数据。…

数据API服务管理功能 - 提升数据效率的关键工具

数据API服务管理功能 - 提升数据效率的关键工具 什么是数据API服务管理功能&#xff1f; 数据API服务管理功能是一种用于有效管理和控制数据API的工具。它为用户提供了方便的界面和功能&#xff0c;以简化数据访问、解析和处理的过程。通过使用数据API服务管理功能&#xff0…

优思学院|质量第一的目的是什么?

国外有一句很著名的话&#xff1a;Quality comes first, profit is its logical sequence&#xff0c;意思是&#xff1a;质量第一&#xff0c;利润是其合理的结果&#xff0c;这句话也是很多公司或者商店使用的标语。 简而言之&#xff0c;只要你把质量放在第一位&#xff0c…

yolo-nas对自定义数据集进行训练,测试详解 香烟数据集

yolov5格式的香烟数据集 https://download.csdn.net/download/qq_42864343/88110620?spm1001.2014.3001.5503 创建yolo-nas的运行环境 进入Pycharm的terminal&#xff0c;输入如下命令 conda create -n yolonas python3.8pip install super-gradients使用自定义数据训练Yo…