http://www.7klian.com

Neo智能合约开拓者为什么需要异常处理惩罚机制

请留意,由于 NeoVM 的设计以及利用 neo-boa 举办编译时的优化,生成的操纵码不必然像我们的 PUSH1、PUSH2、ADD 示例那样简朴。
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 从初始状态 NONE 开始执行操纵,只有当 InvocationStack 为空(进入 HALT 状态)或产生错误(导致 FAULT 状态)才遏制。
操纵码是指:对应于要执行的特定操纵,转换为 NeoVM 可以领略的指令。
每当 NeoVM 执行 TRY 操纵码时,城市建设一个 ExceptionHandlingContext,并将新的上下文添加到 TryStack 中。上下文包括重要信息,譬喻指向捕捉异常时要执行的指令的指针或作为最后一部门可选的 Finally 段的指令的指针。其余两个操纵码 ENDTRY 和 ENDFINALLY 用于将 NeoVM 引导至要遵循的下一条指令,以确保代码按预期执行。
无论是由于智能合约的 bug 激发无效生意业务,照旧其他原因导致 FAULT。一旦 VM 达到 FAULT,状态是无律例复的。
因此,在 Neo 智能合约中添加异常处理惩罚成果,办理方案就
需要确保代码段的执行或失败,不会导致整个挪用失败。

正如我们在上一篇文章中提到,建设新的异常处理惩罚机制需要几个新的操纵码,并为它们带来在 NeoVM 中捕捉和处理惩罚异常所需的新逻辑。个中包罗机制自己所需的三条指令:TRY、ENDTRY 和 ENDFINALLY,以及按照需要提供的三个激发错误或对 VM 举办妨碍处理惩罚的指令:ABORT、ASSERT、THROW。
譬喻,要在 NeoVM 中执行简朴的加法计较,我们可以利用 PUSH1 操纵码将数字 1 压入仓库,然后利用 PUSH2 将数字 2 压入仓库顶部,最后利用 ADD 操纵码,将仓库中的前两个值加在一起。
NeoVM 自己无法领略高级编程语言,譬喻 Python 或 JavaScript。一旦开拓人员以他们选择的语言编写了智能合约,就需要将其转换为 NeoVM 可以或许读取和执行的操纵码。
每当碰着异常时,都可以或许在 TryStack 中搜索可以处理惩罚该异常的 try-catch。本质上讲,这意味着可以在 catch 部门中查抄差异条件时暂停合约的执行,从而使 Neo 上的智能合约可以界说本身的可捕捉异常,抢先制止挪用错误,可能在不想被察觉到行为的事件中强制避免错误。
生成智能合约的操纵码版本后,下一步是将其加载到 NeoVM 中,凡是通过事务将合约陈设到 Neo 上来实现。这会将合约存储在每个网络节点上,可以按照需要在个中挪用它。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读