Hyperledger Fabric 中的错误处理

2025 年 5 月 29 日 | 阅读 6 分钟

错误处理是指在软件出现故障情况后,指示反应和恢复的一系列过程。其中一个决定性影响是用户可以通过流畅、易于理解的错误通知来解决问题的选择。错误管理是指在使用、交互等方面审查、诊断和修复故障。

错误管理的重要性

错误管理有助于软件和计算机故障的平稳处理,限制运营在中断后恢复。对于软件故障,开发人员可以编写代码和/或使用软件工具来解决问题。错误管理还可以通过两个重要的好处来描述。

  1. 它有助于主动错误管理:错误管理能够预测错误在发生之前,并且正确的软件可以解决问题;这被称为主动错误管理。
  2. 为软件提供退出策略:虽然可能无法充分处理所有错误和情况,但软件可以以这样的方式装备,即在遇到错误时,它可以终止而不会产生重大问题、安全漏洞等。例如,屏幕上弹出“有问题”的通知是可以接受的。然而,“对象未分配给特定对象使用”的诊断消息,随后导致系统崩溃,应替换为“请联系您的技术支持团队”。
  3. 保持结构的健壮性:通过现代、良好的错误管理,应该积极设计和维护该系统。无论出现更小的错误状况,系统反复在故障模式下运行都不是标准程序。

上述各类在各自加密货币网络中发现的故障可以广义地分为两类:

  • 可重试错误:这些故障需要在软件层面将消息发送到重试机制。这意味着通过重试该过程可以轻松修复错误。
  • 不可重试错误:这些是偶然由于误用而产生的错误,因此必须妥善解决,允许程序优雅地终止。

以下列出了一些 Hyperledger Fabric 中的重要错误类型:

1. 错误类型:gRPC 请求在提交流程中延迟

交易流程中的任何点都可能出现区块链超时。如果请求的执行时间超过基线设定的三十秒时间限制,则会发生错误。

建议的缓解措施是,当相应的智能合约需要执行复杂计算时,将执行时间延长可能半分钟,以减轻问题。

拟议控制措施

1. 在 Fabric 配置中指定

2. 通过在客户端指定以下 gRPC 参数,在 Fabric 客户端中设置企业级超时

3. 消费者端的重试功能机制,同时确保正确处理超时问题。

4. 确保对节点进行适当处理,并在出现问题时继续执行 I/O 操作。

2. 错误类型:并发错误

视图是一个重要的操作,因为另一方面,P2 几乎不可能从其他节点获取 K1 的任何信息,因为该知识只存在于 P1。已证明,虽然交易已提交,但它必须在所有方法都已用尽后才能成功。当用于访问的版本不是当前版本时,第一个操作就无法进行,如果该版本包含同一节点在准备写访问集并完成其交易时在全局上下文中保存的另一个交易所修改的密钥。这可以通过控制 APP 代码中的密钥冲突来解决。

推荐处理方式

  1. 制定架构安排,消除对同一密钥的并行修改。
  2. 实现客户端重试逻辑以避免关键冲突。
    如果 validation code == 11
    Object a = // 要获取最新状态,请再次请求账本。 a.setAction();
    // 对参数 a 执行写入操作
  3. 两个节点是 P1 和 P2。
    • 另一个名为 K1 的键也出现在注册表中。
    • 由于网络延迟,K1 在 P2 的区块链上未出现。
    • 然后,程序在 P2 上进行了一次 Ki 查询,但未收到任何返回。
    • 可以通过开发用于识别和处理由节点延迟引起的潜在信息差异和不一致的系统来避免这种情况。

推荐:使用重试算法来确定当没有收到任何内容时情况是否已改变。通过强制应用程序也不将其报告给先前的赞助者,使 K1 再次变得独一无二,从而使所有其他内容都回退。

3. 错误类型:节点延迟错误

实际上,然而,作者在与 P1、P2 等人进行 Elsies 的同时,也在思考 K1 的存在是否对 P2 区块中的包含有影响。

描述

诸如签名错误背书、设置错误或偶尔的全局状态不一致等原因可能导致销售或背书未成功。

缓解

检查并更改设置。

推荐处理方式

  1. 通过其请求的发现理由可以具有将调用链代码更改为错误代码的策略。
  2. 可以开发一个客户端应用程序,该应用程序可以识别错误并根据它们是可重试的失败来对其进行分类。

4. 错误类型:链码错误

描述

当链码在使用的通道上不可用,或者依赖的链码未能满足查询时,会发生链码之间的连接问题。

缓解

通过双曲后退恢复。

推荐的管理

  1. 链码调用者可以根据错误进行区分。
  2. 客户端应用程序可以设计为将错误识别和分类为可重试的失败。

5. 错误类型:实例化链码错误

ChannelEventHub 暂时不可用

描述

如果事件中心发现多个链码版本,它会进行协商。

缓解

重新加载链码并激活它。

推荐处理方式

尝试在停止所有容器并保留包含源的最新版本后,安装和实例化链码。

6. 错误类型:Docker 日志错误

在实例化链码时,实例概念存在缺陷。

描述

此程序在链码实例化期间发生。

缓解

语法验证以及链码中的逻辑问题是链码初始化失败的主要原因。纠正错误。

推荐处理方式

要查看出现问题时删除的日志,请修复错误并恢复构建链码,执行以下命令:

Docker logs -f peer0.org1.example.com。

7. 错误类型:链码已存在错误

描述:每当计算机假定链码已创建时,就会发生此错误。

缓解措施:终止 Docker 镜像,终止网络,然后重新开始部署公司的网络卡。

推荐管理

使用:startFabric.sh,stop fabric。使用以下命令:/stopFabric.sh npm install-g composer-playground@0.19.8

Rest-server-composerplits 命令用于创建和管理具有新错误处理框架的错误。

现有连接确定为 fmt,并且应该用新的错误处理框架 Errors.new() 或 Errorf() 来替换。您可以设置为使用 Error() 和 ErrorWithCallstack()。

Error(组件代码、原因代码、通信、参数等的随机字符串)

8. 错误类型:调用堆栈错误

ExceptionWithCallstack(组件代码、原因代码、消息、参数等)

调用堆栈

Err = errors."Peer,"

"ConnectionError,"

"尝试连接到本地节点的错误

%s,"

以及 error.Error() 返回的其他错误

或 errors = err.Error尝试连接到远程节点:%s,

"Peer","ConnectionError",和 "err" 由 WithCallstack.Error() 返回

由 WithCallstack.Error() 返回

在此情况下,调用堆栈有助于处理关键错误。

Peer:组件标题

ConnectionError:错误信号的描述。尝试连接到远程节点失败:%s:故障文本和格式参数。

CallStackError 接口方法

CallStackError 接口的一些功能包括以下几点:

  1. GetStack() string 用于获取调用堆栈。
  2. GetErrorCode() 用于获取与错误对应的代码,格式为准备好的字符串。
  3. GetComponentCode() string 用于获取描述原始模块或元素的组件代码。
  4. GetReasonCode() string 用于返回解释底层错误原因的编码。