Erc-721
如何獲取令牌 ID?
我試圖在鑄造後取回令牌 ID。我的契約 sol 中有以下功能。
function createToken(address to) public onlyOwner returns (uint256) { _tokenIdCounter.increment(); uint256 newItemId = _tokenIdCounter.current(); _safeMint(to, newItemId); return newItemId; }
鑄幣工作有效,但我沒有返回 newItemId,而是返回了 json 數據。就像我只是直接呼叫 mint 方法一樣。
{ tx: '0xf...', receipt: { transactionHash: '0x...', transactionIndex: 0, blockHash: '0x...', blockNumber: 5, from: '0x...', to: '0x...', gasUsed: 154884, cumulativeGasUsed: 154884, ...
我正在用松露在本地進行測試。
這基本上是一個eth_getTransactionReceipt響應,但是除非您的函式具有 view/pure 修飾符,否則您不會使用它來檢索返回值,在您的情況下,此函式需要修改契約的狀態,因此您需要創建一個事件來功能完成後記錄它,然後您將能夠檢查它,例如:
// you can also use "indexed" if you want the value in the topics event Mint(uint256 _tokenId); function createToken ... ... emit Mint(newItemId); ... }
響應將是相同的,但在日誌欄位中您會發現類似的內容(在此範例中,tokenId 為 10):
logs": [ { ... "data": "0x000000000000000000000000000000000000000000000000000000000000000a", "topics": [ "0x07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a84665" ], } ]
基本上,主題將儲存 keccak256 函式名稱和事件的任何索引參數(在本例中為無),並且數據將儲存非索引值(在本例中為 10)。
因此,要獲取 tokenId,您只需將數據欄位轉換為 uint
0x000000000000000000000000000000000000000000000000000000000000000a
= 64 bytes hex string => 10值得一看:
https://docs.soliditylang.org/en/latest/contracts.html#events
https://docs.soliditylang.org/en/latest/contracts.html#functions