赞助交易
Sui 赞助交易是指 Sui 地址(赞助者的地址)支付另一个地址(用户的地址)初始化的交易的 gas 费用。你可以使用赞助交易来支付站点或应用程序上的用户的费用,以便他们不必为此付费。这消除了进入 web3 时 Web 2.0 用户经常遇到的一个重要障碍,因为他们经常需要购买代币以执行链上的交易。例如,你可以赞助游戏玩家的早期交易,以提高转化率。
赞助交易还有助于资产管理,因为你无需使用 SUI 代币维护多个帐户以转移资金。
你可以使用 Sui 赞助交易来:
- 赞助(为用户支付 gas 费用)用户启动的交易。
- 赞助你作为赞助者发起的交易。
- 为用户提供通配符
GasData
对象。该对象覆盖用户交易的 gas 费用。GasData
对象涵盖了为交易确定的任何费用金额,只要预算足够。
使用赞助交易可能面临的潜在风险
在使用赞助交易时可能面临的最大潜在风险是言辞暧昧。在某些情况下,在特定条件下,赞助交易可能导致所有相关的拥有对象,包括在 Sui 验证者检查时处于锁定状态的 gas。为了避免双重花费,验证者在验证交易时锁定对象。在拥有对象的成对 (ObjectID
,SequenceNumber
) 中,只有在多个未完成的交易中同时使用时才会发生言辞暧昧。
为了说辞暧昧,用户或赞助者会签署并提交另一笔交易,试图操纵原始交易中的拥有对象。因为只有拥有对象的所有者才能使用拥有对象,所以只有用户和赞助者才能引起这种情况。
创建用户启动的赞助交易
用户启动的赞助交易包括以下步骤:
- 用户初始化
GasLessTransactionData
交易。 - 用户将
GasLessTransactionData
发送给赞助者。 - 赞助者验证交易,构造带有 gas 费用的
TransactionData
,然后签署TransactionData
。 - 赞助者将已签名的
TransactionData
和赞助者的Signature
发送回用户。 - 用户验证并签署
TransactionData
,然后通过完整节点或赞助者将已双重签名的交易发送到 Sui 网络。
GasLessTransactionData
GasLessTransactionData
基本上是没有 GasData
的 TransactionData
。它不是 sui-core
数据结构,而是用户和赞助者之间的接口。
以下示例构造了一个 GasLessTransactionData
对象。
pub struct GasLessTransactionData {
pub kind: TransactionKind,
sender: SuiAddress,
…
}
创建由赞助者发起的赞助交易
由赞助者发起的赞助交易涉及以下步骤:
- 赞助者构造一个包含交易详细信息和关联 gas 费用数据的
TransactionData
对象。赞助者在发送给用户之前对其进行签名,生成一个Signature
。你可以通过电子邮件、短信或应用程序界面发送未签名的TransactionData
。 - 用户检查交易并对其进行签名,生成交易的第二个
Signature
。 - 用户将已双重签名的交易提交给 Sui 全节点或赞助者以执行它。
你可以将由赞助者发起的赞助交易用作广告商,或激励特定用户操作而无需用户支付 gas 费用。
使用 GasData 对象创建赞助交易
要使用 GasData
对象为交易赞助 gas 费用,创建一个涵盖为交易确定的费用的 GasData
对象。这类似于向用户提供一张空白支票,只能用于支付 gas 费用。用户无需知道费用是多少或批准费用。
使用 GasData
对象进行赞助交易涉及以下步骤:
- 赞助者向用户提供一个
GasData
对象。 - 用户构造
TransactionData
并对其进行签名,生成一个Signature
。 - 用户将
TransactionData
和Signature
发送给赞助者。 - 赞助者确认
TransactionData
,然后对其进行签名。 - 赞助者提交已双重签名的
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 节点提交双签名的交易。
赞助交易数据结构
以下代码块描述了赞助交易和 GasObject
的 TransactionData
结构。你可以在 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.