不填白名单也能定向铸造:签名验证铸造的机制与防冒用 图 1
不填白名单也能定向铸造:签名验证铸造的机制与防冒用 · 图 1

“凭签名铸造”(signed mint、allowlist 的签名式实现)是近几年热门项目常用的资格发放方式:不用把几万个地址写进合约白名单,而是由项目方离线签一张”通行证”,持有者把它和铸造请求一起提交上链。本文拆解这套机制的字段结构、验证逻辑,以及用户端最容易出问题的核对点。

先看它解决什么问题。传统默克尔树白名单要求项目方把全体获邀地址排序、生成一棵哈希树,把树根写进合约;每个用户领取资格时要提供自己那条路径的证明。它的优点是资格状态完全链上化,缺点是合约要先把名单”冻结”进树根——名单临时增补、按条件追加(比如”持有某旧作者优先”),都需要重新生成树并可能升级合约。签名式方案把验证从”查名单”改成”验签名”:合约不存名单,只存一个官方验证密钥;铸造函数多收一段数据——一段由项目方私钥签署的消息,内容通常包含接收地址、数量上限、截止区块(或时间)和一个随机数(nonce),合约用椭圆曲线签名验证(ECDSA 恢复)确认这段数据确实出自官方密钥、且每个字段都约束当前这次调用,通过就放行铸造。

这套结构里有三个字段值得逐项解释。第一个是接收地址:签名绑定了”谁能用这张证”,把它抄给别人通常无效,因为合约检查铸造请求的发起地址与签名里的地址是否一致。第二个是数量上限:一张签名可能只允许铸一枚,也可能给一个钱包额度。第三个是 nonce 或有效期:合约用记账方式记录哪些签名已被使用,防止同一张签名重复兑换;有效期字段则限定过期时间,过期签名即使没被用过也失效。三个机制合起来,签名才接近”一次性电子门票”而不是”永久通行证”。

用户核对要点由此展开。最重要的一条:签名必须随铸造调用在链上提交才算数,任何”私下把签名文件发给你""把签名发到私信里”的流程,都不是这套机制的正常形态——签名验证发生在合约执行内部,前端把参数拼好、你确认后随交易上链,全程不存在”客服代你提交签名”的必要环节。第二个核对点:签名字段里的地址是不是你的钱包地址、数量是不是公告里说的那枚,多数钱包在交易详情或签名弹窗里能看到这些参数,看不懂时宁可不签。第三个是域名:这类铸造同样离不开”前端页面是否官方”的判断,签名机制防的是资格伪造,不防钓鱼页面——假页面可以用一个假合约加任意”官方签名”骗你授权别的东西,所以先核对铸造合约地址再操作,永远排在第一位。

和默克尔白名单相比,两种方式在用户体感上几乎一样:都是”有资格才能铸、一人一份”。差异集中在项目方一侧:签名式发放不用预先冻结名单、可动态定向(给不同地址发不同额度、不同截止的签名),代价是官方签名密钥成为高价值目标——密钥泄露意味着伪造通行证的人可以批量放行铸造;默克尔式则把名单一次性锁死在树根里,公开可审计但灵活性差。没有哪种方式在安全性上绝对占优,关键看密钥管理和名单管理分别交给了谁。

还要澄清一个常见混淆:“签名验证铸造”和”用签名授权给别人铸你的币”(ERC-6492 反事实签名、permit 类免 gas 授权等)不是一回事,前者的签名是”入场资格”,后者的签名是”交易指令”。用户在钱包弹窗里看到的签名请求,如果要求你签一段看不懂含义的乱码数据,风险信号就已经亮起:正常的铸造流程里,你签的应该是明确标注接收地址、数量、截止时间的结构化消息,而不是来路不明的哈希。

任何资格机制都只约束”铸造这一步谁有份”,不会约束作品之后的价格表现,也不保证发放方不会调整未发放部分的政策。把签名字段核对清楚,是这套机制留给用户的全部自主权,其余的”内部通道签名""转让签名名额”多数属于交易资格之外的场外行为,链上无法为其背书。

本文为机制说明,不构成任何投资建议。参与铸造前请核对合约地址与签名字段,谨防钓鱼。