Erc-721

ERC721 - 大量 ownerOf 請求(或其他方式獲取地址上的所有 TokenID)

  • July 5, 2021

我使用 nethereum 獲取 ownerOf NFT id

[Function("ownerOf", "address")]
public class OwnerOfFunction : FunctionMessage
{
   [Parameter("uint256", "_tokenId", 1)]
   public uint TokenID { get; set; }
}

public void IsOwnerOfToken()
{
   var web3 = new Nethereum.Web3.Web3("https://mainnet.infura.io/v3/7238211010344719ad14a89db874158c");

   string contractAddress = "0xc36442b4a4522e871399cd717abdd847ab11fe88";

   var ownerOfFunctionMessage = new OwnerOfFunction()
   {
       TokenID = 99999,
   };

   var ownerOfHandler = web3.Eth.GetContractQueryHandler<OwnerOfFunction>();
   var ownerAddress = ownerOfHandler.QueryAsync<string>(contractAddress, ownerOfFunctionMessage).Result;
   UnityEngine.Debug.LogError(ownerAddress);
}

但我想獲取目前目前的所有 tokenId。

我可以使用非常粗暴的方式,每個 tokenId 的 ownerOf,從零到直到得到這個異常

RpcResponseException: execution reverted: ERC721: owner query for nonexistent token

當 TokenID 超過 token 計數時會出現此消息。

但也許存在更優雅的方式?也許我可以這樣?

var owners = web3.Eth.GetContractQueryHandler<OwnerOfFunction>(0, "latest");

謝謝)

您嘗試做的事情不可能以通用的方式進行。

這是一個範例 ERC-721 實現,您無法使用任何合理的方法查詢以獲取所有令牌。

contract ERC721 is iERC721, iERC165 {
   function balanceOf(address _owner) external view returns (uint256) {
       if (_owner == address(0x01)) return 2;
       return 0;
   }

   function ownerOf(uint256 _tokenId) external view returns (address) {
       if (sha3(_tokenId) == 0x0) return 0x01;
       revert();
   }

   function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable {
       revert();
   }

   function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable {
       revert();
   }

   function transferFrom(address _from, address _to, uint256 _tokenId) external payable {
       revert();
   }

   function approve(address _approved, uint256 _tokenId) external payable {
       revert();
   }

   function setApprovalForAll(address _operator, bool _approved) external {
       revert();
   }

   function getApproved(uint256 _tokenId) external view returns (address) {
       return address(0x0);
   }

   function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
       return false;
   }
}

該實現在規範中是有效的,但是您可以找到哪些令牌擁有所有者的唯一方法是找到一個散列為零的 256 位數字。祝你好運。我斷言確實存在兩個這樣的數字。

因為您想要的東西是不可能的,所以您必須採用一種實用的方法:

  • 收聽事件
  • 希望令牌 ID 是連續的並使用您的方法
  • 使用 NFT 列舉擴展

引用自:https://ethereum.stackexchange.com/questions/102537