div#pop_ad { opacity: 0; }
AD
首页 > 数字货币 > 正文

智能合约为什么对运行环境要求如此苛刻?

[2021-01-29 03:06:41] 来源: 编辑:wangjia 点击量:
评论 点击收藏
导读: 智能合约的性质因为区块链是一个通过多方存储、多方计算的方式来实现数据不可篡改、计算结果可信的分布式系统。智能合约会在区块链网络的多个节点中运行。基于这样的特性,区块链上的智能合约必须要同时具备两种性
智能合约的性质
因为区块链是一个通过多方存储、多方计算的方式来实现数据不可篡改、计算结果可信的分布式系统。智能合约会在区块链网络的多个节点中运行。

基于这样的特性,区块链上的智能合约必须要同时具备两种性质:确定性和可终止性。

什么是确定性?

如果一个程序在不同的计算机、或者在同一台计算机上的不同时刻多次运行,对于相同的输入能够保证产生相同的输出,则称该程序的行为是确定性的,反之则称该程序的行为是非确定性的。

为什么要具备确定性?

如果一个智能合约是非确定性的,那么不同节点运行的结果就可能不一致,从而导致共识无法达成,网络陷入停滞。

为什么要具备可终止性?

如果智能合约是永不停止的,那么节点将耗费无穷多的时间和资源去运行合约,同样导致网络进入停滞状态。

智能合约的确定性与可终止性的挑战

从上一部分的分析中,我们可以了解到,要保证智能合约的正常运行,需要满足两个条件:确定性与可终止性!那么,在实际的智能合约设计中,又面临着哪些挑战呢?

智能合约为什么对运行环境要求如此苛刻?

面临的挑战
确定性的挑战
程序产生非确定性的因素有很多,总结起来有以下几种:

1) 调用了非确定性的系统函数

一般在编写程序的时候,开发者或多或少会调用一些系统提供的函数和功能以减少开发的工作量。这些系统函数中可能会存在一些非确定性的函数,比如生成随机数、获取系统时间等。一旦程序调用了另一个非确定性的程序并使用了它们输出的内容,那么该程序自身的行为也可能会变为非确定性的。

2) 使用了非确定性的数据来源

如果一个程序在运行时获取数据,而数据源提供的是非确定性的数据,那么该程序也可能会变成非确定性的程序。例如,通过搜索引擎来获取某个关键词的前10条搜索结果——搜索引擎针对不同的IP地址来源可能会返回不同的排序结果。

3) 动态调用

动态调用是指,一个程序在调用另一个程序时,如果必须在运行时才能确定被调用的目标,则称该调用为动态调用;反之,如果在运行前即可确定被调用的目标,且在运行时无法变更该目标,则称该调用为静态调用。由于动态调用的目标在运行时决定,因此其行为是非确定的。

一方面,在智能合约的编写中,我们要尽量避免出现非确定性。例如,我们不可以在智能合约中生成一个随机数。

另一方面,在智能合约的运行环境中,我们要尽量避免出现编写的智能合约的语言中,存在非确定的系统函数,以及避免动态调用。

智能合约为什么对运行环境要求如此苛刻?

可终止性的挑战

停机问题(halting problem)是逻辑数学中可计算性理论的一个问题。

通俗地说,停机问题就是判断任意程序是否能在有限的时间之内结束运行的问题。

该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。

艾伦·图灵在1936年用对角论证法证明了我们无法编写出程序P——即不存在解决停机问题的通用算法。这个证明的关键在于对计算机和程序的数学定义,这被称为图灵机。停机问题在图灵机上是不可判定问题。这是最早提出的决定性问题之一。

区块链上的智能合约必须是可终止的,否则将会消耗无限的时间和资源。

从上面的论证已经可以看出,停机问题是不可解的,我们无法在不运行一个程序的情况下,提前判定该程序是否会停机。所以,我们必须设计系统的时候,引入一些机制,来避免这种情况的发生。比如,在以太坊中,采用计价器的方式。运行智能合约,会消耗一种被称为燃料的代币来对智能合约进行计价。一旦燃料耗尽,合约就会执行失败,并且不会退回消耗掉的费用。通过这种博弈论的方式,来避免智能合约进入死循环。

总结

从上面的讨论中,我们知道了,智能合约是运行在区块链系统中的节点之上的。

正是因为运行在各个节点的智能合约,需要保证最后处理数据的状态是一致的,整个区块链系统才能正常运行。

其次,因为当前的智能合约是运行在图灵完备的关键下,所以智能合约必须满足确定性和可终止性!这是区块链智能合约运行环境要求苛刻的根本原因!在第二问中,我们将会一探究竟,对比以太坊、超级账本等主流项目的智能合约运行环境。

添加新手交流群:币种分析、每日早晚盘分析

添加助理微信,一对一亲自指导:YoYo8abc

查看更多:

为您推荐