了解 Sui Network 的简单预言机和元预言机
Web3
支付
DeFi
从本地身份验证、表和 pdb 到只读共享对象。
预言机及其用途
区块链中的预言机是使智能合约能够连接到链外系统并根据现实世界数据执行的基本实用程序。
有许多类型的合约需要预言机,例如,农民和度假者可以使用未来天气事件的保险合同来对冲风险,但需要访问实时天气数据才能结算;一个交易游戏可以让玩家建立一个虚拟的股票投资组合,并看到他们的投资组合的价值增长,但需要实时访问股价;预测市场可以对地缘政治事件的可能性进行众包估计,这可能需要获得待决定的结果;DeFi 合约可能需要准确访问加密货币的相对价格才能正常运行。
这些例子说明了预言机可能提供的数据类型的多样性,以及使预言机数据有用所需的保证的巨大差异——从游戏的较低保证到具有高财务影响的合约的非常高保证。这种可变性还会影响用户为更高质量的数据付费的意愿,对于无关紧要的低风险游戏中使用的数据来说,这种意愿可能较低,而对于与 DeFi 相关的合约中使用的数据来说,这种意愿可能较高。
许多高保证的 oracle 现在在 Sui 上运行,我们建议将它们用于高保证的应用程序。然而,Mysten 实验室团队构建了一个「简单的 oracle」,允许以更便宜的 gas 成本点发布和读取较低的保证值。我们还演示了一种灵活的方法,使用「meta oracle」来组合来自不同来源的 oracle 值,以获得更高的保证,由使用 oracle 的智能合约的开发人员确定。这些 oracle 展示了使用 Sui 的本地特性以降低成本和复杂性并提高性能的优势:从本地身份验证、表和 pdb 到只读共享对象。
简单的预言机——弱原语
一个简单的预言机发布一个数据流, 每个数据项都有一些标准元数据,例如股票代码、序列号、时间戳和读取标识符,以及数据项的实际值。预言机在链上表示为一个共享对象,其中包含一个包含数据值的表,包括存档的最新值和历史值。
更新预言机或归档值是只能由发布预言机的单一机构授权的操作。目前,这种访问控制依赖于检查更新交易地址,但将来我们可以扩展它以使用功能来提高灵活性。来自同一机构的对多个预言机的多次更新可以捆绑在一起到单个可编程交易块(PTB)中。这导致了非常经济的操作:例如,我们可以每 5 秒更新 30 个值,每次链上交易仅使用 1843600 单位的 Gas (MIST) 或 0.0018436 SUI。
为了读取预言机提供的历史值,合约必须通过引用获取共享对象并且只能读取它。这种在只读模式下使用共享对象的效率非常高,因为它不会引起争用,并且所有交易读取值都在 Sui 执行引擎中并行执行。读取简单预言机值的操作非常高效,因为它只读取动态字段。
任何人都可以运行一个简单的预言机。本着无需许可和去中心化的精神,组织可以在链外协调以确定一组股票代码和约定,并独立开始为这些数据类型发出值。其他预言机运营商无需许可即可开始操作此类简单的预言机。
值得注意的是,Sui 本身支持通过多重签名进行身份验证,并且该功能可用于显着增强简单的预言机。如果被授权更新简单预言机的地址是多重签名的,那么多个机构将必须签署每个更新交易,以便在某些交易不可用或拜占庭时允许一定的容错能力。虽然这很有希望,但接下来我们将探索这种机制的链上变体,我们称之为元预言机。
元预言机——灵活增加保证
对于需要重要财务数据的组织来说,依赖仅从单个简单的预言机提取数据的智能合约是鲁莽的。腐败的权威机构可能会提供不正确的数据(尽管这是可在链上审计的),或者权威机构可能会停止运营,从而导致智能合约没有关键数据。但依赖多个独立且信誉良好的来源确实可以改善情况。
为了减轻这些担忧,元预言机使用来自多个简单预言机的读数来增强安全性和可用性。简而言之,元预言通过其简单的预言定义了一组权威,这些权威参与导出每个读数。当查询时,元预言机从一组权威机构中获取至少一个最近时间窗口内的值阈值,然后返回它们的中值作为预言机的值。
查询权限数量和需要刷新的阈值参数是灵活的,可以由依赖预言机的合约开发者确定。然而,应用分布式系统安全性的常用模型:如果元预言机查询 3f+1 个权限,并且阈值为 2f+1(即其中的 2/3),则它可以容忍最多 f 个拜占庭权限,这些权限要么给出不正确的权限,要么给出错误的权限。数据或没有新数据。返回的值保证在两个正确的权威值之内——严重限制了攻击者影响预言机值的能力。
元预言机中包含的简单预言机总数以及可接受的权限集是灵活的,允许智能合约开发人员根据链上成本以及生态系统参与者的需求进行调整 他们信任。更复杂的元预言机是可能的——这将允许治理机制确定要聚合的预言机集,以及复杂的抵押品和审计系统,以激励诚实的数据发布。这些更复杂的元预言超出了我们在本博客中概述的工作范围,但我们希望 Sui 社区能够对它们进行实验并展示其可能性。得益于 Sui Move 编程语言的不受限制的组合属性,任何人都可以使用简单的预言机编写自己喜欢的元预言机合约变体。
在成本方面,读取 10 个数据源并获得中值仅需要 7009880 Mist 或 0.00700988 SUI。
元预言机设计说明,在高吞吐量、低 gas 价格的链中,例如 Sui,最好在链上执行微操作,例如每个权威机构分别将值发布为简单的预言机,然后允许智能合约 根据需要聚合它们。相反,继承自吞吐量低、每笔交易 Gas 成本高的链的设计试图尽可能多地在链外进行,从而增加了操作和智能合约的复杂性。他们还放弃了用于身份验证、授权和聚合的本机设施(例如非常便宜的多重签名),从而在 Sui 上产生了更高的成本。
用途和限制
Mysten Labs 目前正在发布此包中的加密货币价格值。我们还提供了在链上和链下读取这些值所需的实用程序。例如,合约可以使用以下片段使用简单的链上预言机:
public fun get_median_from_oracles_and_transfer(
oracle1: &SimpleOracle,
oracle2: &SimpleOracle,
oracle3: &SimpleOracle,
mist_amount: u64,
ctx: &mut TxContext
) {
let meta_oracle = meta_oracle::new<DecimalValue>(3, 60000, string::utf8(b"SUIUSD"));
meta_oracle::add_simple_oracle(&mut meta_oracle, oracle1);
meta_oracle::add_simple_oracle(&mut meta_oracle, oracle2);
meta_oracle::add_simple_oracle(&mut meta_oracle, oracle3);
let trusted_data = meta_oracle::median(meta_oracle);
let value = meta_oracle::value(&trusted_data);
let decimals = decimal_value::decimal(value);
let value = decimal_value::value(value);
let amount = mist_amount * value;
let usd = MockUSD {
id: object::new(ctx),
amount,
decimals,
};
transfer::transfer(usd, tx_context::sender(ctx));
}
并使用 CLI 上的工具读取 SUI/USDC 和其他货币对的最新值:
sui client dynamic-field 0xaa14ecfe646b35f118332203df2013bd5c1edd7ef8547d2c85f64b2e15d58279
由于这是 Mysten Labs 独有的预言机,并且按原样提供,没有任何 SLA,因此我们强烈建议任何人不要将这些预言机用于任何关键的财务操作。Mysten Labs 对预言机提供的信息的完整性、准确性、可靠性、适用性或可用性不作任何明示或暗示的陈述或保证。通过此预言机提供的信息不构成专业、投资或法律建议。然而,它们对于无赌注游戏或作为元预言机的一部分可能是可接受的。最终,开发人员应该根据自己的保证需求做出判断。
预言机的 Move 代码,以及任何人都可以用来运行预言机和使用元预言机的工具,可以在这里找到,我们鼓励其他人查看它并为不同的数据操作预言机。
所提出(和当前实施)的简单和元预言机模型的一个重要限制是它缺乏商业模式:预言机运营商会产生成本,但目前他们没有直接的方法来收回链上成本。该项目的未来迭代可以探索不同的链上读取支付模型,以及潜在的链下支持可持续预言机的不同模型。如上所述,为了使代码更易于理解,所有授权目前都是由交易创建者地址完成的,但应该通过使用功能来授权,以便更好地与实现复杂授权策略的合约组合。
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表Bi123的观点或立场