不转账、不交私钥,怎么证明一枚 NFT 是你的:签名所有权的原理 图 1
不转账、不交私钥,怎么证明一枚 NFT 是你的:签名所有权的原理 · 图 1

不转账、不交私钥,怎么证明一枚 NFT 是你的:签名所有权的原理

场景:对方要你“证明这个 NFT 是你的”

社群核验、空投登记、平台认证都常见这一幕。正确做法既不涉及转账,也不涉及交出任何密钥:验证方给一段文字(通常带随机串和时效),你在对应的钱包地址上用私钥签个名,把“消息 + 签名 + 地址”交回去,任何人拿以太坊的标准签名恢复函数都能验算:这个签名确实出自该地址的私钥。结合链上查询(该地址当前是不是这枚代币的 owner),结论成立,而全程不需要动那枚 NFT。

这就是“证明所有权”的技术本质:你证明的其实是“我控制这个地址”,代币归属让链上查询顺手补上。

不转账、不交私钥,怎么证明一枚 NFT 是你的:签名所有权的原理 图 2
不转账、不交私钥,怎么证明一枚 NFT 是你的:签名所有权的原理 · 图 2

EOA 与合约钱包走两条验证路

普通地址(EOA)的验证是纯密码学的:节点端用 secp256k1 恢复公钥即可判断。多签 Safe 这类合约地址没有“私钥”可恢复,验算要走 ERC-1271:调用方把消息与签名交给该合约的 isValidSignature,由合约自己按它的阈值规则判定有效与否,返回约定的魔术值才算通过。

差别有实际影响:有的核验工具只测 EOA 签名恢复,遇到合约地址就会误判“失败”。遇到 Safe 地址的持有者,核验方应当走 ERC-1271 路径,而不是简单拒收。

消息里该有什么、怕什么

一段安全的证明消息应当包含:验证方的一次性随机串(防止旧签名被拿来重放)、用途说明、时效。看到这些要素齐全、用词与你理解的用途一致,才签。危险信号是另一类:消息里出现十六进制的授权数据、要求你签的是“交易”而不是“消息”、或者文案含糊到可以套任何用途——签名消息本身不是交易,不消耗 gas,这正是它常被用来做“试探性钓鱼”的原因:先骗你签一个消息建立“会配合”的记录,或嵌入诱导内容。记住原则:证明所有权只需要对文本消息签名,任何声称“证明需要发一笔交易”的流程都值得警惕。

它与登录签名(SIWE 那类)同源但用途不同:登录消息绑定的是网站域名与会话,所有权证明消息绑定的是核验场景;两类消息不可互相挪用,重放在不同场景本身就是不规范实现的信号。

验证方检查清单

第一步,查链上:ownerOf(collection, tokenId) 是不是声称者的地址(Safe 场景则查成员关系)。第二步,验签名:EOA 用恢复算法,合约地址用 ERC-1271。第三步,看消息内容里的随机串是否本次下发、时效是否未过。第四步,看随机串有没有被该验证方记录为“已消费”,防止一份签名反复用于不同人。

它能说明什么,不能说明什么

能说明:此刻控制该地址私钥(或满足该合约签名规则)的人,愿意且有能力执行该地址的签名操作。不能说明四件事:不能说明这枚 NFT 的来源正当(转买、获赠、盗转后持有,签名一视同仁);不能说明现实身份(地址背后是谁,签名不回答);不能说明版权与授权关系;签名有效也不代表持有者本人知情——如果他是被诱导签的,协议层面与自愿无异。把它当作“控制权的证明”,而不是“可信度的证明”,对这句话的理解深度,基本决定了会不会被这类流程骗。

两种角色的共同底线

核验方的底线是:只索取消息签名、自己下发一次性随机串、验签逻辑对 EOA 与合约地址分别实现、绝不把“证明流程”包装成交易签名。声称者的底线是:确认消息内容无害、随机串与用途与本次场景匹配、确认自己是在对文本签名而不是对交易签名。两边都守住底线,这个机制就是干净的密码学工具;任何一边失守,它就会被用来钓鱼或越权。理解原理之后你会发现,所谓“所有权证明”的安全边界,其实取决于双方各做了什么,而不取决于密码学本身有多强。

风险提示:本文只解释技术机制与操作边界,不构成投资建议,也不推荐任何项目或平台。链上规则可能随版本升级变化,判断以官方规范文本与链上实际代码为准。