---
title: "什么是 Oracle?"
description: "Oracle 将链下信息传递给链上应用"
---

## 简介

智能合约是在满足特定事件或条件时自动执行的程序。这些事件可以发生在链上，也可以发生在链下。例如，在一个链上事件中，发送方可以向智能合约发送资金作为贷款抵押品，这会触发贷款金额的发放。而在一个链下事件中，智能合约可能需要某种方式来获取有关这些事件的准确数据，以判断何时执行。预言机（Oracle）连接了链下世界和链上智能合约，充当智能合约的数据来源。

<ImageBlock
  src="https://media.alchemy.com/1704181326-what-is-an-oracle.jpeg"
  alt="预言机将链下数据连接到链上智能合约的示意图"
  width={564}
  height={313}
  caption="Source: https://www.leewayhertz.com/chainlink-solving-blockchain-oracle-problem/https://www.leewayhertz.com/chainlink-solving-blockchain-oracle-problem/"
  priority
/>

## 开发者如何使用预言机

使用智能合约的优势在于，我们不需要第三方来充当中间人。代码决定了智能合约的条款，代码即法律。这些条款可以依赖外部事件，只有满足某个条件后交易才会执行。例如，我们可以使用智能合约根据美元的价值来发行代币交换。智能合约会向预言机查询来自某个外部来源的美元价值，以判断何时执行兑换。

<ImageBlock
  src="https://media.alchemy.com/1704181364-blockchain-oracles.png"
  alt="智能合约向区块链预言机查询外部数据的示意图"
  width={624}
  height={229}
  caption="Source: https://coin98insights.com/what-is-blockchain-oracle"
/>

去中心化金融（DeFi）是预言机最大的应用场景之一。价格预言机提供代币和流动性价值的信息，用于管理用户的资金状况。NFT（非同质化代币）可以利用预言机获取新闻中外部事件的信息，比如[选举结果](https://nftartwork.co.uk/nft-artwork/crossroads/)，从而使 NFT 的外观根据这些结果动态变化。

我们还可以利用预言机来鼓励有利于可持续发展和公民责任的行为，在用户完成任务或达成特定目标后，用代币奖励他们。例如，我们可以为某座城市的居民提供碳抵消代币奖励。

## 预言机的类型

预言机既可以是软件，比如服务器或数据库，也可以是硬件，比如物联网设备和传感器。它们可以是外部服务，为连接到它们的多个应用程序和区块链提供数据。

项目也可以根据自身的特殊需求创建内部预言机。[Augur](https://augur.net/) 就是一个例子，它是一个去中心化博彩平台，拥有一个用于提供投注事件结果的预言机。

[了解](https://www.alchemy.com/case-studies/augur?a=4f1af711be) [Augur](https://www.alchemy.com/dapps/augur) 如何使用 Alchemy 来扩展其去中心化预言机和点对点协议，从而创造更好的用户体验。

预言机是双向的，这意味着它们既可以从现实世界获取数据，也可以向外部世界提供关于链上事件的数据。[智能锁](https://www.hackster.io/simone-romano/a-blockchain-powered-smart-lock-21fad9)根据已完成的交易来解锁，就是链下需要链上事件数据的一个常见例子。

除了与外部世界通信外，预言机还能实现不同区块链之间的跨链通信。开发者可以借此桥接资产，或根据一条链上的交易和事件触发另一条链上的操作。预言机还可以通过在链下执行诸如随机数生成之类的计算，来节省宝贵的计算成本。

## 预言机问题

每当讨论预言机的价值时，通常都会提到“预言机问题”。区块链构建的独特之处在于，节点之间必须就区块链的状态达成共识。这意味着每个节点必须能够处理相同的交易和事件，并得到与其他所有节点相同的结果。

攻击者可能会篡改预言机获取的链下数据，或者数据也可能随时间发生变化。

例如，美元的价值在一天之内就可能频繁变动。如果智能合约根据这个价值执行操作，那么等到另一个节点进行计算时，价格可能已经发生了变化。这会打破节点之间的共识，因为预期结果已经不再是实际结果。

除了预言机提供的数据是否准确这一潜在问题外，中心化的数据来源还可能遭到攻击或出现宕机。在这些情况下，智能合约要么使用被污染的数据运行，要么完全没有数据可用。由于智能合约无法更改且会自动执行，这可能给相关各方带来不可逆的损失。如果预言机想要成为安全、可信的智能合约数据提供方，就必须解决这些问题。

## 预言机的解决方案

解决预言机问题的一种常见方法是利用区块链本身，这种方法被称为去中心化预言机网络（Decentralized Oracle Network，DON）。

在 DON 中，节点不是就交易账本达成共识，而是每个节点本身就是一个预言机。这些节点负责从各个独立的链下来源获取数据。随后，来自各节点的数据会被聚合在一起，并确定一个真值。

这也解决了数据来源正常运行时间的问题，因为即使某个数据源出现问题，由于存在多个数据来源，智能合约仍然能够正常运作。你可以在[这里](https://data.chain.link/ethereum/mainnet/crypto-usd/eth-usd)看到 DON 的实际运作方式。

<ImageBlock
  src="https://media.alchemy.com/1704181493-the-oracle-solution.png"
  alt="去中心化预言机网络聚合多个链下数据源的示意图"
  width={1600}
  height={684}
  caption="来源：chain.link"
/>

‍

## 预言机服务

开发者使用预言机最常见的方式是通过第三方服务。第一个也是最流行的服务是 [Chainlink](https://chain.link/)。通过 Chainlink，开发者和 API 提供方可以将自己的 API 接入 Chainlink 网络，从而成为参与其中的节点运营方。

Chainlink 为运营这些预言机的提供方分配链上标识符，用于管理和奖励这些预言机的信誉。使用 [ERC677 token](https://coinmarketcap.com/currencies/chainlink/) 可以激励提供方给出格式规范、准确的数据，以及所执行的任何链下计算。

另一个日益流行的网络是 [Band Protocol](https://bandprotocol.com/)。该网络与 Chainlink 一样，致力于为外部数据提供可靠、安全的来源。同样地，该网络也有一个 BAND 代币，用于奖励提供优质数据的数据方。关键区别在于，出于节省成本的考虑，[Band Protocol](https://www.alchemy.com/dapps/band-protocol) 运行在 Cosmos 上，而不是 Ethereum 上。

<ImageBlock
  src="https://media.alchemy.com/1704181427-oracle-services.png"
  alt="预言机服务网络向智能合约提供外部数据的示意图"
  width={1600}
  height={501}
  caption="Source: https://public.bnbstatic.com/static/research/static/images/projects/band-protocol/oraclescript.png"
/>

## 如何使用预言机

我们可以通过 API 请求从预言机获取数据，例如使用 Chainlink 提供的[框架](https://docs.chain.link/docs/reference-contracts/)，也可以通过引用某个提供方已经发送并已存在于链上的数据来获取。我们可以通过引用保存这些信息的[智能合约](https://docs.chain.link/docs/reference-contracts/)及其地址来获取这些数据。这种方法的一个常见用途出现在 DeFi 领域。智能合约中保存着定期更新的汇率，其他智能合约可以利用这些数据执行代币兑换操作。

## 结语

智能合约要在现实世界中发挥任何作用，就需要能够获知世界上正在发生的事情。预言机是智能合约用来应对链下事件所需的数据窗口。在区块链这样的去中心化环境中使用中心化的数据来源并不理想。DON 解决了中心化带来的许多问题，提供了安全性和稳定性。随着这些预言机服务的扩展和接入更多提供方，预言机将在区块链和智能合约技术的发展中发挥重要作用。
