BlockChain區塊鏈
  • 本書簡介
  • 區塊鏈運作原理
  • Bitcoin介紹
    • 簡介
    • Bitcoin其他知識
  • Bitcoin原理與實作
  • BitcoinJS
    • BTC 地址格式種類
    • 從 Mnemonic 轉為地址
  • Serverless 架構實作
  • Docker常用指令
  • ethereum初探
    • ethereum歷史
    • EVM
  • ethereum PoS 節點架設
  • ethereum(Docker)
  • ethereum(Geth)
    • Parity
  • ethereum(智能合約)
    • 合約測試 Unit Test
    • DAO
    • 可升級合約
    • 使用合約進行 multiswap
    • 合約安全
    • 開發工具
    • Hardhat 教學
      • Hardhat 寫測試
    • ERC-721 範例
      • 白名單機制
    • OpenZeppelin 合約 library
    • Truffle
    • 合約部屬
    • solidity 教學
  • ethereum(Dapp)
    • 相關 SDK
    • Multicall
    • Ethers.js 使用
    • Remix IDE
    • web3.js 使用
    • 在網頁上使用 web3 並操作區塊鏈
      • solidity筆記
  • Hyperledger Fabric
  • blockchainDB
  • 挖礦程式使用教學
    • 門羅幣/Monero (XMR)
  • Bitfinex API 使用
  • FTX API
  • CCXT 通用交易所 API
  • Solana 教學
  • Ethereum BigQuery
  • The Graph
    • yaml 定義
    • mapping 語法
    • Schema 定義
    • Query 範例
    • Unit test
  • DeFi 筆記
    • MEV 相關
    • Dex 聚合
    • Yearn
    • Curve
    • Uniswap
      • Swap 互動
    • AAVE、Compound
      • Compound 原理
      • AAVE 合約開發
Powered by GitBook
On this page
  • ERC-721 常用於 NFT 相關合約
  • 自己部署一個 ERC-721 NFT 合約
  • ERC-20 與 ERC-721 Total Supply 意思差別
  • ERC721A 教學
  • Contract level data

Was this helpful?

  1. ethereum(智能合約)

ERC-721 範例

ERC-721 常用於 NFT 相關合約

其擁有以下標準:

  1. 擁有權

    • ownerOf(uint256 tokenId) public view returns (address): 返回某個指定 tokenId 的擁有者。

  2. 代幣轉移

    • transferFrom(address from, address to, uint256 tokenId) public: 從一個地址轉移到另一個地址。

    • safeTransferFrom(address from, address to, uint256 tokenId) public: 安全地從一個地址轉移到另一個地址,檢查接受方是否可以接收代幣。

    • safeTransferFrom(address from, address to, uint256 tokenId, bytes data) public: 帶有額外數據的安全轉移。

  3. 授權操作

    • approve(address to, uint256 tokenId) public: 授予某個地址權限移動特定的代幣。

    • getApproved(uint256 tokenId) public view returns (address): 返回某個特定代幣的已批准地址。

    • setApprovalForAll(address operator, bool approved) public: 授權或撤銷某個地址轉移某個擁有者的所有代幣的權限。

    • isApprovedForAll(address owner, address operator) public view returns (bool): 查看某個地址是否被授予了轉移另一個地址的所有代幣的權限。

  4. 供應和創建

    • totalSupply() public view returns (uint256): 返回已發行的代幣總數。

    • mint(address to, uint256 tokenId) public: 創建並發行一個新的代幣。

  5. 事件

    • Transfer(address from, address to, uint256 tokenId): 當代幣被轉移時觸發。

    • Approval(address owner, address approved, uint256 tokenId): 當某個代幣的授權被更改時觸發。

    • ApprovalForAll(address owner, address operator, bool approved): 當某個地址被授予或撤銷轉移所有代幣的權限時觸發。

自己部署一個 ERC-721 NFT 合約

可以直接用 Remix 部署

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

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/utils/Counters.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/access/Ownable.sol";

contract NftExample is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("3D-Marketplace", "3D-NFT") {}

    function mintNft(address receiver, string memory tokenURI) external onlyOwner returns (uint256) {
        _tokenIds.increment();

        uint256 newNftTokenId = _tokenIds.current();
        _mint(receiver, newNftTokenId);
        _setTokenURI(newNftTokenId, tokenURI);

        return newNftTokenId;
    }
}

ERC-20 與 ERC-721 Total Supply 意思差別

  1. ERC20:

    • 定義:代表可替代代幣的標準,意味著每個代幣都是相同的,並且可以互換。例如,所有的USDT或ETH都是一樣的,並且具有相同的價值。

    • totalSupply:在ERC20標準中,totalSupply 函數返回該代幣的總供應量。這是一個固定的數字,表示該代幣的總數量。

  2. ERC721:

    • 定義:代表不可替代代幣(NFT,Non-Fungible Token)的標準,意味著每個代幣都是獨特的,並且不能互換。例如,數字藝術品、收藏品或其他獨特的項目。

    • totalSupply:在ERC721標準中,totalSupply 函數返回當前已經發行的代幣總數。不同於ERC20,每個ERC721代幣都是獨特的,所以totalSupply 更多地表示已發行的獨特項目的數量。

ERC721A 教學

為 ERC721 的改良版 (多了個 A) 主要用意是讓玩家如果一次 mint 多個 NFT 時可以減少 gas fee, 發明者為 azuki 專案。

可以看到如下表格,當一次 mint 五個的時候,在以前 ERC721 標準下要執行五次 mint function,但 ERC721A 可以在 mint function 內加上第二個參數 (mint 的數量),讓你一次 mint 多個,減少了不少 gas 花費。

使用方式

contract test is Ownable, ERC721A {
	constructor(
	  ...
	) ERC721A(
		name, 
		symbol, 
		collectionSize) {}
        function testmint(uint amount) external nonReentrant payable{
		require(msg.value == price * amount, "Price is not correct");
		_safeMint(msg.sender, amount);
	}
}

Contract level data

在合約使用public view 設置 opensea 上 collection 的基本資訊。

如果沒設置之後 mint 後再到 opensea 設置也可以

PreviousHardhat 寫測試Next白名單機制

Last updated 1 year ago

Was this helpful?

How to build and use ERC-721 tokens in 2021
Azukiazukizen
Logo
Contract-level metadataOpenSea Developer Documentation
Logo
Logo