以太坊oracle:一个人们可能会在Meetups听到或其他技术活动中被抛出的非常模糊的术语。如果你不了解,你可能没有意识到区块链oracle只是一个离线数据源的专门案例,它通过响应合约中的链上事件与以太坊EVM进行交互。这可能听起来似乎挺复杂,但实际上并非如此——只需坚持几分钟。
oracle的主要关注点是在合约要求时将外部数据返回合约。这些数据可以是合约开展业务所需的任何数据:存储在数据库中的客户数量,由40年历史的大型机计算的精算风险评估。在本文中,我们将关注通过易于使用的Dark Sky weather forecast API获得的请求洛杉矶温度时的数据。
Chatty合约
人们需要开始与外界联系,以太坊虚拟机也不例外。否则,它只会是另一个孤立的书呆子,坐在周围,害羞只与自己说话。EVM是一种社交动物,它让你知道它想要聊天的方式是发射一个事件(希望有人在听)。在oracle的情况下,该事件会告诉你合约想要谈论的内容,你要提供的信息以及有时你如何加入对话。如果正在运行的合约是礼貌的话,如果你想知道,它甚至可以通过让你知道你做了什么来完成对话。然而,就像脱衣舞娘和律师一样,对EVM的讨厌会花钱,所以我们将不必要的调情保持在最低限度。
无论如何,让我们开始构建我们的Weather oracle。我们使用的是Web3.js 1.0,它的工作方式与0.2.x版本略有不同。我们还使用Ganache作为testnet,它可以很好地处理Websockets连接和事件。除了Node和Javascript之外,你不需要Truffle或Embark或其他工具——oracle将为你编译和部署合约。
确保安装了最新的Solidity编译器以及solc npm软件包。并且不要忘记安装针对Dark Sky的出站HTTP调用的请求包。
如果你想在家里玩,oracle和测试客户端的完整代码位于https://github.com/robinagist/EthereumWeatherOracle。为了清楚起见,有一些冗余。(注意:我在Javascript和Node上有一点菜鸟,但不是软件,所以请原谅我可能已经Python化了你心爱的Javascript,Python和Go是我的主要语言。)
你还需要在https://darksky.net上获得一个Dark Sky API帐户。
细节
过程很简单:
- 一个帐户(EOA或合约)调用主合约上的方法,询问一些离线数据,然后回归其业务。
- 合约方法与在执行期间发出的事件相关联。
- 将通知oracle(已在合约地址处在线监听此特定事件),并开始处理数据请求。
- 处理完毕后,oracle在合约地址上运行另一种方法,完成调用帐户/合约的数据请求。有时,会从此方法发出一个事件,以便通知调用者。
合约
我们的合约很简单。除了通常的潜在交互者(与构造函数的合约)之外,我们有两种方法和两种事件。第一个被调用的方法是request
。请求没有参数,并且它的唯一目的是在被调用时发出一个TempRequest
事件,希