最近在构思HOH水分子社区MOVE共学的最后一个defi项目,考虑的因为是慈善项目,gas费应该减免,所以查阅了一些资料,Sui网络的赞助交易(SponsoredTransactions)正好可以满足需求,现将学习笔记总结如下:一、基本原理介绍Sui网络的赞助交易(SponsoredTr
最近在构思HOH水分子社区MOVE共学的最后一个defi项目,考虑的因为是慈善项目,gas费应该减免,所以查阅了一些资料,Sui 网络的赞助交易(Sponsored Transactions)正好可以满足需求,现将学习笔记总结如下:
Sui 网络的赞助交易(Sponsored Transactions)是一种由某个地址(赞助者)支付其他地址(用户)发起交易的 gas 费用的机制。这种机制可以使用户在进行链上交易时无需支付 gas 费用,从而减少 Web 2.0 用户进入 Web 3.0 时遇到的障碍。通过赞助交易,用户无需购买代币就能执行交易,从而降低了进入 Web3 的门槛。
赞助交易的应用场景
使用赞助交易的潜在风险
赞助交易的最大潜在风险是歧义(Equivocation)。歧义发生在用户或赞助者尝试对原始交易中的拥有对象(例如 ObjectID 和 SequenceNumber)进行操控时,从而导致对象状态在多个非最终化的交易中并行使用。这种情况可能导致对象在 Sui 验证者验证时进入锁定状态,进而引发双重花费的风险。
创建用户发起的赞助交易
用户发起的赞助交易需要以下步骤:
GasLessTransactionData 结构体用于描述不包含 GasData 的交易数据,它是用户和赞助者之间的一个接口。
pub struct GasLessTransactionData {
pub kind: TransactionKind,
sender: SuiAddress,
// 其他字段
}
创建赞助者发起的赞助交易
赞助者发起的赞助交易需要以下步骤:
这种交易形式适用于广告商或其他用例,赞助者可以为特定用户行为提供激励,而无需用户支付 gas 费用。
使用 GasData 对象赞助交易
使用 GasData 对象来赞助交易的步骤如下:
GasData 对象本质上是为用户提供一张“空白支票”,用户无需了解或批准具体的 gas 费用,只要预算足够,便可以支付交易的 gas 费用。
创建 Sui Gas Station
在 Sui 网络中,Gas Station 用于描述提供用户交易赞助的流程。你可以定制一个 Gas Station 来支持特定的用户功能,例如:
授权和速率限制
根据 Gas Station 的具体需求,可以应用不同的授权策略来避免恶意攻击。可能的策略包括:
代码示例:创建一个 Sui Gas Station
以下是 Rust SDK 代码示例,展示如何实现支持赞助交易的 Sui Gas Station。
用户发起的赞助交易:
pub fn request_gas_and_signature(gasless_tx: GaslessTransaction) -> Result<SenderSignedData, Error>;
使用 GasData 对象赞助交易:
pub fn request_gas(/*要求数据*/) -> Result<GasData, Error>;
用户和赞助者发起的双重签名交易:
pub fn submit_dual_signed_transaction(dual_signed_data: SenderSignedData) -> Result<(Transaction, CertifiedTransactionEffects), Error>;
赞助交易的数据结构
以下是用于描述赞助交易的 TransactionData 和 GasData 结构体。
TransactionData 结构体:
#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
pub struct TransactionDataV1 {
pub kind: TransactionKind,
pub sender: SuiAddress,
pub gas_data: GasData,
pub expiration: TransactionExpiration,
}
GasData 结构体:
#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
pub struct GasData {
pub payment: Vec<ObjectRef>,
pub owner: SuiAddress,
pub price: u64,
pub budget: u64,
}
下面是实战内容,首先我们来看一下sui 官方的ts sdk如何发起一笔赞助交易 链接
const tx = new Transaction();
// ... add some transactions...
const kindBytes = await tx.build({ provider, onlyTransactionKind: true });
// construct a sponsored transaction from the kind bytes
const sponsoredtx = Transaction.fromKind(kindBytes);
// you can now set the sponsored transaction data that is required
sponsoredtx.setSender(sender);
sponsoredtx.setGasOwner(sponsor);
sponsoredtx.setGasPayment(sponsorCoins);
其实官网文档写的内容并不多,进一步搜索发现了这个项目,如果你想部署一个开源的gas station,可以考虑这个方案 sui-gas-pool
下面简单说下使用Gas Pool服务(Sui Gas Pool)搭建一个 Gas Station 的详细过程,旨在支持大规模的赞助交易操作。Gas Station 通过管理一组由赞助者地址拥有的 Gas 代币,提供 API 接口来预留 Gas 代币,并支付交易费用。
Sui Gas Pool 是支持大规模赞助交易的服务,其核心是一个数据库,用于管理由赞助者地址持有的 Gas 代币对象。通过优化 Gas 代币管理,Gas Pool 能够同时支持大量交易,并实现高吞吐量。
Gas Pool 服务的典型用户交互流程如下:
Gas Pool 服务实例由以下组件组成:
4.1 Redis 存储
4.2 Gas Pool 服务器
主要接口:
4.3 Gas Pool 初始化程序
以下是搭建 Gas Station 的完整部署流程:
生成或获取赞助者地址的密钥对:
为地址添加初始资金:
部署 Redis 实例:
创建 YAML 配置文件:
tool generate-sample-config --config-path sample.yaml --with-sidecar-signer
设置 RPC 服务的安全令牌:
部署 Gas Pool 服务器:
示例配置文件:
signer-config:
sidecar:
sidecar_url: "http://localhost:3000"
rpc-host-ip: 0.0.0.0
rpc-port: 9527
metrics-port: 9184
gas-pool-config:
redis:
redis_url: "redis://127.0.0.1"
fullnode-url: "http://localhost:9000"
coin-init-config:
target-init-balance: 100000000
refresh-interval-sec: 86400
daily-gas-usage-cap: 1500000000000
通过以上步骤,可成功部署和运行一个高效的 Sui Gas Station,用于支持大规模的赞助交易,为用户降低操作门槛,同时为开发者提供可靠的基础设施支持。
再进一步研究,发现了这个项目,连部署都省了 Shinami Gas Station
这是一个托管式的gas station,注册app之后就能使用,使用方式如下:
学习笔记:Shinami Gas Station 使用指南
生成资金存款地址
存款建议
查看密钥绑定的资金账户
资金余额
近期支出
在 API Insights 标签页,提供以下信息:
过滤和指标
主要图表
通过 Shinami Gas Station,可高效管理 Sui 网络上的交易赞助,为去中心化应用提供可靠的服务支持。
以上就是使用Sui 网络中的赞助交易的学习笔记,后续介绍了官方的支持策略、开源gas station和托管式gas station三种方式,以便能更好的再实战中进行应用。
请用微信关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!