(由于时间问题,本文内容尚未完善,后期将持续更新~)
在阅读学习Hyperledger fabric v1.4 官方文档的过程中,写下该文章用于记录自己的所得所获。
本文以官方文档为依据,主要进行翻译以及用自己的理解进行相关内容表述的工作。
在Hyperledger Fabric中,Ledger(账本) 由两部分组成,world state (世界状态)和 blockchain(区块链)。
世界状态,即一个数据库,它缓存了一组账本状态的当前值。世界状态使得一个程序无需遍历整个交易日志进行当前值的计算,而是能够直接进行访问。默认情况下,账本状态将由 键-值对 进行表示。Hyperledger fabric为世界状态的管理提供了相当的灵活性,世界状态也将因状态的创建、更新和删除而发生频繁变化。
区块链,即一个交易日志,它记录了所有导致当前世界状态变化的更改。交易是以块的形式进行收集,这些块将会附加到区块链。
区块链数据结构与世界状态非常不同,前者一旦被写入就不能够进行修改--即是不可变的。
账本由区块链和世界状态组成,而世界状态是由区块链来确定的。换句话说,世界状态是由区块链派生而来。
将Hyperledger fabric网络视作一个逻辑账本将会是有帮助的。事实上,这个网络维护了一个账本的多个副本,这些副本通过共识过程保持一致。因此,上面所述账本通常会与分布式账本技术(DLT)联系在一起,而前者在逻辑上是单一的,虽然其在网络中分布着许多内容一致的副本。
世界状态将业务对象属性的当前值作为唯一的账本状态进行保存。这样做,可以使得我们能够直接从世界状态获取当前值,而不必过于繁琐的去遍历整个区块链来进行当前值的计算。
如图所示,一个账本的世界状态包含了两个状态。第一个状态的 key=CAR1,value=Audi。第二个状态拥有较为复杂的value,key=CAR2,value={model:BMW, color=red,owner=Jane}。这两个状态的版本均为 version 0。
账本状态记录了一组有关特定对象的事实。在上述这个例子中,展示了CAR1和CAR2这两辆车的账本状态,它们各自含有一副键值对。一个应用程序可以调用一个智能合约,通过使用简单的账本APIs来获取、写入和删除状态。注意,状态值可以是简单的Audi也可以是复合的BMW类型。通常情况下,可以通过查询世界状态来检索具有特定属性的对象,例如:查找所有红色的宝马(BMW with red color)。
世界状态被实现为一个数据库,以便为状态的有效存储和检索提供丰富的操作符集。
应用程序将捕获更改的交易提交到世界状态,这些交易最终将会被提交到总账区块链。应用将通过Hyperledger Fabric SDK 与共识机制隔离开来。应用仅需要调用智能合约就会得到交易被包含在区块链中的通知(无论该交易是否有效)。最关键的设计要点在于仅有满足要求的一组 认可组织 签名的交易才会导致世界状态的更新。
图中所示,状态CAR1和CAR2是在它们的开始版本 version0。这个版本号将会随着状态的每次变化递增。每当状态更新时,都会进行版本的检查,以此确保当前状态与签名背书时的版本相匹配。这就确保了世界状态会按照预期发生变化,而不存在并发的更新。
当首次创建一个账本时,世界状态是空的,因为代表对世界状态有效更改的任何事务都被记录在区块链上,这就意味着世界状态可以在任何时候从区块链重新生成。世界状态的生成非常方便,例如,在创建一个peer时,世界状态会自动生成。此外,如果peer异常,在peer重启时,交易被接受前,世界状态可重新生成。
区块链记录着事务对象是如何达到当前状态过程,记录着每个账本状态的先前版本以及是如何改变的。
区块链是由互连块的序列日志构成,其中每个块包含一组交易,每个交易代表一次对世界状态的查询或更新。
事务排序机制重要在于块排序以及块内事务排序,它是在被称为排序服务的Hyperledger Fabric首次创建时建立的。