Skip to main content

代币管理

在 Sui 上进行编程时的一个关键概念是所有权对象。地址所有的对象对于高度可并行化的交易至关重要。它们还在逻辑上映射到某人独占所有的资产或资源。代币是所有权对象使用的典型案例,其中现金是现实生活的参考。然而,所有权对象的范式,尤其是与代币相关的部分,与其他区块链的余额概念略有分歧。换句话说,在其他系统中,尤其是基于账户的系统中,代币存放在一个单一的位置(字段)中,可以被视为银行账户中的余额。

由于 Sui 使用所有权对象而不是余额,通常拥有一些代币,有时甚至是相当数量的代币,是很常见的。一些情景需要合并一些或所有这些代币为单个对象。有时,合并代币可能是必需的,因为执行交易所需的金额超过发送方所拥有的任何单个代币,从而使合并成为不可避免的步骤。

SDK 使用

Sui 的 SDK(TypeScriptRust)会代表你管理代币,消除了手动处理代币管理的繁琐。SDK 会在可能的情况下尝试合并代币,并假设交易是按顺序执行的。这是一个合理的假设,特别是对于基于钱包的交易和一般情况下的常见场景。Sui 建议在不需要进行大规模并行或并发执行的情况下依赖于此功能。

Gas Smashing

在执行交易时,Sui 允许你提供多个代币作为付款。换句话说,支付可以是代币的向量,而不仅仅是单个代币。这个名为 gas smashing 的功能会自动执行代币合并,并为你编写的 PTB 提供一个可以用于除了 gas 之外的其他目的的单个 gas 代币。

基本上,你可以提供尽可能多的代币(在协议配置中定义的最大限制内),并将它们全部合并(smashed)到提供的第一个代币中。该代币在扣除 gas 预算后,然后可在交易内使用,并可用于任何命令。如果代币未使用,则会返回给用户。

Gas smashing 是一个重要的功能 - 也是一个需要理解的关键概念 - 用于最佳管理代币。有关更多详细信息,请参阅Gas Smashing

通用代币

Gas smashing 对于 Coin<Sui> 对象非常有效,这是唯一可以用于支付 gas 的代币类型。

其他任何代币类型都需要用户进行显式管理。PTB 提供了一个 mergeCoins 命令,你可以使用它将多个代币合并为单个代币。还有一个 splitCoins 作为补充操作来拆分它们。

从成本的角度来看,这些是非常便宜的交易,但是需要用户意识到他们的代币分布和自己的需求。

并发性

在需要重度或高并发性的场景中,将代币(尤其是 Coin<Sui>)合并为单个代币或非常少量的代币可能会在某些情况下出现问题。

如果将所有 Coin<Sui> 合并为单个代币,则需要按顺序提交每个事务。由于代币是一个所有权对象,因此在签署事务时必须提供版本,并且在执行锁定它的事务后,系统将其锁定,从而无法在其他事务中使用它。此外,尝试使用同一个代币签署多个事务可能导致模棱两可,使代币无法使用并在时代结束前被锁定。

因此,在需要重度并发性时,你应该首先将一个代币拆分为与要并发执行的事务数相同的代币。或者,你可以为不同的事务提供多个不同的代币(gas smashing)。至关重要的是,你在不同事务中使用的代币集合根本不能有任何交集。

在处理重度并发时可能存在许多潜在问题。事务执行中的并发性并不是唯一的性能瓶颈。在创建和提交事务时,可能需要与全节点进行几轮往返,以发现和获取正确的对象,并进行事务干扰。这些往返可能会显著影响性能。

并发性是一个复杂的主题,超出了此文档的范围。在处理并发情况下的代币管理时,你必须在最大程度上小心,并且正确的策略通常与具体的场景相关,而不是通用适用。