介绍
什么是区块链
区块链网络的核心是一个分布式账本,记录网络上发生的所有交易(数据变化)。
区块链使用 智能合约 来提供对账本的受控访问。
保持账本在整个网络中同步的过程称为 共识 。
为什么区块链有用
当然有用…
什么是Hyperledger Fabric
Hyperledger Fabric 与其他区块链系统不同的地方是 私有 和 许可 。与允许未知身份参与网络的开放式非许可系统(需要诸如“工作量证明”之类的协议来验证交易并保护网络)不同,Hyperledger Fabric 网络的成员需要从可信赖的 成员服务提供者(MSP) 注册。
Hyperledger Fabric 还提供创建 通道 的功能,允许一组参与者创建各自的交易账本。
共享账本
Hyperledger Fabric 有一个账本子系统,包括两个组件: 世界状态 和 交易日志 。世界状态组件描述了在给定时间点的账本的状态。它是账本的数据库。交易日志组件记录产生世界状态中当前值的所有交易;这是世界状态的更新历史。
Hyperledger Fabric 智能合约用链码编写,当该应用程序需要与账本交互时,由区块链外部的应用程序调用。在大多数情况下,链码只与账本的数据库等交互。
共识机制
交易必须按照发生的顺序写入账本,为此,必须建立交易的顺序。
例如,PBFT(实用拜占庭容错算法)可以为文件副本提供一种机制,使其能够保持各个副本的一致性,即使在发生损坏的情况下也是如此。
或者,在比特币中,通过称为挖矿的过程进行排序,其中竞争计算机竞相解决加密难题,该难题定义所有过程随后构建的顺序。
Hyperledger Fabric 被设计为允许网络启动者选择最能代表参与者间存在的关系的共识机制。
Hyperledger Fabric 模型
资产
资产是可以通过网络交换的几乎所有具有价值的东西,从食品到古董车、货币期货。
链码
链码执行与交易排序分离,限制了跨节点类型所需的信任和验证级别,并优化了网络可扩展性和性能。
账本特性
不可变的共享账本为每个通道编码整个交易历史记录,并包括类似 SQL 的查询功能,以便高效审计和解决争议。
隐私
通道和私有数据集合实现了隐私且机密的多边交易,这些交易通常是在共同网络上交换资产的竞争企业和受监管行业所要求的。
安全和成员服务
通道和私有数据集合实现了隐私且机密的多边交易,这些交易通常是在共同网络上交换资产的竞争企业和受监管行业所要求的。
共识
达成共识的独特方法可实现企业所需的灵活性和可扩展性。
区块链网络
这个话题会在概念层面上描述 Hyperledger Fabric 是如何让组织间以区块链网络的形式进行合作的。
什么是区块链网络
区块链网络是一个为应用程序提供账本及智能合约chaincode服务的技术基础设施。首先,智能合约被用来生成交易,接下来这些交易会被分发给网络中的每个节点,这些交易会被记录在他们的账本副本上并且是不可篡改的。
在大多数的额情况下,多个组织 会聚集到一起作为一个联盟 来形成一个网络,并且他们的权限是由一套在网络最初配置的时候联盟成员都同意的规则来决定的。
示例网络(看不懂先跳)
四个组织 R1、R2、R3 和 R4(三角形),他们共同决定,并且达成了一个协议,他们将会设置并开发一个 Hyperledger Fabric 网络。
R4 被分配作为网络的初始者,它有权设置网络的初始版本。
R4 不会在网络中去进行任何的业务交易。
R1 和 R2 在整个网络中有进行私有通信的需求,R2 和 R3 也是。
组织 R1 有一个客户端的应用能够在通道 C1 中进行业务的交易。
组织 R2 有一个客户端应用可以在通道 C1 和 C2 中进行类似的工作。
组织 R3 可以在通道 C2 中做这样的工作。
节点 P1 维护了 C1 的账本 L1 的副本。
节点 P2 维护了 C1 的账本 L1 和 C2 的账本 L2 的副本。
节点 P3 维护了 C2 的账本 L2 的副本。
这个网络是根据在网络配置(net_config) NC4 中指定的规则来进行管理的,整个网络由组织 R1 和 R4 管理。
通道 C1 是根据在通道配置(channle_config) CC1 中指定的规则来管理的,这个通道由组织 R1 和 R2 管理。
通道 C2 是根据在 通道配置 CC2 中指定的规则来管理的,这个通道由组织 R2 和 R3 管理。
这有一个排序服务 O4 作为这个网络 N 的一个网络管理员节点,并且使用系统通道。
排序服务同时也支持应用通道 C1 和 C2,来对交易进行排序、加入区块然后分发。
每个组织都有一个首选的 CA(证书授权组件)。
创建网络
当一个排序服务启动后就形成了这样的一个网络。在示例网络 N 中,排序服务 O4 由一个单独的节点组成,是根据一个网络配置 NC4 来进行配置的。在网络层面上,证书颁发机构 CA4 被用来向管理员和组织 R4 的网络节点分配身份信息。
能够看到,在定义 网络 N 的时候,第一件事情就是定义一个 排序服务O4。
对于一个网络在最初就考虑以管理员节点的形式定义这个排序服务是非常有帮助的。就像在之前同意的,O4 最初被配置并且由组织 R4 的一个管理员来启动,并且由 R4 管理。
配置 NC4 包含了描述网络管理能力初始集合的规则。
最初在网络中集合仅赋予了 R4 这个权利。(这个在将来会变化,我们稍后会看到,但是目前 R4 是这个网络中唯一的一个成员。)
也能够看到一个证书颁发机构,CA4,它会被用来给管理者和网络节点颁发证书。这个证书能够用来识别属于组织 R4 的组件。由 CA 颁发的证书也可以用来为交易提供签名,来表明一个组织对交易的结果进行背书,背书是一笔交易可以被接受并记录到账本上的前提条件。
这有一个资源,网络 N,有一些用户能够访问这个网络,这些用户是由一个证书颁发机构 CA4 定义的,他们具有网络配置 NC4 中包含的规则中所描述的在网络 N 中的权利。当我们配置和启动排序服务节点 O4 的时候上边讲的事情都会发生。
添加网络管理员
在接下来的阶段,我们会允许组织 R1 用户也具有管理的权限。
我们看到了新的组织 R1 变成了管理员,R1 和 R4 现在在网络中具有了相同的权限。我们看到证书颁发机构 CA1 也被添加进来了,他用来标识 R1 组织的用户。现在从 R1 和 R4 来的用户就已经是网络的管理员了。
定义联盟
尽管这个网络当前可以被 R1 和 R4 管理,但是只有这些还是太少了。我们需要做的第一件事就是定义一个联盟。
由于 NC4 的配置方式,只有 R1 和 R4 能够创建新的联盟。这个图标显示了一个新的联盟 X1,它定义了 R1 和 R2 是它的联盟组织。我们也看到了 CA2 也被添加进来标识来自 R2 的用户。
这个网络虽然最初仅包含一个组织,现在已经由多个组织来管理了。我们将从 R1、R2 和 R4 共享管控权的方式开始,这样的构成更容易被理解。
为联盟创建通道
使用联盟 X1 为 R1 和 R2 创建的的通道 C1。这个通道通过通道配置 CC1 来进行管理,完全独立于网络配置。
CC1 是由 R1 和 R2 管理的,他们在 C1 上具有同等的权利。R4 在 CC1 中是没有任何权利的。
尽管 C1 是网络 N 中的一部分,它还是跟这个网络非常不同的。
需要注意的是通道 C1 如何具有一个同网络配置 NC4 完全分开的配置 CC1。
通道非常有用,因为提供了一个联盟成员之间进行私有通信和私有数据的机制。通道提供了与其他通道以及整个网络的隐私性。
我们也能够看到一旦通道被创建之后,它会真正地代表了“从网络中解放出来”。
节点和账本
我们的网络 N 又新增了两个组件,称作 Peer 节点 P1 和账本实例 L1。
Peer 节点是存储区块链账本副本的网络组件,是区块链标志性的组件。P1 在这个网络中的目的是单纯地放置被其他人访问的账本 L1 的副本。我们可以想象 L1 会被物理地存储在 P1 上,但是 逻辑上 是存储在通道 C1 上。当我们向通道中添加更多的节点之后,我们对这些就会更加清楚。
P1 的配置中一个关键部分就是一个由 CA1 颁发的 X.509 身份信息,它将 P1 和组织 R1 关联了起来。
当 P1 启动之后,它就可以使用排序 O4 加入通道C1。当 O4 收到这个加入请求,它会使用通道配置 CC1 来决定 P1 在这个通道中的权限。比如,CC1 决定 P1 是否能够向账本 L1 中读取或写入信息。
应用程序和智能合约链码(难点)
智能合约 S5 被安装在了 P1 上。在组织 R1 中的客户端应用 A1 可以通过 Peer 节点 P1 使用 S5 来访问账本。
A1、P1 和 O4 都加入了通道 C1,他们都可以使用由这个通道提供的通信设施。
在网络开发的下一个阶段,我们可以看到客户端应用 A1 能够使用通道 C1 来连接指定的网络资源,
在我们的例子中,客户端应用 A1 是跟组织 R1 相关联的,尽管它处在 Fabric 区块链网络的外边,但它是可以通过通道 C1 跟网络相连的。
现在我们能够清楚地看到 A1 能够通过 P1 直接访问账本 L1,但是事实上,所有的访问都是由一个称为智能合约链码 S5 的特殊程序来管理的。
智能合约
智能合约可以被每个组织的应用开发者创建来实现一个在联盟成员间共享的业务流程。智能合约被用来帮助生成被分发到网络中每个节点的交易。需要对智能合约执行两项操作,它必须被安装,然后在通道中被定义。
Hyperledger Fabric 用户经常会在内部使用名词智能合约和链码。大体上来说,一个智能合约定义了交易逻辑,它控制了在世界状态中包含的一个业务对象的生命周期。
然后它会被打包进一个链码中,这个链码会被部署到一个区块链网络中。
可以把智能合约想象为管理交易,链码则管理着智能合约应该如何被打包部署。
安装链码包
在智能合约 S5 被开发完之后,组织 R1 中的管理员必须要把它安装到节点 P1 上。这是一个很简单的操作。当完成之后,P1 就完全“了解”了 S5。特别地,P1 能够看到 S5 的实现逻辑(用来访问账本 L1 的程序代码)。
当一个组织在一个通道中有多个 Peer 节点时,可以选择在哪个节点安装智能合约,而不需要每个 Peer 节点上都安装。
定义链码
尽管链码会被安装在组织的 Peer 节点上,但是它是在一个通道范围内被管理和维护的。所以每个组织需要批准一个链码定义,和一系列参数来定义在一个通道中链码应该被如何使用。一个组织必须要批准一个链码定义,才能使用已经安装的智能合约来查询账本和为交易背书。在我们的例子中,只有一个单独的 Peer 节点 P1,一个组织中的管理员 R1 必须要批准 S5 的链码定义。
在链码定义能够被提交到通道并且用来同通道账本进行互动之前,
需要有效数量的组织来批准一个链码的定义(默认为大多数)。
因为通道中只有一个成员,R1 的管理员可以提交 S5 的链码定义到通道 C1。当这个定义提交后,S5 就可以被客户端应用 A1 调用了!
注意,虽然在这个通道上的每个组件现在都可以访问 S5,但是他们是不能够看到它的程序逻辑的。这对于安装了这个智能合约的节点还是保持隐私性的,在我们的示例中指的是 P1。
背书策略
在链码定义提供的信息中最重要的部分就是背书策略。它描述了在交易被其他的组织接受并存储在他们的账本副本上之前,哪些组织必须要同意此交易
在我们的示例网络中,只有当 R1 和 R2 对交易进行背书之后,交易才能够被接受并存储到账本 L1 中。
调用智能合约
当智能合约被安装在 Peer 节点并且在通道上定义之后,它就可以被客户端应用调用了。客户端应用是通过发送交易提案给智能合约背书策略所指定的 Peer 的节点方式来调用智能合约的。这个交易的提案会作为智能合约的输入,智能合约会使用它来生成一个背书交易响应,这会由 Peer 节点返回给客户端应用。
这些交易的响应会和交易的提案打包到一起形成一个完整的经过背书的交易,他们会被分发到整个网络。
完成网络
我们的目标是为联盟 X1(由组织 R1 和 R2 构成)创建一个通道。网络开发的下一个阶段是将组织 R2 的基础设施添加到网络中。
我们能够看到组织 R2 在通道 C1 上添加了 Peer 节点 P2。P2 也存储了账本 L1 和智能合约 S5 的副本。
R2 也添加了客户端应用 A2,它能够通过通道 C1 连接到网络。
目前这是一个可运行的网络!我们定义了一个通道,在这个通道中组织 R1 和 R2 能够彼此进行交易。这意味着 A1 和 A2 能够使用在通道 C1 上的智能合约 S5 和账本 L1 来生成交易。
生成并接受交易
相较于经常会存有账本副本的 Peer 节点,我们能够看到两种类型的 Peer 节点,一类是存储智能合约而另一类则不存。在我们的网络中,每个 Peer 节点都会存储智能合约的副本,但是在一个更大的网络中,会存在更多的 Peer 节点并且没有存储智能合约的副本。
对于没有安装智能合约的 Peer 节点,我们不应该认为他们在某种程度上是较差的。更多情况下,带有智能合约的 Peer 节点通常会拥有一个特殊的能力——帮助生成交易。+需要注意的是所有的 Peer 节点都可以验证并接受或者拒绝交易存入他们的账本 L1 的副本中。然而,只有安装了智能合约的 Peer 节点才能够参与交易背书的流程,这是生成一笔有效交易的核心。
Peer 节点的类型
在 Hyperledger Fabric 中,所有的 Peer 节点都是一样的,基于这个网络的配置,Peer 节点能够担当多个角色。
- 提交节点通道中的每个 Peer 节点都是一个提交节点。他们会接收生成的区块,在这些区块被验证之后会以附加的方式提交到 Peer 节点的账本副本中。
- 背书节点每个安装了智能合约的 Peer 节点都可以作为一个背书节点。然而,想要成为一个真正的背书节点,节点上的智能合约必须要被客户端应用使用,来生成一个被签名的交易响应。(背书节点的术语就是这样来的)
这是 Peer 节点的两个主要类型,一个 Peer 节点还可以担任的两种其他的角色: - 主节点当组织在通道中具有多个 Peer 节点的时候,会有一个主节点,它负责将交易从排序节点分发到该组织中其他的提交节点。一个节点可以选择参与静态或者动态的领导选举。
(这是很有用的,从管理者的角度来考虑的话会有两套节点,一套是静态选择的主节点,另一套是动态选举的主节点。对于静态选择,0个或者多个节点可以被配置为主节点。对于动态选举,一个节点会被选举成为主节点。另外,在动态选举主节点中,如果一个主节点出错了,那么剩下的节点将会重新选举一个主节点。) - 锚节点如果一个 Peer 节点需要同另一个组织的 Peer 节点通信的话,它可以使用对方组织通道配置中定义的锚节点。一个组织可以拥有0个或者多个锚节点,并且一个锚节点能够帮助很多不同的跨组织间的通信。
向通道中添加组织和节点
当 R2 加入到通道的时候,组织必须要向它的 Peer 节点 P2 上安装智能合约 S5。现在,Peer 节点 P2 有了智能合约和账本的物理的副本,像 P1 一样,它可以生成并接受交易到它的账本 L1 的副本上了。
R2 必须要像 R1 那样批准相同的链码定义才能够使用智能合约 S5。因为链码定义已经被组织 R1 提交到了通道,当 R2 的组织批准了链码定义并且安装了链码包之后,R2 就可以使用链码了。提交的交易只需要发生一次。通道中新的组织批准了通道中其他成员已经同意的链码参数之后就可以使用链码了。因为链码定义的批准是发生在组织级别的,所以 R2 只需要批准链码定义一次,然后就可以将多个节点加入到安装了链码包的通道。”然而,如果 R2 想改变链码的定义,那么 R1 和 R2 需要为他们的组织批准一个新的定义,然后其中的一个组织需要将定义提交到通道。”
(在我们的网路中,我们能够看到通道 C1 连接了两个客户端应用、两个 Peer 节点和一个排序服务。因为这里只有一个通道,也就只有一个跟这个通道组件交互的逻辑账本。Peer 节点 P1 和 P2 具有相同的账本 L1 的副本。智能合约 S5 的副本通常会使用相同的编程语言来进行相同的实现,如果语言不同,他们也必须有相同的语义。)简化视觉词汇表
随着网络的增长,之前帮助我们理解通道的连线将会变得越发笨拙。添加另外一个联盟定义(略)
添加一个新的通道(略)
添加另外一个Peer节点(略)
把一个Peer节点添加到多个通道中(略)
网路已经完全形成了
网络总结
略网络组件的总结
下边是我们讨论过的网络组件的一个快速总结: - 账本。每个通道一个。由 区块链 和 World state 组成
- 智能合约 (或者叫链码)
- Peer 节点
- 排序服务
- Channel
- 证书颁发机构CA