okx

Solidity学习示例代码

时间:2023-07-30|浏览:178

欧易

欧易(OKX)

用戶喜愛的交易所

币安

币安(Binance)

已有账号登陆后会弹出下载

如果你已经学完了我之前关于Solidity学习代码示例的一系列文章,那么对于Solidity编写以太坊智能合约应该已经很熟悉了。在上一篇文章《Solidity学习代码示例-ERC20示例》中,我们学习了如何在以太坊链上发行ERC20代币,并且通过具体的代码块学习了每个代码块的用途。现在,让我们开始学习ERC721,也就是我们通常说的NFT。废话不多说,让我们开始学习如何发布我们自己的NFT,并且从代码层面学习每个代码块的用途。

首先,我们打开https://remix.ethereum.org/这个在线以太坊智能合约编辑器,创建一个名为ERC721.sol的文件,并将代码放入其中。

然后,我们进入编译界面,可以选择自动编译或手动编译。

一旦编译成功,我们就可以在本地测试网络上部署我们的合约。

部署完成后,我们将能看到我们部署的合约地址以及合约的所有方法。

通过以上步骤,我们已经将合约编译并部署到了这个在线合约编辑器提供的本地测试网络上。当然,如果我们想将合约部署到以太坊的实际网络上,我们只需切换网络并连接我们的浏览器插件钱包即可。

在这份ERC721代码中,我们实现的功能是任何人都可以调用合约的mint方法铸造自己的NFT,每个NFT的id都是唯一的。接下来,我们将仔细分析和解释源代码。

ERC721.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.12;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721Enumerable, Ownable { using Counters for Counters.Counter; using Strings for uint256;

Counters.Counter private _tokenIdTracker;

event Mint(address indexed from, address indexed to, uint256 indexed tokenId);

uint256 private _currentTokenId = 0; string private constant _baseTokenURI = "https://ipfs.io/ipfs/QmXgMRpwoEtuhksEJ7LD9ySLzAvAM5tqs1q6rGZ38Qg1Kf/"; string public baseExtension = ".json";

constructor(string memory name, string memory symbol) ERC721(name, symbol) { require(bytes(name).length != 0 && bytes(symbol).length != 0, "name and symbol can't be empty"); }

function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), baseExtension)); }

function mint() external { uint256 tokenId = _tokenIdTracker.current() + 1; _mint(msg.sender, tokenId); _tokenIdTracker.increment(); emit Mint(address(0), msg.sender, tokenId); } }

导入"@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

导入"@openzeppelin/contracts/access/Ownable.sol";

导入"@openzeppelin/contracts/utils/Counters.sol";

发行代币需要遵守相应的EIP协议,之前的ERC20代币遵循的是EIP20协议。OpenZeppelin是一个用于开发安全智能合约的库,它的代码经过社区审核并且有很强的社区支持,实现了标准代币接口,因此我们可以放心地使用import命令将其导入到我们的代码中。因此,在这里,我们与ERC20代码类似,也导入了其代码接口文件。

contract MyNFT is ERC721Enumerable, Ownable {}

使用is将我们需要用到的文件方法继承到主合约中,这样我们就可以使用来自继承合约的所有方法。

using Counters for Counters.Counter;

using Strings for uint256;

Counters.Counter private _tokenIdTracker;

由于Counter.sol是一个库合约,所以我们需要使用using命令来使用这个库合约。具体的使用方式是将库函数(来自库A)附加到任何类型(B)。

在下面的代码中,我们将使用Counters库来将uint类型的tokenId转换成string类型,所以我们还需要使用Strings库的方法。

_tokenIdTracker变量直接使用库合约Counters的方法来声明其类型。

event Mint(address indexed from, address indexed to, uint256 indexed tokenId);

我们声明了一个Mint事件,在执行mint方法时,可以返回具体

« 上一条| 下一条 »
区块链交流群
数藏交流群
区块链币圈-全球区块链数字货币行情、比特币虚拟货币资讯,狗狗币以太坊环保币柚子币莱特币瑞波币等加密数字货币价格非交易行情查询,金色财经巴比特范非小号快讯平台。
趣开心资讯 Qukaixin.cn ©2020-2024版权所有 桂ICP备19010284号-1