Hyperledger Fabric 二三事 - 账本
账本
引言
账本是 Fabirc 中所有状态转换的有序的防篡改的记录。状态转换是参与方提交的链码调用(“交易”)的结果。每个交易都会生成一组资产键值对,这些键值对以创建、更新或删除形式提交到账本。
账本由区块链(“链”)组成,用于以区块的形式存储不可变的顺序记录,以及用于维护当前 Fabirc 状态的状态数据库。每个通道有一个账本。每个节点为其所属的每个通道维护一个账本的副本。也就是说每个通道都有一个链。
Fabric 账本的一些特点:
- 使用基于键的查找、范围查询和组合键查询来查询和更新账本
- 使用富查询语言进行只读查询(如果使用 CouchDB 作为状态数据库)
- 只读历史记录查询(查询一个键的账本历史记录)用于支持数据溯源场景
- 交易:
- 包括链码读取键/值(读集)的版本以及链码写入键/值(写集)的版本
- 包含每个背书节点的签名,并被提交给排序服务
- 按顺序打包到区块,并被排序服务“分发”到通道上的节点
- 节点根据背书策略验证交易并执行策略
- 在附加一个区块之前,会执行一次版本检查,以确保被读取的资产的状态自链码执行以来未发生更改
- 一旦交易被验证并提交,就具有不变性
- 一个通道的账本包含一个配置区块,用于定义策略、访问控制列表和其他相关信息
链
每条链都是一个事务日志,其结构为通过hash链接的区块,其中每个区块包含N个事务。区块头包括区块事务的hash值,以及前一个区块的区块头hash值。这样,分类账上的所有交易都被排序,并以加密方式链接在一起。换言之,在不破坏hash链接的情况下,不可能篡改账本数据。最新区块的hash表示以前的每个事务,从而可以确保所有对等节点都处于一致和受信任的状态。 区块链存储在peer节点的文件系统(本地或附加存储)上,有效地支持区块链工作量的仅可增加的性质
状态数据库
帐本的最新状态数据表示区块链事务日志中包含的所有键值对的最新值。由于最新状态数据表示通道已知的所有最新键值,它有时被称为世界状态。
调用链码时根据当前状态数据来执行事务。为了使这些链码交互非常有效,所有键的最新值都存储在状态数据库中。状态数据库只是链事务日志中的索引视图,因此可以随时从链中重新生成。在接受事务之前,状态数据库将在对等节点启动时自动恢复(或在需要时生成)。
状态数据库选项包括LevelDB和CouchDB。LevelDB是嵌入在peer进程中的默认状态数据库,并将链码数据存储为键值对。CouchDB是一个可选的外部状态数据库,它在链码数据建模为JSON时提供附加查询支持,允许对JSON内容进行丰富的查询
事务流程
- 应用程序的客户端发送交易提案给特定的背书peer节点
- 背书peer节点验证交易提案的交易签名,并执行链码中的函数来模拟交易,输出链码执行结果
- 携带着背书签名发送回客户端
- 客户端将背书签名组装到交易内容中,并将其广播到排序节点
- 排序节点将这些交易打包为区块,提交给通道上的所有peer节点。
- 在提交之前,peer节点将验证交易。首先,他们将检查背书策略,以确保指定peer节点已对结果进行签名,并且根据交易内容验证签名。然后,peer节点将对交易读集执行版本控制检查,以确保数据完整性并防止双花等威胁。(如果读取的数据已被另一个交易更改,则区块中的交易将标记为无效,并且不应用于账本的状态数据库。客户端应用程序将收到警报,并可以根据需要处理错误或重试。)

浙公网安备 33010602011771号