本文详细介绍了以太坊智能合约中的Oracle概念及其重要性,特别是如何通过使用Provable服务创建自己的Oracle。文章提供了对Oracle的类型、使用场景的深入分析,且通过示例代码演示了如何在以太坊上构建一个获取美国柴油价格的智能合约。
以太坊智能合约是以太坊区块链网络最有价值的特性;最近,基于智能合约在以太坊区块链上开发的应用程序迅猛增长。这些智能合约是沙盒化的,无法访问以太坊区块链外部的数据。以太坊智能合约无法发起 HTTP 调用或访问硬件层;它们仅是代码,只在发送交易时执行。为了为智能合约提供数据访问,并实质上将它们连接到以太坊区块链网络以外的世界,需要一个 Oracle。在本文中,我们将了解如何在智能合约中设置我们自己的 Oracle。
以太坊区块链网络是执行智能合约的一组节点。为了获得相同的一致结果,所有节点必须访问相同的一组输入,这称为确定性。为了验证智能合约的输出,以太坊依赖于这一确定性特性,这意味着验证节点在运行代码时必须都产生相同的输出。
维护这一特性是一项相当棘手的任务。由于以太坊是一个通用平台,其运行的智能合约需要来自诸如互联网等不同外部源的数据。如果无法访问这些外部数据源,智能合约的实用性可能会受到显著限制。另一方面,如果允许节点从这些外部源收集信息,即使是很小的时间差异也可能导致数据不一致,不同节点获取不同的输入,因此产生不同的输出,违背确定性特性,从而导致合约失败。
为了避免此类问题,智能合约被限制与外部数据源交互或调用任何互联网 URL,而这就是 Oracle 提供帮助的地方。Oracle 是智能合约访问现实世界数据的一种方式。Oracle 抓取这些现实世界数据并将其推送到区块链上,以便其他智能合约能够正确访问它们。Oracle 本身是一种智能合约。
以下是一些链外数据存储的例子:
修剪块:以太坊节点可能包含大量数据,但为了优化,可以仅创建一个包含分布式账本一部分的节点。这种节点称为修剪节点,并保存在集中位置。
状态变量:存储在以太坊区块链上的数据无法更改;它是不可变的。然而,状态变量的内容可能会随着账户余额的变化而波动。解决方案是在链外存储此类数据。
Oracles:在本文中讨论。
数字资产:数字资产通常需要大量数据集来定义。考虑到区块的大小有限,将它们存储在链上是不可行的。
Oracle 主要有两种类型:
硬件 Oracle:这是指来自硬件设备的数据,例如条形码扫描仪。这类信息对注册事件的发生很有用。
软件 Oracle:这指的是在线可 readily 用的信息,例如天气预报、燃油费用、汇率、股票价格等。软件 Oracle 为智能合约提供了广泛的最新数据。
在演示与 Oracle 关联的工作时,我们将使用一个名为 Provable 的 Oracle 服务。Provable 是智能合约和区块链应用程序的领先 Oracle 服务,每天在 以太坊, Rootstock, R3 Corda, Hyperledger Fabric 和 EOS 等平台上处理成千上万的请求。
在此演示中,我们将创建一个智能合约,用于获取美国当前的柴油价格。
要开始,我们需要一些测试 Ether。我们将使用 Kovan,你可以将钱包地址粘贴到 Kovan faucet gitter 中以获得。聊天机器人将为你提供测试以太币。确保安装 Metamask 浏览器扩展并创建 ETH 钱包。
前往 Ethereum Remix IDE 并创建一个新的 Solidity 文件,例如 - dieselprice.sol
将以下代码粘贴到你的新 Solidity 脚本中:
上面代码的解释:
第1行:声明 Solidity 版本
第3行:导入最新版本的 Provable API,
第5行:开始我们的名为 DieselPrice 的合约,使用 Provable 指代 API
第7到16行:创建一个变量 dieselPriceUSD,用于存储价格,实例化价格和 Provable 查询事件的事件,创建构造函数
第18到28行:创建一个回调函数,在收到输出后调用智能合约,将回调函数的结果赋值给我们的变量并将价格从美元转换为美分
第30到37行:向构造函数传递一个输出字符串和一个 API 字符串,以获取柴油价格,该 API 以 XML 格式获取信息,fuelPrices.diesel 获取特定标签
编译智能合约并使用 injected Web3 部署它(编译合约前确保在 Metamask 中选择 Kovan 测试网)。忽略关于代码中未使用变量的警告。批准来自 Metamask 的交易。
现在,你将在 Remix 的“已部署合约”部分看到你的合约。打开已部署的合约并点击 dieselPriceUSD - 它将在按钮下显示输出,类似于下图所示。有时你可能需要等待一分钟才能显示真实数据。所以,如果你看到 0 值,请耐心等待并再试一次。
你可以参考 Provable 的官方文档 获取更多示例和用例。
请订阅我们的 时事通讯,获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 与我们联系。你也可以随时在我们的 Discord 社区服务器中与我们聊天,这里有一些你见过的最酷的开发者 :)
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!