Movement的Aptos Core存储库的拉取请求已修复代币royalty查询中的一个重大漏洞,该漏洞暴露了影响NFT市场和royalty分配的两种严重故障模式。
该漏洞存在于`token::royalty`函数中,当代币不带自己的royalty时,该函数会回退到集合的royalty。原始实现使用`collection::create_collection_address(creator, collection_name)`重新推导集合地址。但由于集合名称可通过`collection::set_name`进行变更,重命名集合会破坏此推导过程并导致查询失败。
这导致了两个可观察的问题。首先,如果重命名后该创建者下没有持有新名称的集合,视图函数会因`EOBJECT_DOES_NOT_EXIST`而中止,导致调用`tokenv2::royalty()`的市场操作彻底且无法恢复地失败。其次,如果创建者在原始名称下已注册了另一个集合,推导过程会错误地指向该第二个集合,即使对于不具有可变royalty引用的集合,royalty支付也会被错误地引导。
PR #416中详述的修复方案是从铸造时直接存储在代币上的`Object<Collection>`引用读取数据,而不是重新推导。该字段仅写入一次,不受重命名的影响。增加了四项回归测试,涵盖重命名后的代币royalty回退、名称碰撞场景、royalty缺失时的行为和优先级规则。修复后,完整`aptos-token-objects`测试套件的全部87个测试都已通过。
