在Hyperledger Fabric中,读写集(Read-Write Set, R/W Set) 是智能合约(链码)执行期间生成的一个关键数据结构,包含了事务执行过程中对账本状态的读取和写入操作。理解读写集是理解Fabric事务处理流程的核心之一。以下是对读写集的详细介绍:
1. 读写集的基本概念
- 读集(Read Set):读集包含了链码在执行期间读取的账本状态。每一条读取操作都会记录键的状态,包括键的名称和对应的版本号。版本号表示的是该键在账本中最后一次被修改的版本。
- 写集(Write Set):写集包含了链码执行期间对账本状态的写操作。每一条写操作记录了键的名称和将要写入的值,但不包含版本号。
2. 读写集的生成过程
读写集是在链码执行阶段生成的,具体流程如下:
- 链码执行:客户端向Fabric网络提交一个包含输入参数的提案交易。Peer节点会根据这个提案来执行链码。链码执行的结果包括一个读写集。
- 读操作:链码执行过程中,如果需要读取账本中的某个状态,Peer会将这个读取操作记录到读集中。每次读取时,系统会将当前读取的键及其版本号记录下来。
- 写操作:链码可以修改某个键的值或新增一个键值对,这些修改会被记录在写集中。写集仅记录键和新的值,不记录版本号。
- 生成读写集:链码执行完成后,读集和写集会合并成一个完整的读写集,并作为提案结果返回给客户端。
3. 读写集的作用
- 一致性验证:在Fabric网络中,多个Peer节点可以同时执行相同的提案交易。每个Peer节点独立地生成自己的读写集。提案交易被提交到Orderer之后,会将交易的读写集分发给所有的Peer节点。Peer节点在提交交易前,会对读写集进行一致性验证,确保所有读取的键自生成读集以来没有被其他事务修改(即版本号未变)。如果验证失败,交易将被拒绝提交。
- 状态更新:在通过一致性验证后,写集中的修改将被应用到账本中,更新账本状态。
4. 读写集的结构
读写集的结构主要包括以下几个部分:
- Namespace:在Fabric中,链码的数据是以命名空间(Namespace)为单位组织的。每个链码对应一个命名空间。在读写集中,数据是按命名空间来组织的,表示读写集属于哪个链码。
- 读集(Read Set):
- 键(Key):账本中被读取的状态键。
- 版本号(Version):该键被读取时的账本状态版本。
- 写集(Write Set):
- 键(Key):被修改或新增的状态键。
- 值(Value):要写入账本的新值。
5. 读写集的应用场景
- 事务并发控制:通过版本号检测来确保并发执行的事务不会导致数据不一致,这是Fabric中的一种乐观并发控制机制。
- 事务回滚:如果在事务提交前,检测到读写集的一致性验证失败,可以通过读写集来回滚链码执行对状态的修改。
6. 示例
假设链码需要读取账本中两个键“Key1”和“Key2”,并且需要更新“Key1”的值。
- 读集:
- 键1(Key1):版本号为v1
- 键2(Key2):版本号为v2
- 写集:
- 键1(Key1):新值为Value1
在一致性验证过程中,系统将检查“Key1”和“Key2”的版本号。如果自链码执行以来,这两个键的版本号没有改变(即依然是v1和v2),那么这个事务就可以提交,写集中的新值Value1将被写入账本。否则,事务将被拒绝。
总结
Hyperledger Fabric中的读写集是用于事务执行期间记录账本状态变更的关键数据结构。它不仅记录了链码对账本状态的读写操作,还在事务一致性验证中起到了核心作用,确保Fabric网络中的数据一致性和并发安全。理解读写集对深入了解Fabric的事务处理机制至关重要。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特