主页 > 安卓手机怎么安装imtoken > 一文读懂智能合约执行引擎的前世今生

一文读懂智能合约执行引擎的前世今生

安卓手机怎么安装imtoken 2023-11-22 05:07:17

作为第一个提出的智能合约语言,Solidity为区块链应用场景打开了一扇新的大门。

- 起源 -

智能合约一词最早由跨学科法律学者 Nick Szabo 于 1994 年提出。 他对智能合约的定义如下:

“智能合约是一组数字定义的承诺,包括合同各方可以执行这些承诺的协议。”

因此,简而言之,Nick Szabo 将智能合约视为一组承诺。 所谓承诺,是指参与者约定的相互权利和义务。 所以智能合约的本质和目的就是承诺本身。 例如,在一个简单的买卖事件中,卖方承诺供货,买方承诺付款。 这两个承诺可以组成一个智能合约。 注意 Nick Szabo 对智能合约的定义中提到的关键词:数字形式和协议。 这两个关键词决定了智能合约不同于传统意义上的承诺,在形式和功能上具有决定性的特征。

“智能合约”最早由以太坊引入区块链。 根据以太坊白皮书,引入智能合约主要是为了解决以下问题:

总之,脚本语言无法满足更丰富的应用操作,于是以太坊设计了独特的智能合约语言Solidity,同时也诞生了执行智能合约的智能合约执行引擎EVM。

从此,区块链技术的应用场景从单一的基于UTXO的数字货币交易扩展到图灵完备的通用计算领域。 用户不再局限于Bitcoin Script支持的简单逻辑,可以自行设计任意复杂的合约逻辑。

- 概述 -

以太坊设计智能合约具有以下设计特点:

▲执行的确定性

确定性是指程序对于给定的输入,无论何时何地执行,无论执行多少次,其输出都是相同的。 由于区块链维护着同一个账本,智能合约执行的确定性可以理解为执行同一个合约的不同节点必须有相同的结果。

以太坊智能合约语言被设计得足够简单。 为了保证执行的确定性,不会实现随机数、不确定(系统)调用等功能。 同时,智能合约的执行是在一个环境受限的虚拟机中进行的。 这样可以在底层保证结果的确定性。

▲ 图灵完备性

图灵完备的语言,比较官方的解释是一种“可以计算所有算法可以计算的问题”的语言,包括死循环。 以太坊引入智能合约的目的是实现图灵完备性,以支持更丰富的应用形态。

引入图灵完备性后需要解决的一个问题是停机问题:一般来说,没有办法判断给定的程序是否会停机。

为了避免图灵完备性带来的宕机问题,以太坊引入了Gas机制,对相关执行流程进行成本计算。 通过以gas为单位计算各种操作的成本(每个操作都会对应一个具体的gas消耗量,即有对应的gas消耗量表),并设置每次执行的gas消耗量上限,即gasLimit,合约执行的累计操作,在gasLimit上限后强制停止执行以太坊图灵完备可以执行什么程序,从而达到关机的效果。 Gas机制的引入使得用户使用应用的复杂度取决于他愿意为此付出的代价,而不是平台的物理限制。

当然,Gas机制的引入还有其他的好处,这里就不一一介绍了。

▲保安

安全作为以太坊的设计前提,也是智能合约需要保证的。 以太坊智能合约的安全性在设计上主要体现在两个方面:

1)相对简单的智能合约语言

与主流的图灵完备语言相比,Solidity语言专注于区块链场景,无需实现多线程、系统调用等诸多语言特性,使其设计尽可能简单。 然而,这也是早期难以使用的原因之一,尽管随着语言的逐渐发展,其功能也在不断增加和完善。

2)智能合约的执行环境充分隔离

以太坊智能合约在以太坊虚拟机 (EVM) 中运行。 EVM 中的执行不仅是沙箱化的,而且实际上是完全隔离的,这意味着 EVM 中运行的代码无法访问网络、文件系统或其他进程。 即使是智能合约也只能有限地访问其他智能合约。 通过操作的隔离,在很大程度上保证了安全可控。

但不可否认的是,以太坊智能合约仍然存在诸多安全问题,比如著名的“重入攻击”。

—— 详解——

接下来,让我们深入了解一下 Solidity 合约的执行引擎——EVM。

EVM 被定义为使用一个字节作为指令的堆栈虚拟机。 栈虚拟机的特点是在执行操作时依赖于与操作数栈(operand stack)进行交互。

Solidity 合约源代码被编译为使用低级的、基于堆栈的字节码,所以我们实际部署在以太坊上并在 EVM 中执行的实际上是一串字节码。 代码由一系列字节组成,其中每个字节代表一个操作。 执行字节码时,根据字节码的操作含义,从第一个字节码开始依次执行,直到执行到代码末尾或出现错误(如遇到REVERT、STOP或RETURN操作码)。 这些操作可以访问三种类型的空间来存储数据:

智能合约的执行过程实际上就是根据操作码定义的行为对三类存储空间进行操作的过程。 让我们用下面的例子来简单地展示一下:

下图为部分合约片段:左侧为合约字节码,右侧为字节码所代表的操作含义

以太坊图灵完备可以执行什么程序_杭州图灵完备科技有限公司_图灵完备是什么

每个操作码的简单含义如下:

PUSH1:字节码16进制为60,操作含义是将下一个字节压入栈

ADD:字节码16进制为01,操作含义是将栈上的两个元素出栈相加,然后将结果放回栈中

MSTORE:字节码16进制为52,操作含义是将第二个出栈的值存入Memory,存入的索引值为第一个出栈的元素

RET:字节码十六进制为f3,操作的意思是执行结束以太坊图灵完备可以执行什么程序,返回结果,结果在Memory中,起始索引为第一个出栈的值,长度为第二个出栈的值堆

将这段字节码放入EVM中执行,其执行过程如下:

图灵完备是什么_以太坊图灵完备可以执行什么程序_杭州图灵完备科技有限公司

其中,PC表示当前执行操作代码的位置。 在合约片段(即:RET操作代码)执行结束时,会从Memory中的60开始取出5个字节的数据。 至此,合约片段执行完毕。 最终结果会返回给调用者!

细心的同学会发现图中的相关指令并没有Storage相关的操作。 其实是因为示例代码中为简单起见没有选择SStore等相关指令,其执行原理与上述表达式类似。

“那么,EVM为什么要这样设计呢?为什么可以通过这些栈的进出、内存的复制、贮存? ”

这就涉及到编程语言的设计。 从理论上讲,在计算的理论体系中,指令集体系结构是计算机的抽象模型,指令集中包含的指令类型的丰富程度直接影响程序表达的丰富程度。 例如,指令集可以包括加减乘除等算术和逻辑运算指令,跳转等控制指令,读内存等数据处理指令。 作为一个虚拟机,你可以根据需要选择或添加指令来构建一个指令集来表达你想要的功能。 例如,EVM 并没有为浮点数相关的操作添加 Storage 相关的指令,所以这从指令层面说明了 Solidity 语言不支持浮点数操作。 指令确定后,借助现代程序设计的一些工具,就可以设计出特定的语言。 所以,在某种程度上,如果有必要,我们也可以实现自己的语言和相应的执行引擎。

- 发展 -

EVM 的本质是通过一种可编程的语言来操作“世界状态”,也就是我们所说的区块链账本。 因此,如何更好更快的运行是智能合约虚拟机的一大追求。

随着不断的发展,业界出现了很多智能合约执行引擎,也不乏新的探索。

本文是【虚拟机】专栏的开篇,介绍智能合约和以太坊智能合约的由来。 下系列文章会详细介绍其他执行引擎,敬请期待!

关于作者

和奇趣链科技基础平台部区块链虚拟机研究组

参考

[1] 智能合约百度百科

[2] 以太坊黄皮书

[3] 以太坊白皮书