无ABI时读取外部智能合约数据实现NFT持有者权限校验方案问询
无第三方合约ABI读取NFT持有数据的可行方案
你要实现的地址持有验证需求不需要获取目标合约完整ABI,以下三种方案均可直接实现:
- 使用NFT标准通用ABI片段
目前绝大多数主流NFT项目均兼容ERC721/ERC1155通用标准,你仅需要引入对应标准下你要调用的方法的ABI片段即可,不需要完整合约ABI。以验证持有量需要调用的balanceOf方法为例,仅需如下ERC721标准ABI片段即可:
Cryptokitties合约完全兼容该标准方法,直接使用该片段即可正常调用读取持有量,返回值大于0即可判定为NFT持有者。[ { "constant": true, "inputs": [{"name": "owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function" } ] - 直接构造合约调用calldata
如果你不想引入任何ABI片段,可以直接计算方法选择器构造调用参数:ERC721的balanceOf方法的固定选择器为0x70a08231,你只需将需要查询的用户地址补零扩展为32字节,拼接在选择器后作为calldata,直接向链节点发送eth_call请求即可直接拿到uint256格式的持有量返回值,全程不需要用到ABI。 - 调用节点内置的NFT查询接口
目前主流EVM兼容链的公共节点大多已内置标准NFT查询RPC接口,你只需传入目标合约地址、待验证用户地址即可直接获取持有数据,不需要自行处理ABI或调用参数构造。
注:如果遇到非标准NFT合约,只需先确认其查询持有量的方法签名,替换对应选择器或ABI片段即可正常调用,不需要获取完整合约ABI。
内容的提问来源于stack exchange,提问作者Soragim
相关产品推荐
相关产品推荐

