如何访问 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;
我想获得 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;