Sui开发者必读:MOVE语言及技术特性

2023-05-04 18:49 栏目:行业动态 来源:网络整理 查看()

作者:隋网

本文是Sui Network 最佳实践的开发者快速参考。

Sui 是基于第一性原理重新设计和构建的L1 公链,旨在为创作者和开发者提供一个能够在Web3 上承载下一个十亿用户的开发平台。 Sui 上的应用程序基于Move 智能合约语言,可横向扩展,允许开发人员快速且低成本地支持广泛的应用程序开发。 Sui主网将于2023年5月3日正式上线。

本文是Sui Network 最佳实践的开发者快速参考。

Move

常规知识

阅读有关升级包的更多信息并编写升级友好的代码。

包是不可变的,易受攻击的包代码可以永远调用。解决方案是在对象级别添加保护。

如果将一个包从P 升级到P',其他依赖P 的包和客户端将继续使用P,而不是自动更新到P'。因此,依赖包和客户端的代码都必须更新为显式指向P'。

期望被依赖包扩展的包可以通过在所有版本中提供符合标准的(不变的)接口来避免每次升级时破坏以前的扩展。以Wormhole跨链桥为例,Wormhole作为发送消息的桥梁,客户端生成和发送消息的代码需要传递一个MessageTicket给最新版本包中的publish_message。

公共功能不能删除或修改,但公共(朋友)功能可以删除或修改。您可以自由地只使用公共(朋友)函数或自可见函数,除非您不希望您当前的库函数永远公开。

无法删除结构类型。可以添加新字段(甚至可以添加动态字段)并且可以通过升级添加新功能。添加新类型时要仔细考虑。添加一次,永久保留!

使用向量支持的集合(向量、VecSet、VecMap、PriorityQueue 等),最多包含1000 个数据项。

对于允许第三方添加的集合、更大的集合和未知大小的集合,使用基于动态字段的集合(Table、Bag、ObjectBag、ObjectTable、LinkedTable 等)。

Sui Move 对象的最大大小为250KB——。任何创建大于此对象的尝试都将中止事务。确保对象不会持续增长到大于向量支持的集合。

如果函数f 需要调用者支付(例如SUI),请使用fun f(payment: Coin) 函数而不是fun f(payment: mut Coin, amount: u64) 函数。这对调用者来说更安全。因为他们确切地知道他们应该支付什么,并且他们不需要依赖函数f 来提取正确的金额。

无需稍微优化气体消耗。在计算Sui 的成本时,采用四舍五入的方法来计算最近的桶,因此只有非常快速的波动才会引起气体变化。特别是如果这笔交易已经处于最低成本范围内,那就再便宜不过了。详情见下图。

Sui开发者必读:MOVE语言及技术特性

遵循Move 编码约定以实现统一的样式。

t-align: left;">可组合性
  • 使用 display 标准自定义您的对象在钱包、应用程序和浏览器中的显示方式。

  • 避免使用「自我转移」功能——任何时候都有可能,从当前函数返回 obj,而不是写入 transfer::transfer(obj, tx_context::sender(ctx)),这允许调用者或可编程交易块(programmable transaction block)使用 obj。

测试

  • 使用 sui::test_scenario`模拟多次交易和多位发送者的测试场景。

  • 使用 sui::test_utilsmodule 通过 assert_eq 测试获得更好的纠错消息,通过 print 调试打印,以及通过 destroy 进行 test-only 销毁。

  • 使用 sui move test --coverage 计算测试时代码覆盖的信息,使用 sui move coverage source --module 查看以红色突出显示的未覆盖行。如果可行,建议将覆盖率设置为 100%。

应用程序

  • 为了获得最佳性能和数据一致性,应用程序应该在同一个全节点上提交写入和读取请求。在 TS SDK 中,这意味着应用程序应使用钱包的 signTransactionBlock API,然后通过调用应用程序全节点上的 execute_transactionBlock 来提交交易,而不是使用钱包的 signAndExecuteTransactionBlock API。这确保了先写后读的一致性——从应用程序的全节点读取将立即反映事务的写入,而不是等待 checkpoint。

  • 为了降低延迟,如果您的应用程序需要知道交易已确认,但不需要立即查看交易效果或读取交易写入的对象 / 事件,请使用带有"showEffects": false 和"showEvents": false 的 executeTransactionBlock。

  • 应用程序应该将频繁读取的数据本地缓存,而不是从全节点频繁抓取。

  • 尽可能地使用可编程交易块(programmable transaction blocks)来组合现有的链上功能,而不是发布新的智能合约代码。可编程交易块允许大规模批次处理和异构组合,进一步降低已经很低的 gas 费。

  • 应用程序应该将对 gas 预算、gas 价格和 coin 选择权留给钱包,这将为钱包提供了更大的灵活性,并且钱包有责任试运行交易以确保交易不会失败。

签名

  • 永远不要签署两笔触及同一独享对象的并发交易,要么单独使用独享对象,要么等待一笔交易结束后再发送下一笔交易。违反此规则可能会导致客户端模棱两可,从而同时锁定两个交易中涉及的独享对象,直到当前 epoch 结束。

  • 任何发起交易的 sui client 命令(例如 sui client publish、sui client call)都可以接受 --serialize-output 标志以输出要签名的 base64 交易。

  • Sui 支持多种签名方案(signature schemes)进行交易签名,包括包括本机多重签名。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发