智能合约的确定性是什么(智能合约的确定性是指什么)
如果一个程序在不同的计算机、或者在同一台计算机上的不同时刻多次运行,对于相同的输入能够保证产生相同的输出,则称该程序的行为是确定性的,反之则称该程序的行为是非确定性的。使程序产生非确定性的因素有很多,
如果一个程序在不同的计算机上运行,或者在同一台计算机上的不同时间运行,对于相同的输入可以保证相同的输出,那么这个程序的行为就是确定性的,反之亦然,这个程序的行为就是不确定性的。 造成程序不确定性的因素有很多,可以总结为:一般在编写程序时,开发人员会调用系统提供的一些函数和功能,以减少开发工作量。 这些系统函数中可能存在一些不确定的函数,比如生成随机数,获取系统时间。 一旦一个程序调用另一个非确定性程序并使用它的输出,它自己的行为就可能变成非确定性的。 使用非确定性数据源如果程序在运行时获取数据,而数据源提供非确定性数据,那么程序也可能成为非确定性程序。 例如,通过搜索引擎获得某个关键字的前10个搜索结果——搜索引擎可能会为不同的IP地址源返回不同的排序结果。 调用动态调用是指当一个程序调用另一个程序时,如果调用的目标只能在运行时确定,则该调用称为动态调用;相反,如果在运行前可以确定被调用的目标,并且在运行时不能改变目标,则该调用称为静态调用。 因为动态调用的目标是在运行时决定的,所以它的行为是不确定的。 对于区块链上的智能合约,我们一般要求其行为是确定性的,因为非确定性合约可能会破坏系统的一致性。 《区块链》的作者在设计智能合同系统时,必须考虑这个问题,找到排除不确定因素的方法。 那么让我们来看看现有的区块链是如何解决这个问题的。 比特币有一个内置的脚本引擎,用于执行认证脚本,这是区块链智能合约的原型。 开发者可以基于这个脚本系统开发一些简单的应用,但是由于它的指令集非常简单,并且不是图灵完整的,所以能够实现的功能相当有限。 这个系统不提供任何系统功能,不提供任何访问数据的能力,不提供动态调用功能,甚至不提供静态调用,所以比特币的智能合约必须是确定性的。 以太坊以太坊的主要设计思想是提供一个图灵完整的智能契约平台,让用户可以编写任意逻辑的程序。 它专门开发了执行合同代码的虚拟机EVM,设计了类似JavaScript的高级语言Solidity,方便用户开发。 以太坊智能合约不提供任何不确定的系统功能,可访问的数据只是链中的数据,外部的数据需要通过事务发送给合约。 但是以太坊中的CALL和CALLCODE指令的目标地址是通过栈传递的,这使得契约在运行时动态调用其他契约代码,使得契约的调用路径不确定。 好在契约可以访问的数据是确定性的,这样所有节点在动态调用目标代码时都会得到相同的目标地址,保证了系统的一致性。 然而,调用路径的不确定性将导致可伸缩性方面的重要性能损失,这将在智能契约的重新配置(第2部分):并行宇宙和无限扩展中详细介绍。 FabricFabric是超级账本中的子项目,其智能合约使用重量级Docker作为执行环境。 这可能和大家的印象有点矛盾——“Docker不是一直被认为是轻量级容器技术吗?” 其实Docker的“轻”是相对于模拟物理机架构的重量级虚拟化技术而言的。 在区块链应用场景中,Docker是一个相当繁重的执行环境,这也是Fabric的性能瓶颈。目前只能达到每秒几百TPS。 由于Docker的特性,智能合约几乎可以使用物理计算机上的所有功能,因此具有高度不确定性。 因此,Fabric要求智能合约的开发者在编写代码时避免使用非确定性函数,并计划提供一套专门开发的确定性系统函数库供开发者使用。 但由于不确定性无法从底层机制上避免,所以难免有些一厢情愿的想法在于开发者对良好开发规范的遵守。 不确定性,就像一个幽灵,平时好像不存在。在某些极端情况下,它可能会突然出现并导致难以判断的故障。