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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CI/CD—K8S 基本理解与部署

1 K8S 是什么 Kubernetes 是一款容器的编排调度工具&#xff0c;来源于 Google 开源的 Brog 系统。Kubernetes简称K8S&#xff0c;是用8代替8个字符 “ubernete” 而成的缩写&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化…

【javaweb】学习日记Day1 - HTML CSS入门

目录 一、图片标签 ① 绝对路径 1.绝对磁盘路径 2.绝对网络路径 ② 相对路径 &#xff08;推荐&#xff09; 二、标题标签 三、水平线标签 四、标题样式 1、CSS引入样式 ① 行内样式 ② 内嵌样式 ③ 外嵌样式 2、CSS选择器 ① 元素选择器 ② id选择器 ③…

读书笔记 |【项目思维与管理】➾ 顺势而动

读书笔记 |【项目思维与管理】➾ 顺势而动 一、企业步入“终结者时代”二、过去成功的经验也许是最可怕的三、做好非重复性的事四、适应客户是出发点五、向知识型企业转变六、速度是决胜条件 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; …

Python web实战之Django 的缓存机制详解

关键词&#xff1a;Python、Web 开发、Django、缓存 1. 缓存是什么&#xff1f;为什么需要缓存&#xff1f; 在 Web 开发中&#xff0c;缓存是一种用于存储数据的临时存储区域。它可以提高应用程序的性能和响应速度&#xff0c;减轻服务器的负载。 当用户访问网页时&#xff…

网安周报|半数人工智能开源项目引用存在漏洞的软件包

1、半数人工智能开源项目引用存在漏洞的软件包 根据EndorLabs的数据&#xff0c;开源在AI技术堆栈中发挥着越来越重要的作用&#xff0c;但大多数项目(52%)引用了存在已知漏洞的易受攻击的依赖项。EndorLabs在最新的《软件依赖管理状态报告》声称&#xff0c;在发布仅五个月后&…

【Minecraft】Fabric Mod开发完整流程4 - 自定义物品方块以及食物、燃料

目录 自定义物品与方块自动侦测矿藏工具工具功能实现执行结果 自定义音乐方块自定义食物自定义燃料 自定义物品与方块 自动侦测矿藏工具 探测器纹理下载地址&#xff1a; https://url.kaupenjoe.net/mbkj57/assets 众所周知&#xff0c;正经人永远不喜欢常规套路挖矿&#xff0…

web-xss-dvwa

目录 xss&#xff08;reflected&#xff09; low medium high xss(store) low medium high xss(dom) low medium high xss&#xff08;reflected&#xff09; low 没有什么过滤&#xff0c;直接用最普通的标签就可以了 http://127.0.0.1/DVWA-master/vulnerabili…

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能&#xff1a;客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信&#xff0c;从此老死不相往来 看代码&#xff1a; //发送端…

python ffmpeg合并ts文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 当你从网站下载了一集动漫&#xff0c;然后发现是一堆ts文件&#xff0c;虽然可以打开&#xff0c;但是某个都是10秒左右&#xff0c;…

Learning Deep Features for Discriminative Localization

Some Words: 这里主要是我阅读paper的笔记 这篇文章主要是2016年CVPR的一篇文章&#xff0c;中文名是 学习用于判别性定位的深度特征&#xff0c; &#xff08;一&#xff09;Abstract: 在这篇工作中&#xff0c;我们又重新探讨了全局平均池化层&#xff0c;并且阐释了CNN网络…

【uni-app】 .sync修饰符与$emit(update:xxx)实现数据双向绑定

最近在看uni-app文档&#xff0c;看到.sync修饰符的时候&#xff0c;觉得很有必要记录一下 其实uni-app是一个基于Vue.js和微信小程序开发框架的跨平台开发工具 所以经常会听到这样的说法&#xff0c;只要你会vue&#xff0c;uni-app就不难上手 在看文档的过程中&#xff0c;发…

常见分布式ID解决方案总结:数据库、算法、开源组件

常见分布式ID解决方案总结 分布式ID分布式ID方案之数据库数据库主键自增数据库号段模式Redis自增MongoDB 分布式ID方案之算法UUIDSnowflake(雪花算法) 雪花算法的使用IdWorker工具类配置分布式ID生成器 分布式ID方案之开源组件uid- generator(百度)Tinyid&#xff08;滴滴&…

x11 gtk qt gnome kde 之间的区别和联系

Linux 下的图形库介绍 一、Linux 图形领域的基础设施 1.1 X Window X Window从逻辑上分为三层&#xff1a;X Server、X Client和X协议。 最底层的X Server&#xff08;X服务器&#xff09;主要处理输入/输出信息并维护相关资源&#xff0c;它接受来自键盘、鼠标的操作并将…

378. 有序矩阵中第 K 小的元素

378. 有序矩阵中第 K 小的元素 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__378有序矩阵中第K小的元素__直接排序__378有序矩阵中第K小的元素__归并排序__378有序矩阵中第K小的元素__二分查找 原题链接&#xff1a; 378. 有序矩阵中…

全志T113-S3 Tina-linux --1. 开发环境搭建

1. 硬件环境 1.1 开发板 型号&#xff1a;100ASK_T113-PRO Base V1.1&#xff08;韦东山&#xff09;配置&#xff1a;CPU&#xff1a;T113-S3&#xff0c;RAM&#xff1a;128MB&#xff0c;ROM&#xff1a;128MB T113-S3配置 1.2 上手使用 1.2.1 串口shell 串口shell配置…

面试热题(二叉树的锯齿形层次遍历)

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3…

Yolov5缺陷检测/目标检测 Jetson nx部署Triton server

使用AI目标检测进行缺陷检测时&#xff0c;部署到Jetson上即小巧算力还高&#xff0c;将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…

zookeeper+kafka

目录 Kafka概述 一、为什么需要消息队列&#xff08;MQ&#xff09; 二、使用消息队列的好处 三、消息队列的两种模式 四、Kafka 定义 五、Kafka 简介 六、Kafka 的特性 七、Kafka 系统架构 分区的原因 八、部署kafka 集群 1.下载安装包 2.安装 Kafka 3.修改…

卷积神经网络实现彩色图像分类 - P2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P2周&#xff1a;彩色识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子…

【考研复习】24王道数据结构课后习题代码|第3章栈与队列

文章目录 3.1 栈3.2 队列3.3 栈和队列的应用 3.1 栈 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…