JVM上的确定性执行机制

目前的加密货币并不适用于一般性的支付网络

具有加密验证机制的分布式共享总账能够在一些场景下发挥它的作用

通过编程框架编写“智能契约”(smart contract)来构建共享总账,并用于操作共享总账的状态,这已成为一种趋势

从基础计算机科学角度来看,智能契约语言不可避免地存在一些问题

JVM的类加载机制可以规避这些问题,并为智能契约提供了确定性执行(deterministic execution)机制

很多开发人员对比特币和加密货币都有所了解。媒体上充斥着各种耸人听闻的非法交易和犯罪活动事件,这些事件的中心内容都与比特币有关。

比特币的主要属性(公开的交易匿名总账、不可逆的交易、不可靠的账号网络)在支付网络的日常合法交易中表现得力不从心,这种趋势日渐突显。

不过,如果单纯从技术角度来看,加密货币的开发在某些方面还是很有趣的。它们在合法领域的应用开发才刚刚起步。随着比特币和加密货币技术的发展,一些有趣的技术开始显现出来。

这类系统可能在一些行业领域取得成功,比如供应链管理、金融技术(包括清算系统)和所有权登记(特别是对于那些在行政区域内存在录入或腐败问题的物理资产)。2016年的“区块链”热潮正在褪去,不过其相关的技术可以被用于真实场景。

由Linux基金维护的Hyperledger就是一个很有趣的项目,包括分布式总账、区块链和机密货币相关技术,有80多个组织对此感兴趣。 

这篇文章将聚焦在这个新兴领域的一个特定技术上。试想这样的一种情况,如果共享总账的参与各方彼此了解(可能存在某种被信任的集中式第三方机构,它会分发秘钥对给参与者),那么不可靠性就不再成为问题,公开挖矿(以及大量相关的验证工作)也可以被丢弃掉。

不过即使是这种非常简单的情景,仍然存在一些问题。我们比较关注的一个问题是,如何能够确保每个参与方执行的是一个智能契约,而且这些契约对总账产生的效果是相同的(假设所有参与方都是从相同的总账状态开始的)。

换句话说,健壮的智能契约框架需要确保每一个契约都能够按照确定性来执行,并能够终结执行。这是计算机科学理论研究领域的一个老问题。

每个计算机专业的学生都知道,图灵机是计算机程序执行模型的理论基础。图灵机理论揭示了图灵机与运行在物理机上的等价程序之间的相关性。

因此,编程语言可以被归入图灵语言的范畴,图灵语言可以模拟出所有可能的图灵机(假设内存是无限制的)。非图灵语言显然不如图灵语言来得强大,而且对于计算机科学来说,非图灵语言也不如图灵语言来得有趣。

这种划类是有意义的,但它仍然存在停机问题,这是计算机科学领域的一个基础问题。该问题最初由阿兰·图灵提出:在一个给定的初始状态,不可能存在一种通用的算法,可用于确定一个图灵机是会停止还是会一直运行下去。

这个问题给确定性执行的概念带来了阻碍,在一些基本条件无法得到满足的情况下,比如停机行为不可预测,我们该如何确保所有的程序能够产生相同的结果?幸运的是,有一些技术可以帮组我们绕开停机问题。

首先,我们知道图灵机的定义里有一个前提,就是存储是不受限制的(对于内存也是如此)。但现实的计算机所使用的存储是有限的。或许我们可以通过限制程序和计算的规模来规避停机问题,而函数编程为我们带来了一些启示。假设我们把程序看成从X到Y的有限状态的单次转换(这里的状态可以指有限的图灵机存储),使用符号表示如下:

f : X -> Y

现在,我们把所有可能的程序看成一个空间(有限的),我们往这个空间里添加了一个特别的状态,表示程序在一定时间内不会停止,那么我们就建立起了一个有限(但是很大)的map。

这个map代表了所有可能的程序。map的键是(start_state,program_code),map的值是程序的停止状态,这些状态可以通过在程序上应用start_state获得。这是著名的函数编程技术——备忘录(memoization)。在一个不存在副作用的编程语言里,我们可以使用预计算的结果代替函数调用。也就是说,对于有限状态空间和有限程序来说,它们可以避免停机问题。

不仅如此,函数式思维还为我们带来了关于确定性执行的一般性定义:

给定状态X和函数f,在有限的时间内,不管是谁将函数f应用在X上(假设运行平台具有一致的语义),总能产生相同的状态Y。

不过要注意,确定性执行要求我们在不执行代码的情况下,使用一些编程手段确定一个函数是否满足确定性执行条件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6242d991282a1632609e11cd4890b812.html