HyperLeger织物开发(五)——HyperLeger织物账本存储
一、HyperLeger织物账本简介
布里的数据以分布式账本的形式存储。账本由一系列有顺序和防篡改的记录组成,记录包含着数据的全部状态改变。账本中的数据项以键值对的形式存放,账本中所有的键值对构成了账本的状态,也称为世界状态(世界国家)。
每个通道中有唯一的账本,由通道中所有成员共同维护着账本,每个记账节点上都保存了所属通道的账本的一个副本,因而是分布式账本。对账本的访问需要通过链码实现对账本键值对的增加,删除,更新和查询等的操作。
账本由区块链和状态数据库两部分组成。
区块链是一组不可更改的有序的区块(数据块),记录着全部交易的日志。每个区块中包含若干个交易的数据,不同区块所包含的交易数量可以不同。区块之间用哈希链(Hashed-link)关联:每个区块头包含该区块所有交易的哈希值以及上一个区块头的哈希值。链式结构可以确保每个区块的数据不可更改以及每个区块之间的顺序关系不可更改,因此,区块链的区块只可以添加在链的尾部。
状态数据库记录了账本中所有键值对的当前值,相当于对当前账本的交易日志做了索引。链码执行交易的时候需要读取账本的当前状态,从状态数据库可以迅速获取键值的最新状态。
如果没有状态数据库,要获得某个键值时,需要遍历整个区块链中和该键值相关的交易,效率非常低,因此,读取状态数据库可以认为是快速定位和访问某个键值的方法。另外,当状态数据库出现故障的时候,可以通过遍历账本重新生成。
当一个区块附加到区块链尾部的时候,如果区块中的有效交易修改了键值对,则会在状态数据库中作相应的更新,确保区块链和状态数据库始终保持一致。
区块链的数据块以文件形式保存在各个节点中。状态数据库可以是各种键值数据库,织物缺省使用,并且也支持CouchDB的选项.CouchDB除了支持键值数据外,也支持JSON格式的文档模型,能够做复杂的查询。
二,HyperLeger织物交易流程
1,客户端向背书节点发送交易提案请求
客户端首先构建交易提案,交易提案的作用是调用通道中的链码来读取或者写入账本的数据。客户端使用织物SDK创建交易提案,并使用用户的私钥对交易提案进行签名。
织物SDK作用有两个,一个是将交易提案封装成符合gRPC协议的Protobuf格式的消息,一个是对创建的交易提案进行签名。
客户端打包完交易提案后,将交易提案提交给通道中的背书节点。背书节点的背书策略定义了哪些背书节点签名背书后交易才能有效,客户端根据背书策略选择相应的背书节点,并向相应背书节点提交交易提案。
HyperLeger织物开发(五)——HyperLeger织物账本存储