本文解释了StarkNet ID的自动续订功能,该功能通过智能合约实现用户域名续费。文章详细阐述了用户如何设置续订的“限制价格”和ETH“授权额度”来保护资金,并说明了自动续订的条件及终止方式,强调了该机制在保障用户资金安全方面的设计。

StarkNet ID 最近为用户推出了订阅功能。一个自动续订合约已被部署,以方便用户域名的续订。本文解释了我们智能合约审计中审查的此订阅功能的核心功能。
是的。智能合约旨在防止未经授权的 ETH 从用户账户转移,即使已经授予了代币 allowance。
一名 admin 负责监督此 Auto-Renewal contract,而 renewer 则负责在用户指定的 limiting price 和 allowance 下触发续订。
最显著的潜在风险是 admin 在命名合约上将域名价格提高到上限,即用户指定的 limiting price。然而,即使有足够的 allowance,admin 也不能每年代表用户花费超过 limiting price 的金额。
要添加订阅,用户需要与两个合约进行交互:
1 – Auto-Renewal Contract:用户创建一个支出流(enable_renewals()),其中指定了用户愿意为年度订阅支付的 limiting price。
2 – StarkGate ETH Contract:用户需要授权(approve())Auto-Renewal contract 足够的 ETH allowance 以支付年度订阅费用。
请注意,limiting price 和 allowance 都限制了续订的 ETH 支出。续订将在以下两种情况中的任何一种下失败:
1 – 如果域名成本高于 limiting price,以下检查将失败。
let total_price = domain_price + tax_price;
assert(allowance >= total_price, '续订 allowance 不足');
2 – 如果代币 allowance 已用尽,对 StarkGate ETH transferFrom() 的调用将 revert。
// 转移 allowance(包括税费),如果 tx 失败将被取消
IERC20CamelDispatcher{ contract_address: erc20 }.transferFrom(renewer, contract, total_price);
例如,对于 10 年订阅,用户应至少为 Auto-Renewal contract 分配 $10 \times (\text{domain_price} + \text{tax_price})$ 的 allowance。10 年后,ETH allowance 不足将导致订阅失效。
此外,续订只能在以下条件下发生:
1 – 每年一次(带有一天的余量)。
// 364 是因为我们不断给现有月份增加一天的余量,
// 如果续订时间超过一天,余量会缩小。
assert(block_timestamp - last_renewed > 86400_u64 * 364_u64, '域名已续订');
2 – 如果域名将在一个月内到期。
// 检查域名是否设置在一个月内到期
let expiry: u64 = INamingDispatcher{ contract_address: naming }
.domain_to_data(array![root_domain].span()).expiry;
assert(expiry <= block_timestamp + (86400_u64 * 30_u64), '域名未设置到期');
用户可以随时通过以下两种方法之一终止订阅:
任何一种方法都将中断续订流程,导致后续的续订尝试失败。
ChainSecurity 自 2017 年以来一直致力于保护智能合约。我们的客户包括蓝筹 DeFi 协议、有前途的新 Web3 项目、中央银行和大型组织。
阅读我们已发布的审计报告。
预约通话讨论审计前景。
延伸阅读
- 原文链接: chainsecurity.com/blog/s...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!