如何使用以太坊智能合约构建自己的预言机? Plato区块链数据智能。垂直搜索。人工智能。

如何使用以太坊智能合约构建自己的预言机?

阅读时间: 5 分钟

以太坊是第一个继承了创建 dapp、在区块链上交易加密资产等品质的区块链。

它有自己的编程语言来编写智能合约并在以太坊虚拟机上实现它们,从而在执行活动中注入去中心化。 

智能合约执行预定义的代码行并完成预期任务。 但是,如果我们想让智能合约根据实时发生的结果发挥作用呢?

为了实现这一点,我们需要了解区块链预言机的概念,智能合约可以通过它接收来自现实世界的输入。 

什么是加密中的预言机,以及如何在以太坊智能合约中创建预言机? 我们将在下一节详细讨论这个问题。 

博客的关键主题

  • 什么是加密预言机,以及预言机如何工作
  • 不同类型的预言机
  • 从预言机到以太坊智能合约的数据流
  • 如何编写以太坊预言机
  • 加密预言机的问题

什么是 Oracle,为什么需要它?

甲骨文 是充当连接区块链与外部系统的桥梁的实体。 换句话说,预言机将链下事件数据提供给智能合约,以根据输入执行操作。

例如,在投注赛事中,用户可以投注他们认为会赢得比赛的球员。 根据实时发生的情况,将奖励分配给投注赢家的用户。 

区块链预言机有助于将有关获胜者的数据补充到智能合约中。 oracle 上的数据流是双向的,可用于将任何实时数据从天气预报到股市状态再到智能合约。 

以太坊区块链中的每个节点都拥有关于交易的信息,这些信息应该是统一的。 因此,从 API 获取数据可能会导致差异。 相比之下,oracle 将数据加载到区块链上,在所有节点上看起来都是一样的。

区块链甲骨文
区块链甲骨文

如何从 Oracle 访问数据?

智能合约使用请求和响应周期从预言机节点获取信息。 使用 HTTP GET 实现的预言机将接收来自智能合约的请求,回调函数可以从预言机中检索请求的数据。 

通过这种方式,智能合约从预言机收集数据。 每个预言机都被配置为提供特定的信息,您可以寻求第三方服务来获取您要查找的数据。 

以下是一些预言机服务

  • 链环
  • 可证
  • 威网
  • 平行链接等。

预言机的分类

根据获取、验证和传输数据,Oracle 被分为各种类型。 

输入预言机: 最广泛认可的类型,其中数据从实时发生的链下获取。 例如。 股票的价格信息是从链下获得的,以根据金融市场条件触发对智能合约的行动。

输出预言机: 智能合约触发预言机执行操作的输入预言机的反面。 例如。 向存储提供商发送信号以存储数据或启动银行网络进行支付。

跨链预言机: 跨链预言机有助于在不同的区块链上读取和写入数据。 它还可以在一个区块链中触发事件并使它们在另一个区块链上运行。 

支持计算的预言机: 支持计算的预言机利用链下计算来提供服务。 特别是当由于技术或财务限制而导致链上不可靠时,会使用这种类型的预言机。

从 Oracle 中获取数据

第 1 步:智能合约向预言机发送查询。

第二步:查询指向数据载体,从数据源中寻找数据

第 3 步:数据从源中派生并馈送到预言机。

第 4 步:Oracle 根据请求将响应发送给智能合约。 

在以太坊智能合约中创建 Oracle – 代码结构

我们将了解 oracle 如何使用称为 Provable 的 oracle 服务确定比特币的当前美元价格。 

pragma solidity >= 0.5.0 < 0.6.0; //Declaring the Solidity version import "github.com/provable-things/ethereum-api/provableAPI.sol"; //Importing latest version of provable API contract BitcoinPrice is usingProvable { //Contract named BitcoinPrice, UsingProvable refers to the API uint public bitcoinPriceUSD; //bitcoinPriceUSD is the variable created to store the price, Provable query event that makes a constructor event LogNewBitcoinPrice(string price); event LogNewProvableQuery(string description); constructor() public { update(); } // callback function to call the smart contract after the output is received and transfers the result from callback function to the variable assigned function __callback( bytes32 _myid, string memory _result ) public { require(msg.sender == provable_cbAddress()); emit LogNewBitcoinPrice(_result); BitcoinPriceUSD = parseInt(_result, 2); // Let's save it as cents... } //passing output string and API string to fetch bitcoin price to our constructor function update() public payable { emit LogNewProvableQuery("Provable query was sent, standing by for the answer..."); provable_query("URL", "xml("https://min-api.cryptocompare.com/data/generateAvg?fsym=BTC&tsym=USD&e=Kraken" ); } } 

甲骨文问题

考虑到来自第三方的数据的安全性和真实性,Oracle 问题从根本上是去信任智能合约和可信第三方预言机之间的冲突。

智能合约依靠预言机来做出有关其执行的决定,从而赋予它们对其功能的巨大权力。 事实上,智能合约的去中心化性质受到质疑。 

然而,像 ChainLink 和 Oraclize 这样的预言机服务作为分散式解决方案工作,它们基于新颖和经过验证的方法获取数据。 因此,获得的数据是通过分散的方式获得的。  

结论

区块链与现实世界的连接对于向去中心化世界的飞跃具有可接受的意义。 预言机正在为智能合约与实时数据的可靠接口提供解决方案。 

然而,为了实现可持续性,oracle 服务进行了改进,以灌输链下获得的数据的安全性和正确性。 

想要保持更相关 Web3 安全?

关注 羽毛笔审计 对于许多关于 Web3 的最新文章。

23 观点

该职位 如何使用以太坊智能合约构建自己的预言机? 最早出现 博客.quillhash.

时间戳记:

更多来自 散列