ethereum - ERC721 NFT 创建一个功能来购买/出售由合约所有者预先设定的 NFT,安全问题
问题描述
我在研究为某人购买 NFT 创建功能时遇到了这个答案:
https://stackoverflow.com/a/67384225/1414721
相关线路是
IERC20 tokenContract = IERC20(tokenAddress);
require(tokenContract.transferFrom(msg.sender, address(this), price),
"buy: payment failed");
我不希望人们能够在以太坊以外的任何地方购买我的 NFT,尽管这里的作者说:
防止出现边缘情况,即如果在执行过程中 gas 用完,买方最终可能会免费获得 NFT
这引起了我的注意,从阅读代码看来,这里正在进行的检查是为了防止这种极端情况。
我不确定当购买 NFT 的货币是以太坊时如何应用。
我已经调整了我的购买功能,看起来像
function buy(uint256 _tokenId) external payable {
uint256 price = tokenIdToPrice[_tokenId];
require(price > 0, 'This token is not for sale');
require(msg.value == price, 'Incorrect value');
address seller = ownerOf(_tokenId);
IERC20 tokenContract = IERC20(address(0));
require(tokenContract.transferFrom(msg.sender, address(this), price), "buy: payment failed");
payable(seller).transfer(msg.value);
_transfer(seller, msg.sender, _tokenId);
tokenIdToPrice[_tokenId] = 0;
emit NftBought(seller, msg.sender, msg.value);
}
我相信a)将代币合约从以太坊代币(IERC20(address(0))
- 我知道address(0)
是以太坊代币地址?)和b
require(tokenContract.transferFrom(msg.sender, address(this), price), "buy: payment failed");
确保处理提到的气体限制边缘情况。
这是正确的吗,谷歌搜索这很难。
最后一个问题(不相关,我希望没关系) - 当市场显示所有可用于集合的 NFT 时,我假设他们这样做的方式是合约具有返回 NFT ID 和令牌 URI 的函数?这是正确的,还是 OpenZeppelin 提供了这个功能,我不必担心添加这个功能?
解决方案
我认为气体边缘情况是通过改变操作顺序来解决的。先付款,然后转移代币。
推荐阅读
- haskell - 笛卡尔积中的变换文件夹很难理解
- gson - Gson 可以返回反序列化时引发异常的目标字段吗?
- java - Java 10 和 Mac 应用程序菜单
- ios - UICollectionView - 单元格不应滚动到视图之外
- android - 为底部选项卡添加阴影
- logstash - 过滤以使用 grok 从多行中提取数据
- android - 以编程方式创建文件夹后如何更新文件系统?
- ios - 如何快速获取 iphone 设备本地存储的文档 [pdf,docx,doc,xlsxl]
- java - 使用 asynchttpclient 作为 maven 项目发送异步发布请求并运行
- django - Django 自定义查询集