Solidity

ERC721 tokenOfOwnerByIndex() 如何列出使用者擁有的代幣?

  • May 21, 2019

根據eip-721,有一個可選的“列舉擴展”。所以我所做的就是呼叫balanceOf以獲取帳戶擁有的令牌數量,並tokenOfOwnerByIndex在循環中呼叫以獲取每個擁有的令牌 ID。

for(var i = 0; i < balance.toNumber(); i++) {
 myERC721Token.tokenOfOwnerByIndex.call(web3.eth.accounts[0], i)
 .then((id) => { ... });       
}    

結果,它實際上列出了使用者擁有的代幣。

但是,我不確定程式碼實際上是如何工作的,因為tokenOfOwnerByIndex返回映射變數ownedTokens,但我從未為ownedTokens! 但它怎麼還能歸還所有者的代幣呢?僅供參考,我像下面一樣鑄造令牌。

import "openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol";

contract MyERC721Token is ERC721Token {

 function createNewToken(...) {
   _mint(msg.sender, index);
 }
}

如果你看一下 openzeppelin 的契約,_mint我在這裡呼叫的契約從來沒有給ownedTokens. 任何人都可以看到我可以找出為什麼對我有用的契約之間的關係tokenOfOwnerByIndex嗎?

ERC721Token繼承自ERC721BasicToken

當一個新的代幣被鑄造時,_mint從 ERC721Token 呼叫,然後從 ERC721BasicToken 呼叫super._mint它的_mint實現。

super._mint``addTokenTo從頂層實現(ERC721Token)呼叫。

addTokenToownedTokens除了呼叫之外,還執行其他邏輯來更新數組super.addTokenTo,這再次引用了 ERC721Basic 令牌。

因此,通過使用ERC721Token您可以為使用者獲得一組可列舉的令牌。


通常,您可以將此結構視為一個合約層,向另一層添加額外的邏輯。

在底部你有 ERC721BasicToken,它本身實現了 ERC721 所需的所有功能。然後你有 ERC721Token,它位於 ERC721BasicToken 之上,並用自己的邏輯覆蓋了大部分功能。

巧妙的是,它還包括使用super.functionName語法的舊邏輯,以便在任何新邏輯之外執行舊邏輯。因此,它不是改變函式的邏輯,而是擴展了邏輯。

在這種情況下,新邏輯完成了所有繁重的工作,以使每個所有者的代幣可列舉。

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