ethereum - 如何获取 ERC-721 tokenID?
问题描述
我创建了一个部署在 ropston 网络上的 ERC-721 合约。使用合同我正在创建 NFT,它完全可以正常工作。
现在对于转移部分,我需要获取任何 NFT 的 tokenID 并转移到其他地址,但是每当我从 etherscan 或使用 web3 获取交易详细信息时,我都无法获取 tokenID。
我想将 tokenID 存储在数据库中,以便在转移到其他地址时可以使用它。
我已经圈出了上图中所需的确切 tokenID。
我使用以下代码:
window.ethereum
.request({
method: 'eth_sendTransaction',
params: [
{
from: fromAddress,
to: contractAddress,
gas: '50000',
data: nftContract.methods.transferFrom(fromAddress, toAddress, tokenNumber).encodeABI()
},
],
})
我只想在创建 NFT 时获取 tokenID 并将其存储到数据库中以供参考并执行业务逻辑。
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
以上是负责创建 NFT 的 solidity 函数。
解决方案
您的mintNFT()
函数不会发出任何包含newItemId
.
solidity 使用的是标准的 transfer 定义
没有“标准定义”,ERC-721标准只定义了一个接口和一些其他规则——并且(接口的)实际实现由每个开发人员负责。但是,我假设“标准定义”是指OpenZeppelin 实现,它是 ERC-721 标准的广泛使用的实现,许多开始使用 Solidity 编码的人都在使用它。
您可以在链接的实现中看到 OZ_mint()
函数发出Transfer()
事件,其中第三个参数是铸造的令牌 ID。
因此,执行您的mintNFT()
函数会有效地发出Transfer()
包含新生成的令牌 ID 作为第三个参数值的事件。
mintNFT()
从 JS 代码执行合约函数后,它会返回一个PromiEvent
对象,您可以使用该对象来捕获其receipt
事件。
收据包含发出的日志,您也可以在其中找到Transfer()
日志。
const tx = nftContract.methods.mintNFT(...).send({from: ...});
tx.on('receipt', function(receipt){
console.log(logs[0].topics[3]); // this prints the hex value of the tokenId
// you can use `web3.utils.hexToNumber()` to convert it to decimal
});
如果您想从已经存在的交易中获取令牌 ID(使用 tx 哈希),您可以使用以下代码段:
web3.eth.getTransactionReceipt('0x258a6d35445814d091ae67ec01cf60f87a4a58fa5ac1de25d0746edf8472f189').then(function(data){
let transaction = data;
let logs = data.logs;
console.log(logs);
console.log(web3.utils.hexToNumber(logs[0].topics[3]));
});
您可以在 web3 文档中找到send() 方法和收据的更多详细信息。
推荐阅读
- python - 如何在 python tkinter mainloop 中定义一个列表而不改变它的值
- php - 在php中获取天蓝色广告登录用户名
- javascript - 当我尝试使用其类名将子元素附加到 div 时,它不会附加元素但如果我直接使用 div 附加
- java - GraalVm Polyglot 应用程序 - 是否可以在运行时从 java 评估 kotlin 脚本?
- templates - Ansible:如何评估一个模板并将评估的模板放入另一个模板中?
- c++ - 如何将 C++ 中生成的图像数据转换为 Javascript 中的图像数据?
- c# - 在 AspNet Core Identity Server4 上配置 Swagger
- apache-spark - 如何处理 varchar not null 列中的空格从 azure synapse 表到 spark databricks
- typescript - 如何编写单个 Xpath 而不是多个
- html - 如何删除引导程序中列之间的空格?