这篇文档是关于 Hyperledger Fabric 官方文档 的学习笔记。
Introduction
区块链是一个不可变的交易账本(Ledger),维护在同级节点(peer nodes)的分布式网络中。每个节点通过应用已经通过共识协议(concensus protocol)的交易来维护账本的副本,这些交易被分组为多个区块,区块中包含了此区块绑定到前一个块的 hash。
Bitcoin cryptocurrency 比特币加密货币是第一个也是最广为人知的一个区块链的应用。Ethereum,以太坊则采用了不同的方式,整合了很多与比特币相同的特性,但添加了智能合约(smart contract,Fabric 把它叫做 chaincode)以创建一个用于分布式应用的平台。Bitcoin 和 Ethereum 属于公共无许可(public permissionless)区块链技术。也就是说,它们是对任何人开放的,公共网络,其中的参与者都匿名交互。
但这种无许可区块链技术不能满足企业用户场景,因为企业用户案例中,尤其是财务交易需要遵循 KYC(Know Your Customer)和 AML(Anti Money Laundering)规则。
所以对于企业使用,需要考虑到:
- 参与者可识别
- 需要许可
- 高交易吞吐量性能
- 交易确认低延迟
- 与业务交易相关的隐私和数据的隐私和机密性
Hyperledger Fabric 就是专门为企业使用设计的。
For now, it’s enough to think of a blockchain as a shared, replicated transaction system which is updated via smart contracts and kept consistently synchronized through a collaborative process called consensus.
自问自答
1. 什么是分布式账本(ledger)?
答:一个区块链网络的核心就是一个分布式账本,记录了网络中发生的所有交易。
一个区块链账本是去中心化的(decentralized),因为它被多个参与者复制。
另外,区块链账本也是 append-only 的。一个交易一旦添加到账本中,就不能再修改了。
2. 什么是 peer ?功能?
答:Peer 是区块链网络的基本元素,托管(host)账本和智能合约。
3. 什么是 Smart contract?
答:为了支持一致的信息更新,以及启用一些账本功能(比如交易,查询等)。区块链网络使用智能合约来提供对账本的受控访问。
智能合约不仅是一个封装信息并发散到网络的关键机制,它也可以用来允许参与者自动执行交易的某些方面。比如根据运送时间自动修改运费。
4. 什么是共识(Consensus)?
答:保持账本交易在网络中同步的过程,就是共识。共识要确保,只有在交易被对应的参与者确认时,账本才会更新。以及一旦账本更新,那么所有的账本以相同的顺序,更新相同的交易。
Hyperledger Fabric
Linux 基金会于2015年创建了 Hyperledger 项目,以推进跨行业的区块链技术。Hyperledger Fabric 是 Hyperledger 中的区块链项目之一。像其他区块链技术一样,它有 Ledger,使用智能合约,并且是参与者用来管理其交易的系统。
Hyperledger Fabric与其他一些区块链系统的不同之处在于它是私有的并且许可的。也正因为如此,在国外 Fabric 不受什么待见,他们甚至认为 Fabric 不是去中心化的。反而在国内,Fabric 受到众多企业的青睐。
Fabric 是高度模块化,高度可配置化的架构。应用场景有银行,金融,保险,医疗保健,人力资源,供应链,甚至数字音乐交付。
Fabric 是第一个支持用通用开发语言比如Java,Go,Node.js 开发智能合约的分布式账本平台。
支持可插拔共识协议。
共享账本(Shared Ledger)
账本系统包含两个组件:
- 世界状态(world state):描述某个时间点的账本状态。是账本的数据库。默认使用 LevelDB。
- 交易日志(transaction log):世界状态的更新历史。不需要可插拔的。It simply records the before and after values of the ledger database being used by the blockchain network.
智能合约(Smart Contract)
在 Fabric 中,智能合约是用 chaincode 写的,所以也称为 chaincode。
智能合约是可信的分布式应用,可从区块链和 peer 中潜在的共识中获得安全性/信任。
当外部应用需要跟账本交互的时候,就会调用智能合约。大多数情况下,chaincode 只跟账本的数据库组件(世界状态)交互,比如查询。目前支持用 Go 和 Node 实现 chaincode。
智能合约有三个要点:
- 多个智能合约同时运行
- 可能会动态地部署
- 应用代码被视为是不可信的,甚至可能是恶意的
共识(Consensus)
交易必须按照发起的顺序写到账本里。错误地(或恶意地)添加到账本里的交易需要被拒绝掉。
实现的方式有很多,各有利弊。比如 PBFT(Practical Byzantine Fault Tolerance)可以让文件副本彼此通信,并且保持每个副本一致,即使是在发生损坏的情况下。
许可的(permissioned)和无许可的(permissionless)区块链
无许可的区块链:所有参与者都是匿名的。使用挖矿本地货币或交易费作为经济诱因,来补偿参与基于PoW(Proof of Work)的拜占庭容错共识的特殊费用。
有许可的区块链:一群已知的,认证的,通过审查的参与者。通过依赖参与者的身份,有许可的区块链可以使用传统 CFT(crash fault tolerant)或者BFT(byzantine fault tolerant)公司协议,这些协议不需要高花费地挖矿。
隐私和机密性
对于公共的无许可的区块链,交易是在每个节点上执行的,因此交易数据和代码是对网络中的每个节点可见的,没有机密性。
为了解决隐私和机密性的问题,区块链平台采用过多种办法:
- 加密数据:在无许可的区块链中,就算是加密了,也都在每个节点中可见,时间和计算资源足够的话,就能解密。
- 零知识证明(Zero Knowledge Proofs,ZKP):取舍在于计算ZKP需要很多时间和计算资源。
- 在有许可的区块链中,可以利用多种形式的共识,有些可以限制机密信息的分发,只分发给授权了的节点。
自问自答
1. 什么是 Tendermint?
答:简单来说就是一种区块链共识算法。
Peers
A blockchain network is comprised primarily of a set of peer nodes (or, simply, peers). Peers are a fundamental element of the network because they host ledgers and smart contracts.
区块链网络主要由一组 Peer 节点(或简称为对等节点)组成。Peer 是区块链网络的基本元素,因为它们托管账本和智能合约。智能合约用于封装共享进程,账本用于封装共享信息。一个 Peer 可以有多个账本和智能合约。
Applications and peers
当应用需要访问账本和智能合约的时候,就需要连接到 peer。Fabric 的 SDK 提供了 API 使得应用可以连接到 peer,调用 chaincode 来生成交易,提交交易到网络上,然后将它们排序、验证、提交到分布式账本中,接收事件当此过程结束。
通过连接 peer,应用可以执行 chaincode 以查询、更新账本。
Peers, in conjunction with orderers, ensure that the ledger is kept up-to-date on every peer. In this example, application A connects to P1 and invokes chaincode S1 to query or update the ledger L1. P1 invokes S1 to generate a proposal response that contains a query result or a proposed ledger update. Application A receives the proposal response and, for queries, the process is now complete. For updates, A builds a transaction from all of the responses, which it sends to O1 for ordering. O1 collects transactions from across the network into blocks, and distributes these to all peers, including P1. P1 validates the transaction before committing to L1. Once L1 is updated, P1 generates an event, received by A, to signify completion.
更新账本比查询多额外的两个步骤。查询账本过程中,peer 不需要跟其他 peer 交互,可以直接返回本地账本副本的查询结果;但是在更新账本过程中,只有当其他 peer 都同意更新,账本才能更新——也就是说需要共识。
上图中的第四步,应用发送一系列建议的(proposed)更新到整个 peer 网络,以作为提交到各自账本的交易。这是通过使用一个 orderer 实现的,它会把这些交易打包到一些区块中,然后分发到整个 peer 网络。每个 peer 会先验证这些交易然后再更新到各自本地的账本副本。由于这整个 ordering 的过程需要一些时间(几秒)来完成,应用会接收到异步的通知,如上图的第五步。
Peers and Channels
通过 Channel 机制,区块链网络中的一组组件可以进行私下通信和交易。这些组件通常是 peer 节点,orderer 节点和应用程序。通过加入 channel,它们同意协作以共享和管理与该频道关联的相同的账本副本。Channel 是一个逻辑上的结构,由物理上的 peer 集合形成。Peer 提供了访问和管理 channel 的控制点。
Peer and Organizations
区块链网络由向其贡献资源的多个组织组成和管理。网络的大小取决于这些协作的组织提供的资源的多少。网络不依赖于某个单个的组织,只要有一个组织贡献资源,那么这个网络就会存在。这也是一个网络去中心化的核心含义。
不同组织的应用不需要是一样的,如何操作 peer 的账本副本完全取决于组织。应用要么连接到所属组织的 peer,要么连接到其他组织的 peer。这取决于所需的账本交互的性质:对于查询账本的交互,应用通常连接到所属组织的 peer;对于更新账本的交互,应用则需要连接到验证更新所需的每个组织的 peer。
Peers and Identity
通过数字证书,每个 peer 都被所属组织的管理员分配了身份。