Status: In progress
在今年大火的众多DIFI概念项目中,有一类DIFI项目显得特立独行,它不属于金融交易平台,不提供抵押借贷服务,但是却伴随着DIFI的大火而暴涨,这就是Oracle(预言机)类项目。
预言机虽然跟甲骨文公司(Oracle)名字一样,但是跟甲骨文是没有一点关系,在区块链里,预言机更多的是oracle的本意“先知”。
跟预言机相对应的一个概念是图灵机,从事计算机和互联网行业的小伙伴应该对图灵机不陌生,这是一个抽象的通用计算模型,主要是用来做计算用的,我们现在的手机啊,电脑啊,游戏机啊,区块链矿机啥的都是图灵机,你用这东西可以来做很复杂的计算,算天体运行周期,算火箭轨迹,挖矿啊等等。图灵机很强大,但是它也不是万能的,有很多问题图灵机也做不了,比如你想知道你女朋友今天的心情;或者你想知道你前女友是不是结婚了;也或者你想知道今天彩票的中奖号码。这些图灵机都没办法回答你。而预言机就是为了回答这些具有不确定预言性质的问题而存在的。
我们都知道区块链的智能合约是一个封闭的执行环境,任何一笔链上交易在任何节点在任何时候执行都应该是确定的,结果都应该是一致的,因此智能合约在执行的时候,智能依赖于当前链上存在的数据而不能依赖链外的不可靠数据。
确定性和一致性这件事对于有多重要呢? 就好比一个男的带儿子去做亲子鉴定,那个人当然是期待这个结果是确定的唯一的,这样他才能放心;假如说这时候一对父子,每次鉴定的结果都不一样,那这个亲子鉴定服务谁还敢用。同样的道理,假如一笔转账交易,你给我转钱的时候我看明明是转了10个neo,结果我明天再看,同一个转账交易变成了你只给我转5个neo,那我肯定分分钟爆炸,奉劝你耗子尾汁。
智能合约的封闭性就是为了实现这种极端严格的确定性和一致性而设计的,在经典的智能合约设计里,一个确定的交易只能依赖于区块链确定的数据源,得到严格确定的结果。
但是问题是,链上的数据太少,只依赖于链上已有的数据来执行智能合约严重制约了智能合约的应用场景。你可以用智能合约来做ICO发行自己的代币,你也可以通过交易来触发智能合约。但是你没办法通过链外的【事件】来触发合约:比如你没办法在智能合约里【比特币价格超过20000美元】的时候执行卖出行为,智能合约没办法知道什么时候比特币价格是什么;你不能用天气的变化,股价的涨跌,国际大势,机票余票,实时汇率等等在日常生活中无处不在的数据作为事件触发智能合约。这些【链外】数据它们会变化,你当前执行一笔交易如果依赖于这些链外数据,那么这个交易在不同的节点验证的时候获取到的数据可能会不同,从而导致交易验证不通过。而即使当前验证通过的交易,在之后再次需要验证(数据同步)的时候又会因为外部数据变化而失败。因此链外数据作为交易执行的依据会破坏合约交易的确定性和一致性。
而预言机,就是为了解决这个问题而存在的。简单来说,预言机为智能合约提供可靠稳定的链外数据。抽象一点,我们可以把预言机当成是区块链的永久的链外数据缓存机制,当区块链需要链外数据的时候,它通过预言机向链外数据源请求数据,然后把数据永久缓存在预言机里,这样当以后区块链再次需要这个数据的时候,就直接从缓存里读取,而不是从现实世界中获取,从而避免了因为外界数据变化而导致链内交易的不确定性。
设计预言机有三个主要的技术挑战。
首先是确定数据源,也就是如何寻找可靠的稳定的数据源。把链外数据输入到区块链世界里看起来是那么简单而美好,但是当我们真的去实施的时候往往面临很多意想不到的麻烦,比如币价。区块链以及虚拟货币玩家大概都已经习惯了经常去查看比特币的价格,这个价格往往都是一个很确定的值,有时候甚至精确到小数点后两位,但是这个价格确定是比特币的当前价格么?你在火币网上看到一个价格,你再去coinbase上查查,是不是一致的呢?肯定不一样对吧。同理我们查机票余票以及票价,不同平台给的结果也往往是大同小异,所以现实世界中的数据都不一致的时候我们要怎么办呢?
第二个挑战,时效问题。时效问题的意思就是预言机提供数据要及时。我们知道现在区块链面对的一个首要挑战就是TPS过低,无法进行大规模商用,其共识周期短则十几秒,多则十分钟。而研究人员主要的工作之一就是设计出高效的共识算法,可以尽量快的,大量的处理用户的交易。如果在交易的验证过程中需要调用大量的预言机接口,且每次调用都需要等待很久才能获得响应,那么这样将会极大的影响区块链共识的效率。因此如何及时的向区块链返回数据请求也是预言机需要解决的一个问题。
第三个挑战,信任问题,为什么信任预言机。这个其实应该是预言机的首要问题,但是因为谈到这个问题的时候还会涉及到前文提到的内容,所以放在最后聊。信任问题具体来说就是,在数据源确认的情况下,我们如何确认预言机提供的数据就是来自数据源的,换句话说,我们如何避免预言机构造虚假的数据。预言机的工作流程大致是收到来自区块链的数据请求,然后向数据源获取数据,之后返回结果到区块链。由于缺乏对外沟通的接口,区块链是没有任何手段来对这个返回的数据的完整性和真实性来进行验证的(公钥验证除外)。所以,我们如何确定预言机返回的数据是真实的没有被篡改的呢?
以上三个问题算是当前在设计预言机的时候需要特别注意的技术挑战。在下一篇文章里,我将详细介绍已有的预言机解决方案里是如何解决上述问题以及依然存在的薄弱点。