首页 百科 查(chá)看内容
  • 3394
  • 0
  • 分享到

智能合约(yuē)的确定性

2018-5-13 18:26

来源: 链(liàn)门(mén)户

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

调用了(le)非确定性的系统函(hán)数

一般在编写程序的时候,开发者或多(duō)或少会(huì)调用一些系统提(tí)供的函(hán)数和功能以减少(shǎo)开发的工作量。这些系统函数中可能会(huì)存在一些非确(què)定(dìng)性的函数,比如(rú)生成(chéng)随机(jī)数、获取系统时(shí)间等。一旦程序调用(yòng)了(le)另一个非确定性的程(chéng)序并使用了它们(men)输(shū)出的内容,那么该程(chéng)序自身的(de)行为也可能会变为非确定性(xìng)的。

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

如(rú)果一个程序在(zài)运(yùn)行时获取数据,而数(shù)据(jù)源提供的是非确定性(xìng)的数据(jù),那(nà)么该程序也可能会变成非(fēi)确(què)定性的程序。例如,通过搜(sōu)索引(yǐn)擎来获(huò)取(qǔ)某个关键词的前10条搜索(suǒ)结(jié)果——搜索引擎针对不同的IP地址来源可能会返回(huí)不同的排(pái)序结果。

动(dòng)态调用

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

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


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


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

Fabric

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

请先 注册/登录 后参与评论

    回顶部

    bsports-b(中国)一站式体育服务官方网站

    bsports-b(中国)一站式体育服务官方网站