本文介绍了如何结合 Gelato 的 Web3 Functions 和 Redstone 的链下预言机网络,构建低延迟的预言机,并提供了一个 Float 的用例,展示了如何使用这种方案将交易速度提高 20 倍。同时还对比了传统 Chainlink 预言机,展示了混合方案的优势,最后介绍了 Gelato 提供的各种服务。
BLOG — 使用案例
将 Redstone 的按需预言机和 Gelato 的 Web3 Functions 结合起来是一项改变游戏规则的创新,它使新型 DeFi 应用程序能够更快地处理用户交易并创造无与伦比的用户体验。
Redstone 是一种按需预言机,可以查询多个数据源并将数据作为预言机网络进行签名 - 但它不会在不需要时将数据推送到链上。这使得更多数据以更低的延迟和更高的安全性进行传输。 总结一下,用户可以简单地获取他们需要的数据并根据需要将其上链,从而节省 gas 费用并实现更高的刷新率!
用户可以集成 Web3 Functions 以从链下预言机(如 Redstone)查询数据并将其推送到链上,从而将 Redstone 的安全性与 Gelato 可靠的计算和自动化相结合。
延迟是指数据传输的时间延迟。 对于预言机,延迟是指预言机在链上更新数据所需的时间。 拥有低延迟非常重要,因为它确保数据点是最新的,并且可以快速且定期地查询数据并将其推送到链上。 这样想:加密资产价格一直在波动,因此用户需要能够访问最新的市场数据,并确保能够快速且持续地刷新该数据。
通过集成这些解决方案,Float 能够以快 20 倍的速度处理用户交易!
Float 创建点对点市场,你只需单击一下即可铸造杠杆代币。杠杆代币使你能够获得热门加密资产的杠杆回报,而无需承担额外的清算、保证金维护和抵押债务头寸的风险。
相应的稳定币抵押品池支持通过 Float 铸造的杠杆代币。 为了确保代币始终可以兑换其 100% 的价值,Float 会根据从价格预言机收到的数据,定期更新每个池的余额。 在他们最新的更新中,Float 使用 RedStone 的按需预言机来收集经过验证的价格数据,这些数据使用 Gelato 的 Web3 Functions 在链下调用,然后在满足某些条件时推送到链上。 因此,Float 能够比以前快 20 倍地处理更新,从而创造无缝的用户体验。
如果你有兴趣了解有关此用例的更多信息,请查看我们在 Twitter 上与 Float 和 Redstone 的 Twitter space。
传统上,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 是一个 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!