什么是预言机?
智能合约就其性质而言,能够运行各种算法并可以存储和查询数据。 因为每个节点每次都需要大量计算,所以从Ethereum智能合约中进行频繁的网络请求是切不实际的(也是不可能的)。预言机可以监控区块链事件并能将监控结果发回智能合约。这样,智能合约就可以与链外的世界进行互动了。
但是这样有一个明显的信任问题。与信任单一外部数据源的分布式智能合约有些矛盾。不过这可以通过让多个独立的预言机来响应相同的查询最终形成共识来缓解这个问题。
有关预言机的更多信息,请查看在分布式应用程序之间提供“可靠连接”的FinTech公司Oraclize。 他们对预言机的解释很不错。
The Tinypay.co DNS Oracle
Tinypay的预言机做了三件简单的事情:
- 从合同中提取'ClientCreated'事件
- 使用来自事件的数据验证DNS记录
- 域名确认后,向合约发送'ConfirmClient'交易
我经历了几次迭代,最终实现了,我希望通过它们来引导您了解以太坊的发展。
你也可以直接用RPC,不过似乎不应这么干
我第一次写预言机,我用了Go-Ethereum。我想直接使用RPC API与Ethereum节点进行所有通信。
这很有趣,因为我能够学习很多关于以太坊协议如何进行存储和数据编码等较底层的内容。我必须手动重新在代码中创建ABI(应用程序二进制接口),并使用它来发送和解密消息。 ABI对于定义合约如何交互以及如何从线上的原始字节中提取数据是必需的。
从事件中实际提取数据证明比我想象的要复杂得多。Go-Ethereum的处理事件没完成。我被迫手动轮询RPC端点,并找出如何将来自原始事件的二进制数据解码。Go-Ethereum当然似乎是以太坊团队关注的焦点,他们应该很清楚Go-Ethereum在观看和解码事件方面的问题。我希望他们能很快有所提升,这会使得Go-Ethereum成为编写预言机和其他以太坊客户端应用程序的更好选择。
低级别的RPC API和解码API被证明是非常低效率的,并且他们正在更快地进行迭代,所以...
Web3 则是一个很好的抽象
对于第二次迭代,我切换到node.js并使用web3库与geth节点进行通信。 这给了我内置的抽象了的事件查询,数据提取和格式化,而且明显使开发变得更容易。
我开始使用Alex Beregszaszi非常有用的'tinyoracle'指南,这让我在第二版中获得了不错的成果
下面的代码是经过选择编辑的,完整的代码可以在github