购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 Fabric网络模型

本节介绍Fabric区块链的网络模型,使读者从整体上了解Fabric区块链的体系结构和工作原理。

2.1.1 Fabric网络的主要组件

Fabric网络的主要组件如下。

● 成员服务提供者(Membership Service Provider,MSP)。

● 客户端。

● Peer节点。

● 排序节点(Orderer节点)。

1.MSP

MSP是定义身份验证方式和访问网络权限规则的组件。它可以管理希望加入网络的用户和客户端,为发起交易提案的客户端提供证书。MSP通过CA(Certificate Authority,证书颁发机构)来颁发、验证或撤销证书。Fabric区块链支持可插拔的CA服务,默认的CA服务是Fabric CA,但是组织可以选择使用外部的CA服务。

Fabric网络模型中包含两种MSP。

(1)本地MSP:管理用户、客户端和节点(Peer节点和排序节点)的身份与权限。每个节点和客户端都有一个本地MSP,它定义了谁拥有管理或访问自身的权限。

(2)通道MSP:定义通道级别的管理权限。Fabric网络中的不同成员可以组成一个通道(channel),每个通道都有一个独立的区块链。这样多个组织就可以共同使用一个区块链网络,分别维护不同的区块链。只有通道的成员才能看到通道中其他成员的交易。也就是说,通道相当于网络的分区,目的是确保只有相关参与方才能看到相关交易。

关于MSP的具体情况将在第4章介绍。

2.客户端

客户端应用可以通过Fabric SDK与区块链网络通信,并发起交易提案。Fabric SDK可以提供读/写区块链中数据的功能。每个客户端都有CA 颁发的证书。本书第10章将介绍使用Go语言开发客户端应用的方法。

3.Peer节点

节点仅指某项逻辑功能,而不是网络中的物理设备。多个不同类型的节点可以运行在同一个物理服务器上。除了Peer节点,Fabric网络中还包含排序节点。

Peer 节点是用于记账并维护世界状态数据和账本副本的节点,负责接收经过排序服务排序的、以区块形式打包存储的状态更新数据,并维护账本和状态数据。排序服务负责在交易被记账到区块链和状态数据库之前对交易进行排序。交易必须进行排序,因为这样才能确保交易在被写入网络时对世界状态的更新是有效的,也就是说,确保状态数据库中的数据是最新交易产生的。可以这样理解,账本中记录的是交易的明细数据,状态数据库中存储的是最新的交易结果。关于Fabric区块链的数据存储结构将在第6章中介绍。

Peer节点还有一个特殊的背书角色,即在记账之前对交易进行背书。

Fabric网络中包含背书节点、记账节点、锚节点和领导节点这4种类型的Peer节点,具体说明如下。

(1)背书节点。背书节点是一种具有背书交易角色的特殊的记账节点,可以对来自客户端的交易请求进行背书。每个背书节点都负责处理一个安装好的智能合约和一个账本,它的主要功能是模拟交易。背书基于智能合约和账本的本地副本运行,运行过程中会生成读/写集,然后会将读/写集发送至提交交易提案的客户端。在模拟交易的过程中,交易并不会被写入账本中。模拟交易的目的是对交易进行验证。交易的完整流程将在2.1.3小节介绍。

智能合约是运行于区块链平台的程序。客户端应用可以通过接口层调用智能合约,与Fabric网络进行交互。关于智能合约开发的具体情况将在第9章介绍。

(2)记账节点。记账节点负责将从排序服务接收到的交易数据写入区块,并将区块追加到自己维护的区块链副本中。区块中包含一个交易列表,记账节点会对列表中的每个交易进行验证,并标记有效或无效,然后将其写入区块。无论有效交易还是无效交易都会被写入区块链中,以备将来审计时使用。

(3)锚节点。因为Fabric网络可能由多个组织构成,所以需要一些Peer节点进行跨组织通信。并不是所有Peer节点都可以跨组织通信,只有经过授权的特殊Peer节点才可以做到这一点,这些特殊Peer节点就是锚节点。锚节点在通道配置中定义。

(4)领导节点。领导节点负责将排序服务发送来的消息传送给同一组织中的其他 Peer节点。领导节点使用Gossip协议确保组织内的每个Peer节点都可以收到消息,但是它不能跨组织通信。如果领导节点掉线,则组织可以通过投票或随机产生等方式从在线活动的Peer节点中再选择一个作为领导节点。

4.排序节点

排序节点是运行排序服务的节点。关于排序服务的概念将在2.1.3小节介绍。

比特币由矿工在挖矿时根据交易费的金额选择记账的顺序,愿意支付更高手续费的交易会被优先记账。而Fabric区块链则采用不同的策略,它允许组织自行选择最合适的排序机制。这种策略使Fabric区块链更适合企业用户。

Fabric区块链支持SOLO、Kafka和Raft这3种排序机制。关于Fabric区块链的共识算法将在5.3.1小节介绍。

2.1.2 Fabric区块链平台的体系结构

Fabric区块链平台的体系结构

Fabric区块链平台的体系结构如图2-1所示。

图2-1 Fabric区块链平台的体系结构

Fabric区块链平台分为接口层、应用层和服务层3个层次。

1.接口层

接口层负责为客户端应用提供与Fabric网络进行交互的渠道,包括API、SDK和CLI,具体说明如下。

● API(Application Program Interface,应用程序接口)是Fabric区块链提供的对区块链网络进行访问和操作的接口。可以在客户端应用中调用API与网络进行交互。

● SDK(Software Development Kit,软件开发工具包)是Fabric区块链提供的开发包,客户端应用可以利用SDK与智能合约进行交互。

● CLI(Command Line Interface,命令行界面)是一个命令行客户端工具,用户可以通过命令行访问 Fabric 网络。开发者可以通过 CLI 快速测试链码,或者查询交易状态。智能合约经过打包就是链码。

2.应用层

应用层位于接口层和服务层之间,包括身份管理、账本管理、交易管理和智能合约4个模块。

(1)身份管理

身份管理模块负责对Fabric网络中的成员进行身份管理,颁发数字证书,并提供身份验证服务。

加入Fabric网络的组织也被称为“成员”。Fabric区块链属于联盟链。与比特币、以太坊等公有链不同,并不是任何人都可以随意加入Fabric网络。在大多数情况下,由多个组织组合在一起构成一个联盟,形成一个区块链网络。在对网络进行初始化时,联盟会制定一组安全策略。这组安全策略决定了每个组织的权限。

策略是由属性的数字标识符组成的表达式。例如,OR('Org1.peer', 'Org2.peer')表示组织Org1的任意Peer节点或者组织Org2的任意Peer节点。策略用于限制对区块链上的资源进行访问。例如,可以在策略中定义谁可以在指定的通道上进行读/写操作,谁可以调用指定的链码API。在搭建排序服务和通道之前,可以在配置文件configtx.yaml中定义策略。当在通道中初始化链码时,也可以指定策略配置文件。

configtx.yaml 中包含一组默认的示例策略,这组示例策略适用于大多数网络。关于Fabric网络的策略定义规则将在第4章介绍。

区块链网络的创建者可以邀请组织加入网络,加入的具体方式是将组织的MSP加入网络。MSP定义网络的其他成员如何验证交易中签名的有效性。可以使用组织的数字证书来生成签名,生成后由组织发布。在MSP中,一个组织的标识所拥有的访问权限由策略来管理。策略由加入网络的组织共同制定。

组织可以是一个跨国公司,也可以是一个人。在Fabric区块链的网络拓扑中使用三角形表示一个组织,如图2-2所示。

联盟是区块链网络中排名不分先后的组织的集合。这些组织共同组建了通道,通道是允许数据隔离和保密的私有区块链实现。指定了通道的账本,可以在通道中的Peer节点间共享数据。交易各方必须通过身份验证才能与通道进行交互。通道在配置文件configtx.yaml中被定义。

在Fabric区块链的网络拓扑中使用椭圆表示一个通道,如图2-3所示。通道C连接应用程序A1、Peer节点P2和排序节点O1。

图2-2 使用三角形表示一个组织

图2-3 使用椭圆表示一个通道

尽管一个网络可以有多个联盟,但是大多数网络中都只有一个联盟。在创建通道时,所有加入通道的组织必须是联盟的成员。但是通道创建后,不是联盟成员的组织也可以加入其中。

排序服务是指事先定义好的一组节点,用于对交易进行排序,并写入区块,然后将区块发布至相关Peer节点进行验证和记账。

排序服务独立于Peer节点,按照先到先服务的原则对网络中的所有通道提供服务。

排序服务集成Kafka消息队列和Raft共识算法,具体情况将在第5章介绍。

(2)账本管理

账本负责存储网络中的交易数据。Fabric 区块链中的数据存储结构由区块链、状态数据库、区块索引和历史索引组成。

● 区块链中的数据保存在区块中,不可篡改,并且按交易发生的顺序存储。

● 状态数据库中保存着账本数据的当前缓存值。

● 区块索引和历史索引分别保存当前和历史的区块索引,以便可以在账本数据中快速定位交易数据。

在比特币和其他很多区块链网络中,区块一旦被加入链中,其内容就不允许被修改了。但是Fabric网络的状态数据库内容是可以修改的。状态数据库中以键值对的形式记录账本的最新数据,因此其内容是经常变化的。通道中的每个 Peer节点都会维护其自己的账本副本,并会通过一个名为Consensus的进程与其他Peer节点同步账本的内容。关于Fabric区块链的账本存储方式将在6.1节具体介绍。在Fabric区块链的网络拓扑中,账本的表现形式如图2-4所示。

图2-4 账本的表现形式

每个通道只有一个账本,通道中的每个Peer节点都会维护一个该通道的账本副本。

(3)交易管理

交易是指资产在网络成员之间转移的操作。资产是区块链管理的对象,它可以是有形的(比如房地产或硬件设备),也可以是无形的(比如智能合约或知识产权)。在Fabric区块链中使用一组键值对表示资产(可以是二进制格式或JSON格式的),并且可以通过交易修改资产。

(4)智能合约

智能合约是指部署于区块链网络上的程序,可以存取状态数据库中的数据。

3.服务层

服务层中包括成员服务、区块链服务、链码服务和事件流,具体说明如下。

(1)成员服务

成员服务用于管理用户ID,并对网络的所有参与者进行身份验证,可以通过ACL(Access Control List,访问控制列表)对用户的特定网络操作授权进行管理和控制。关于成员服务的具体情况将在第4章中介绍。

(2)区块链服务

区块链服务用于管理Fabric网络中的数据存储和交易,在交易过程中负责节点间的共识管理,维护一个分布式账本。账本存储在Peer节点中,Peer节点间通过P2P网络传输协议进行通信。

Fabric网络的共识机制由以下几个阶段组成。

● 客户端向背书节点提交交易提案。

● 背书节点对交易的有效性进行检查,通过检查后进行背书签名。

● 背书节点把经过背书签名后的交易发送回客户端,客户端收集到足够数量的背书签名后把包含背书签名的交易广播给排序节点。

● 排序服务对交易进行排序并产生区块。

● 排序服务将排序后的区块广播给记账节点,记账节点对所有的交易和背书信息进行验证,通过验证后把区块写入账本中。

(3)链码服务

链码是经过打包的智能合约;链码服务用于管理Fabric网络中的智能合约,包括智能合约的编码、部署和调用等。

链码可以部署于区块链网络中。客户端应用可以通过调用链码来与状态数据库进行交互。链码可以通过多种编程语言实现,例如Go、Node.js和Java等。

多个智能合约可以放在一个链码中。当链码被部署后,其中的所有智能合约都可以被客户端应用调用。此时智能合约是一个与特定商业过程相关的、有域名的程序,而链码则是一组相关智能合约的容器。每个链码都有自己的背书策略,该策略应用于链码中定义的所有智能合约。背书策略中会指定哪个组织必须对智能合约生成的交易进行签名,从而证明该交易是有效的。

智能合约可以调用通道内的其他智能合约,也可以跨通道调用智能合约。

(4)事件流

事件流是Fabric网络中各组件的通信机制,可以在应用程序、Peer节点、排序服务和智能合约间传递消息。所谓事件流是指事件在各组件之间流转、传递的机制。由于篇幅所限,本书不对事件流展开介绍。

2.1.3 排序服务与交易的流程

排序服务与交易的流程

在Fabric网络中,交易是各成员间资产转移和管理的记录,是区块链中保存的数据。本小节介绍Fabric网络的交易流程。在交易的流程中,排序服务发挥着重要的作用,它决定了交易被记录到区块中的顺序。

1.什么是排序

在比特币、以太坊等公有链中,任何节点都可以不经授权就参与共识的过程,也就是所谓的挖矿。在形成共识的过程中,交易被排序并打包到区块中。正因如此,这些公有链都依赖具有概率性的共识算法(不确定由谁记账,也不确定记账交易的顺序)。最终共识算法保障了账本在很大概率上一致。这可能会造成账本的分叉,因为从网络中不同参与者的视角来看,交易的顺序各不相同。

Fabric区块链的工作原理与前文提到的公有链的工作原理不同,它设置了一种特殊的节点,即排序节点,专门负责对交易进行排序。多个排序节点构成排序服务。因为Fabric区块链采用确定的共识算法,到达记账节点的区块顺序是一致的,而且交易内容经过多次验证,所以不可能存在互相冲突的交易,比如一笔钱被使用两次。这样就保证了区块链不可能出现分叉。

为了提升效率,Fabric区块链将背书操作从排序过程中分离出来,由Peer节点完成。这就优化了自身性能、提高了可扩展性。

2.排序节点和通道配置

除了负责排序,排序节点还负责维护一个可以创建通道的组织的列表,这些组织构成联盟,联盟信息保存在系统通道的配置中。关于系统通道将在第5章具体介绍。默认情况下,系统通道的配置数据只能由其所在的排序节点的管理员编辑。

排序节点还可以增强对通道的基本访问控制,例如约束哪些组织的哪些用户可以读/写通道上的数据。当创建联盟或通道时,管理员设置的策略中定义了谁有权限更新通道的配置数据。

更新通道配置的交易由排序节点处理,以确认交易的发起者是否拥有指定的管理员权限。如果有,则排序节点会根据当前的配置数据验证配置更新请求,生成一个新的配置交易,并将配置更新请求打包到一个区块中,然后将该区块发送至通道中的所有Peer节点。Peer 节点对经过排序节点授权的交易数据(其中包含对通道配置的修改)进行验证,确认对配置的修改符合通道定义的策略。通过验证后对通道配置的修改将被写入区块链中。

3.身份标识

与Fabric区块链的所有组件(包括Peer节点、应用程序、管理员和排序节点)进行交互都需要组件所属组织的身份标识,身份标识由数字证书和组织的MSP所定义。

与Peer节点一样,排序节点也属于一个组织。同样,每个独立的CA也应该只为一个组织服务。可以选择使用一个单独的CA,也可以部署一个根CA,然后设置中间CA,这取决于每个组织的选择。

4.基本交易流程

Fabric网络可以为应用程序提供账本和智能合约(链码)服务。智能合约用于生成交易,交易会被顺序地派发至网络中的每个节点,然后会被永久地记录在节点上的账本副本中。应用程序的用户可以是客户端应用的用户,也可以是区块链网络的管理员。

账本存储在 Peer 节点上,可以在应用程序中通过智能合约访问账本数据,如图2-5所示。

图2-5 应用程序访问账本数据的流程

向账本中写入数据实际上是一个交易。交易的基本流程分为图2-6所示的3个阶段。这3个阶段的目的是确保区块链网络中所有Peer节点上的账本保持一致。

图2-6 Fabric网络中交易的基本流程

图2-7描述了更详细的交易流程。

图2-7 更详细的交易流程

(1)提案/背书

在提案/背书阶段,客户端应用会发送一个交易提案到一组Peer节点,Peer节点会调用智能合约发起一个更新账本的申请,然后对结果进行背书。此时,背书Peer节点不会将更新提案应用到自己的账本副本中,而是会将背书的结果返回至客户端应用。背书结果中包含背书节点的签名和对应的带有版本号的交易数据读/写集。

客户端应用如果收集了策略中规定的足够数量的背书,则将交易发送至排序服务。

(2)排序/打包

在交易的第2阶段,排序服务会通过共识协议对交易进行排序。在Fabric网络中,共识协议是可插拔的,即可以从多个配置好的共识协议中选择使用其中的一个,并且可以动态增加共识协议。

排序服务从不同的客户端接收交易,并按通道对它们进行排序。排序服务不需要查看交易的内容,也不会执行交易的操作。排序服务可以为每个通道的交易创建区块,将交易打包到区块,并使用自己的数字证书为区块签名,然后利用Gossip协议将签名后的区块向所有Peer节点广播。

(3)验证/记账

根据应用程序在提交交易到账本之前指定的背书策略对交易进行验证。应用程序指定的背书策略中包括需要哪个Peer节点或需要多少个Peer节点对给定智能合约的正确执行提供担保。每个交易都需要经过背书策略中指定数量的Peer节点进行背书。如果要求多个Peer节点对交易进行背书,则并发执行背书可以提高系统的性能。

所有的Peer节点都会从排序服务接收到经过排序的区块。Peer节点会验证排序服务对区块的签名,然后对读集合中的数据进行验证,以判断交易是否有效。每个有效的区块都会被写入区块链账本中。区块中每个交易中的写集合都会被更新到状态数据库中。

5.完整的交易流程

下面以一个由多组织构成的Fabric网络为示例演示完整的交易流程。示例网络的拓扑如图2-8所示。

图2-8中使用的图例如表2-1所示。

示例网络中包含3个组织,分别是Org1、Org2和Org3。Org1提供5个Peer节点,Org2提供4个Peer节点和1个排序节点,Org3提供3个Peer节点和1个排序节点。

这些组织共同组成一个通道。任何组织发起的交易都会通过通道传送给所有3个组织。通道中包含一个智能合约的实例和通道策略。通道策略在配置文件configtx.yaml中定义,在创建通道时指定其内容。默认情况下,每个Peer节点都有一个记账者角色(记账节点),在图2-8中用三角形图标表示。Peer节点可以有多个角色,比如可以是背书节点、领导节点和锚节点。每个节点上都保存着一个账本的副本,其中包括区块链和状态数据库。背书节点上都安装了智能合约,以便对交易进行确认。

图2-8 示例网络的拓扑

表2-1 图2-8中使用的图例

每个组织都有自己的CA。Fabric网络采用模块化设计,每个组织都可以选择使用任何CA产品。在本例中Org1和Org2使用Fabric CA,而Org3使用Comodo CA。

Fabric网络中交易的完整流程如图2-9所示。

图2-9 Fabric网络中交易的完整流程

整个交易过程可以分为以下6个步骤。

(1)客户端初始化交易

在Fabric网络中交易由客户端应用发起,发起交易的方式是向背书节点发送交易提案。提案是向通道上指定的Peer节点提出的背书请求。提案可以是初始化(init)请求,也可以是读/写请求。

可以使用 Fabric SDK 构造交易提案。交易提案的作用是请求调用一个链码,以便读/写账本。Fabric SDK是一个将请求绑定到对应程序包的进程。SDK持有客户端的数字证书,因此为客户端所接受,可以代表客户端对其发起的交易提案进行签名,然后向选择的背书节点发送请求。

在发送交易提案到背书节点前,客户端SDK需要知道网络中所有背书节点的列表。在图2-8中有5个背书节点,分别是P12、P14、P22、P24和P32。背书节点在配置文件configtx. yaml中定义,configtx.yaml中保存着前文提到的背书策略。

每个背书节点上都安装了一个链码,还存储着一个账本副本。所有Peer节点上的账本副本都保持同步。

(2)背书节点验证签名并执行交易

背书是指定Peer节点执行链码交易并对客户端应用的交易提案返回一个“提案响应”的处理过程。提案响应中包括执行链码的响应信息、结果(读集合和写集合)、事件,以及作为Peer节点执行链码证据的数字签名。

链码应用程序应符合背书策略。背书策略可以指定如下配置信息。

● 背书节点:指通道中必须执行特定交易的 Peer 节点。这些特定交易都与特定链码应用程序绑定在一起。

● 交易被接受的前提条件:比如要求交易得到最少数量背书节点的背书、最小百分比背书节点的背书或分配给特定链码应用程序的所有背书节点的背书。

有些背书节点可能已经离线了,其余的背书节点在收到交易提案后,会按照事先定义好的步骤对交易进行验证,具体如下。

● 交易提案消息是否符合要求。

● 交易提案之前有没有被记账过。

● 签名是否有效。

● 提交交易提案的客户端是否有权限在当前通道上执行交易。

背书节点会以交易提案作为参数调用链码的函数,链码会基于数据库的当前状态执行模拟交易,并得到交易的结果。交易结果包括链码的响应值和交易的读/写集。读/写集中包含模拟交易时从当前状态数据库中读取的数据,以及执行交易时向状态数据库中写入的数据。此步骤中并不实际更新账本,读/写集和背书节点的签名将作为提案响应返回SDK。

(3)检查提案响应

客户端应用在收到所有背书节点的响应后,对背书响应列表进行验证,检查其是否满足背书策略的规则。不同的通道拥有不同的背书策略。

客户端应用会对背书节点的签名进行有效性校验。如果链码只希望查询账本,则客户端应用将检查查询响应,而不会将交易提交至排序服务。在交易发送至排序服务之前,客户端应用会检查提案响应以确保满足指定的背书策略的规则。

(4)客户端将背书信息集成到交易中

背书响应通过验证后,客户端应用会将其发送到合适的排序服务。背书信息最终会出现在区块中。在图2-8所示的示例网络中由组织Org2和Org3提供的两个排序节点组成排序服务。在生产网络中,通常会启动多个排序节点,以防出现故障影响网络的正常运行。

SDK会将交易提案和背书响应都封装到交易信息中,然后将其发送至排序服务。发送至排序服务的交易信息中包含以下信息。

● 模拟交易时产生的读/写集。

● 背书节点的签名。

● 通道ID。

排序服务并不会对交易信息中的所有信息进行检查,而只会从网络的所有通道中接收所有交易,然后按时间对它们进行排序,为每个通道创建一个区块,用于存储该通道的交易。

对交易的排序在网络范围内进行,不同应用程序的交易背书和提交的读/写集会同时被排序。

排序服务由一组排序节点组成,它并不对交易和智能合约进行处理,也不维护共享账本。排序服务接收经过背书的交易,并为这些交易指定一个记账节点,由记账节点将这些交易写入账本中。

(5)验证交易

当区块被经过排序的交易填满后,它会被发送至网络中的领导节点。理想状态下,Fabric网络中应该有一个领导节点,但是这并不是强制要求。如果没有领导节点,则排序节点需要逐一确认此区块已经被传送至所有的记账节点,这样做会增加网络的负载。为了避免这种情况,联盟中的每个组织都会提名自己的领导节点。每个组织可以有多个领导节点,以防止出现故障。有的组织如果只有一个领导节点,而且该领导节点没有对请求做出响应,则会在活动的Peer节点中启动一个投票机制,选举新的领导节点。

借助通道,所有的排序节点都可以得到通道中的领导节点列表。排序节点会将准备好的区块发送至所有活动的领导节点。

领导节点会将区块发送给同一组织内的其他记账节点。区块会通过Gossip协议而被传送至通道中的所有Peer节点。区块中的交易会被验证以确认如下事项。

● 满足背书策略的规则。

● 从交易执行生成读集合后,读集合中的变量与账本状态相比并没有发生变化。

根据验证的结果,区块中的交易会被标记为有效或无效。

(6)更新账本

Peer节点会根据链码的策略检查背书是否有效,同时要对读/写集进行检查,判断其是否与世界状态数据一致;特别是当背书节点模拟交易时,需要判断已经存在的读数据是否与世界状态数据一致。

当记账节点完成验证交易后,交易将会被写入账本中(也就是将区块追加到区块链中),并使用读/写集中的写数据更新状态数据库。

每个Peer节点均可与多个通道相关联。因此,在Fabric网络中可以存在多个区块链。

最后,每个记账节点都会将交易记账的结果异步通知到发起交易的客户端应用。

6.交易模拟和读/写集

在对交易进行背书时,有一个模拟交易的过程。在此过程中会生成交易的读/写集。读集合中包含一组唯一的关键字和它们的版本(注意不是由键和键的值数据所组成的键值对,而是由键和版本号组成的数据),以记录模拟过程中所读取的数据;写集合中包含一组唯一的关键字及它们的新值,新值就是在交易过程中写入区块链的值。如果交易删除某个关键字,则在写集合里该关键字会被记录一个删除标记。

如果在模拟交易的过程中多次修改一个关键字的值,则写集合里只保留最后一次写入的值。

关键字的版本号只在读集合中记录,写集合中只保存关键字及其最新值,并不包含版本号。版本号的最低要求是可用于标识关键字的不重复的标识符,可以通过以下两种方式实现版本号。

● 使用自增数字作为版本号。

● 基于区块链的高度生成版本号。

下面是一个读/写集的示例。

<TxReadWriteSet>
    <NsReadWriteSet name="chaincode1">
      <read-set>
        <read key="K1", version="1">
        <read key="K2", version="1">
      </read-set>
      <write-set>
        <write key="K1", value="V1">
        <write key="K3", value="V2">
        <write key="K4", isDelete="true">
      </write-set>
    </NsReadWriteSet>
<TxReadWriteSet>

读集合中包含K1和K2两个关键字;写集合中包含3个关键字,即K1、K3和K4。

记账节点会利用读集合检查交易的有效性,利用写集合更新相关关键字的版本号和值。由于篇幅所限,这里不展开介绍使用读/写集进行交易有效性校验和记账的过程。 ky6awzZ6nXFeZixUJxwIa77xWWSrNlOmzppys6QmoqyiW2/Hl3AMN95SUagMlqzA

点击中间区域
呼出菜单
上一章
目录
下一章
×