使用 Web3 函数构建低延迟预言机

  • gelato
  • 发布于 2023-03-29 18:26
  • 阅读 36

本文介绍了如何结合 Gelato 的 Web3 Functions 和 Redstone 的链下预言机网络,构建低延迟的预言机,并提供了一个 Float 的用例,展示了如何使用这种方案将交易速度提高 20 倍。同时还对比了传统 Chainlink 预言机,展示了混合方案的优势,最后介绍了 Gelato 提供的各种服务。

BLOG — 使用案例

使用 Web3 Functions 构建低延迟预言机

概要

  • Gelato 可以与链下拉取式预言机网络(如 Redstone)结合使用,以创建模块化、可定制的低延迟预言机,这些预言机的更新频率高于传统预言机系统(例如,每分钟链上价格更新)
  • 这为构建更高效的杠杆产品(如 Float)、衍生品交易协议、期权、借贷市场等创造了新的可能性!

介绍

将 Redstone 的按需预言机和 Gelato 的 Web3 Functions 结合起来是一项改变游戏规则的创新,它使新型 DeFi 应用程序能够更快地处理用户交易并创造无与伦比的用户体验。

Redstone 是一种按需预言机,可以查询多个数据源并将数据作为预言机网络进行签名 - 但它不会在不需要时将数据推送到链上。这使得更多数据以更低的延迟和更高的安全性进行传输。 总结一下,用户可以简单地获取他们需要的数据并根据需要将其上链,从而节省 gas 费用并实现更高的刷新率!

用户可以集成 Web3 Functions 以从链下预言机(如 Redstone)查询数据并将其推送到链上,从而将 Redstone 的安全性与 Gelato 可靠的计算和自动化相结合。

为什么数据延迟很重要?

延迟是指数据传输的时间延迟。 对于预言机,延迟是指预言机在链上更新数据所需的时间。 拥有低延迟非常重要,因为它确保数据点是最新的,并且可以快速且定期地查询数据并将其推送到链上。 这样想:加密资产价格一直在波动,因此用户需要能够访问最新的市场数据,并确保能够快速且持续地刷新该数据。

Float 使用案例

通过集成这些解决方案,Float 能够以快 20 倍的速度处理用户交易!

Float 创建点对点市场,你只需单击一下即可铸造杠杆代币。杠杆代币使你能够获得热门加密资产的杠杆回报,而无需承担额外的清算、保证金维护和抵押债务头寸的风险。

相应的稳定币抵押品池支持通过 Float 铸造的杠杆代币。 为了确保代币始终可以兑换其 100% 的价值,Float 会根据从价格预言机收到的数据,定期更新每个池的余额。 在他们最新的更新中,Float 使用 RedStone 的按需预言机来收集经过验证的价格数据,这些数据使用 Gelato 的 Web3 Functions 在链下调用,然后在满足某些条件时推送到链上。 因此,Float 能够比以前快 20 倍地处理更新,从而创造无缝的用户体验。

如果你有兴趣了解有关此用例的更多信息,请查看我们在 Twitter 上与 Float 和 Redstone 的 Twitter space

由 Web3 Functions 驱动的现代混合预言机 vs Chainlink 预言机

传统上,Chainlink 预言机一直在使用请求响应模型。 这需要一个链上交易来发出一个事件,该事件可以触发一个链下的 Chainlink 函数,然后该函数会触发另一个链上交易。 你可能可以猜到,此流程会产生大量延迟并存在价格过时的风险。

该模型的一种替代方法是将所有价格都推送到链上。 但是,尽管这有助于解决以前的问题,但效率低下(它浪费了 gas)并且无法很好地扩展,因为并非所有写入链上的价格都是必需的。

使用像 RedStone 这样的基于拉取的 Oracle 解决方案为混合解决方案铺平了道路,利用了两全其美的优势,创建了一个链下、按需的基础设施,该基础设施以比标准 Oracles 更高的频率更新价格。

最后,Gelato Web3 Functions 提供了自定义协议接收价格方式的能力,可以按需并根据任意链上和链下条件更新链上价格。

在这里,你可以看到一个 Gelato Web3 Function,展示了如果价格开始偏离预定义的阈值,如何在链上更新 Redstone 预言机:

Web3Function.onRun(async (context: Web3FunctionContext) => {
  const { userArgs, provider } = context;
  const oracleAddress = userArgs.oracleAddress as string;
  const oracle = new Contract(oracleAddress, ORACLE_ABI, provider);

  // Wrap contract with redstone data service
  // 使用 redstone 数据服务包装合约
  const wrappedOracle = WrapperBuilder.wrap(oracle).usingDataService(
    {
      dataServiceId: "redstone-rapid-demo",
      uniqueSignersCount: 1,
      dataFeeds: ["ETH"],
      disablePayloadsDryRun: true,
    },
    ["https://d33trozg86ya9x.cloudfront.net"]
  );

  // Retrieve stored & live prices
  // 检索存储的和实时的价格
  const decimals = await wrappedOracle.decimals();
  const livePrice: BigNumber = await wrappedOracle.getLivePrice();
  const storedPrice: BigNumber = await wrappedOracle.getStoredPrice();
  console.log(`Live price: ${livePrice.toString()}`);
  console.log(`Stored price: ${storedPrice.toString()}`);

  // Check price deviation
  // 检查价格偏差
  const deviation: BigNumber = await wrappedOracle.getPriceDeviation();
  const deviationPrct = (deviation.toNumber() / 10 ** decimals) * 100;
  console.log(`Deviation: ${deviationPrct.toFixed(2)}%`);

  // Only update price if deviation is above 0.2%
  // 仅当偏差高于 0.2% 时才更新价格
  const minDeviation = 0.2;
  if (deviationPrct < minDeviation) {
    return {
      canExec: false,
      message: `No update: price deviation too small`,
    };
  }

  // Craft transaction to update the price on-chain
  // 制作交易以更新链上价格
  const { data } = await wrappedOracle.populateTransaction.updatePrice();
  return {
    canExec: true,
    callData: data,
  };
});

以及 RedstoneOracle 智能合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "@redstone-finance/evm-connector/contracts/data-services/RapidDemoConsumerBase.sol";

contract RedstoneOracle is RapidDemoConsumerBase {
    uint8 private immutable _decimals = 8;
    uint256 private _price = 0;

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function getStoredPrice() external view returns (uint256) {
        return _price;
    }

    /**
     * Use storage-less approach to query in memory price
     * See: https://github.com/redstone-finance/redstone-oracles-monorepo/tree/main/packages/evm-connector#storage-less-approach
     *
     * @return uint256 price.
     */
    function getLivePrice() public view returns (uint256) {
        // Extract and verify price using redstone connector
        // 使用 redstone connector 提取并验证价格
        return getOracleNumericValueFromTxMsg(bytes32("ETH"));
    }

    function _computeDeviation(
        uint256 newPrice,
        uint256 oldPrice
    ) internal pure returns (uint) {
        if (oldPrice == 0) {
            return 1 * 10 ** _decimals;
        } else if (newPrice > oldPrice) {
            return ((newPrice - oldPrice) * 10 ** _decimals) / oldPrice;
        } else {
            return ((oldPrice - newPrice) * 10 ** _decimals) / oldPrice;
        }
    }

    function getPriceDeviation() external view returns (uint) {
        return _computeDeviation(getLivePrice(), _price);
    }

    function updatePrice() public {
        _price = getLivePrice();
    }
}

关于 Gelato

Gelato 是一个 Web3 云平台,使开发者能够创建自动化的、gasless 的和链下感知的 Layer 2 链和智能合约。 400 多个 web3 项目多年来一直依赖 Gelato 来促进 DeFi、NFT 和游戏中的数百万笔交易。

  • Gelato RaaS: 一键部署你自己的定制 ZK 或 OP L2 链,内置原生账户抽象和所有 Gelato 中间件。

  • Web3 Functions: 通过运行去中心化的云函数,将你的智能合约连接到链下数据和计算。

  • Automate: 通过以可靠、开发者友好和去中心化的方式自动执行交易来自动化你的智能合约。

  • Relay: 通过易于使用的 API,让你的用户可以访问可靠、强大且可扩展的 gasless 交易。

  • Account Abstraction SDK: Gelato 与 Safe 合作,构建了一个功能齐全的 Account Abstraction SDK,结合了 Gelato 业界最佳的 gasless 交易功能和业界最安全的智能合约钱包。

订阅我们的新闻通讯并打开你的 Twitter 通知,以获取有关 Gelato 生态系统的最新更新! 如果你有兴趣成为 Gelato 团队的一员并构建互联网的未来,请浏览空缺职位并在此处申请 here

资源

  • 原文链接: gelato.cloud/blog/build-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
gelato
gelato
The Web3 Developer Cloud. Launch your own chain via our #1 Rollup-As-A-Service platform.