上一篇,我写了用Web3.js构建以太坊Oracle。这个练习给了我一些新的Web3.js 1.0版本知识。许多新的好东西可供选择而且使用它实现一个简单的oracle非常容易。但是,显然必须有更好的方法。
Instant Oracles,只需添加处理程序!
Ezo(发音为eh-zoh)是用于构建和运行以太坊的离线事件响应器的工具。受到ServerLess和Gordon等AWS工具集以及Django,Rails和Truffle等开发工具的启发,Ezo开始将大多数oracle开发减少到几个命令并自定义生成的Python事件处理程序。当然,这不是空话,我在晚餐前几分钟,即可让我们在沙拉三明治到达之前建立一个简单的时间戳oracle。
为什么一个时间戳oracle?
在以太坊虚拟机(EVM)上,时间以(大约)15秒块为单位进行测量。你和我都没有看到时间的概念。在EVM上,你只能真正知道块计数(自链生效以来生成的块数),并且可能会在一秒,十秒或更长时间内发生变化。然而,以太坊合约的现实可以与外界牢固地联系在一起。它可能具有法律约束力的协议,必须在外部世界的时钟上执行。如果合约需要知道什么时候它是脱链的,以便完成它的工作,它必须问别人。我们简单的oracle将简单地抓住系统的纪元时间并将其发送回调用合约上的方法。
它是如何工作的?
在它最基本的形式中,Ezo使用简单模型与所有合约进行交互:
单个合约事件响应者的顺序很简单:
- 1.oracle开始倾听事件。
- 2.账户实体在合约上执行请求方法。
- 3.该合约发出命名事件。
- 4.监听每个新区块的oracle接收事件。
-
- oracle执行特定事件所需的处理。
- 6.然后oracle打包处理结果并将响应发送给调用合约。
Ezo可以同时执行多个合约的复杂操作。但是,就我们的时间戳响应者而言,我们只需要一份简单的合约。幸运的是,Ezo带有Timestamp Oracle合约。
pragma solidity ^0.4.21;
// Timestamp Oracle
// Generated by ezo
//
// use at your own risk
//
contract TimestampRequestOracle {
address public owner;
uint public _timestamp;
event TimeRequest(address sender);
event RequestFilled(address sender,uint timestamp);
function constructor() public {
_timestamp = 0;
owner = msg.sender;
}
function sendTimestampRequest() public {
emit TimeRequest(msg.sender);
}
function setTimestamp(uint timestamp) public {
_timestamp = timestamp;
emit RequestFilled(msg.sender, _timestamp);
}
function getTimestamp() public returns (uint) {
return _timestamp;
}
}
实体(合约/所有者帐户)运行不带参数的sendTimestampRequest()
方法。我们的oracle将获取T