An Introduction to Hyperledger Fabric
作者:禅与计算机程序设计艺术
1.简介
Hyperledger Fabric是一个开源分布式账本项目,可以让不同组织的多方参与对交易记录进行管理、验证和协调。它实现了私有/联盟链、金融、供应链等众多区块链应用场景,是继比特币之后又一款重要的公开分布式区块链平台。
在了解 Hyperledger Fabric 之前,需要先理解一些 Hyperledger Fabric 的基本概念和术语。
2. 基本概念术语说明
2.1 Fabric网络模型
Hyperledger Fabric 是由多个节点组成的分布式系统,这些节点通过基于共识协议达成一致,并在一个共享账本上维护交易数据。 Hyperledger Fabric 提供了一个可扩展的架构,允许在不断变化的业务需求中快速迭代升级。
Fabric网络架构 :Fabric 网络是由多个节点(或称 Peer)组成,每个节点都在运行共识引擎并加入到网络中。每个 Peer 可以提供服务,同时也扮演着通信组件的角色。当一条交易被写入到网络中时,所有节点都会验证该交易,并最终形成一份共识结果。
网络中的每一个Peer都负责维护一份完整的副本的共享账本,并且可以通过共识协议执行各种操作,如创建新的通道、安装智能合约、调用交易方法等。不同的 Peer 可以部署不同的业务逻辑,形成具有独特性质的多通道网络。
Fabric组件 :如下图所示,Hyperledger Fabric 包括以下组件:
- Ordering Service (排序服务): 对交易请求进行排序、执行共识、生成区块,并将区块传播给网络中的其他节点。
- Membership Services (成员服务): 用于管理网络成员的身份验证、授权、证书签发等功能。
- Ledger (账本): 存储交易数据,并允许向其中添加新的数据。
- Gossip Protocol (gossip 协议): 一种去中心化的 P2P 网络协议,用于将消息从一个节点传递到整个网络。
- CouchDB (NoSQL 数据库): 一种嵌入式的 NoSQL 数据库,用于保存账本数据。
- Chaincode (智能合约): 可编程的代码包,用于处理交易并更新账本状态。
- SDKs (开发工具包): 用于构建应用程序连接至 Hyperledger Fabric 的接口。
Fabric架构特点 :Hyperledger Fabric 是一个模块化架构,允许各个子系统独立升级,适用于复杂的金融和科技场景。
Scalability : Hyperledger Fabric 支持水平扩展,允许网络中的 Peer 节点按照业务需求增减。
High Throughput and Low Latency : Hyperledger Fabric 通过 gossip 协议支持低延迟的高吞吐量,能够满足实时交互场景下的需求。
Privacy : Hyperledger Fabric 提供了一系列隐私保护机制,包括交易加密、匿名性以及基于身份认证的权限控制。
Governance and Trust : Hyperledger Fabric 使用属性、策略、联邦治理、排序服务等组件构建了一个可信任的系统,可以在不可信任的环境中安全地交换信息和交易。
Provenance and Auditability : Hyperledger Fabric 记录了每条交易的信息,确保数据的真实性、完整性以及流程透明性。
Smart Contract Integration : Hyperledger Fabric 提供了两种方式与现有的智能合约框架集成,分别是将 Chaincode 插件化到底层的 Fabric 引擎中,或者将已有的 Fabric 系统作为独立的分区运行,并与现有的区块链系统集成。
Versatility : Hyperledger Fabric 兼容主流的操作系统和云计算平台,可以使用几乎任意语言编写智能合约,并利用丰富的 SDK 和组件进行应用构建。
3. Fabric 核心算法原理及操作步骤
3.1 工作模式
Fabric 使用一个工作模式来保证所有节点都能够正确执行所有的交易。交易首先被提交到某一个特定节点(下称“初始背书节点”),这个节点将把该交易数据加进自己的本地区块链副本中,同时通知其他的节点进行背书。随后,其他的节点会对该交易的有效性进行验证(包括签名检查、智能合约检查等)。如果所有节点的验证结果都是“同意”,那么这笔交易就会被标记为“有效”,并且就可以被提交到区块链上。
下面是 Fabric 中的主要工作流程:
- 客户端提交交易请求。
- 请求被转发到排序服务。
- 初始背书节点接收到请求,收集交易数据和相关的 endorsement (背书)Signatures,并将它们放入一个叫做“待处理区块”的文件夹。
- 每隔一段时间(取决于网络规模),排序服务就会将待处理区块里的所有交易打包成一个区块,并广播出去。
- 节点收到区块后,就开始验证区块的有效性。第一步就是检查区块头是否符合预期,然后检查签名证书是否有效。验证完毕后,节点就会把区块保存到自己本地的区块链副本中。
- 当某个节点想把交易提交到区块链上时,它只需要向排序服务发送一条交易提案,然后等待背书签名。一旦获得足够数量的签名,该交易就可以提交到区块链上。
- 如果某个交易因为某种原因没有得到足够的背书签名,它就可能会被标记为无效。这种情况下,需要采取相应的补救措施,比如撤销交易、降低交易费用等。
3.2 共识协议
共识协议决定了如何在多个节点之间达成一致。在 Hyperledger Fabric 中,共识协议采用 PBFT (Practical Byzantine Fault Tolerance),这是一种简单而强大的拜占庭容错型共识算法。PBFT 假设系统中的任意一个进程都可能发生故障,但只会影响很少的一部分交易,因此它的性能要优于其他的共识算法。
共识协议定义了网络中的所有 Peer 节点如何达成共识,即选举出一组节点来共同审批交易。通过这样的方法,Fabric 可以在不依赖任何中央authority的情况下,使交易数据在整个网络中快速、一致地同步。
3.3 区块结构
每一个区块都包含很多交易数据,而且 Fabric 将它们存在一个叫做 Ledger 的分布式数据库里。为了确保区块的有效性,Fabric 使用数字签名来防止篡改。区块头包含一些元数据,如数字签名、区块号、区块大小、上一个区块哈希值等。区块体则包含一系列交易数据,每个交易都包含一串数字签名、交易发起者的标识符、交易操作类型、交易输入输出等信息。
3.4 智能合约
智能合约是一种编程语言,它允许用户根据一组规则创建和更新区块链上的状态。智能合约可以帮助管理复杂的资产和关系,还可以用来自动化合同履行流程。Fabric 提供了两种类型的智能合约:
- System chaincodes: 这些是由 Fabric 系统管理员编写的链码,负责管理网络和通道,并负责执行一些关键的基础性操作,例如身份管理和记录系统事件。
- Application chaincodes: 这些是由网络中的用户编写的自定义链码,他们可以通过 API 来与区块链上的资源进行交互。
为了更好地理解 Hyperledger Fabric 的智能合约,这里再总结一下两类链码的特点:
- System chaincodes:
系统链码由系统管理员编写,它们只能对特定的系统资源进行读写操作,例如:
CDS(Configuration Deployment System) - 管理系统配置。ESCC(Endorsement System Chaincode) - 执行背书。LCCC(Lifecycle System Chaincode) - 管理生命周期的相关操作,例如链码部署、版本升级、链码实例化和调用。
- Application chaincodes:
应用程序链码由应用开发人员编写,使用的是与 Fabric 兼容的编程语言。应用程序链码运行在通道上,与系统链码不同,它可以访问受权限保护的系统资源。另外,它也可以创建、更新或删除区块链上的状态。
4. Fabric 代码实例及其具体操作步骤
本节展示 Hyperledger Fabric 具体操作步骤,包括代码实例及代码的详细解释。
4.1 配置网络
配置 Hyperledger Fabric 需要准备好多个文件,包括创世区块文件、排序服务配置文件、网络配置文件、组织MSP文件、通道配置文件等。创建配置文件后,即可启动 Hyperledger Fabric 。下面是 Hyperledger Fabric 创建网络的一般步骤:
- 生成创世区块:首先,创建一个目录,然后在目录下创建配置文件。创建一个名为
core.yaml的文件,并指定链的名称和通道的名称。 - 生成身份材料:接着,为网络中的每个组织生成身份材料。需要为每个组织创建包含私钥和证书的 MSP 文件。
- 配置排序服务:创建排序服务配置
orderer.yaml。指定排序服务所使用的证书,并设置集群节点的 IP 地址和端口。 - 配置网络:创建网络配置
network.sh,并指定网络参数,如域名、IP 地址等。 - 创建通道:在 CLI 或 UI 上创建通道。
- 安装并实例化链码:在 CLI 或 UI 上安装和实例化链码。
- 连接 SDK:连接 Hyperledger Fabric SDK ,完成应用构建。
4.2 操作区块链
操作 Hyperledger Fabric 区块链的一般步骤如下:
- 连接区块链:首先,连接网络,包括排序服务和组织节点。
- 登录:获取身份材料,并登陆到 Hyperledger Fabric 网络中。
- 查询交易信息:查询交易信息,包括通道信息、最新区块高度、当前链码的版本号等。
- 创建通道:根据需求创建新的通道。
- 安装链码:将链码安装到指定的通道上。
- 实例化链码:根据链码的描述文件实例化链码,分配给目标通道。
- 调用链码:向链码提交交易,调用链码中的函数。
- 响应结果:链码执行成功后,返回响应结果。
下面是 Hyperledger Fabric 操作区块链的具体代码实例:
4.2.1 获取区块链信息
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 查询区块链信息
const blockchainInfo = await network.query.getBlockchainInfo();
console.log(`当前区块高度 ${blockchainInfo.height}`);
console.log(`当前链码版本 ${blockchainInfo.currentBlockHash}`);
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.2.2 创建通道
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 检查是否已经存在此通道
const channelExists = await network.getChannel('mychannel');
if (!channelExists) {
// 创建通道
await network.createChannel('mychannel');
console.log(`通道 mychannel 创建成功`);
} else {
console.log(`通道 mychannel 已存在`);
}
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.2.3 安装链码
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 连接 peer node
const contract = network.getContract('fabcar');
// 安装链码
const installResponse = await contract.submitTransaction('Install', 'v1.0');
console.log(`链码 fabcar 安装成功,版本 v1.0`);
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.2.4 实例化链码
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 连接 peer node
const contract = network.getContract('fabcar');
// 实例化链码
const instantiateResponse = await contract.submitTransaction('Instantiate', 'v1.0', 'initLedger');
console.log(`链码 fabcar 实例化成功,版本 v1.0`);
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.2.5 调用链码
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 连接 peer node
const contract = network.getContract('fabcar');
// 发起调用
const response = await contract.evaluateTransaction('QueryAllCars');
console.log(`查询结果 ${response}`);
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.2.6 执行交易
// 连接区块链
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity });
try {
// 登录
const network = await gateway.getNetwork('mychannel');
// 连接 peer node
const contract = network.getContract('fabcar');
// 调用链码
const transactionId = await contract.submitTransaction('CreateCar', carNumber, make, model, color, owner);
console.log(`交易 ID 为 ${transactionId},创建车辆成功`);
} catch (error) {
console.error(error);
} finally {
// 关闭连接
await gateway.disconnect();
}
代码解读
4.3 测试 Hyperledger Fabric
测试 Hyperledger Fabric 时,最重要的是验证交易的有效性,验证交易的过程如下:
- 创建测试网络:首先,创建一套测试网络,包括一个排序服务节点和两个组织节点。
- 配置测试网络:为网络中的每个组织生成身份材料,并修改排序服务配置文件。
- 创建测试通道:创建一个测试通道。
- 安装链码:将测试链码安装到测试通道上。
- 实例化链码:根据链码的描述文件实例化链码,分配给目标通道。
- 调用链码:调用链码中的函数,并将交易信息写入区块链。
- 查看区块链信息:查看区块链中的交易信息,确认交易的有效性。
- 清理测试网络:清理测试网络,删除测试区块链、身份材料等数据。
下面是 Hyperledger Fabric 测试交易的具体代码实例:
4.3.1 配置测试网络
此处省略配置测试网络的步骤。
4.3.2 创建测试通道
此处省略创建测试通道的步骤。
4.3.3 安装链码
此处省略安装链码的步骤。
4.3.4 实例化链码
此处省略实例化链码的步骤。
4.3.5 调用链码
此处省略调用链码的步骤。
4.3.6 查看区块链信息
此处省略查看区块链信息的步骤。
5. 未来发展趋势与挑战
Hyperledger Fabric 有许多优秀的特性,可以满足各种业务场景。但是,它的架构仍然处于不断发展阶段,仍有很多地方可以优化。下面列出 Hyperledger Fabric 未来的发展方向和挑战。
5.1 可伸缩性
当前 Hyperledger Fabric 的架构设计在可伸缩性上仍有不少问题。尤其是在大规模网络中,节点的增加会导致区块生成速度的减缓,进而导致链的分叉。另外,网络规模的扩大也会导致 Hyperledger Fabric 整体的资源消耗越来越大,影响 Hyperledger Fabric 节点的性能。
5.2 隐私保护
Hyperledger Fabric 目前还不能完全解决隐私保护的问题。相对于比特币或其他类似的加密货币系统来说,隐私保护主要依靠交易加密和匿名性。但是 Hyperledger Fabric 还没有提供足够的隐私保护机制,比如身份认证、访问控制等。
5.3 扩展能力
Hyperledger Fabric 的扩展能力相比其他区块链平台来说,还有很长的路要走。例如,目前 Fabric 只支持 Go 语言编写的智能合约。同时,Fabric 的一些组件还存在一些性能限制,例如排序服务节点的吞吐量和内存。
5.4 可用性
Hyperledger Fabric 作为开源的分布式系统,它的可用性一直很强劲。但是,当前 Hyperledger Fabric 仍然依赖于底层的组件,如排序服务节点、共识协议等,它们都有单点故障的风险。因此,在实际生产环境中, Hyperledger Fabric 仍然存在潜在的可用性问题。
6. 附录:常见问题与解答
Q:Hyperledger Fabric 是什么?
A:Hyperledger Fabric 是一个开源的分布式账本项目,可以让不同组织的多方参与对交易记录进行管理、验证和协调。它实现了私有/联盟链、金融、供应链等众多区块链应用场景,是继比特币之后又一款重要的公开分布式区块链平台。
