如何访问 ERC721 令牌的特定元数据

How to get access to specific metadata of a ERC721 token

我想获得 n 个带有特定“dna”的 ERC721 代币。 请参阅以下元数据:

{
  "dna": "602472F",
  "name": "Test #1",
  "description": "My Collectibles",
  "image": "ipfs://QmasMm8v9WkU11BtnWsybDW6/1.png",
  "edition": 1,
  "attributes": [
    {
      "trait": "type",
      "value": "Fire"
    },
    {
      "trait_type": "Eyes",
      "value": "Black"
    }
  ]
}

我知道如何使用 tokenURI 访问令牌。 这是我的代码:

  string public uri;
  string public uriSuffix = ".json";

  function _baseURI() internal view virtual override returns (string memory) {
    return uri;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory){
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : "";
    }

现在,我如何检查令牌是否具有我正在寻找的 dna?我应该从 Opensea API 还是从 solidity 方面获取此信息?

Ps:我所有的 .json 和 .png 文件都托管在 IPFS 中。

EVM 合约无法直接读取链下数据(JSON 文件)。为此,您需要使用链下应用程序(或 Chainlink 等预言机提供商)将链下数据提供给合约。

所以从链下应用程序查询数据要容易得多。

使用node.js和web3包查询合约的示例:

const contract = new web3.eth.Contract(abiJson, contractAddress);
const tokenURI = await contract.methods.tokenURI(tokenId);
const contents = (await axios.get(tokenURI)).data;
return contents.dna;