Cointime

扫码下载App
iOS & Android

给 Sui 开发者的入门指南:需要注意哪些事项?

项目方

Sui Network 主网启动,开发者又多了一块构建 DApp 的新土壤。

撰文:Sui Network

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

本文将为开发人员在 Sui Network 上的最佳实践做快速参考。

Move

常规知识

阅读有关包升级的详细信息并编写对升级友好的代码。

  • 包是不可变的,有漏洞的包代码可以永远调用,解决方案是在对象层面添加保护。
  • 如果将包从 P 升级到 P',依赖于 P 的其他包和客户端将继续使用 P,而不是自动更新到 P'。因此,依赖于包和客户端的代码都必须更新以明确地指向 P'。
  • 期望被依赖包扩展的包,可以通过提供符合所有版本标准的(不变的)接口,来避免每次升级时破坏它们之前的扩展。以 Wormhole 跨链桥为例,通过 Wormhole 作为桥梁发送消息,要想生成发送消息的扩展包,可以使用任意版本 Wormhole 包中的 prepare_message 指令来生成 MessageTicket,而发送消息的客户端代码必须将该 MessageTicket 传递到最新版本包中的 publish_message。
  • public 函数不能删除或更改,但 public(friend) 函数可以。您可以自由地使用 public(friend) 或仅自己可见功能,除非您要将现在的库函数永远公开。
  • 不能删除 struct 类型、不能添加新字段(尽管您可以添加动态字段)或通过升级新功能。添加新类型时请谨慎思考,一旦添加后将永远存在!

使用 vector 支持的集合(如 vector, VecSet, VecMap, PriorityQueue),最多不超过 1000 个数据项。

  • 使用动态字段支持的集合(如 Table、Bag、ObjectBag、ObjectTable、LinkedTable)用于任何允许第三方添加的集合、更大的集合和未知大小的集合。
  • Sui Move 对象最大为 250KB——任何创建更大对象的尝试都将导致事务中止,请确保您的对象没有不断增长大过 vector 支持的集合。

如果您的函数 f 需要来自调用者的付款,例如使用 SUI ,请使用 fun f(payment: Coin) 函数而不是 fun f(payment: &mut Coin, amount: u64) 函数。这对调用者来说更安全,因为他们可以准确地知道具体支付数额,并且不需要依靠函数 f 来提取正确的数额。

不需要小幅度优化 gas 消耗。在 Sui 上计算花费成本时,使用四舍五入的方法计算出其最接近的 bucket,因此只有非常剧烈的波动才会导致 gas 的变化。特别是,如果您的交易已经在最低成本范围内,那就不能更便宜了。详情请参照下图。

遵循 Move 编码惯例(Move coding conventions)来获得统一的式样。

可组合性

  • 使用 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)进行交易签名,包括包括本机多重签名。
评论

所有评论

推荐阅读

  • Bitwise BITB连续两日减持比特币,截至4月26日持仓降至33,888枚BTC

    Bitwise官方数据显示,截至当地时间4月26日,其比特币现货交易所交易基金BITB的比特币持仓触及33,888枚 BTC,较前一日减少约60枚BTC,已连续两日减持,市值约合 2,165,342,638.549 美元。此外,当前 BITB 流通份额降至62,160,000份,每份持仓额为 0.000545 BTC。

  • PYUSD过去24小时增发约1亿枚,总发行量再超3亿枚

    链上数据显示,PayPal推出的美元稳定币PayPal USD(PYUSD)总发行量再过去24小时增发约1亿枚,目前共发行约3.02亿枚。链上总持有地址数7656个,链上交易数量为85177笔。

  • 美国司法部驳回Tornado Cash开发者Roman Storm刑事指控动议

    美国司法部周五驳回了Tornado Cash开发者Roman Storm的驳回刑事指控的动议,称辩护文件提出了有争议的事实,应由陪审团权衡,而不是适合早期阶段动议的论点。司法部指控Storm与同伙Roman Semenov共同策划洗钱、经营未经许可的货币转移业务和违反制裁法律的阴谋,通过创建和运营Tornado Cash,一个旨在匿名交易的加密混合服务,朝鲜的Lazarus Group和其他犯罪实体通过Tornado Cash洗钱,美国当局指控。Storm的律师在3月底提出了驳回起诉书的动议,认为Tornado Cash不是托管混合服务,不符合“金融机构”的定义,Storm无法控制该服务或阻止Lazarus等组织使用它。周五的文件中,司法部对辩护方对Tornado Cash的描述提出了质疑,称其于2019年宣布为混合器,整个服务包括网站、用户界面、一组智能合约和“中继器网络”。

  • 灰度昨日晚间再次向Coinbase Prime地址转入超1000枚BTC

    据 Arkham 数据监测,灰度地址昨日晚间向 Coinbase Prime 转入约 411 枚 BTC 之后,于大约 14 小时前再次向 Coinbase Prime 地址转入 1003 枚 BTC,价值约合 6418 万美元。

  • 孙宇晨过去7小时累计向Binance充值1.66亿枚USDT

    据链上分析师@ai_9684xtpa监测,过去7小时,孙宇晨累计向Binance充值1.66亿枚USDT。 地址TLbkc...eRxuB:一周前赎回2023.10存入Justland的7860万枚WSTUSD,转换为USDT后存入币安; 地址TXNL4...PD752:7小时前赎回8553万枚USDT并存入币安。

  • 某地址8小时前向Galaxy Digital OTC地址转移8150枚ETH,疑似委托卖出

    据链上分析师@ai_9684xtpa监测,8小时前,地址0x4E8...fA555向Galaxy Digital OTC地址转移8150枚ETH(价值2564万美元),疑似委托卖出。 一个月前该巨鲸曾同样向OTC地址转移9150枚ETH,随后Galaxy Digital分批充值进Coinbase疑似出货;该地址的ETH建仓成本约3371美元,疑似卖出部分亏损253万美元。

  • 疑似Amber Group地址从Gate.io提取300万枚SAFE

    据Spot On Chain监测,钱包0x011(可能是Amber Group) 6小时前首次以2.25美元的价格从Gate.io提取了300万枚SAFE(672万美元)。值得注意的是,自 2024 年 4 月 23 日以来,SAFE的价格已经下跌了约36%。

  • 富兰克林以太坊ETF EZET在DTCC网站上列出

    据COINOTAG在X平台表示,富兰克林以太坊ETF EZET在DTCC网站上列出。

  • 灰度GBTC比特币持仓跌破30万枚BTC关口

    灰度官方数据显示,截至当地时间4月26日,GBTC的比特币持仓已跌破30万枚BTC关口,触及298,445.4699枚BTC,较前一日减少约2167枚BTC。 此外,GBTC 的资产管理规模(非公认会计原则)为19,052,609,573.56美元,流通份额降至335,190,100份。

  • 香港投委会:虚拟资产现货ETF可通过银行买卖

    香港投资者及理财教育委员会表示,现货虚拟资产ETF投资范围只限于在持有证监会牌照的虚拟资产交易平台上所提供予香港公众买卖的虚拟资产 (目前只限比特币及以太币),交易对手须通过持牌虚拟资产交易平台买卖虚拟资产,以减低交易对手风险。资产託管须委託在香港受监管的指定机构保管虚拟资产,例如持牌虚拟资产交易平台、银行或其于香港註册成立的子公司,以减低託管风险。投资者可以通过证券行或银行买卖虚拟资产现货ETF,有些虚拟资产现货ETF亦提供非上市的基金单位类别,有关单位类别的运作与非上市的基金十分类似,投资者可通过证券行或银行进行申购和赎回。