ERC721 tokenOfOwnerByIndex() 如何列出使用者擁有的代幣?
根據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)呼叫。
addTokenTo
ownedTokens
除了呼叫之外,還執行其他邏輯來更新數組super.addTokenTo
,這再次引用了 ERC721Basic 令牌。因此,通過使用
ERC721Token
您可以為使用者獲得一組可列舉的令牌。通常,您可以將此結構視為一個合約層,向另一層添加額外的邏輯。
在底部你有 ERC721BasicToken,它本身實現了 ERC721 所需的所有功能。然後你有 ERC721Token,它位於 ERC721BasicToken 之上,並用自己的邏輯覆蓋了大部分功能。
巧妙的是,它還包括使用
super.functionName
語法的舊邏輯,以便在任何新邏輯之外執行舊邏輯。因此,它不是改變函式的邏輯,而是擴展了邏輯。在這種情況下,新邏輯完成了所有繁重的工作,以使每個所有者的代幣可列舉。