HyperLeger织物开发(五)——HyperLeger织物账本存储

  

HyperLeger织物开发(五)——HyperLeger织物账本存储

  

一、HyperLeger织物账本简介

  

布里的数据以分布式账本的形式存储。账本由一系列有顺序和防篡改的记录组成,记录包含着数据的全部状态改变。账本中的数据项以键值对的形式存放,账本中所有的键值对构成了账本的状态,也称为世界状态(世界国家)。
每个通道中有唯一的账本,由通道中所有成员共同维护着账本,每个记账节点上都保存了所属通道的账本的一个副本,因而是分布式账本。对账本的访问需要通过链码实现对账本键值对的增加,删除,更新和查询等的操作。
账本由区块链和状态数据库两部分组成。
区块链是一组不可更改的有序的区块(数据块),记录着全部交易的日志。每个区块中包含若干个交易的数据,不同区块所包含的交易数量可以不同。区块之间用哈希链(Hashed-link)关联:每个区块头包含该区块所有交易的哈希值以及上一个区块头的哈希值。链式结构可以确保每个区块的数据不可更改以及每个区块之间的顺序关系不可更改,因此,区块链的区块只可以添加在链的尾部。
状态数据库记录了账本中所有键值对的当前值,相当于对当前账本的交易日志做了索引。链码执行交易的时候需要读取账本的当前状态,从状态数据库可以迅速获取键值的最新状态。
如果没有状态数据库,要获得某个键值时,需要遍历整个区块链中和该键值相关的交易,效率非常低,因此,读取状态数据库可以认为是快速定位和访问某个键值的方法。另外,当状态数据库出现故障的时候,可以通过遍历账本重新生成。
当一个区块附加到区块链尾部的时候,如果区块中的有效交易修改了键值对,则会在状态数据库中作相应的更新,确保区块链和状态数据库始终保持一致。
区块链的数据块以文件形式保存在各个节点中。状态数据库可以是各种键值数据库,织物缺省使用,并且也支持CouchDB的选项.CouchDB除了支持键值数据外,也支持JSON格式的文档模型,能够做复杂的查询。

  

二,HyperLeger织物交易流程

  

1,客户端向背书节点发送交易提案请求

  

客户端首先构建交易提案,交易提案的作用是调用通道中的链码来读取或者写入账本的数据。客户端使用织物SDK创建交易提案,并使用用户的私钥对交易提案进行签名。
织物SDK作用有两个,一个是将交易提案封装成符合gRPC协议的Protobuf格式的消息,一个是对创建的交易提案进行签名。
客户端打包完交易提案后,将交易提案提交给通道中的背书节点。背书节点的背书策略定义了哪些背书节点签名背书后交易才能有效,客户端根据背书策略选择相应的背书节点,并向相应背书节点提交交易提案。
 HyperLeger织物开发(五)——HyperLeger织物账本存储”> <br/>根据背书策略,E0、E1, E2三个背书节点需要完成签名背书。</p>
  <h4> 2,背书节点对交易提案进行签名背书</h4>
  <p>背书节点收到交易提案后,使用MSP模块验证签名并确定请求者是否被合理授权进行交易提案的操作(使用每个通道对应的ACL进行验证),背书节点以交易提案凭证为输入,基于当前状态的数据库执行来生成交易结果,输出包括反馈值,读取集和写入集。此时,账本并未进行更新。背书节点会将背书节点输出,背书节点签名,是否背书声明作为交易提案反馈回传给客户端的SDK。<br/>首先校验交易的签名是否合法,然后根据签名者的身份,确认其是否具有权限进行相关交易。此外,背书节点还需要检查交易提案的格式是否正确以及是否已经提交过(防止重放* * *)。<br/>在所有合法性校验通过后,背书节点按照交易提案调用链码模拟执行交易。链码执行时,读取的数据(键值对)是背书节点中本地的状态数据库,链码读取过的数据回被归总到读集(套);链码对状态数据库的写操作并不会对账本做改变,所有的写操作将归总到一个写入集(写集)中记录下来。读集和写集将在确认节点中用于确定交易是否最终写入账本。<br/>在链码执行完成后,背书节点把链码模拟执行后得到的读写集(读写)等信息签名后发回给客户端。此时,交易信息只在客户端和单个背书节点之间达成共识,并没有完成全网共识,各个客户端的交易顺序没有确定,可能存在双花问题,所以不是一个有效交易。同时,客户端需要收到大多数背书节点的验证回复后,才算验证成功,具体的背书策略由智能合约代码控制,可以由开发者自由配置。<h2 class=HyperLeger织物开发(五)——HyperLeger织物账本存储