社区投稿|解码Big Vector,开启Sui超扩展性的新篇章
* 本文是来自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 框架中面临的两个限制是:
- 数组的 256,000 字节限制
- 动态字段的 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 Explorernew_auction: 0.019801108 SUI
https://suiexplorer.com/txblock/Du2Dvbnc3nN3h51t16moEGnjBDBvRcWnQbpGDnS6hJ2s?network=testnetdelivery: 1.8085723 SUI
https://suiexplorer.com/txblock/7SHDY4JLBJqpGkvqP78F83JJqPUfh4L8ugG6rzrUth6c?network=testnetrecoup: 2.39032962 SUI
https://suiexplorer.com/txblock/BmLXPeoL5U1TeaVyhMXDjeUnUiL53vb1oAMocG5tR7vV?network=testnetsettle: 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|英文电报群|中文电报群
相关文章:

社区投稿|解码Big Vector,开启Sui超扩展性的新篇章
* 本文是来自Sui生态项目Typus团队的投稿,文中「我们」均指代该项目团队,转载时修改部分不准确的用词。 本研究报告介绍了Big Vector的概念,这是一种我们用于 Typus V2 的新数据结构,以缓解 Sui 上数组和动态字段(dynamic field)…...

Linux根目录下的目录结构及其作用详解
Linux根目录是文件系统的最顶层,它包含了一些子目录,每个子目录都有特定的功能和存储的文件。只有了解了各个文件的使用功能,才能更好的去使用Linux系统。希望通过下面这张图能够让你更加了解根目录下的各个目录的功能。...

源码和SaaS账号:租房与自建房的区别
在当今数字化时代,软件已成为企业运营的重要支撑。然而,对于许多中小企业来说,获取和运营软件的方式有两种:源码和SaaS账号。这两者有何区别呢?让我们用租房和自建房的比喻来解释。 价格比较 源码:购买源码…...
Docker容器设置为自动重启
有时Docker服务出现异常,或者服务器出现异常,需要重启Docker服务或者服务器; 如果希望有一部分基础的或者常用的容器,在服务或者服务器重启的时候,可以实现自动启动,仅需使用命令进行简单配置即可实现。 D…...

速卖通卖家如何通过自己搭建测评补单系统,提高产品权重和排名?
速卖通卖家如何给店铺增加权重和排名? 在竞争激烈的速卖通平台上,为自己的店铺增加权重是吸引更多买家和提升销售的关键。店铺的权重决定着在搜索排名、推荐位和广告展示方面的优先级。今天珑哥为您介绍一些有效的策略,帮助您提升速卖通店铺…...

香港金融科技周2023:AIGC重塑金融形态
10月31日,由香港财经事务及库务局与投资推广署主办的“香港金融科技周2023大湾区专场”盛大启幕。中国AI决策领先企业萨摩耶云科技集团创始人、董事长兼 CEO林建明受邀参加圆桌会议,与中国内地、香港以及全球金融科技行业顶尖人才、创新企业、监管机构和…...
6G关键新兴技术-智能超表面(RIS)技术演进
一、产品定义及范围 根据欧盟5G公私联盟协会(5G Infrastructure Public-Private Partnership, 5GPP)定义,可重构智慧表面(Reconfigurable Intelligent Surface, RIS)技术是由能够任意塑造电磁波面的材料组成,几乎是被动(Passice)设备,可以适…...

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

使用Postman快速复现浏览器的请求(包括生成调用代码)
前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 好久没有写开发类的工具使用文了,这…...
四则运算的正则校验
文章目录 四则运算的正则校验带有变量的四则运算的正则校验带有括号的四则运算的正则校验变量使用${}包裹的四则运算正则表达式变量使用${}包裹的可以有括号的四则运算正则表达式变量使用#{}包裹的可以有括号的四则运算正则表达式变量使用${}或者 #{}包裹的可以有括号的四则运算…...

【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源
一、 业务场景解释 由于公司业务需要开发设计一款文件读取导入工具,导入的配置和目标数据库并不一定在同一个数据库地址,故需要使用到自定义数据源,并且支持数据源切换 大致场景如下: 二、工具选择 鉴于市面上有很多工具&#…...
制作docker镜像文件
技术主题 Docker作为一个开源的应用容器引擎,制作自己的docker镜像文件是使用docker的第一步,这样我们能够更好地管理应用程序。 技术原理 技术原理一:安装Docker 一般都是在官网下载特定的docker文件,然后安装即可 技术原理…...
JAVA 中 Socket 和 WebSocket 区别
区别: Socket: Socket是位于java.net包下的一个类,是 Java 提供的用于在客户端和服务器之间建立网络通信的底层套接字接口,用于传输层的网络通信。 WebSocket: WebSocket 是一种基于 TCP 协议的通信协议,建立在 Socket 的基础上,…...
python 接收到一个接口的数据 是json格式 ,然后把其中键值对的一个值改掉 再返回给接口
先上代码 import json import requests # 发送请求获取接口数据 response requests.get(http://example.com/api/data) # 解析JSON数据 data json.loads(response.text) # 更改某个键值对的值 new_value new_value data[key_to_change] new_value # 将更改后…...
⌈C++11⌋实现一个简易计算器
原理: 数据栈:有数据就直接入栈 运算符栈:设遍历到当前的运算符位e,如果栈不为空,比较栈顶与当前运算符优先级e,当栈顶运算符优先级大于或者等于e的优先级,则出栈,并将两个数据栈的…...

面试算法45:二叉树最低层最左边的值
题目 如何在一棵二叉树中找出它最低层最左边节点的值?假设二叉树中最少有一个节点。例如,在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时,每当遇到新…...
Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21.
前两天下了一个demo,运行时候报了一个这样的错,特此记录一下。 先看下报的错。 Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21. Searched in the following…...
LoRaWan之LoRaMAC 的快速入门指南
概述 本快速入门指南简要介绍了 LoRaMAC 层的重要操作。示例部分提供了不同设备类别的完整示例。 初始化 LoRaMAC层的初始化函数是LoRaMacInitialization( LoRaMacPrimitives_t *primitives, LoRaMacCallback_t *callbacks, LoRaMacRegion_t region )。该函数具有三个参数:L…...

中国教育企业出海 新兴技术助力抢占先机
继游戏、电商、短视频等领域轮番出海之后,国内教育企业纷纷开启了出海之路。近日发布的《2023年教育应用出海市场洞察》报告显示,在中国教育企业出海市场中,语言学习是最主要的赛道,但赛道竞争更为激烈。 报告指出,全…...

IntelliJ IDEA2023旗舰版和社区版下载安装教程(图解)
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...