Neo3 智能合约的异常处理惩罚机制再一次为 dApp 开拓人员提供了一个强大的开拓支持,再一次向对开拓者最友好的开放平台迈近了一步。操纵码加载到 NeoVM
设计此机制的一个显著长处是它对 try-catch 嵌套的支持,答允在另一个 try-catch 中再执行一个 try-catch。假如第一个 try-catch 没有捕捉到异常,则将进入第二个 try-catch,直到被捕捉或触发妨碍为止,从而提供更大的机动性。
对付 Neo 合约开拓人员而言,,各类操纵码的布置都由编译器处理惩罚,这意味着他们可以会合精神在源代码级别为其合约添加异常处理惩罚。譬喻,Python 开拓人员将可以或许在他们的代码中利用 try 和 except 代码块,由 neo-boa编译器举办表明,以沟通的捕捉条件添加到最终的智能合约中。
在深入先容详细的实施方案之前,先通过本文来康康 Neo 智能合约的逻辑轨迹,以便更好地领略新异常处理惩罚机制的执行观念。
挪用由适当定名的 InvocationStack 处理惩罚,它是 NeoVM 执行引擎的要害组件。挪用智能合约时,合约字节码和任何其他相关参数都将加载到 VM 中,从而建设正在运行的执行上下文。该执行上下文可以被认为是用于执行相关操纵的断绝情况。执行期间处理惩罚异常
将 Python 源代码编译为 Neo2 操纵码。
源代码到操纵码
为表明这一机制设计,NGD 上海协议组认真人卢川在 Neo 专栏中颁发了初始版本的简介。固然尚未完全表明执行完的实施机制,但卢川引入了该系统的两个重要部门:TryStack 和 ExceptionHandlingContext。
转换进程由编译器处理惩罚,编译器将智能合约的源代码转换为筹备由 NeoVM 执行的操纵码。在 Neo 生态系统中,有面向多种语言的编译器,譬喻焦点C#编译器 Neon、Python 的 neo-boa、以及 Go 的 neo-go。
操纵码是指:对应于要执行的特定操纵,转换为 NeoVM 可以领略的指令。
每当 NeoVM 执行 TRY 操纵码时,城市建设一个 ExceptionHandlingContext,并将新的上下文添加到 TryStack 中。上下文包括重要信息,譬喻指向捕捉异常时要执行的指令的指针或作为最后一部门可选的 Finally 段的指令的指针。其余两个操纵码 ENDTRY 和 ENDFINALLY 用于将 NeoVM 引导至要遵循的下一条指令,以确保代码按预期执行。
无论是由于智能合约的 bug 激发无效生意业务,照旧其他原因导致 FAULT。一旦 VM 达到 FAULT,状态是无律例复的。
因此,在 Neo 智能合约中添加异常处理惩罚成果,办理方案就需要确保代码段的执行或失败,不会导致整个挪用失败。