Ledger(账本)

本文档来自于Ledger,为了提高学习效率而做了简化。

The Ledger

ledger.diagram.1

  • Ledger:由World State和Blockchain组成
  • World State:是保存账本state的当前状态的数据库(个人理解:可以类比比特币的UTXO)
  • Blockchain:记录所有导致当前World State发生的更改的事务日志(个人理解:与比特币的区块链基本一致)

World State

ledger.diagram.3

  • 世界状态是一些事实的键值对
  • 世界状态是通过数据库实现的
  • 应用程序提交改变世界状态的交易,这些交易最终被提交到账本的区块链
  • 世界状态记录的事实都有版本,供Hyperledger Fabric内部使用,并且每次状态更改时都会递增
  • 当首次创建分类帐时,世界状态为空

Blockchain

ledger.diagram.2

  • Blockchain是有关世界状态中的state是如何到达其当前状态的事实的历史记录
  • Fabric中的Blockchain是由文件实现
  • Blockchain由Block组成
  • Block包含Block header、Block data和Block metadata
  • Block header中包含Block data的hash值和上一个区块的hash值
  • Block data中包含交易列表

Blocks

  • Block Header
    • Block number: 从零开始的数字,创世区块是0,每次追加一个新的区块这个Block number自增1
    • Current Block Hash: 当前区块包含的所有的交易的hash值
    • Previous Block Header Hash: 上一个区块的Block Header中的hash值

ledger.diagram.4

  • Block Data

    Block Data包含已经排好序的交易列表,这些交易在排序服务创建区块时写入到Block Data

  • Block Metadata

    • Block Metadata包含区块创建者的证书和签名,用于通过网络节点验证块。
    • 区块提交者将每个交易的有效/无效指示符添加到Block Metadata的bitmap中
    • 直到(包括)该块为止的累积状态的哈希值,以便检测状态派生(这是为了在提交之前验证状态有没有被其他的交易更改)

Transactions

ledger.diagram.5

每个交易都包含以下四部分:

  • Header

    取得有关交易的一些基本元数据-例如相关链码的名称及其版本。

  • Signature

    包含客户端应用程序的签名;此字段用于检查交易明细是否未被篡改,因为它需要应用程序的私钥来生成。

  • Proposal

    保存编码后的应用程序提供给智能合约的输入参数,使用这些参数来创建更新账本的提议。当智能合约运行时,该提议提供了一组输入参数,这些输入参数与当前的世界状态一起确定了新的世界状态。

  • Response

    获取世界状态的前后值,作为读写集(RW-set)。它是智能合约的输出,如果交易成功通过验证,它将应用于账本来更新世界状态。

  • Endorsements

    这是满足背书策略的组织的签名列表。交易响应包含了背书列表,并且只有满足交易背书策略的背书列表才会存在在此,如果不满足背书策略则不在此记录,因为也不会更新世界状态。

World State database options

The world state is physically implemented as a database, to provide simple and efficient storage and retrieval of ledger states. As we’ve seen, ledger states can have simple or compound values, and to accommodate this, the world state database implementation can vary, allowing these values to be efficiently implemented. Options for the world state database currently include LevelDB and CouchDB.

世界状态在物理上是使用数据库实现的,以提供简单有效的存储和账本状态检索。如我们所见,账本状态可以具有简单值或复合值,为了适应这种情况,世界状态数据库的实现方式可能会有所不同,从而可以有效地实现这些情况。世界状态数据库的选项当前包括LevelDB和CouchDB。

LevelDB is the default and is particularly appropriate when ledger states are simple key-value pairs. A LevelDB database is co-located with the peer node – it is embedded within the same operating system process.

LevelDB是默认值,当账本状态为简单键/值对时尤其适用。LevelDB数据库与peer节点位于同一位置都嵌入在同一操作系统进程中。

CouchDB is a particularly appropriate choice when ledger states are structured as JSON documents because CouchDB supports the rich queries and update of richer data types often found in business transactions. Implementation-wise, CouchDB runs in a separate operating system process, but there is still a 1:1 relation between a peer node and a CouchDB instance. All of this is invisible to a smart contract. See CouchDB as the StateDatabase for more information on CouchDB.

当账本状态被构造为JSON格式的文档时,CouchDB是一个特别合适的选择,因为CouchDB支持丰富的查询和业务交易中经常发生的丰富数据类型的更新。在实现方面,CouchDB在单独的操作系统进程中运行,但是peer节点和CouchDB实例之间仍然存在1比1的关系。

In LevelDB and CouchDB, we see an important aspect of Hyperledger Fabric – it is pluggable. The world state database could be a relational data store, or a graph store, or a temporal database. This provides great flexibility in the types of ledger states that can be efficiently accessed, allowing Hyperledger Fabric to address many different types of problems.

在LevelDB和CouchDB中,我们看到了Hyperledger Fabric的重要方面–它是插件化的。世界状态数据库可以是关系数据存储,图形存储或时态数据库。这为可以有效访问的账本状态类型提供了极大的灵活性,从而使Hyperledger Fabric可以解决许多不同类型的问题。

Example Ledger: Basic Asset Transfer

使用同一个身份创建四个资产,账本会变成下面这样:

ledger.diagram.6

Namespaces

Even though we have presented the ledger as though it were a single world state and single blockchain, that’s a little bit of an over-simplification. In reality, each chaincode has its own world state that is separate from all other chaincodes. World states are in a namespace so that only smart contracts within the same chaincode can access a given namespace.

即使我们已经将账本呈现为一个单一的世界状态和单个区块链,但这还是有点过分简化了。实际上,每个链码都有其自己的世界状态,该状态与所有其他链码分开。世界状态位于名称空间中,因此只有相同链码内的智能合约才能访问给定的名称空间。

A blockchain is not namespaced. It contains transactions from many different smart contract namespaces. You can read more about chaincode namespaces in this topic.

区块链没有命名空间。它包含来自许多不同的智能合约命名空间的交易。您可以在Chaincode namespace中阅读有关链码名称空间的更多信息。

Channels

In Hyperledger Fabric, each channel has a completely separate ledger. This means a completely separate blockchain, and completely separate world states, including namespaces. It is possible for applications and smart contracts to communicate between channels so that ledger information can be accessed between them.

在Hyperledger Fabric中,每个通道都有一个完全独立的账本。这意味着完全独立的区块链,以及完全独立的世界状态以及名称空间。应用程序和智能合约可以在通道之间进行通信,以便可以在它们之间访问分类帐信息。