使用ERC-1155 (比ERC-721)普遍接受的好处是它节省了大量的气体。但是,在制造代币的时候,它真的能节省汽油吗?
如果是这样的话,我们是否应该在部署合同时预置薄荷令牌?我想知道OpenSea是怎么做到的。
发布于 2021-11-18 20:54:52
它真的在制造代币的时候节省汽油吗?
是的,在制造代币的时候可以节省很多汽油。让我们看看下面的示例,其中我创建了两个简单的OpenZeppelin契约。一个是ERC721,一个是ERC1155。
当我部署这些函数和薄荷时,我得到以下结果:
因此,您可以看到,在这种基本情况下,ERC721的成本几乎是薄荷糖的两倍。同样重要的是要注意的是,实现可能会有很大的变化,这会改变汽油价格。
ERC1155s之所以通常更便宜,是因为它们有一种更有效的存储数据的方法。
在部署合同时,我们是否应该预置铸币券?
这将取决于您的用例。如果您正在部署10k NFT集合,那么自己创建所有NFT可能不是一个好主意。相反,目前使用的一个常见模式是允许人们通过您的网站自己创建NFT。
我想知道OpenSea是怎么做到的
OpenSea使用一个名为LazyMinting的方法。在这里,你上传了所有的元数据,但实际上,你并没有把NFT的链,直到一个用户铸币NFT。这允许您上传NFT而无需支付任何费用。这也类似于在您的网站上有一个薄荷功能,在这两种情况下,最终用户谁想要NFT支付铸币的费用。这个解决方案的规模很好。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract MyERC721 is ERC721, ERC721URIStorage, Ownable {
constructor() ERC721("MyToken", "MTK") {}
function safeMint(address to, uint256 tokenId, string memory uri)
public
onlyOwner
{
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}
contract MyERC1155 is ERC1155, Ownable {
constructor() ERC1155("") {}
function setURI(string memory newuri) public onlyOwner {
_setURI(newuri);
}
function mint(address account, uint256 id, uint256 amount, bytes memory data)
public
onlyOwner
{
_mint(account, id, amount, data);
}
function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
public
onlyOwner
{
_mintBatch(to, ids, amounts, data);
}
}https://ethereum.stackexchange.com/questions/113811
复制相似问题