在以太坊上实现区块链Oracle

TLDR:在这篇文章中,我解释了如何构建以太坊区块链oracle。该服务将根据智能合约的请求查询API,并将所请求的信息添加到区块链。所描述的方法允许多个竞争方部署相同的oracle并且在结果中具有相同的发言权。但是很容易被转换成一个更简单的oracle来服务于一个利益相关者。

背景

然而,以太坊中的智能合约可以为广泛的应用提供动力,并且由于区块链的性质,智能合约缺乏必要的功能:互联网连接。

为什么?你可能会问

以太坊区块链被设计为完全确定性的,这意味着如果有人下载整个网络历史并重放它们,它们应该总是以相同的状态结束。确定性是必要的,以便节点可以达成共识。

但是,互联网不是确定性的,在某个时间点查询API的智能合约,不能保证以后查询相同的API会得到相同的结果。Web上的API和数据发生了变化。因此,智能合约本质上缺乏连通性。

所以神谕,对吧?

oracle这个名字来源于这样一个事实:从历史上讲,oracles是事实的来源。这就是我们所需要的。

Oracles是在智能合约使用的区块链上插入数据的服务。通过将具有所需信息的事务添加到区块链,智能合约可以运行并始终获得相同的信息,因为它从区块链中检索它。

我们将创建一个oracle服务,该服务可以查询JSON API并从API响应中检索单个值。oracle将保存所有请求和答案,并将拥有一组预定义的利益相关者。

这些是运行node.js服务的帐户,该服务查询API并返回对oracle的响应。oracle还具有必须接收的最小数量的相等响应,以确认所提供的答案是有效的。

这样,如果竞争方依赖于oracle来支持他们的合约,并且其中一方(节点)变得流氓或试图操纵结果,那就不能因为他们同意预定义的等量答案的法定人数。

建筑

这个oracle将包含两个组件。on-chain oracle(智能合约)和off-chain oracle服务(node.js服务器)。

on-chain oracle是一个智能合约,它有一个公共函数createRequest,它接收URL,查询和要检索的属性。然后,启动一个事件来提醒新链接oracle的新请求。

脱链oracle由不同方部署的几个node.js服务组成,这些服务将查询API并将响应返回给契约。

然后,链上oracle验证是否已达到最小数量的相等响应,如果是,则发出一个事件,表明它已就该值达成共识,以便查询oracle的客户端智能合约知道它有自己的响应。

在线Oracle实施

我们使用商定的条款定义oracle合约:最低法定人数和总法拉利。对于这个例子,有三个利益相关者,为了达成共识,3个中的2个必须提供相同的答案。

然后我们添加Request Struct,它将保存请求:

现在我们可以创建公共函数createRequest,客户端智能合约(任何想要使用oracle服务的合约)都会调用:

该功能包含利益相关者之间协议的重要部分。受信任参与最终解决方案的帐户的地址。并且将发出将被脱链神谕倾听的事件NewRequest

听完这个事件后,离线神谕将调用公共函数updateRequest

此函数将首先检查调用者是否是预定义地址之一。然后它会检查oracle没有投票,如果是,它将保存oracle答案。然后它将检查该答案是否至少由所需的最低法定人数提供。如果是这样,那么我们就结果达成一致,并将发出一个事件,即UpdatedRequest,以警告客户合约结果。

在这里,您可以找到有关如何使用Truffle来创建样板的完整oracle代码和说明。

离线Oracle实施

这是更简单的部分,它是可以监听发出的区块链事件和查询API的任何服务。

脱链oracle使用web3监听on-chain oracle发出的事件,并查询请求的API,解析检索到的JSON以获取所请求的密钥并调用公共函数updateRequest。因为它不是帖子的焦点这是一项简单的服务,我不会进一步深入了解脱链服务的实施细节。

在这里,您可以找到所有利益相关方应该部署的此服务的代码。

加起来

该实现允许不依赖于单个方来成为事实的来源,因为它是唯一一个查询API,而是让多方同意结果。它也是一种非常灵活的服务,因为它可以查询任何公共JSON API,允许在大量用例中使用。

所有代码都可以在这里找到。

提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢