题目
页面写“授权此 NFT”,实际在 NFT 合约上调用 setApprovalForAll(marketOperator, true)。用户卖出这件 NFT 后认为权限已经消失,又收到同系列的新 NFT。请审查调用目标、权限范围和撤销流程。
考察目标
- 区分 NFT 合约目标与 operator 参数。
- 比较单 token 授权与系列全量授权。
- 识别撤销与恶意转移竞争的边界。
审查 ERC-721 全量 operator 授权的目标、范围、持续性与撤销竞态。
页面写“授权此 NFT”,实际在 NFT 合约上调用 setApprovalForAll(marketOperator, true)。用户卖出这件 NFT 后认为权限已经消失,又收到同系列的新 NFT。请审查调用目标、权限范围和撤销流程。
setApprovalForAll 调用目标是 NFT 合约,operator 是被授权的地址,可为合约或 EOA。权限覆盖 owner 在此合约下的全部 NFT,包括后续持有的资产;卖出单件通常不清除 owner/operator 权限。单 token 的 approve 则随该 token 转移清空。页面应写清系列范围、operator 和链,提供撤销,并说明撤销确认前资产仍可能被转移。
核对 chainId、NFT 合约、operator、approved 和实际账户。operator 的名称不能代替完整地址,源码公开也不证明可信。标准授权允许同一 owner 有多个 operator,因此撤销一个市场不等于清除了其他授权。
逐 token 授权绑定 tokenId,转移时重置。OpenZeppelin 5.4.0 的全量权限保存在 owner/operator 映射中,转移单件不改它;后续 owner 收到同系列 NFT 时,operator 仍具备相应权限。系列授权不等于授权 owner 所有链、所有 NFT 合约,风险提示应准确而非笼统。
读取 isApprovedForAll(owner, operator),确已授权时不重复请求。若市场支持单 token 授权,可按用途提供更小权限;若协议依赖全量授权,诚实说明需求。市场挂单签名的过期/取消与 NFT operator 撤销是两套机制,不要混在同一个“取消”按钮里。
撤销通过同一 NFT 合约 setApprovalForAll(operator, false),需要签名、gas 和链上确认。恶意 operator 可能在撤销前转移,不能保证撤销追回已失资产。必要时核对其他授权与剩余资产,按情况安全转移。回执后重读,处理重组、其他设备变更、owner/chain 切换和用户拒绝。
发现这道题有问题? 反馈此题