Seaport 的集合型收单:一个报价怎么吃掉你手里任意一张 图 1
Seaport 的集合型收单:一个报价怎么吃掉你手里任意一张 · 图 1

Seaport 的集合型收单:一个报价怎么吃掉你手里任意一张

现象先行:你没挂单,NFT 却被“收单”卖掉了

不少新手第一次遇到这种事:手里一张从没挂过单的 NFT,被一个早已存在的“地板价收单”直接成交,资产换成了 ETH。这不是漏洞,是 Seaport 协议里合法规则的结果。Seaport 把每笔订单拆成两边:offer 是订单发起方愿意给出的东西,consideration 是要求收到的东西。普通收单锁定某一个编号;而所谓集合型收单(collection offer),offer 里的代币字段只填到“某合约”这一层,代币编号位置写的是特殊值 criteria 等于 0,意思是“这个合约里的任意一枚都可以”。订单本身因此不对应任何具体资产,它对整个合集生效。

Seaport 的集合型收单:一个报价怎么吃掉你手里任意一张 图 2
Seaport 的集合型收单:一个报价怎么吃掉你手里任意一张 · 图 2

成交时靠什么确定“是哪一枚”

真正卖出的编号是在订单被满足(fulfill)那一刻才补上的。协议规定:如果订单里存在 criteria 型条目,履约调用必须附带一个 CriteriaResolver——它声明实际代币编号,并给出一段可验证的包含证明(inclusion proof),证明这枚代币确实落在订单声明的标准之内。对 collection offer,这个标准就是“该合约发行的全部代币”,绝大多数实现用一个特殊的 merkle root 值代表全集,无需逐币建树。Seaport 在履约时核验证明,验证通过,Transfer 事件按那枚实际编号发出。换句话说,链上记录完整回答了“收单吃的是哪张、谁卖的、多少钱”,只是这些信息在订单创建时还不存在。

由此产生的两类真实风险

第一类是“地板狙击”:出售动机强的持有人(急于退出、误操作转账进来)会主动去成交那个低价收单,买家挂一次单,之后所有把币转到可成交路径上的人可能依次被吃掉。你如果没有挂过单、也没主动接受收单,你的币不会被卖——收单永远需要你一侧的授权或签名动作,要么你签过允许市场卖出你资产的订单,要么你主动点击接受。第二类是签名误读:在聚合器或钓鱼页面签下的“免费认领”,实际内容可能是授权市场转移你全部藏品,之后任何收单都能直接执行它。EIP-712 弹窗里那屏数据要核对 spender 与权限范围,这比记住协议名词更救命。

用户侧核对与替代方案

想支持收单市场又不想被动:可以把收单当挂单用——你签名一个自己的出售订单并把它挂到市场,收单匹配需要双方签名相遇,主动权还在你手里。想检查自己是否暴露:用授权管理工具查你对市场与 conduit 通道合约的 setApprovalForAll 状态,凡是长期挂着的全量授权都是潜在的被吃面,不交易时撤销。作为买家挂集合收单前,也要明白成交的不一定是你想收藏的那一枚稀有度,匹配顺序由市场撮合逻辑与你的设置决定。

边界

Seaport 文档对未使用报价额的抢跑、部分可填充订单等还有细规则,涉及程序化交易时应通读官方文档而不是二手教程。本文不构成投资建议:机制解释不等于推荐挂收单或卖地板,任何报价都是真金白银的公开委托。

一个具体例子走一遍

把机制钉在数字上。买家对某合集挂出“每个编号 1 ETH、总量 10”的集合收单:offer 侧是 10 ETH 的 ERC-20 条目,consideration 侧是合集合约地址加 criteria 等于 0 的 ERC-721 条目,订单签名后由市场保管。卖家点击“接受”的瞬间,撮合构造反方向订单,履约调用里出现 CriteriaResolver,声明“成交的是编号 4217”,并附上包含证明。合约端做三件事:验两笔签名、验证明、按分配表执行转账——ETH 给卖家、NFT 给买家、版税 recipients 各自入账,一次原子完成。任何一环不满足就整体回滚,不存在“钱付了币没动”的中间态。

理解到这个深度,日常决策就清晰了:集合收单对卖家的意义,是“有人公开备好了按个计价的资金”,它的可信度取决于报价地址的历史与资金规模,而不是报价数字大小;对买家则是公开委托,挂出去就会被懂规则的人按最有利自己的方式触发。市场界面把这套复杂撮合简化成“接受”按钮,简化的是界面,不是订单的法律与密码学实质。风险提示补充:签名订单与授权涉及真实资产转移,执行前逐字段核对签名内容。