本來是想一步一步從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, Ownable
contract 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);
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結