「三分钟入门 Neo3」的新系列,将介绍针对 Neo3 虚拟机(VM)正在开发的异常处理新机制。Neo 智能合约中增加了异常处理功能,旨在使它们能够在面对意外 bug 时尽快恢复正常运作。
本文将先简单介绍「异常处理」的概念以及 Try-Catch 的初步方案。
Neo 虚拟机
所有部署在 Neo 区块链上的智能合约均由 NeoVM 的网络节点执行。调用合约时,与调用事务关联的输入将通过 VM 内部的合约字节码运行。可在此处找到有关 NeoVM 工作原理的交互式指南。
● https://neoresearch.io/nvm-learn/
Neo 上的每个节点将在相同的 VM 上执行相同的代码,因此调用结果的成功或失败是确定的。好处是,如果交易中输入的内容无效(例如,尝试发送比地址更多的资产),交易将不会继续进行,并且合约将被停止执行。
在某些情况下,希望合约能够直接自如地处理意外情况再继续运作。为了使之成为可能,开发人员需要确保他们的智能合约具备预测此类意外事件并对其做出相应反应的能力。
而这需要通过实施异常处理机制来实现。该机制允许开发人员编写特殊指令以保证在发生意外错误时可以使用。这些可以简单地记录日志,并将遇到的特定问题通知开发人员以帮助调试,也可以提供进一步的代码来分析和处理调用。
Try-Catch 初步方案
处理异常的常用方法是 Try-Catch 机制。该机制使程序能够提前测试异常,而不是随机遇到异常就崩溃。该程序将在 Try 部分中运行要检查的代码,然后在 Catch 部分中检测并处理所有问题。
Neo 创始人兼核心开发者张铮文最初于 2018 年 7 月提出了在 Neo 智能合约添加异常处理功能的想法。对此,NeoResearch 的 Igor Coelho 认为可以尝试捕获机制,使用新的 Try 操作码,以便在发生异常时记录 VM 跳转的位置。
Coelho 提供了这种行为的简单示例,展示了零误差除法。在当前的 Neo2 VM 中,这些指令将触发 FAULT 状态并结束执行合约。
通过建议的 Try 操作码跳转位置,可以预测并处理故障。在执行要监视的代码之前,Try 操作码可以为 VM 提供有关发生故障时应去何处进一步指令的信息。在建议的设计中,采取 Catch 操作码的形式,可以提供发生异常的原因。
Neo 开发人员之间进一步讨论考虑了实现最后一个操作码的有用性,该操作码将包含要运行的代码段,而不管是否捕获到异常,是否应该允许多个捕获段。
铮文提供了一套完整的操作代码,用于最终实现合约的 Try-Catch-Final。值得注意的是,这里提到的条件抛出操作码 THROWIF和THROWIFNOT,后来被 ABORT 和 ASSERT 指令所取代,旨在提高智能合约和钱包的安全性。
在下一篇文章中,我们将更详细地研究 Neo3 异常处理的过程。