Skip to main content

赞助交易

Sui 赞助交易是指 Sui 地址(赞助者的地址)支付另一个地址(用户的地址)初始化的交易的 gas 费用。你可以使用赞助交易来支付站点或应用程序上的用户的费用,以便他们不必为此付费。这消除了进入 web3 时 Web 2.0 用户经常遇到的一个重要障碍,因为他们经常需要购买代币以执行链上的交易。例如,你可以赞助游戏玩家的早期交易,以提高转化率。

赞助交易还有助于资产管理,因为你无需使用 SUI 代币维护多个帐户以转移资金。

你可以使用 Sui 赞助交易来:

  • 赞助(为用户支付 gas 费用)用户启动的交易。
  • 赞助你作为赞助者发起的交易。
  • 为用户提供通配符 GasData 对象。该对象覆盖用户交易的 gas 费用。GasData 对象涵盖了为交易确定的任何费用金额,只要预算足够。

使用赞助交易可能面临的潜在风险

在使用赞助交易时可能面临的最大潜在风险是言辞暧昧。在某些情况下,在特定条件下,赞助交易可能导致所有相关的拥有对象,包括在 Sui 验证者检查时处于锁定状态的 gas。为了避免双重花费,验证者在验证交易时锁定对象。在拥有对象的成对 (ObjectIDSequenceNumber) 中,只有在多个未完成的交易中同时使用时才会发生言辞暧昧。

为了说辞暧昧,用户或赞助者会签署并提交另一笔交易,试图操纵原始交易中的拥有对象。因为只有拥有对象的所有者才能使用拥有对象,所以只有用户和赞助者才能引起这种情况。

创建用户启动的赞助交易

用户启动的赞助交易包括以下步骤:

  1. 用户初始化 GasLessTransactionData 交易。
  2. 用户将 GasLessTransactionData 发送给赞助者。
  3. 赞助者验证交易,构造带有 gas 费用的 TransactionData,然后签署 TransactionData
  4. 赞助者将已签名的 TransactionData 和赞助者的 Signature 发送回用户。
  5. 用户验证并签署 TransactionData,然后通过完整节点或赞助者将已双重签名的交易发送到 Sui 网络。

GasLessTransactionData

GasLessTransactionData 基本上是没有 GasDataTransactionData。它不是 sui-core 数据结构,而是用户和赞助者之间的接口。

以下示例构造了一个 GasLessTransactionData 对象。

pub struct GasLessTransactionData {
pub kind: TransactionKind,
sender: SuiAddress,

}

创建由赞助者发起的赞助交易

由赞助者发起的赞助交易涉及以下步骤:

  1. 赞助者构造一个包含交易详细信息和关联 gas 费用数据的 TransactionData 对象。赞助者在发送给用户之前对其进行签名,生成一个 Signature。你可以通过电子邮件、短信或应用程序界面发送未签名的 TransactionData
  2. 用户检查交易并对其进行签名,生成交易的第二个 Signature
  3. 用户将已双重签名的交易提交给 Sui 全节点或赞助者以执行它。

你可以将由赞助者发起的赞助交易用作广告商,或激励特定用户操作而无需用户支付 gas 费用。

使用 GasData 对象创建赞助交易

要使用 GasData 对象为交易赞助 gas 费用,创建一个涵盖为交易确定的费用的 GasData 对象。这类似于向用户提供一张空白支票,只能用于支付 gas 费用。用户无需知道费用是多少或批准费用。

使用 GasData 对象进行赞助交易涉及以下步骤:

  1. 赞助者向用户提供一个 GasData 对象。
  2. 用户构造 TransactionData 并对其进行签名,生成一个 Signature
  3. 用户将 TransactionDataSignature 发送给赞助者。
  4. 赞助者确认 TransactionData,然后对其进行签名。
  5. 赞助者提交已双重签名的 TransactionData 给全节点以执行交易。

创建 Sui 气站

在 Sui 上,气站是一个概念,用于描述你设置流程以赞助用户交易的位置。你可以定制 Sui 气站以支持你需要的特定面向用户的功能。一些 Sui 气站的示例用例包括:

  • 监视网络上的实时 gas 价格,以确定气站提供的 gas 价格。
  • 跟踪向用户提供的 gas 的使用情况。
  • 气池管理,例如使用特定的 gas 对象以最小化成本或降低锁定的大量对象的风险,同时保持这些对象在锁定状态下不流动。

授权和速率限制

根据你的气站性质,你可以应用不同的授权规则,以避免被不良行为者滥用。可能的政策包括:

  • 每个帐户或每个 IP 地址限制 gas 请求速率
  • 仅接受具有有效授权头的请求,该头具有单独的速率限制

滥用检测

对于你作为赞助者提供的所有 gas 对象,你应该跟踪用户是否曾试图使用言辞暧昧并锁定对象。如果检测到此类行为,请相应地阻止用户或请求者。

用于创建 Sui 气站的代码示例

以下 Rust SDK 代码示例演示了如何实现一个支持前述每种赞助交易类型的 Sui 气站。

用户启动的赞助交易

使用 API 端点接收 GaslessTransaction 交易并返回一个单签名的 SenderSignedData 对象。

pub fn request_gas_and_signature(gasless_tx: GaslessTransaction) -> Result<SenderSignedData, Error>;

使用 GasData 对象的赞助交易

使用 API 端点接收单签名的 SenderSignedData 并返回交易的结果。

pub fn submit_sole_signed_transaction(sole_signed_data: SenderSignedData) -> Result<(Transaction, CertifiedTransactionEffects), Error>;

或者,使用 API 端点返回一个 GasData 对象。

pub fn request_gas(/*requirement data*/) -> Result<GasData, Error>;

用户和赞助方启动的交易

使用 API 端点接收双签名的 SenderSignedData 并返回交易的结果。

pub fn submit_dual_signed_transaction(dual_signed_data: SenderSignedData) -> Result<(Transaction, CertifiedTransactionEffects), Error>;

对于由用户和赞助方启动的交易,用户可以通过赞助方或 Full 节点提交双签名的交易。

赞助交易数据结构

以下代码块描述了赞助交易和 GasObjectTransactionData 结构。你可以在 Sui GitHub 存储库的 源代码 中查看。

TransactionData 结构

#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
pub struct TransactionData {
pub kind: TransactionKind,
pub sender: SuiAddress,
pub gas_data: GasData,
}

GasData 结构

#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
pub struct GasData {
pub payment: ObjectRef,
pub owner: SuiAddress,
pub price: u64,
pub budget: u64,
}

要了解有关 Sui 中交易的更多信息,请参阅 Transactions.