如何从Elrond智能合约端点读取NFT属性并优化NFT交互gas消耗
方案可行性结论
技术上完全可以实现,且确实能大幅降低gas消耗、减少样板代码,但必须补充所有权校验逻辑避免安全漏洞。
核心逻辑说明
NFT/SFT的所有权、属性元数据本身就存储在对应代币合约的链上存储中,你的业务合约只要兼容对应代币标准的接口,不需要持有代币本身就能读取所有需要的信息:
- 针对ERC721标准的NFT,可直接调用
ownerOf(uint256 tokenId)查询持有者,调用tokenURI(uint256 tokenId)读取属性元数据 - 针对ERC1155标准的SFT/NFT,可直接调用
balanceOf(address account, uint256 id)查询持有量,调用uri(uint256 id)读取属性元数据
你只需要让用户在请求endpoint时传入两个代币的合约地址+token ID即可,完全不需要用户先将NFT转账到你的业务合约,自然也省去了后续返还NFT的逻辑。
必须补充的安全校验
跳过NFT转账步骤后,你必须主动完成以下校验,否则会出现任意用户冒用他人NFT领取新NFT的漏洞:
- 校验请求发起者
msg.sender是传入的两个NFT的合法持有者,ERC721直接核对ownerOf返回值是否等于msg.sender,ERC1155核对balanceOf(msg.sender, tokenId)≥1 - 增加请求防重机制,避免同一用户用同一批NFT重复提交请求领取奖励,可以给每个用过的NFT+用户地址组合加使用标记,或者限制同一NFT在冷却时间内不能重复提交
- 如果对原子性要求高,可以额外校验请求处理全程NFT没有被转移,处理完请求前可以要求用户提前给你的业务合约授权对应NFT的操作权限,处理完成后释放授权即可,这一步的gas成本远低于两次NFT转账
适用边界
该方案仅适用于你的场景:即业务逻辑不需要长时间持有用户NFT、仅需要瞬时读取属性做校验的场景。如果后续业务调整为需要用户质押NFT一段时间才能获得奖励,还是需要走NFT转账到业务合约的逻辑。
内容的提问来源于stack exchange,提问作者Stéphane Leroy
相关产品推荐
相关产品推荐

