【本课堂内容全部选编自PlatON首席密码学家、武汉大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】
在上一堂课的学习中,我们介绍了Hyperledger Fabric的基情况以及组成,今天我们来拆解其架构组成,细说Hyperledger Fabric的技术框架。
区块链网络中的每一个参与者(包括客户端应用程序,记账节点、排序服务节点等),要想参与区块链网络,都必须具有封装在X.509数字证书中的数字身份。这些身份非常重要,因为它们确定了参与者在区块链网络中对资源的访问权限。
要使身份可以验证,它必须来自可信任的权威机构。成员服务提供商( MSP)在Fabric中就充当权威机构的角色,默认使用X.509证书作为身份,采用传统的公钥基础结构(PKI)分层模型。
PKI(Public Key Infrastructure,公钥基础设施)的目标就是实现不同成员在不见面的情况下进行安全通信(建立信任),Fabric采用的模型是基于可信的第三方机构,也就是证书颁发机构(Certification Authority,CA)签发的证书。CA会在确认申请者的身份后签发证书,同时会在线提供其所签发证书的最新吊销信息,这样使用者就可以验证证书是否仍然有效。
证书是一个包含公钥、申请者相关信息以及数字签名的文件。数字签名保证了证书中的内容不能被任何攻击者篡改,而且验证算法可以发现任何伪造的数字签名。通常情况下,PKI体系包含证书颁布机构(CA)、注册机构(RA)、证书数据库和证书存储实体。
RA是一个信任实体,它负责对用户进行身份验证以及对数据、证书或者其他用于支持用户请求的材料进行合法性审查。
CA则会根据RA的建议,给指定用户颁发数字证书,这些证书由根CA直接或分层进行认证。
(*Fabric成员服务实体示意图*)
对上图中的实体进行进一步介绍说明:
Root Certificate Authority(Root CA):根CA,代表PKI体系中信任的实体,同时也是PKI体系结构中的最顶层认证机构。
Registration Authority(RA):注册机构,是一个可信任的实体,通过它可以确定希望参与许可区块链的用户的有效性和身份信息。它通过与用户进行带外通信的方式以验证用户的身份和角色。同时RA还需要负责创建注册所需的注册凭证。
EnrollmentCertificateAuthority(ECA):在验证用户提供的注册凭证后,ECA负责发出注册证书(ECerts)。
TransactionCertificateAuthority(TCA):在验证用户提供的注册凭证后,TCA负责发出交易证书(TCerts)。
TLS Certificate Authority (TLS-CA):负责颁发TLS(Transport Layer Security,传输层安全协议)证书和凭据,以允许用户使用其网路。
Enrollment Certificates(ECerts):ECerts是长期证书,针对所有角色颁发。
TransactionCertificates(TCerts):TCerts是每个交易的短期证书。它们是由TCA根据授权的用户请求颁发的。此外,TCerts可以被配置为不携带用户身份的信息。它们使得用户不仅可以匿名地参与系统,还可以防止事务的可链接性。
TLS-Certificates(TLS-Certs):TLS-Certs携带其所有者的身份,用于系统和组件之间进行通信及维护网络级安全性。
CodeSignerCertificates(CodeSignerCerts):负责对代码进行数字签名来标识软件来源及软件开发者的真实身份,以此保证代码在签名之后不被恶意篡改。
(*用户注册流程示意图*)
具体的用户注册流程做一个简单的介绍,成员的注册分为两个过程:
离线过程
每个用户或者Peer节点必须向RA注册机构提供身份证件(ID证明),同时这个流程必须通过带外数据(out-of-band,OOB)进行传输,以提供RA为用户创建(和存储)账户所需的证据。
RA注册机构返回用户有关的用户名和密码,以及信任锚(包含TLS-CA Cert)。如果用户可以访问本地客户端,那么客户端可以将TLS-CA证书作为信任锚的一种方式。
在线过程
用户连接客户端以请求登录系统,在这一过程中,用户将用户名和密码发送给客户端。
用户端接着代表用户向成员服务发送请求,成员服务接受请求。
成员服务将包含几个证书的包发送给客户端。
一旦客户端验证完成所有的加密材料是正确有效的,它就会将证书存储于本地数据库中并通知用户,用户注册完成。
现在来看看这些身份如何用于表示区块链网络的可信成员。这是会员服务提供商(MSP)发挥作用的地方:它通过列出其成员的身份来识别应该信任哪些根CA和中间CA是信任域的成员,或者哪些CA被授权为成员签发有效的身份。
MSP的强大不仅仅是列出谁是网络参与者或频道成员。MSP可以在它所代表的组织范围内识别参与者可能扮演的特殊角色,为网络和通道的访问权限设置奠定基础。在区块链网络中,有两个地方会出现MSP,一个是本地MSP,一个是通道MSP。
本地MSP用来定义节点和用户的权限,定义了本地层面的成员哪些有管理权哪些有参与权。
如果一个组织的节点想要加入某个通道,那么本地MSP也要加入通道的配置中,一个通道中的所有节点共享通道MSP的视图。下面来看一个例子。
(*MSP工作流程示意图*)
用户B的身份由RCA1签发,存储在本地MSP中,当B想要连接到Peer并尝试在peer上安装智能合约时,需要执行一下操作:
Peer先检查ORG1-MSP,以验证B的身份确实是ORG1的成员。验证成功后将允许install命令实现链码的安装。
B希望在通道上也实例化智能合约,那么通道上的所有组织必须都同意。因此,Peer必须先检查通道的MSP,然后才能成功提交此命令。
本地MSP仅在应用的节点或用户的文件系统上定义。因此,在物理上和逻辑上,每个节点或用户只有一个本地MSP。
由于通道MSP可用于通道中的所有节点,因此它们在通道配置中进行逻辑定义一次。其实,通道MSP也在通道中为每个节点的文件系统实例化,并通过一致性保持同步。
Fabric的区块链服务包含4个模块:共识管理、分布式账本、账本存储以及P2P网络协议。
共识管理用于在多个节点的分布式复杂网络中使消息达成共识。
分布式账本与账本存储负责管理区块链系统中所有的数据存储,比如交易信息、世界状态等。
P2P网络协议则是网络中节点的通信方式,负责Fabric中各节点间的通信与交互。
1. P2P网络
在Fabric的网络环境中,节点是区块链的通信实体.存在三类不同的节点,分别是客户端节 点(Client)、Peer节点(Peer)以及共识服务节点(Ordering Service Nodes或者Orderers).
客户端节点代表着终端用户实体
必须连接到Peer节点后才可以与区块链进行通信交互。
可以根据它自己的选择来连接到任意的Peer节点上,创建交易和调用交易。
在实际系统运行环境中,客户端负责与Peer节点通信提交实际交易调用,与共识服务通信请求广播交易的任务。
Peer节点负责与共识服务节点通信来进行世界状态的维护和更新
它们会收到共识服务广播的消息,以区块的形式接收排序好的交易信息,然后更新和维护本地的世界状态与账本。
Peer节点可以额外地担当背书节点的角色,负责为交易背书。每个合约代码程序都可以指定一个包含多个背书节点集合的背书策略。
2. 共识服务
Fabric网络中的Orderers节点聚集在一起形成了共识服务
它可以看作一个提供交付保证的通信组织。
共识服务为客户端和Peer节点提供了一个共享的通信通道,还为包含交易的消息提供了一个广 播服务的功能。
共识服务可以有不同的实现方式,在v1.0版本中,Fabric将共识服务设计成了可插拔模块,可以根据不同的应用场景配置不同的共识选项。目前,Fabric提供了3种模式实现:Solo、Kafka和Ratf。
Solo是一种部署在单个节点上的简单时序服务,它只支持单链和单通道。
Kafka是一种支持多通道分区的集群共识服务,可以支持CFT(Crash Faluts Tolerance)。它容忍部分节点宕机失效,但是不能容忍恶意节点。
Raft遵循“领导者和追随者”模型,每个通道都选举一个“领导者”,它的决定将被复制给“追随者”。只要总节点数与失效节点数目满足n>=2f+1,它就允许包括领导者在内的部分节点宕机失效。
3. 分布式账本
区块链技术从其底层构造上分析,可以将其定义为一种共享账本技术。账本是区块链的核心组成部分,在区块链的账本中,存储了所有的历史交易和状态改变记录。
在Fabric中,每个通道都对应着一个共享账本,而每个连接在共享账本上的Peer节点,都能参与网络和查看账本信息,即它允许网络中的所有节点参与和查看账本信息。
账本上的信息是公开共享的,并且在每个peer节点上,都维持着一份账本的副本。
Fabric合约代码服务提供了一种安全且轻量级的方式,沙箱验证节点上的合约代码执行,提供安全容器服务以及安全的合约代码注册服务。
其运行环境是一个锁定和安全的容器,合约代码首先会被编译成一个独立的应用程序,运行于隔离的Docker容器中。在合约代码部署时,将会自动生成一组带有签名的智能合约的Docker基础镜像。在Docker容器中,Peer节点与合约代码交互过程如图所示:
(*合约代码执行流程示意图*)
步骤如下:
Peer节点收到客户端发来的合约代码执行请求后,通过gRPC与合约代码交互,发送一个合约代码消息对象给对应的合约代码。
合约代码通过调用Invoke()方法,执行getState()操作和putState()操作,向Peer节点获取账本状态数据库和发送账本预提交状态数。若要读取和写入私有数据,则通过getPrivateDate()和putPrivateDate()方法。
合约代码执行成功后将输出结果发送给Peer节点,背书节点对输入和输出信息进行背书签名,完成后应答给客户端。
点宽学园【区块链与密码学】第三单元的课程今天就结束啦!感谢同学们的一路陪伴~大家也要记得复习哦!从下一期我们将进入新的篇章,敬请期待啦~
关注点宽学园,每周持续更新区块链系列课程,小宽带你进入区块链世界。我们下节课见啦。
【区块链与密码学】课堂回顾:
区块链与密码学系列文章合集