社区投稿|解码Big Vector,开启Sui超扩展性的新篇章

news2025/2/28 3:59:45

* 本文是来自Sui生态项目Typus团队的投稿,文中「我们」均指代该项目团队,转载时修改部分不准确的用词。

本研究报告介绍了Big Vector的概念,这是一种我们用于 Typus V2 的新数据结构,以缓解 Sui 上数组和动态字段(dynamic field)的局限性。Big Vector的主要目标是探索其在单一交易内需要超扩展性(hyper-scalability)的应用中的潜力,同时保持成本在最低水平。

动态字段首次亮相于 2022 年 10 月的 Sui 0.13.0 版本。这些“字段”独特之处在于它们与一个对象(object)相关联,而不是在一個数组内將其序列化。在使用动态字段时,通过 Move 函数在执行过程中进行访问,而不是在对象最初加载时就提前加载。

尽管动态字段没有绝对的容量限制,但每个交易访问的对象数量有一个最大限制,即 1,000 个对象。如果用户数超过这个限制,单一交易无法完全容纳他们。例如,对于 10,000 名用户,至少需要将操作分成 10 个批次。此外,访问动态字段内的对象的气费遵循固定的收费机制,这意味着随着更多的读取和访问被执行,相关的燃气费用会增加。

动态字段的局限性

为了更好地理解这一点,让我们通过 Typus V1 框架的一个例子来进行说明。为了缓解 1,000 个对象的限制,我们通过将原本是一个单一步骤的代码拆分成 17 个步骤来进行重写。

(以下内容需要对 Typus 的架构有基础的了解,请参考 Architecture - Typus Finance 以获取更多信息。)

(0) settle 
    (0) settle_performance_fee_balance
    (1n) settle_bidder_balance
    (2n) settle_adjust_active_user_share_ratio
    (3n) settle_adjust_deactivating_user_share_ratio
    (4n) settle_reset_bidder_user_share
    (5n) settle_remained_performance_fee_combination
    (6n) settle_rock_n_roll_deactivating
    (7n) settle_rock_n_roll_active
(8n) activate_share
(9) activate_vault
(10) new_auction
(11) delivery_premium
(12n) refund_active
(13n) refund_deactivating
(14n) delivery_active
(15n) delivery_deactivating
(16n) delivery_bidder

将过程拆分成 17 个交易明显影响了执行速度,导致了明显的减速,同时也增加了气费。其根本问题在于访问动态字段所带来的高成本。

https://github.com/MystenLabs/sui/blob/main/crates/sui-protocol-config/src/lib.rs#L1164

执行一个包含 20,000 用户的期权库的单轮通常会产生大约 30 到 70 SUI 的气费。考虑到目前有 14 个期权库,每周 7 个,每天 7 个,我们的月度结算气费将在 7,140 到 16,660 SUI 的范围内。

为了扩大规模并容纳更多的底层资产、行权价格和到期日,我们不可避免地需要扩展超出现有的 14 个期权库。然而,这样的扩张将会由于不断上升的气费而大幅提高我们的运营成本。

即使撇开气费问题,拆分交易也会给合约带来额外的复杂性。某些交易需要在下一个交易开始之前完成,这种方法涉及添加多个临时字段以实现新的函数来执行原本在每一轮中执行的任务。

这引入了额外的依赖关系,并降低了代码的整体稳健性(robustness)。由此产生的问题是,如果在访问这些临时字段时出现逻辑错误,导致计算错误,这不仅需要大量的时间来在复杂的代码中找出问题,还需要额外的人力来纠正合约。

V1 案例研究

让我们来看一个我们过去遇到的场景。这个例子发生在所有“交易失败”事件发生之前。在之前的内部调查中,我们注意到尽管最近的几轮都没有导致实现盈利,但我们的存款用户份额仍有所下降。理论上,用户份额应该与前几天的数值保持一致。

在更仔细地检查后,我们发现问题源于在步骤结算step settle过程(步骤 0 到 7)中没有完全限制用户操作。这里的 n 的存在表明它涉及到解决遇到 1,000 个动态字段访问的挑战,并需要多次运行来解决。

(0) settle 
    (0) settle_performance_fee_balance
    (1n) settle_bidder_balance
    (2n) settle_adjust_active_user_share_ratio
    (3n) settle_adjust_deactivating_user_share_ratio
    (4n) settle_reset_bidder_user_share
    (5n) settle_remained_performance_fee_combination
    (6n) settle_rock_n_roll_deactivating
    (7n) settle_rock_n_roll_active
(8n) activate_share
(9) activate_vault
(10) new_auction
(11) delivery_premium
(12n) refund_active
(13n) refund_deactivating
(14n) delivery_active
(15n) delivery_deactivating
(16n) delivery_bidder

这个问题出现的场景是,在一个特定的实现盈利的结算阶段,用户在步骤2step 2n 中执行取消订阅unsubscribe。步骤2step 2n 的目的是将用户的份额和余额以 1:1 的比例对齐,以避免后续的浮点计算可能导致的微小余额差异。

然而,如果一个用户在这个过程中执行了取消订阅unsubscribe,特别是当一部分用户已经达到了 1:1 的比例,而其他人还没有调整时,那么还没有完成调整的用户(相对于他们实际价值持有更高的份额和余额)将会把他们的份额转移到“停用中的子期权库”deactivating sub vault中。因此,这个用户实际上会承受部分损失,将这个损失按比例分配给仍然在“活跃子期权库”active sub vault中的人。

余额(balance)和份额供应(share_supply)不是 1:1 的比例

在这一事件之后的后续轮次将需要重新调整回 1:1 的比例,因为在活跃子期权库中的用户份额和余额将不再平衡。如果后来有任何用户在步骤 2n中取消订阅,它会让情况更复杂,使追踪原始存款金额这件事变得更具挑战性。

由于在活跃子期权库中的用户份额和余额不再是 1:1 的比例,每一轮的步骤 8nstep 8n都会将活跃子期权库中现有的损失或收益重新分配给从“预热子期权库”warmup sub vault转移过来的用户。此外,每一个在步骤 12nstep 12n中退款refund_active时都会将未填充的用户份额(unfilled user shares)从活跃子期权库转回到预热子期权库。这种复杂性会在每一轮中累积,这就是为什么,在计算错误的情况下,尚未经历实现盈利阶段的用户的新存款可能会导致意外的损失。

这个操作的问题源于拆分交易需要以原子操作来执行(译注:原子操作(atomic operation)指的是不可被中断的一个或一系列操作,简单来说就是这些交易最終需要全部被执行,但是必须依序一个一个来执行)。为了解决这个问题,我们实施了一个类似于链上互斥锁(mutex)的概念,在上述步骤的操作期间暂时停止用户交易。这样做的后果是,操作需要相当多的时间,导致我们的拍卖时间延迟,并需要更多的交易执行者(crankers)。

我们的产品并不是完全依赖动态字段的理想选择。尽管数组可能看似是解决这个问题的一个潜在解决方案,但Sui 对数组的容量设置了上限,限制为 256,000 字节(bytes)。为了更直观地说明这一点,让我们从 Typus出发,它为每个元素分配 100 字节的用户数据。在这种情况下,单个数组的最大容量仅限于容纳 2,560 名用户。任何试图超过这个阈值的尝试都将导致交易失败。这让我们难以直接使用数组这个解决方案。

总结一下,我们从当前的 Sui 框架中面临的两个限制是:

  1. 数组的 256,000 字节限制
  2. 动态字段的 1,000 个对象访问限制

Big Vector

让我们引入 big vector 的概念,这是一个旨在同时解决这两个限制的解决方案。big vector 背后的基本思想是使用动态字段来存储多个数组,类似于将一个大型数组分解成多个较小的切片。如果我们可以在一个单独的数组切片中存储 2,000 个用户的数据,并且一个单独的动态字段一次可以访问多达 1,000 个对象,那么最大容量就扩展到在单个交易中容纳 2,000,000 个用户。

从本质上讲,Big Vector 通过合并动态字段和数组,打破了数组所施加的上限,同时放宽了动态字段内 1,000 个对象的访问限制。这导致了单个交易内可以访问的元素数量的增加,有效地提高了可扩展性。

我们希望将 Big Vector 集成到 Sui 框架中的理由是,我们认为在访问相同的动态字段时,气费不应随每次访问而激增,而且应该有一种更高效的内存分配方法。

V2 案例研究

我们使用我们的 Big Vector 框架在测试网上复制了期权库结算气费的实验。当执行一个包含 45,000 名用户的期权库的单一轮次时,相关的气费总计为 7.1 SUI。考虑到我们当前的期权库,这大大降低了我们每月的运营结算气费支出,大约为 1,690 SUI。这与 V1 中的 7,140 到 16,660 SUI 的范围相比有着显著的下降,同时还能同时容纳更多的用户。

V1 mainnet gas fee 20k users in the vault -> 30 — 70 SUI / round
V2 testnet gas fee 45k users in the vault -> 7.1 SUI / round

在我们的 V2 中,费用减少的一个重要因素是数据访问的变化。与过去每个用户都有自己的动态字段不同,我们现在将数组放在动态字段内。这导致了动态字段访问频率的大幅下降。因此,剩下的只是常规的、标准的数据访问气费成本。

V2 testnet gas fee txns
update_price + activate: 3.80566692 SUI Sui Explorer

new_auction: 0.019801108 SUI
https://suiexplorer.com/txblock/Du2Dvbnc3nN3h51t16moEGnjBDBvRcWnQbpGDnS6hJ2s?network=testnet

delivery: 1.8085723 SUI
https://suiexplorer.com/txblock/7SHDY4JLBJqpGkvqP78F83JJqPUfh4L8ugG6rzrUth6c?network=testnet

recoup: 2.39032962 SUI
https://suiexplorer.com/txblock/BmLXPeoL5U1TeaVyhMXDjeUnUiL53vb1oAMocG5tR7vV?network=testnet

settle: 0.001376352 SUI
https://suiexplorer.com/txblock/CUiKwKbMpXUfh3vonQL1zJ9nxGiYSokGE2G4dp2r8Ts3?network=testnet

通过大幅降低运营成本,我们现在能够让我们的产品多样化。Typus V2可以涵盖更广泛的基础资产、执行价格和到期日。将操作合并到单一交易的优点是,它将执行多个交易可能产生的计算差异的风险降至最低。因此,我们可以推出短期期权库,如1小时、5分钟和1分钟的期权库,同时保持结算的准确性。

结论

我们认识到动态字段作为数据存储访问的作用,但我们想强调它们对可扩展性和复杂代码相关风险的限制。有人可能会争辩说,通过实施限制和优化数据结构可以缓解这些问题,但缺点是执行速度更慢和成本更高。鉴于此,它提出了一个问题:是否有更好的解决方案?

Big Vector 作为一个解决方案,适用于两种应用。第一种是需要单一交易操作,对时间敏感的这种应用类型;第二种是因为其数据访问密集,而无法完全倚赖动态字段的这种应用类型(译注:因为有动态字段限制,且成本可能很高)。这种方法不仅让开发者不用因为 1,000 个对象限制而在代码上妥协,而且还大幅降低了气费。

我们的目标是开启一个关于将 Big Vector 集成到 Sui 框架中的讨论,提供一种更高效的内存分配方法。我们认为,当用户访问相同的动态字段时,气费不应随每次访问而增加。

随着链上流动性持续积累和 Sui 的 TVL 经历指数级增长,我们预计会有大量新用户和应用涌入。对于一个能够在单一交易内提供超高可扩展性同时保持最低成本的框架,有其技术上的必要性。我们认为,应该让在 Sui 上的所有开发者尝试实施这种新方法。

由 Typus 团队的 six0hfour 撰写,由 kyrie.move 翻译。

⭑ 如果您喜欢这个内容,觉得它有帮助,或者想与我们讨论,可以透过社交媒体找到我们: typusfinance | Link3.to

我们将很快发布更多原创内容,与此同时,去看看 Typus 并自己尝试一下! Typus Finance

参考资料:

Typus 开发者

https://github.com/MystenLabs/sui/blob/main/crates/sui-protocol-config/src/lib.rs#L1164

Sui Documentation


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|英文Twitter|中文Twitter|Discord|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么让小程序排名靠前?小程序搜索排名问题

小程序的排名是十分重要的,因为这会直接影响到用户的点击率,用户在搜索小程序时,会看到搜索引擎的前几条搜索结果,如果您的小程序不在这些位置上,很可能就会被忽略,所以,想要让用户能够看到您的…

【广州华锐互动】VR虚拟现实旅游:改变游客旅游方式,提升旅游体验

虚拟现实(Virtual Reality,简称VR)是一种利用电脑模拟产生一个三维的虚拟世界,提供用户关于视觉、听觉、触觉等感官的模拟体验。随着科技的进步,VR虚拟现实技术已逐渐进入各行各业,尤其在旅游行业中的应用&…

佩戴比较舒适的蓝牙耳机有哪些?几款戴着很舒服的蓝牙耳机推荐

你是否感到困扰?佩戴普通的入耳蓝牙耳机久了,很容易引发耳朵的不适感,甚至对耳膜造成一定程度的损伤?现在有一种开放式的耳机出现在大家的视野中。这种耳机利用了骨传导传声的独特特性,只需要挂在耳朵上就能享受到音乐…

大模型开启人工智能的新时代

大模型是指具有非常大的参数数量的人工神经网络模型。在深度学习领域,大模型通常是指具有数亿到数万亿参数的模型。这些模型通常需要在大规模数据集上进行训练,并且需要使用大量的计算资源进行优化和调整。 大模型通常用于解决复杂的自然语言处理、计算…

MacBook风扇这么响,原来是因为这些细节没注意!

你有没有发现,你的MacBook风扇总是在不经意间声音特别大?平时我们的Mac需要做一些繁重的工作。例如,当涉及到Web开发,照片修饰和视频编辑时。听到我们的MacBook Pro风扇控制器弹起并且MacBook Pro风扇的噪音增大,因为我…

C++继承——圆形和圆柱体

C继承 Circular圆形类 /*圆形类*/ class Circular { private:const static double PI;double R 0; public:Circular() default;Circular(double r);double GetArea(); /*圆面积*/double GetGirth(); /*圆周长*/ }; const double Circular::PI 3.14;Circular::Circula…

实习答点。

计数单————>变成记录采购开单的记录表,实时的进行数据比较和统计。 具有: 采购前可以提供实时的数据比较,选择最合适的物品进行采购。 1.警戒库存 通过日期范围进行分析比较往年的采购量和库存量进行比较,进行判断今年的…

Q-CTRL首次在量子市场获得ISO 27001国际标准认证

​(图片来源:网络) 国际公认的ISO 27001标准概述了信息安全管理系统(ISMS)的实施,并表现了管理风险的能力,包括与客户数据安全相关的风险。总部位于悉尼的Q-CTRL是第一家获得ISO 27001认证的独…

数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;) 📜ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码) 目录 顺序表简介 …

法律咨询服务预约小程序的作用

纠纷不断,法律服务的需求度非常高,公司/个人在多个场景都有可能使用到法律业务,对相关咨询机构来说,需要不断拓展客源和品牌宣传以获得更多生意增长,然而线下拓展困难,线上是商家们发展的必要渠道。 那么通…

怎么在现货黄金交易过程中高效设置止损?

投资市场中的风险具有客观及普遍性,现货黄金买卖也是如此,作为典型的国际性交易产品之中,在现货黄金买卖过程中人们要灵活应对行情变化,从中争取盈利空间。而设置止损就是防止风险扩大的一条有效措施,所以炒金者们应当…

聊聊 Rust 变量,你学会了吗?

Rust 是一门强调安全、并发、高效的系统编程语言。无 GC 实现内存安全机制、无数据竞争的并发机制、无运行时开销的抽象机制,是 Rust 独特的优越特性。 它声称解决了传统 C 语言和 C语言几十年来饱受责难的内存安全问题,同时还保持了很高的运行效率、很深…

第4天:基础入门-30余种加密编码进制amp;Webamp;数据库amp;系统amp;代码amp;参数值

第4天:基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值 一、知识点 1. 存储密码加密-Web&数据库&系统2. 传输数据编码-各类组合传输参数值3. 代码特性加密-JS&PHP&NET&JAVA4. 数据显示编码-字符串数据显示编码二…

资源限流 + 本地分布式多重锁——高并发性能挡板,隔绝无效流量请求

前言 在高并发分布式下,我们往往采用分布式锁去维护一个同步互斥的业务需求,但是大家细想一下,在一些高TPS的业务场景下,让这些请求全部卡在获取分布式锁,这会造成什么问题? 瞬时高并发压垮系统 众所周知…

C#开发的OpenRA游戏之选择建筑物显示状态信息

C#开发的OpenRA游戏之选择建筑物显示状态信息 前面已经分析了金钱系统,有了钱之后,就可以放任地建造万物了。 在建造的过程中,当你选择建筑物时,就可以看到当前建筑物的健康信息和制造当前物品的进度,如下图所示: 从上图可以看到最上面的进度条是这个建筑物的健康程度,…

Java 代码读取自定义的配置文件里面的东西

目录 1 问题2 实现 1 问题 Java 代码读取自定义的配置文件里面的东西,在代码里面进行使用。 也就是随便一个配置文件,如何在代码里面进行读取 2 实现 将配置文件,随便起一个名字,将这个配置文件写到 resource 这个目录下&#…

Java调用HTTPS接口,绕过SSL认证

1:说明 网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。 Java调…

主播直播美颜SDK:性能优化策略

当下,主播直播美颜SDK成为了越来越多主播的利器。这些SDK可以实时美化主播的外貌,提高视觉吸引力,但同时也需要处理大量的图像数据。因此,性能优化成为了不可或缺的一环。本文将探讨主播直播美颜SDK的性能优化策略,以确…

【word技巧】word文档如何转换为ppt文件?

大家是否会遇到需要将word文档转换为ppt文件的情况?除了反反复复粘贴复制以外,还有其他方法可以转换文件格式,今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题,副标题设…

【C++初阶】——初始化列表static成员友元内部类匿名对象

个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 代码仓库:Gitee 目录 前言 再谈构造函数 初始化列表 explicit关键字 匿名对象 static成员 友元 友元函数 友元类 内部类 再次理解类和对象 前言 前几篇文章我们对于分别对C类…