Ledgerhtml
Ledger(帐本)即全部的state transitions(状态切换),是有序且不可篡改的。state transitions(状态切换)是由参与方提交的chaincode(智能合约)调用(“transactions/事务”)的结果。每一个事务都将产生一组资产键值对,这些键值对做为建立、更新或删除而提交给Ledger(帐本)。数据库
Ledger(帐本)由blockchain(区块链)(“chain”)组成,区块则用来存储有序且不可篡改的记录,以及保存当前状态的state database(状态数据库)。在每个channel中都会存在一个Ledger(帐本)。每个peer都会维护它做为其中成员的每个channel中的本地拷贝的Ledger(帐本)。并发
chain是一个事务日志,是一个由hash连接的连接各个区块的结构,其中每一个区块都包含了N个事务的序列。区块header包含了该区块的事务的hash,以及上一个区块头的hash。这样,全部在帐本上的交易都是按顺序排列的,并以密码方式连接在一块儿。换句话说,在不破坏hash连接的状况下篡改帐本数据是不可能的。最近的区块的hash表明了之前的每一个事务,从而确保全部的peers都处于一致和可信的状态。
函数
chain存储在peer文件系统(本地或附加存储)上,有效地支持blockchain工做负载的应用程序的特性。区块链
该帐本的当前状态数据表示chain事务日志中包含的全部键的最新值。因为当前状态表示channel所知道的全部最新键值,所以有时也称为“World State(世界状态)”。spa
在chaincode调用对当前状态数据执行操做的事务时,为了使这些chaincode交互很是有效,全部键的最新值都存储在一个状态数据库中。状态数据库只是一个索引视图到chain的事务日志中,所以能够在任什么时候候从chain中从新生成它。在事务被接受以前,状态数据库将自动恢复(或在须要时生成)。版本控制
状态数据库选项包括LevelDB和CouchDB。LevelDB是嵌入在peer进程中的默认状态数据库,并将chaincode数据存储为键/值对。CouchDB是一个可选的外部状态数据库,当你所写的chaincode数据被建模为JSON时,它提供了额外的查询支持,容许对JSON内容进行丰富的查询。
日志
在高层业务逻辑处理上,transaction flow(事务处理流程)是由应用程序客户端发送的事务协议,该协议最终发送到指定的背书节点。背书节点会验证客户端的签名,并执行一个chaincode函数来模拟事务。最终返回给客户端的是chaincode结果,即一组在chaincode(读集)中读取的键/值版本,以及在chaincode(写集)中写入的键/值集合,即返回该peer执行chaincode后模拟出来的读写集结果,同时还会附带一个背书签名。code
客户端将背书组合成一个事务payload,并将其广播至一个ordering service(排序服务节点),ordering service(排序服务节点)为当前channel上的全部peers提供排序服务并生成区块。htm
实际上,客户端在将事务广播到排序服务以前,先将本次请求提交到peer,由peer来验证事务。
首先,peer将检查背书策略,以确保指定的peer的正确分配已经签署告终果,而且他们将根据事务payload对签名进行身份验证。
其次,peer将对事务读取集进行版本控制,以确保数据完整性,并防止诸如重复开销之类的问题。Hyperledger Fabric具备并发控制,即事务容许并行执行(经过背书)来增长吞吐量,而且在提交(全部peer)的状况下,每一个事务都通过验证,以确保没有其余事务修改它已经读取的数据。换句话说,它确保了在执行(批准)时间以后读取的数据没有发生变化,所以执行结果仍然有效,而且能够提交到帐本状态数据库。若是读取的数据被另外一个事务更改,则该区块中的相同事务被标记为无效,而且不该用于帐本状态数据库。客户端应用程序被警告,而且能够在适当的状况下处理错误或重试。
(备注:上述最后一段话的逻辑理论上是正确的,即读取本地版本而后根据本地版本发送广播至排序服务,再由排序服务进行事务处理。但事务处理结果经过实际使用sdk开发,该结果并未即时返回给当前调用客户端,即客户端没法实时获取事务状态,只能经过再次查询来确认最终结果。后续版本sdk可能会修复此问题。)
请参阅Hyperledger Fabric Transaction Flow——事务处理流程、Hyperledger Fabric Read-Write set semantics——读写集和Hyperledger Fabric CouchDB as the State Database——使用CouchDB,以深刻了解事务结构、并发控制和状态数据库。