请(qǐng)选择 进入手机版(bǎn) | 继续访问电脑版
首页 百科 查看内容
  • 3393
  • 0
  • 分享(xiǎng)到

智(zhì)能合约的(de)确定性

2018-5-13 18:26

来源: 链门户

如果一个程(chéng)序在不同的计算机(jī)、或者在同一台计算机上的(de)不同(tóng)时刻多次运行,对于相同的输入(rù)能够保证产生相(xiàng)同(tóng)的输出(chū),则称该程(chéng)序的行(háng)为是(shì)确定性的,反之则称该程序的行为是非确定性(xìng)的。使程(chéng)序产生非确(què)定性的因素有(yǒu)很多,总结起来有(yǒu)以(yǐ)下几(jǐ)种:

调用了非确定(dìng)性的系统函数

一般在(zài)编写(xiě)程序的时候,开发者或多或少(shǎo)会调(diào)用一些系(xì)统提供(gòng)的函数和功能以减少开发的工作量。这些系(xì)统函数中可能会(huì)存在一些非(fēi)确定性的(de)函(hán)数,比(bǐ)如生成随机数、获取系(xì)统时间(jiān)等(děng)。一旦程序(xù)调用(yòng)了(le)另一个非确(què)定性的程序并使用了它们输出的内容,那(nà)么该程序自身的(de)行为也可能会变为非(fēi)确定性的。

使用了(le)非(fēi)确定(dìng)性(xìng)的数据来源

如果一个(gè)程序在运行时获取数据,而数(shù)据源提供的(de)是非确(què)定性的数据,那么该程(chéng)序也可能会变(biàn)成非确定性的(de)程序。例(lì)如,通过搜索引擎来获取(qǔ)某个关键词的前10条(tiáo)搜索结果——搜(sōu)索(suǒ)引擎针对(duì)不同的(de)IP地(dì)址来源(yuán)可能会(huì)返回不同(tóng)的排序结果。

动(dòng)态调用

动(dòng)态(tài)调用是指,一个程序在调用另一个程序时,如果必须(xū)在运行(háng)时才能确定被调用的目标,则称该调用(yòng)为动态调用;反(fǎn)之,如果在(zài)运行前即可(kě)确定(dìng)被(bèi)调用的目(mù)标,且(qiě)在运行(háng)时无法变更该目标,则称该调用为静态调(diào)用。由于动(dòng)态调用(yòng)的目标(biāo)在运行时决定,因此(cǐ)其行(háng)为是非确定的(de)。

对于区块链上的智能合约,我们一般要(yào)求它的行为必须是(shì)确(què)定性的,因为非确定性的合约可能会(huì)破坏系统的一(yī)致性。区(qū)块链(liàn)的(de)作(zuò)者必须考虑到(dào)这个问(wèn)题,并在设计智能合约系统的时候,就想办法把非确定性因素排除在外。那么(me)我们来(lái)看看现有的各个区块链是如何解决这个(gè)问题的。


比(bǐ)特币内置了一套脚(jiǎo)本引擎(qíng),用于执行鉴(jiàn)权脚本,它是区块(kuài)链(liàn)智能合约的雏形。开发者可以基(jī)于这套脚本(běn)系(xì)统来开发一些简单的应用,但由于(yú)其指令(lìng)集非常简单且非图(tú)灵(líng)完备,能(néng)够实(shí)现功能相当有限。这套系(xì)统既没(méi)有提(tí)供任何系统(tǒng)函数,也没有提供任何访问(wèn)数据的能力,更没有动态调用的功能,甚(shèn)至连静态调用也没有提供,因此比特币的智能(néng)合约一定是(shì)确定性的。


以太坊的主要设计思想,就是提供一个(gè)图灵完备(bèi)的智能合约平台,让用户可以编写(xiě)任意逻辑的程序。它专门开发了一个用(yòng)于执行合约代(dài)码的虚(xū)拟机(jī)EVM,并设计了一种类似于JavaScript的高级语言Solidity,以方便用户进行(háng)开发。以太(tài)坊智能合约没(méi)有提供(gòng)任何非确定(dìng)性(xìng)的系统(tǒng)函数,可访问(wèn)的数据也(yě)仅限于链内数据,外部数据需要通过交(jiāo)易(yì)来发送到(dào)合约(yuē)。但是,以(yǐ)太(tài)坊(fāng)的CALL和CALLCODE指令的目标地(dì)址(zhǐ)通(tōng)过(guò)栈来传递(dì),使得合约可以在运行时动态调用其它的合约代码(mǎ),使合(hé)约的调(diào)用路径变为非确定性(xìng)。好在合约可以访问到(dào)的数据都(dōu)是确定性的,使得所有节点在动态调用(yòng)目标代码时一定(dìng)会获得相(xiàng)同(tóng)的目标地(dì)址,保证了系统的一致性。但(dàn)是调用路径(jìng)的(de)非确定性,会导致一个可扩展(zhǎn)性(xìng)上的重要性能损(sǔn)失,具体会在《重(chóng)构智能合约(中):平行宇宙与无限扩展》中(zhōng)详述。

Fabric

Fabric是超(chāo)级账(zhàng)本中的一个子项目,它的智(zhì)能合约采用(yòng)了重量级(jí)的Docker作为(wéi)执行环境(jìng)。这可能跟大家(jiā)的印象有点矛盾——“Docker不是一(yī)直(zhí)被认为是(shì)一(yī)种(zhǒng)轻量级的容器技术吗?”。实际上,Docker的“轻”是(shì)相对于模拟物理机架构的重量级虚(xū)拟化技(jì)术而(ér)言(yán)。在(zài)区块链(liàn)应(yīng)用场景下,Docker是一个(gè)比较“重”的执行环境,这也是Fabric的性能(néng)瓶(píng)颈所在,目(mù)前只能达(dá)到每秒几百TPS。由于Docker的特性,智能(néng)合约几乎可以使用物理计算机(jī)上的所有功(gōng)能,因此具(jù)有极高的(de)非确定性。所以Fabric要求智能合(hé)约的开发(fā)者在编写代码的时(shí)候尽量避免使用到具(jù)有(yǒu)非(fēi)确定性(xìng)的功能,并计划提供一套专门开发的确定性系统函数库供开发者使用。然而,由于(yú)无法从底层机制上避(bì)免(miǎn)非确定性的产生,寄托于开发者(zhě)遵(zūn)守(shǒu)良好的开(kāi)发规范难免(miǎn)有些一厢情愿。非(fēi)确定(dìng)性就像幽(yōu)灵一般,平时似乎并不存在,在(zài)一些边缘案例(corner case)上就可能(néng)会突然冒出(chū)来造(zào)成难以判断的故障。
乐鱼官方端网站登录入口-乐鱼leyu(中国)
版权申明:本内容来自于互联网,属第(dì)三方(fāng)汇(huì)集推荐平台。本文的版权(quán)归原作者所有(yǒu),文(wén)章(zhāng)言论不代表链门户的(de)观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。
相关新闻(wén)
发表评论

请先 注册/登录 后参与评论(lùn)

    回顶(dǐng)部

    乐鱼官方端网站登录入口-乐鱼leyu(中国)

    乐鱼官方端网站登录入口-乐鱼leyu(中国)