原本是想一步一步从solidity根底语法做个系列教程,然而这种基础知识,网上材料曾经很多了,一搜一大片,而且官网的文档也讲的很具体,所以本文默认是曾经理解了相干的常识。
什么是NFT
NFT 是咱们用以代表独特物品所有权的代币。 NFT 让咱们把诸如艺术品、收藏品、甚至房地产等物品代币化。 他们一次只有一个正式客人,并且受到以太坊区块链的爱护 - 没有人能够批改所有权记录或者依据现有的 NFT 复制粘贴一份新的。
NFT 代表非同质化
代币。 非同质化是一个经济术语,您能够用它来形容家具、歌曲文件或您的电脑等物品。 这些货色不能与其余物品调换,因为它们具备独特属性。
另一方面,同质化
物品能够调换,这取决于它们的价值而非独特属性。 例如,ETH 或美元具备同质化属性,因为 1 ETH/1 USD 能够兑换成另外的 1 ETH/1 USD。
简易版NFT合约代码
pragma solidity ^0.8.4;import '@openzeppelin/contracts/token/ERC721/ERC721.sol';import '@openzeppelin/contracts/access/Ownable.sol';// 继承ERC721, Ownablecontract SimpleMintContract is ERC721, Ownable { // mint 价格 uint256 public mintPrice = 0.05 ether; // 总共曾经被mint数量 uint256 public totalSupply; // 能够mint的最大数量 uint256 public maxSupply; // 是否开启mint bool public isMintEnabled; // 每个地址mint => 数量 mapping(address => uint256) public mintedWallets; // 构造函数,部署合约的时候,设置最大数量为2 constructor() payable ERC721('Simple Mint', 'SIMPLEMINT') { maxSupply = 2; } // 内部调用函数,开启mint function toggleIsMintEnabled() external onlyOwner { isMintEnabled = !isMintEnabled; } // 设置最大mint数量 function setMaxSuppley(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } // mint函数 function mint() external payable { // require判断函数,前半部判断为false,则抛出后半局部信息 // 判断是否开启mint require(isMintEnabled, 'minting not enabled'); // 判断地址是否曾经mint require(mintedWallets[msg.sender] < 1, 'exceeds max per wallet'); // 判断发送到合约的eth数量是否跟mint价格一样 require(msg.value == mintPrice, 'wrong value'); // 判断是否还有能够mint的数量 require(maxSupply > totalSupply, 'sold out'); mintedWallets[msg.sender]++; totalSupply++; uint256 tokenId = totalSupply; _safeMint(msg.sender, tokenId); }}