合约签名 ERC-1271:多签钱包怎么给 NFT 订单签名 图 1
合约签名 ERC-1271:多签钱包怎么给 NFT 订单签名 · 图 1

一句话理解

个人钱包签订单,靠的是“地址能反推公钥”;多签钱包这类合约没有私钥,反推逻辑失效。ERC-1271 反转了验证方向:市场不再自己验签,而是调用 isValidSignature(hash, signature) 问合约本人——“这签名你认吗?”合约回答认,订单才算有效。它让多签金库、DAO 国库也能在 NFT 市场正常下单。

消息怎么流

以挂单为例的完整路径:市场前端按 EIP-712 把订单字段(卖哪只、价格、期限、随机盐)哈希成结构化摘要 → 钱包/多签成员对摘要签名 → 市场凑齐签名后调用合约的 isValidSignature → 合约按自己的规则判定(Safe 的实现是检查本次提交里收集到的有效签名是否达到门槛数)→ 通过则订单入池可执行。

与个人签名的两点差异:

  1. 签名形态更厚。Safe 类订单签名携带各成员签名片段与门槛信息,体积大于个人签名;
  2. 判定是链上/多方的。“签名是否有效”从一次数学验证变成一次合约调用,Gas 略高,但这也意味着订单权限模型与钱包治理一致——门槛没凑够,签名就不成立。

实操路径

市场挂单流程因平台而异,通用骨架:用多签地址连接市场(支持 1271 的市场会识别合约地址走专用流程)→ 发起挂单动作会生成一笔待议交易或一条待签消息 → 走多签内部审批(达到门槛自动执行或手工执行)→ 订单出现在市场。若平台只认 EOA 签名,多签地址会显示“不支持挂单”,这是兼容性边界而非 bug。安全提示:无论签名者是合约还是个人,签前核验字段(价格、Token ID、过期时间)的习惯同样重要(参见授权签名安全)。

常见问答

问:订单签名会被别人偷拿去冒名成交吗?

订单消息绑定订单合约、你的地址、具体资产与随机盐,通常还带过期时间;泄露的签名只在该订单范围内可被任何人提交执行——最坏情况是这笔单被提前以你声明的条件成交,而不是“被盗号”。真正要守的是无条件消息与授权类签名,别与订单签名混淆。

问:取消挂单要再签一次吗?

取消本质是链上调用订单合约的撤销函数或提交新的失效消息,多签钱包执行这一步同样要凑门槛签名。高价值资产取消排队时,预留审批时间是操作常识。

问:个人钱包签名和 1271 合约签名,哪个更容易被滥用?

滥用边界相同(都限定在订单字段范围内),差别在攻击面:个人钱包依赖单把私钥的保管,合约签名依赖签名门槛与成员地址集合。对高价值国库,门槛模型把“单点被盗即被下单”变成“需同时攻破多数成员”,风控上更稳健。

对开发者补一句:集成 1271 验证的市场前端必须把 isValidSignature 的调用放进 try-catch 并处理 Gas 估算失败的分支,合约不存在或回滚都应返回“无效”而非 500 报错——这是合约钱包兼容性问题最常见的修复点。对用户来说,理解这一层能帮你判断哪些平台的多签支持是认真做的。

作为开发者集成提示的最后一条:1271 验签调用应始终设置 Gas 上限并兜底返回“无效签名”,任何情况下不要以调用异常替代验签结论——历史事故里,把回滚误读为“通过”的市场漏洞正是这样产生的。

风险提示

本文为操作机制科普,不构成投资建议。合约签名依赖合约实现与市场兼容程度,理解边界再操作;本内容不构成法律或投资建议。