0%

死磕chainLink Data Feeds原理

聚合数据合约:https://github.com/smartcontractkit/libocr/blob/master/contract/AccessControlledOffchainAggregator.sol

原文集锦:https://github.com/blockchainGuide

概述

Chainlink Data Feeds 是将您的智能合约连接到现实世界数据(例如资产价格、储备余额和 L2 序列器健康状况)的最快方法。

Data feed 类型

  1. Prices feed
    功能: 提供实时、准确的资产价格。
    用途:
    DeFi 协议: 为借贷、衍生品交易、AMM 等提供实时价格数据,确保交易的公平性和透明度。
    DEX: 提供流动性池中资产的实时价格,用于计算交易滑点。

  2. Proof of Reserve feeds
    功能: 提供加密货币交易所或托管机构持有的加密资产储备证明。
    用途:
    增强用户信任: 证明交易所或托管机构确实持有足够的资产来支持用户的提款。
    防止欺诈: 防止交易所或托管机构挪用用户资产。

  3. 利率和波动率Feeds
    功能: 提供利率和资产价格波动率数据。
    用途:
    衍生品交易: 为期权、期货等衍生品定价提供基础数据。
    风险管理: 用于评估投资组合的风险。

  4. L2 排序器 uptime Feeds
    功能: 提供二层网络(如 Optimism、Arbitrum)排序器的运行时间数据。
    用途:
    监控网络状态: 监测二层网络的稳定性,确保交易顺利进行。
    风险管理: 在排序器出现故障时及时采取措施。


Data feed 组件

Chainlink数据喂价机制中的三个核心概念:消费者(Consumer)、代理合约(Proxy contract)和聚合器合约(Aggregator contract)。

image-20240820104818930

  1. 消费者(Consumer)
  • 定义: 使用数据喂价的链上或链下应用。
  • 功能: 通过调用代理合约上的函数,从聚合器合约中获取数据。
  • 接口: 使用AggregatorV3Interface接口与代理合约交互。
  1. 代理合约(Proxy contract)
  • 定义: 指向特定数据喂价的聚合器合约的链上代理。

  • 作用:

    • 隔离消费者与聚合器: 消费者直接与代理合约交互,而不需要了解聚合器的底层实现细节。
    • 升级聚合器: 当需要对聚合器进行升级时,只需更新代理合约的指向,而不需要修改消费者合约。
  1. 聚合器合约(Aggregator contract)
  • 定义: 从预言机网络接收定期数据更新的合约。
  • 功能:
    • 数据聚合: 收集来自多个预言机的數據,并进行聚合处理。
    • 数据存储: 将聚合后的数据存储在链上。
    • 数据提供: 通过代理合约向消费者提供数据。

【整体流程】

  1. 预言机提供数据: 预言机从链下获取数据,并将其发送给聚合器合约。
  2. 聚合器处理数据: 聚合器对收到的数据进行验证和处理,然后将结果存储在链上。
  3. 消费者查询数据: 消费者通过代理合约调用聚合器合约提供的函数,获取所需的数据。

Chainlink的数据喂价机制通过消费者、代理合约和聚合器三层架构,实现了链上智能合约与链下数据之间的安全、可靠的交互。这种设计使得DeFi应用能够获取实时、准确的链下数据,从而构建更复杂、更强大的金融应用。

去中心化数据模型

数据聚合

每个 data feed 由多个独立的 Chainlink 预言机运营商更新。 AccessControlledOffchainAggregator聚合链上数据。

代码解读

  • 构造函数:
    • 初始化一些关键参数,如最大gas价格、LINK token、数据范围、访问控制合约等。这些参数对合约的运行和安全性至关重要。
  • 版本信息:
    • typeAndVersion()函数返回合约的类型和版本号,方便版本管理和升级。
  • 数据访问函数:
    • 提供一系列函数,如latestAnswer(), getAnswer(), getRoundData()等,用于获取最新的或历史的聚合数据。
  • 访问控制:
    • checkAccess()修饰符用于限制对数据访问函数的调用,只有授权的账户才能调用这些函数。

核心功能与特点

  • 数据聚合: 合约的主要功能是聚合链下数据,并将其安全可靠地存储在链上。
  • 访问控制: 通过访问控制机制,确保只有授权的账户才能访问和修改合约数据。
  • 可扩展性: 继承自OffchainAggregator,可以方便地扩展和定制。
  • 透明度: 所有数据都存储在链上,可以被任何人验证。

如何提交数据到合约

  1. 数据提供者准备数据: 数据提供者准备好需要提交到链上的数据,确保数据的准确性和可靠性。

  2. Chainlink节点接入: 数据提供者将数据提供给Chainlink节点。Chainlink节点是一个分布式的节点网络,负责将链下数据传输到链上。

  3. 节点验证数据: Chainlink节点会对收到的数据进行验证,确保数据的真实性和有效性。

  4. 节点生成任务请求: 节点将验证后的数据打包成一个任务请求,并发送给链上的合约。

  5. 合约执行任务: 合约接收到任务请求后,会验证请求的有效性,并执行相应的操作,将数据写入链上。

合约如何验证数据

  1. 范围验证
  • 设定上下限: 为每个数据设置一个合理的上下限范围。如果数据超出这个范围,则被认为是异常数据。
  • 历史数据对比: 将当前数据与历史数据进行对比,如果偏差过大,则触发警报。
  1. 一致性验证
  • 多节点对比: 将多个预言机提供的数据进行对比,如果差异过大,则对数据进行质疑。
  • 外部数据源对比: 将链上数据与链下权威数据源(如雅虎财经、CoinMarketCap)进行对比,以验证数据的准确性。
  1. 签名验证
  • 预言机签名: 预言机对提供的数据进行签名,以证明数据的来源。
  • 合约验证: 合约验证签名的有效性,确保数据是由授权的预言机提供的。
  1. 时间戳验证
  • 检查时间戳: 验证数据的时间戳是否合理,防止过旧或过新的数据被利用。
  • 防止重放攻击: 通过时间戳来防止攻击者重放旧的数据。
  1. 格式验证
  • 数据类型: 验证数据的类型是否符合预期的格式,例如数值型、字符串型等。
  • 数据结构: 验证数据的结构是否符合预定义的格式,例如JSON格式。
  1. 业务逻辑验证
  • 关联关系验证: 验证不同数据之间的关联关系是否合理,例如价格与交易量之间的关系。
  • 历史趋势验证: 验证数据是否符合历史趋势,是否存在异常波动。
  1. 智能合约验证
  • 自定义验证逻辑: 开发者可以在智能合约中编写自定义的验证逻辑,以满足特定的需求。
  • 可编程性: 智能合约的灵活性和可编程性使得验证逻辑可以根据不同的业务场景进行定制。
  1. 去中心化验证
  • 多方验证: 多个节点共同验证数据,提高验证的可靠性。
  • 激励机制: 通过激励机制鼓励节点参与验证,提高网络的安全性。

OCR

OCR(Off-Chain Reporting)是一种在Chainlink网络中使用的机制,它允许多个节点在链下协同工作,将数据聚合到一个报告中,然后将这个报告作为一个整体提交到链上。这种方式大大提高了Chainlink网络的效率和可扩展性。

OCR的工作原理

  1. 节点选举: 节点之间通过选举产生一个领导节点。
  2. 数据收集: 领导节点定期向其他节点(跟随节点)收集最新的数据。
  3. 报告生成: 领导节点将收集到的数据进行聚合,生成一个报告。
  4. 报告验证: 领导节点将报告发送给跟随节点进行验证。
  5. 报告签名: 如果跟随节点验证通过,则对报告进行签名。
  6. 链上提交: 领导节点将带有足够多节点签名的报告提交到链上。
  7. 链上验证: 合约验证报告的签名,并提取其中的数据。

参考