摘要
Gas 豁免人(免 Gas 费)功能通过允许一小部分经过治理批准的地址(“豁免人”)提交gasPrice = 0 的交易,实现 Stable 链上终端用户的无 Gas 费交易。Stable 目前运营一个豁免人服务(“豁免人服务器”),合作伙伴可以集成该服务,无需实现特定协议的封包逻辑即可提供无 Gas 费用户体验。
本文档规定了 Gas 豁免人 机制、交易格式、治理控制以及面向合作伙伴的豁免人服务器 API。
范围
本规范涵盖:- 免 Gas 费交易的协议级规则
- 封包交易机制和标记地址
- 治理控制的授权和允许的目标
- 用于提交已签名用户交易的豁免人服务器接口
定义
- Waiver(豁免人):通过验证者治理在链上注册的以太坊地址,授权提交免 Gas 费交易。
- InnerTx(内部交易):终端用户签名的交易,
gasPrice = 0。 - WrapperTx(封包交易):由豁免人签名的交易,将用户的
InnerTx传输到链上并授权执行。 - Marker address(标记地址):用于识别豁免人封包交易的哨兵地址:
0x000000000000000000000000000000000000f333。 - AllowedTarget(允许的目标):一种策略,将豁免人限制在特定的合约地址和方法选择器。
概述
Gas 豁免人 使用封包交易模式:- 用户使用
gasPrice = 0签署InnerTx。 - 豁免人将
InnerTx封包成WrapperTx并广播。 - 验证者检测到标记交易,验证豁免人授权和策略约束,然后执行嵌入的
InnerTx。
InnerTx 负载。
协议规范
标记地址路由
当且仅当满足以下条件时,交易被视为豁免人封包交易:to == 0x000000000000000000000000000000000000f333。
data 字段解释为编码的内部交易负载,并使用以下豁免人验证规则进行处理。
授权和策略检查
对于每个候选封包交易,验证者必须执行:- 豁免人授权
WrapperTx.from必须是通过治理在链上注册的豁免人地址。
- Gas 豁免
WrapperTx.gasPrice必须等于0。InnerTx.gasPrice必须等于0。
- 目标白名单
InnerTx.to和从InnerTx.data提取的方法选择器必须被豁免人的AllowedTarget策略允许。
- Value 限制
WrapperTx.value必须等于0。
执行语义
如果所有检查通过:- 协议以用户身份执行
InnerTx,保留用户的from、nonce和调用语义。 - Gas 计费由豁免人机制处理:用户不支付 Gas 费,豁免人交易根据功能定义使用
gasPrice = 0。 - 封包交易必须提供足够的
gasLimit以覆盖InnerTx的执行(包括解包和验证的开销)。
交易格式
WrapperTx
封包交易由豁免人签署并发送到标记地址。InnerTx
内部交易由终端用户签署。治理控制的访问
豁免人授权由验证者治理在链上管理。 治理控制提供:- 可审查的豁免人地址授权
- 豁免人注册和更新的链上透明度
- 撤销能力
- 通过
AllowedTarget进行每个豁免人的范围界定
安全模型
终端用户签名完整性
用户签署InnerTx。豁免人不允许修改内部交易负载而不使签名失效。合作伙伴仍必须确保用户仅签署预期的交易负载。
信任边界
如果合作伙伴通过豁免人服务器路由提交,Gas 豁免人 引入了服务依赖性:- 服务的可用性影响提交无 Gas 费交易的能力。
- 授权保留在链上;只有注册的豁免人地址才能产生有效的封包提交。
合作伙伴集成
合作伙伴通过以下方式集成:- 从用户收集已签名的
InnerTx(gasPrice = 0)。 - 将已签名的内部交易提交到豁免人服务器 API。
- 处理流式结果并向终端用户显示交易哈希。
豁免人服务器
概述
豁免人服务器将已签名的用户InnerTx 负载封包并广播为豁免人授权的封包交易。合作伙伴无需构造封包交易或操作豁免人地址。
端点和基础 URL
基础 URL:- 主网:待定
- 测试网:
https://waiver.testnet.stable.xyz
身份验证
除健康检查外,所有端点都需要 Bearer Token 身份验证:API
GET /v1/health
健康检查端点。
身份验证:无。
POST /v1/submit
提交一批已签名的内部交易。
身份验证:必需(Bearer)。
请求正文:
GET /v1/submit
用于流式提交的 WebSocket 接口。
身份验证:必需(Bearer)。
集成示例
创建用户 InnerTx
合作伙伴负责构造gasPrice = 0 的 InnerTx,然后收集用户签名。
示例:
错误代码
PARSE_ERROR:解析交易失败INVALID_REQUEST:请求正文格式错误BATCH_SIZE_EXCEEDED:批处理大小超过允许的最大值VALIDATION_FAILED:交易验证失败BROADCAST_FAILED:广播到链失败RATE_LIMITED:超过速率限制QUEUE_FULL:服务器队列已满TIMEOUT:请求超时

