TPS12万?基于MoveVM的新秀公链- Sui (技术篇)
0xf1E2
August 7th, 2022

主要作者简介:廖师虎拥有超过十多年的开发和工程经验,17年开始关注区块链行业,并且在Dfinity上积累了多年生态开发经验,同时其团队目前正在翻译新版本Move Book ,并将在下周准备好。本文大部分内容编译于其于CFG Labs 8月3日晚的第五次office hour-新公链Sui和Move语言的介绍。有兴趣的朋友可以订阅我们的youtube频道: CFG Labs@0x_Atom

总览和Move语言

Sui是一个主打低延迟,高性能,水平扩展的无需许可的去中心化智能合约平台。智能合约语言是Move, 链用Rust语言写。Sui主要有几个特点,首先强调安全性,在区块链和金融领域,安全显得至关重要,通过水平扩展,Sui致力于为用户提供与Web2相媲美的用户体验。团队拥有多年大厂(Facebook + Diem)积累的丰富的链开发经验和钱包经验,同时相比于Aptos的设计(严格按照Libra和Diam的代码库),Sui进行了重新设计。

Move语言可以象通用语言那样写库和框架,合约也是静态不可变的lib,合约数据实际保存在Move或链的全局存储上,各种合约可以相互组合引用。Move的语言本身继承了Rust的一些特点,比如所有权,同时把特性内化了,并且更适合金融资产。比如我想把这个资产转移给别人的时候,那么原来的的所有人就不再拥有这个资产了。同时也做了前置规定,比如资产不能复制(不可变)不能随意丢弃,不能像其他通用语言(例如Rust, Solidty,Solidity中资产是可以复制的,比如以太坊中的重入攻击)。所以相较于Rust语言,Move提供了一种更为精简的解决方案。所以总结下,Move语言的最大特性是所有权,线性类型原理,前置资产不能随意复制和丢弃。同时, Move将资产定义为对象(对象由地址来控制)。而Move 程序定义了基于这些对象的操作,包括创建的定制化规则,资产的转移,以及改变资产的操作。Sui 使用对象模型并利用 Move 的强大所有权模型,进一步将这种方法扩展到更多涉及的交易,这些交易可能明确依赖于其发送者控制下的多个元素。通过要求明确的依赖关系,Sui 将“多通道”方法应用于交易验证,确保这些独立的交易流可以不受其他阻碍地进行。

一切皆为对象,有全局ID

Sui 定义了一切对象,每个Sui对象都有一个全局唯一标识符,它作为对象的持久标识,在所有者之间流动以其他对象的流入和流入流出。每个ID由对象分配,而交易创建了对象本身。此 ID 由创建它的事务分配给对象。ID 也是递增的。除了 ID 之外,每个对象还携带有关其所有权的元数据。他的对象有三种,第一种,不可变的对象 (比如Package,模块, 这里叫模块,其他链称为智能合约)。Move程序通过模块组合而成,而每个模块都包含结构声明和函数声明。模块可以从其他模块上输入结构类型并且调用其他模块声明的函数。当然还有包括单所有者对象和共享对象。单个地址控制的对象叫做单所有者对象,而对象也可以和其他对象共享读/写权限,或者只以读权限共享。而对象的所有权决定了交易是否或者如何使用这个对象作为输入。总结一下,单所有者对象只能用于其所有者发起的交易或者将其母对象视为输入,而共享对象可以被任意交易使用,但是只能具有指定的可变性权限。比如我有个共享对象,那么多个人可以修改它,这种情况下,我们需要共识。作为用户,当你需要去访问合约,访问对象的时候,就需要走共识流程。单所有者对象可以变为共享对象,也可以把共享对象的内容,子对象,构造成单所有者对象。单所有者对象也可以转变为不可变对象,但是这个方向是不可逆的。

共识机制

Sui的共识机制也非常有特色的,主要围绕着三种对象展开。针对于不可变对象,不可变对象可以理解为常量,随便引用,所以不需要共识。单所有者对象是通过DAG+BFT一致广播协议, 这个并不需要共识。当我找到这个对象后,我只要找到这个对象的依赖路径,因为每个对象在生成的时候,他是根据在之前的对象以及依赖路径实现的。比如我有笔交易,从账户A到账户B,这个对象会生成新的版本,这意味着不可变对象不能再变为所有者对象。除了不可变之外,他的版本或者哈希会发生变化。而这个哈希也会根据同一个对象之前的版本生成,交易的签名,时间戳,会生成新的哈希值。所以这是一个依赖DAG的情况,类似于比特币的UTXO模式,能够找到当前对象的整个关系网络,从而确保对象转账可信性。转账也是目前Sui的主打应用场景,可以实现在无需大家共同操作同一个对象的情况下,实现非常快的单笔交易的提交(注意,Sui的网络上是单笔交易验证,而并非像在以太坊,比特币网络中的N条交易区块打包,这也是非常重要的特色)。共享对象是基于BFT 共识,Narwhal and Tusk, 从Libera BFT的共识衍化而来。

Sui的全局存储

Move语言的全局存储,会带来状态爆炸的问题,所以Sui的全局存储设计,独立于Move语言的全局存储,重新做了设计,并且引入了存储基金等经济激励设计(这块的问题我们会在下篇经济机制设计中详细进行解读)。CTO 在discord提到目前这个存储大小小于1兆(非最终确定值,会根据测试情况进行进行调整),所以NFT图片,游戏的道具的存储问题可以被很好的解决。从成本来讲,链上数据存储带来了严峻的跨期挑战:比如说今天处理数据并且将数据写入存储的验证节点可能与未来需要存储该数据的验证者不同。如果说用户仅在写入时支付计算费用,那么未来用户将需要为过去用户的存储支付补贴以及高昂的费用。所以负面的网络外部性会给Sui带来潜在的风险。所以为了解决这个隐患。当用户在 Sui 上进行交易时,他们会预先支付计算和存储费用 (一般网络上需要支付手续费,还有存储费用)。存储费会被存入存储基金,用于调整分配给验证者的未来权益奖励,而这个奖励是基于 SUI 质押者的份额(POS机制的设计)。这个设计可以给Sui的验证者带来持续性的激励,并且提供整个网络的商业可持续性。当然相比于其他解决的方案,比如AR, IPFS,这个全局存储有什么功能差异和全新体验呢(问题来自于Yolo 童鞋)。那么针对于大对象,我们鼓励大家还是去使用专门的链,而小对象(1兆临界值),Sui提供了相对友好,轻松调用API的灵活体验。Move语言自身的全局存储,也类似。官方展示了NFT,游戏等适用的应用场景,有兴趣的朋友可以去搜索相关资料。这里针对1兆的临界值,红军大叔认为1兆以下可能更适合一些文本,长文本。这里的核心问题在于小文件存储会占用大量的存储空间,在去中心化的环境下,如何保证矿工按照协定保留历史数据?(changbin童鞋)。而在Sui的经济设计下,运营节点在利益驱动的情况下,总会试图删除老数据,目前并没有看到Sui文档中关于引入类似Filecoin中时空证明以及挑战机制的设计。

强调为普通用户设计,降低开发者门槛

Sui 他们在今年初的时候,发了一些文章,为了实现真正的Web3愿景,其主打产品致力于服务于普罗大众,并且非常开发者友好。TPS也一再号称可以达到十几到二十万。这主要是因为在单所有者模式下,通过DAG+BFT的一致广播协议,相较于传统的验证者需要同步数据,多轮共识的BFT机制下,可以实现效率更高的来回通信。师虎兄提到目前上线的游戏Demo演示速度非常快,画面感也非常好。Sui为游戏做了专门的SDK(与合作伙伴一起开发这个GameSDK),因为对于Move语言来讲,你可以开发工具包,而且Move语言本身除了标准库以外,还有自己的框架,每个链都有自己的框架。而且Library能够不断增强你链上的功能。这是Move语言的一大优势。而对于开发者来说,在开发的时候,你可能并不需要熟悉Move语言本身,大大降低了开发者门槛。同时,为了改善用户体验,通常情况下用户需要注册web3钱包才能使用服务,而在Sui网络上,可以通过发邮件解决,比如通过邮件接收Token。同时,如果你没有gas费支付,还可以进行委托支付, 或者通过phyisical work获得相应收益,比如可以通过看广告,玩游戏获得相应的燃料费用(这个借鉴了以太坊最新的设计理念,受托支付)。所以Sui在用户体验,面向这个普通用户开发者的时候,做了很多设想和设计。目前其激励测试版刚上线,分配机制也很诱人。除了存储基金的设计以外,Sui 基金会给每个测试网阶段的参与者奖励 2,000 SUI。同时Sui 基金会承诺将 Sui 代币供应的 10% 质押给继续参与 Sui 主网的表现最好的验证者(之前Aptos几万人拿了200个份额,所以对于跑节点的大户应该很有吸引力)。

工程设计中的trade off 问题

设计复杂度

怎么避免数据爆炸问题呢?红军大叔认为图片,链,二进制这些数据放在一起,会带来状态爆炸的问题,的确Su在设计中也试图在解决这个问题。传统区块链通常只需要一个共识协议,而Sui需要两个协议:(1) 基于拜占庭一致广播的协议来处理简单的交易,以及(2)共识协议来处理与共享对象的交易。这意味着 Sui 团队需要维护一个更大的代码库。涉及共享对象的事务在将其提交到共识协议之前需要一点成本。而这个成本主要用于安全地组合上述两种协议。在其他区块链上交易是被直接提交给共识协议的。可以直接将交易提交给共识协议。请注意,共享对象交易的最终确定性仍在 2-3 秒范围内(尽管有这个成本)。在 Sui 中构建高效的同步器比在传统区块链中更难。同步器子协议允许验证器通过共享数据来相互更新,慢速验证器也可以追赶上。这种设计似乎参照了古典数据库 (最简单一个存服务器的路径,直接存在blob clob (数据库里的一种数据类型)的模式,存二进制存进去,理论上隔离)(红军大叔)。

简单情况下的顺序写入

传统区块链需要所有节点同步信息,达成共识,并且对于所有客户端交易进行排序。比如提议者可以抢跑,三明治攻击自己的交易(BAD MEV),尽管别人的交易最先提交,因而会产生MEV价值提取问题,为用户和生态带来损害。而Sui对于大部分交易放弃了共识(上文提到的不可变对象以及单所有者模式下,通过DAG+BFT的一致广播协议)从而减少网络的延迟问题。通过这种方式,Sui 启用了多通道处理方法。其他交易无需排队等待,前一笔交易的完成。Sui 为每笔交易提供适当宽度的通道。简单的交易只需要查看发送方账户 (用户无需像其他链上的用户一样去区块链浏览器上追踪交易信息,大大优化了用户体验),当然这种的设计缺点是这些交易者每次只能发送一笔交易,因此交易必须快速完成。

复杂的总查询

相较于传统区块链,Sui 的总查询可能更加困难,因为它并不强调交易的总顺序(Total Order)而是采用了随意排序(Casual order)。就本地读取而言,总查询相当少见,但在某些情况下很有用。例如,一个新的验证者加入网络并需要将总状态下载到磁盘,或者审计员希望审计整个区块链。

Sui 通过检查点的设计试图解决这个问题。每次将增量添加到由认证交易产生的区块链时,都会建立一个检查点。检查点的工作方式很像预写日志,它在程序完全执行之前存储状态。该程序中的调用代表区块链中的智能合约。检查点不仅包含交易,还包含交易前后对区块链状态的承诺。Sui 使用了epoch 变化时的状态承诺。Sui 需要来自多个验证者的单一答案,并利用辅助协议获得代表区块链状态的哈希值。该协议消耗的带宽很少,也不会导致交易的堵塞问题。验证器在每个 epoch 变化时生产检查点。Sui 要求验证器也更频繁地生成检查点。因此,用户可以使用这些检查点来审计区块链。

总结

至此,我们对于Sui的技术特色以及工程机制进行了梳理。对于Sui而言,Move语言是核心,Move衍生出的很多特性,比如对象,共识机制都是非常独特的,区别于其他链的设计。其他链上普遍的共识,打包,交易,顺序等,在Sui上进行了重新设计,确保了足够的安全,当然也牺牲了部分的灵活性。比如不可变带来的性能不可变问题。资产,对象,需要用户签名,和合约没关系。资产并不在合约名下,合约没有保存数据,资产保存在用户地址下面。而在全局存储的设计下,Public Key就是账户地址。同时我们发现,原来函数式的设计似乎被越来越多的协议引入,用于提升区块链的整体性能,包括不可变,Actor模型(内部不可变)等,并且巧妙地利用隔离机制 ,加强并行力度,实现高性能(TPS)。Sui虽然没有直接采用Actor模型,但是类似于Actor的设计,通过DAG等独立设计,保证了并发力度,并且通过加入相应特性,切入特定应用场景,为用户带来更好的用户体验。

从用户角度来讲,如果我们说Rust的开发难度为100,那么精简的Move语言开发难度为10(CosmWasm,Rust在20-30吧)。同时,Move写代码编译为Move VM(虚拟机)的字节码,和webassembly 有点像(webassembly为010101的二进制字节码,上面为Rust,再上面为Move)。

引用

Subscribe to atom_crypto
Receive new entries directly to your inbox.
Collectors
View
#1
#2
#3
View collectors
This entry has been permanently stored on-chain and signed by its creator.