在以太坊上,一个合约支持哪些接口,几乎全靠 ERC-165 的 supportsInterface 查询和各市场自己维护的登记表;tezos 走的是另一条更”自描述”的路:合约把入口清单像标签一样贴在代码注解里。TZIP-017 是这条路上与签名体验直接相关的一份提案,它把”先签名、后代付、后揭示”的预签名模式标准化,给 NFT 领取、免 gas 交互这类场景提供统一接口。需要先说明状态:这份 2020 年 8 月提出的接口类提案在官方仓库里仍标注为 Draft,属于设计完整但未走完标准化流程的规范,引用它的合约以自身文档为准。
它要解决的问题在 tezos 与以太坊两边长得一样:你想领一枚免费 NFT 或执行一次链上操作,却要为一笔小操作垫付 gas、还要等入块;如果由项目方代付,传统模型又要求项目方持有你的私钥权限,这是不可接受的。预签名模型的答案是把”授权”与”执行”拆给两方:持有者用自己的密钥对一个结构化许可签名,签名不直接上链;项目方或任何第三方把这份签名连同参数打包成一笔揭示交易提交,费用由提交者出。
TZIP-017 的关键设计是把许可拆成 reveal 与 redeem 两个动作。规范文本给出的模型里,签名覆盖的不只是”我想转这批代币”这句话,还包括一组防重放与防串链的上下文变量:计数器(counter)、链标识、签名者地址、以及揭示时要用到的参数。计数器对应 tezos 的公钥管理机制——tezos 的同一地址可以轮换多个公钥,每个有编号,许可把”用哪把公钥签的”钉死在签名里,防止旧公钥被撤销后签名仍在别处被重放。链标识字段则阻止同一份签名在主网和测试网之间挪用。
对 NFT 场景,这套接口的典型用法有三类。一是免费铸造:项目方公布 permit 入口的调用格式,持有者本地签名,聚合器批量收集签名后一次揭示,gas 由项目方或揭示人承担;签名里带过期参数(deadline 类字段)的项目让过期的许可自动失效。二是代付授权:用户签名允许一个中继合约代表自己执行某次转账或领取,中继在链上 redeem 时校验签名与计数器。三是跨合约组合:一份许可能覆盖的只是签名时被明示的那组参数,任何字段被改动,链上校验就会失败,这让”授权范围”第一次在 tezos 上变得可读、可核对。
与以太坊的相近概念对照着看最清楚。以太坊一侧对应的是 EIP-2612 的 permit 与 EIP-712 的结构化签名,签名同样不上链、同样防篡改,差别在于 tezos 的账户模型允许一个地址挂多把可轮换公钥,因此许可必须显式绑定密钥编号,而以太坊的外部拥有账户只有一把当前密钥,没有这个字段。另一个差别是 tezos 把 gas 语言写进了模型:提案文本讨论了用链下服务协调执行费、揭示者可获得支付等激励设计,把”谁付钱”作为接口设计的一部分,而不是留给生态自行摸索。
给使用者的核对清单由此而来。第一,签名前先看清钱包弹窗里的参数摘要:涉及哪只合约、哪几个 tokenId、有没有过期字段、计数器是多少;摘要缺失或全是十六进制的授权要格外警惕。第二,理解签名的”不上链”性质——你签完的那一刻链上什么都没发生,这既是免 gas 的来源,也是撤销窗口:在揭示之前,链上状态不变,但你也无法从链上查询这份签名的存在与去向。第三,计数器机制意味着同一地址连续签的多份许可互不覆盖,误签后简单再签一份并不能作废旧的,正确处置是等其过期、或在合约支持时通过提高计数器类入口使其失效(是否支持取决于具体合约实现)。
第四,也是最重要的一条:TZIP-017 仍是草案。看到某个项目宣传”支持 TZIP-17 免 gas”,要区分它实现的是提案文本、提案某个修订版,还是仅借用了这个名字的私有方案。判断方法是看合约源代码入口是否与提案的接口定义对应、签名格式里有没有 counter 与 chain id 字段,而不是看落地页措辞。标准地位决定了一个现实风险:不同项目对草案的解读可能不一致,同一份签名未必跨项目通用。
预签名模式的风险边界与其他链相同:签名一旦被有权限的第三方揭示就不可拒绝,签名内容写多少权限就只能兑现多少权限。机制本身不产生收益,也不改变资产归属规则;对任何以”免 gas 领取”为名的入口,先把签名请求当成一笔真实交易来审,是这类接口给每个使用者的基本功。
本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。