常见问题

背书

背书架构:

问题:在一个网络中需要多少个 Peer 节点来对一笔交易进行背书?
回答:为一笔交易进行背书所需 Peer 节点的数量取决于部署链码的时候所指定的背书策略。
问题:一个应用程序客户端需要连接所有的 Peer 节点吗?
回答:客户端只需要连接链码的背书策略所需数量的 Peer 节点即可。

安全和访问控制

问题:

我如何来确保数据隐私?

回答:

对于数据隐私,这里有很多个方面。首先,你可以使用通道来隔离你的网络,每个通道代表网络成员的一个子集,这些成员查看部署到该通道上的链码的相关数据。

其次,你可以使用 私有数据 来保护组织的数据隐私。一个私有数据集合规定了通道中的一部分组织可以背书、提交或者查询私有数据,而不需要额外创建一个通道。在这个通道上其他的参与者只会收到数据的哈希值。更多信息可以参考 在 Fabric 中使用私有数据 教程。注意,在本文档的“关键概念”章节也解释了 什么时候应该使用私有数据而不是通道

第三,作为 Fabric 使用私有数据来对于数据进行哈希的替代方案,客户端应用可以在调用链码之前将数据进行哈希或者加密。如果你将数据进行哈希运算的话,那么你需要提供一个方式来共享原始的数据。如果你将信息进行加密的话,那么你需要提供一个方式来共享解密秘钥。

第四,你可以通过在链码逻辑中增加访问控制的方式,将数据的访问权限限制在你的组织中的某些角色上。

第五,账本数据还可以通过在 Peer 节点上的文件系统加密的方式来进行加密,在数据在交换的过程中是通过 TLS 来进行加密的。

问题:

排序节点能够看到交易数据吗?

回答:

不,排序节点仅仅对交易进行排序,他们不会打开交易。如果你不想让数据经过排序节点,那么应该使用 Fabric 的私有数据功能。或者,你可以在调用链码之前在客户端应用中对数据进行哈希运算或加密。如果你对数据进行加密的话,那么你需要提供一种方式来共享解密的秘钥。

应用程序端编程模型

问题:

应用程序客户端如何知道一笔交易的结果?

回答:

模拟交易的结果会在提案响应中通过背书节点返回给客户端。如果有多个背书节点,那么客户端会检查所有的反馈是否一样,并且提交结果和背书来进行交易的排序和提交。最终提交节点将会验证这笔交易是否有效,并且客户端会通过 SDK 获取交易的最终结果。

问题:

我应该如何查询账本的数据?

回答:

在链码中,你可以基于键来查询。键可以按照范围来查询,复合键还可以通过多参数的组合进行查询。比如可以用一个复合键(owner, asset_id)查询所有某个实体拥有的资产。这些基于键的查询可以用来对于账本进行只读查询,也可以在更新账本的交易中使用。

如果你将资产数据在链码中定义为 JSON 格式并且使用 CouchDB 作为状态数据库的话,你也可以在链码中使用 CouchDB JSON 查询语句来对链码的数据进行富查询。应用程序客户端可以进行只读查询,这些反馈通常不会作为交易的一部分被提交到排序服务。

问题:

我应该如何查询历史数据来了解数据的来源?

回答:

链码 API GetHistoryForKey() 能够返回一个键对应的历史。

问题:

如何保证查询的结果是正确的,尤其是当被查询的 Peer 节点可能正在恢复并且在获取缺失的区块?

回答:

客户端可以查询多个 Peer 节点,比较他们的区块高度、查询结果,选择具有更高的区块高度的节点。

链码(智能合约和数字资产)

问题:

Hyperledger Fabric 支持智能合约吗?

回答:

是的。我们将这个功能称为链码。它是我们对于智能合约的实现,并且带有一些额外的功能。

链码是部署在网络上的程序代码,它会在共识过程中被链的验证者执行并验证。开发者可以使用链码来开发业务合约、资产定义以及共同管理的去中心化的应用。

问题:

我如何创建一个业务合约?

回答:

通常有两种方式开发业务合约:第一种方式是将单独的合约编码到独立的链码实例中。第二种方式,也可能是更有效率的一种方式,是使用链码来创建去中心化的应用,来管理一个或者多个类型的业务合约的生命周期,并且让用户在这些应用中实例化这些合约的实例。

问题:

我应该如何创建资产?

回答:

用户可以使用链码(对于业务规则)和成员服务(对于数字通证)来设计资产,以及管理这些资产的逻辑。

在大多区块链解决方案中由两种流行的方式来定义资产:无状态的 UTXO 模型,账户余额会被编码到过去的交易记录中;账户模型,账户的余额会被保存在账本的状态存储空间中。

每种方式都带有他们自己的好处及坏处。本区块链技术不主张任何一种方式。相反,我们的第一个需求就是确保两种方式都能够被轻松实现。

问题:

支持哪些语言的链码开发?

回答:

链码能够使用任何的编程语言来编写并且在容器中执行。当前,支持 Golang、node.js 和 java 链码。

也可以使用 Hyperledger Composer 来构建 Hyperledger Fabric 应用。

问题:

Hyperledger 有原生的货币吗?

回答:

没有。然而,如果你的网络真的需要一个原生的货币的话,你可以通过链码来开发你自己的原生货币。对于原生货币的一个常用属性就是交易会引起余额的变动。

近期发布版本中的不同

问题:我在哪里能够看到在不同的发布版本中都有哪些变动?
回答:发布版本中的变动记录在 版本发布 中。
问题:如果还要其他问题的话,我在哪里可以获得技术上的帮助?
回答:请使用 StackOverflow

排序服务

问题:我有一个正在运行的排序服务,如果我想要转换共识算法,我该怎么做?
回答:这个是不支持的。
问题:什么是排序节点系统通道?
回答:排序节点系统通道(有时被称为排序服务系统通道)是排序节点初始化时被启动的通道。它被用来编排通道的创建。排序节点系统通道定义了联盟以及新通道的初始配置信息。在通道被创建的时候,在联盟中定义的组织、/Channel 组中的值和策略以及 /Channel/Orderer 组中的值和策略,会被合并到一起来形成一个新的初始的通道定义。
问题:如果我更新了我的应用程序通道,我是否需要更新我的排序系统通道?
回答:一旦一个应用程序通道被创建,它的管理独立于其他任何的通道(包括排序节点系统通道)。基于所做的改动,变动可能需要也可能不需要被放置到其他的通道。一般来说,MSP 的变动应该被同步到所有的通道,而策略的变动一般是针对一个特定通道的。
问题:我可以有一个既作为一个排序节点又作为应用程序角色的组织吗?
回答:尽管这是可能的,但是我们强烈不建议这样配置。默认的 /Channel/Orderer/BlockValidation 策略允许任何具有有效的证书的排序组织来为区块签名。如果一个组织既是排序节点又是应用程序的话,那么这个策略就应该被更新为只有被授权来排序的证书的子集才可以为区块签名。
问题:我想要实现一个针对于 Fabric 的共识,我应该如何开始?
回答:一个共识的插件需要实现在 consensus 包 中定义 ConsenterChain 接口。针对于这些接口已经有了两个插件:solokafka。你可以学习他们来为你自己的实现寻求线索。排序服务的代码可以在 orderer 包 中找到。
问题:我想要改变我的排序服务配置,比如批处理的超时时间,当我启动了网络之后,我该如何做?
回答:这属于网络的配置。请参考 configtxlator

Solo

问题:我如何在生产环境部署 Solo?
回答:Solo 不该用于生产环境。它不是并且永远也不会是容错的。

Kafka

问题:

我如何从排序服务中删除一个节点?

回答:

这个流程有两步:

  1. 将节点的证书添加到相关排序节点的 MSP CRL 中来阻止 Peer 节点连接到它。
  2. 通过使用标准的 Kafka 访问控制措施,比如 TLS CRLs 或者防火墙的方式来阻止节点连接 Kafka 集群。
问题:我之前从来没有部署过一个 Kafka/ZK 集群,我想使用基于 Kafka 的排序服务。我应该如何做?
回答:Hyperledger Fabric 文档假设阅读者大体上已经有了维护的经验来创建、设置和管理一个 Kafka 集群(查看 郑重声明)。如果没有这样的经验你还要继续的话,你应该在尝试基于 Kafka 的排序服务之前完成,至少 Kafka 快速开始指南 中的前六步。你也可以查看 这个示例配置文件 来了解一个关于 Kafka/ZooKeeper 的合理默认值简单的解释。
问题:我从哪里能够找到使用基于 Kafka 的排序服务的 Docker 组件?
回答:查看 端到端的 CLI 示例.
问题:为什么在基于 Kafka 的排序服务中会有对于 ZooKeeper 的依赖?
回答:Kafka 在内部使用 ZooKeeper 来在它的 brokers 之间进行协调。
问题:我尝试按照 BYFN 示例,但是遇到一个 “service unavailable” 错误,我应该怎么做?
回答:查看排序服务的日志。“Rejecting deliver request because of consenter error” 的错误日志一般是和 Kafka 集群的连接错误引起的。请确保 Kafka 集群设置正确并且排序服务节点可以与之连接。

BFT

问题:什么时候会有 BFT 版本的排序服务?
回答:目前还没有具体的时间。我们在 1.x 周期中尝试将它放置到一个发布版本中,比如它会在 Fabric 的一个小的版本更新中。可以查看 FAB-33 来获得更新。