主页 > imtoken钱包app下载 > 区块链Oracle预言机实现教程【附代码】

区块链Oracle预言机实现教程【附代码】

imtoken钱包app下载 2023-06-22 06:15:26

区块链本身是封闭的。 区块链的确定性模型是基于区块链在交易执行过程中不能执行任何外部逻辑,所有外部数据只能通过交易进入系统。 预言机/Oracle是一种通过交易为智能合约提供可信数据的服务。 Oracle虽然听起来很神秘,但它的实现并不复杂。 在本文中,我们将介绍预言机的功能和运行原理,通过天气数据预言机WeatherOracle的完整实现过程,帮助您快速掌握区块链预测机器/Oracle的本质。

区块链开发课程精选

1、为什么智能合约需要预言机/预言机?

智能合约中执行的逻辑不能在区块链之外执行任何操作,例如,它不能访问互联网上的 Web 服务。 外部数据进入智能合约的唯一方式是将其放入交易中,通过向系统发送新交易来触发区块链状态的更新。

试想一下,如果智能合约在执行过程中可以访问外部API获取数据会怎样?

如果今天部署此合约,API 可能会返回以下数据:

{ "foo": "bar" }

但是当你明天再次部署时,API 可能会返回新的数据,例如:

{ "foo": "baz" }

那么可以想象,如果一个月后有人同步以太坊区块链,智能合约会执行,但是API的响应数据和一个月前不一样,就会导致重新同步

区块链的状态不同于之前已经存在的节点状态。

这不再是一个完全自主的区块链。 经过同样的同步过程,我的区块链和你的不一样!

让我们换一种说法:给定一组区块,节点必须能够在没有互联网连接的情况下从头开始重现区块链的最终状态。

那么这对智能合约开发者意味着什么呢? Oralce(预言机),开发者必须构造一个预言机来实现智能合约与外界的交互。

2、如何实现一个简单的oracle/Oracle?

现在让我们创建一个简单的 oracle/oracle 来将外部天气数据提供给智能合约:

oracle arch

以太坊网络拥堵_以太坊网络事件通知不稳定_以太坊主要包含三种类型的网络

在底层区块链平台上,我们需要部署一个智能合约。 该合约有一个方法 updateWeather() 来更新天气状态。 只有合约白名单中的地址才能调用该方法。 updateWeather方法接受天气数据作为参数,同时触发一个以太坊合约事件,将天气数据作为事件参数,以便JavaScript应用订阅该事件并获得异步通知。

同时,我们会创建两个nodejs进程,其中一个是oracle/Oracle。 其实现逻辑是周期性轮询第三方天气API获取天气数据,然后将天气数据提交给智能合约进行历史审计。

另一个nodejs进程负责订阅智能合约的天气事件,然后在控制台输出事件参数。 如前所述,只要 oracle/Oracle 调用合约的 updateWeather() 方法,就会触发一个天气事件。

需要指出的是,为了便于理解oracle机的核心实现思想,对以下代码进行了简化,去掉了必要的错误处理,因此不适用于生产环境。

源代码在这里:

接下来,我们详细解释一下这个简单的oracle的实现。

3. oracle智能合约的实现

智能合约有一个公共的oracleAddress状态变量,用于表示允许调用智能合约updateWeather方法的账户地址。 我们在构造函数中分配它:

contract WeatherOracle {  
  address public oracleAddress;
  
  constructor (address _oracleAddress) public {
    oracleAddress = _oracleAddress;
  }
  
  // ...
}

以太坊主要包含三种类型的网络_以太坊网络事件通知不稳定_以太坊网络拥堵

接下来我们定义天气事件,当 weatherUpdate() 调用成功时会触发该事件。 同样为了简单起见,让我们让这个事件简单地采用一个表示温度的字符串参数。

event WeatherUpdate (string temperature);

最后,我们必须实施 updateWeather() 方法。 它的可见性是公开的,这意味着可以从外部调用此方法:

function updateWeather (string temperature) public {
    require(msg.sender == oracleAddress);
    emit WeatherUpdate (temperature);
  }

注意 require 语句。 只有当调用地址(msg.sender)与白名单地址(oracleAddress)一致时,方法才允许继续执行,否则事务将被回滚。

嗯,就这么简单。

4.预言机服务

我们的oracle是一个简单的nodejs服务以太坊主要包含三种类型的网络,使用request库调用外部天气API,解析API的响应,然后构造交易并提交给智能合约,然后等待一段时间,重复上面的工作,然后很快

反复。

让我们从访问 API 开始。 我们将 API 的地址放在一个环境变量中,以避免在开发/生产环境切换时修改源代码:

const options = { uri: process.env.WEATHER_URL, json: true };
const start = () => {
  request(options)

以太坊网络拥堵_以太坊网络事件通知不稳定_以太坊主要包含三种类型的网络

.then(parseData) .then(updateWeather) .then(restart) .catch(error); };

以下代码用于解析API的响应结果:

const parseData = (body) => {
  return new Promise((resolve, reject) => {
    const temperature = body.main.temp.toString();
    resolve({ temperature });
  });
};

现在需要做的就是构造一个调用智能合约的 updateWeather() 方法的以太坊交易。 注意account()是一个异步方法,它的作用是加载一个以太坊账户,contract是一个js

对象,包含之前部署的WeatherOracle智能合约的部署地址和ABI接口数据。 这些与智能合约相关的功能来自著名的web3开发包:)

const updateWeather = ({ temperature }) => {
  return new Promise((resolve, reject) => {

以太坊网络事件通知不稳定_以太坊网络拥堵_以太坊主要包含三种类型的网络

account().then(account => { contract.updateWeather(temperature, { from: account }, (err, res) => { resolve(res); }); }); }); };

最后,我们只需要在指定的超时后重新启动进程。 wait() 函数将在指定的超时后解析。

const restart = () => {
  wait(process.env.TIMEOUT).then(start);
};

搞定了! 上面的代码实现了一个简单的服务,该服务从 API 获取数据,然后将其提供给智能合约。

注意:

5.气象事件利用服务

这是另一个简单的 nodejs 服务。 同理以太坊主要包含三种类型的网络,contract是一个js对象,包含了合约的部署地址和ABI信息。 调用 Wea​​therUpdate 并传入回调是我们订阅天气事件的所有代码:

const consume = () => {

以太坊主要包含三种类型的网络_以太坊网络拥堵_以太坊网络事件通知不稳定

contract.WeatherUpdate((error, result) => { console.log("NEW WEATHER DATA EVENT ON SMART CONTRACT"); console.log("BLOCK NUMBER: "); console.log(" " + result.blockNumber) console.log("WEATHER DATA: "); console.log(result.args); console.log("\n"); }); }

当服务运行时,当交易成功入链时,它会周期性地向控制台输出数据:

NEW WEATHER DATA EVENT ON SMART CONTRACT
BLOCK NUMBER:
  3424586
WEATHER DATA:
{ temperature: '74.75' }

如果您想学习区块链并在区块链技术领域开创一番事业,请查看我们与以太坊、比特币、EOS、Fabric、Tendermint 和其他区块链相关的一些交互式在线编程教程:

原文:构建你的第一个以太坊预言机