Chainlink预言机:连接区块链与真实世界的桥梁

robot
摘要生成中

预言机技术详解:以Chainlink为例

预言机是区块链领域中连接智能合约与外部世界的关键基础设施。它作为一种中间件系统,能够为链上智能合约提供外部数据信息。预言机的核心功能是为区块链上的智能合约输送数据。

预言机详解系列之 Chainlink(上)

举个例子,假设我们在以太坊网络上部署了一个需要获取特定日期原油交易量数据的智能合约。由于智能合约本身无法直接访问链下的真实世界数据,这时就需要借助预言机来实现。具体流程是:智能合约先将所需日期的原油交易量数据需求写入事件日志,然后链下会启动一个进程来监控并订阅这个事件日志。当监听到交易中的请求时,该进程会通过提交链上交易的方式,调用合约的相关方法,将指定日期的原油交易量信息上传到智能合约中。

预言机详解系列之 Chainlink(上)

在预言机市场中,Chainlink占据了最大的市场份额。作为一个去中心化的预言机项目,Chainlink旨在以最安全的方式向区块链提供现实世界中产生的数据。Chainlink在基本预言机原理的基础上,围绕LINK代币通过经济激励建立了一个良性循环的生态系统。Chainlink预言机需要通过LINK代币的转账来触发。LINK是以太坊网络上的ERC677合约,基于LINK代币完成的预言机功能属于请求/响应模式。

预言机详解系列之 Chainlink(上)

ERC677代币标准在ERC20的基础上增加了transferAndCall方法。该方法将支付和服务请求合二为一,满足了预言机业务场景的需求。当用户进行transferAndCall转账时,除了ERC20的转账外,还会判断接收地址是否为合约地址,如果是则调用该地址的onTokenTransfer方法。

预言机详解系列之 Chainlink(上)

在请求预言机服务之前,用户需要先确认该预言机的可信度,因为预言机为消费者提供服务前需要先付款。当预言机的消费者使用transferAndCall方法支付费用并请求服务时,预言机合约的onTokenTransfer方法会进行一系列安全检查,包括验证转账是否为LINK代币、检查数据长度是否超限、验证function selector等。检查通过后,才会通过delegatecall来调用oracle合约的oracleRequest方法。

预言机详解系列之 Chainlink(上)

oracleRequest方法会生成唯一的requestId,设置过期时间,并发出OracleRequest事件。该事件包含了请求数据,采用CBOR编码格式。链下节点会监听这个事件,解析出请求信息,然后通过API调用获取所需数据,最后通过提交交易的方式调用fulfillOracleRequest方法将数据提交到链上。

预言机详解系列之 Chainlink(上)

fulfillOracleRequest方法会进行一系列验证,包括检查调用者权限、验证请求有效性等。验证通过后,会记录可提取的代币数额,并调用请求者合约的回调函数返回数据。

预言机详解系列之 Chainlink(上)

对于开发者来说,如果只想使用已有的币对价格数据,可以直接调用官方提供的Price Feed接口。每个交易对都有一个单独的Price Feed(即Aggregator),实际上是AggregatorProxy合约。开发者可以通过调用latestRoundData()方法获取最新价格数据,其中answer参数即为最新价格。大多数以USD为计价单位的交易对,精度统一为8位,简化了不同代币间的精度处理。

预言机详解系列之 Chainlink(上)

此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 5
  • 分享
评论
0/400
PebbleHandervip
· 15小时前
也就这么回事吧
回复0
破产打工人vip
· 15小时前
太难了 放弃挣扎
回复0
Crypto金矿vip
· 15小时前
我去年靠link的行情赚了200倍 纯靠技术面分析
回复0
测试网学者vip
· 15小时前
link又被抄作业了
回复0
Web3教育家vip
· 16小时前
这真是基本上令人着迷的东西,让我为我的web3学生讲解一下...
查看原文回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)