手把手教你如何創建部署自己的NFT合約


 

 

聲明:

本文章整體參考,並且親身做了實驗,順利運行,遂寫下此文章僅供學習交流使用哦~現在鏈上數據空間非常的珍貴,主流的做法都是將文件數據放置進到ipfs當中,並且將hash上鏈,甚至可以將hash再次加密上鏈,一起來看吧

概述

自Cryptokitties[1]推出以來,兼容 ERC-721 標准的加密收藏品已經非常流行,並在最近幾個月向大規模采用的方向發展。本指南將涵蓋使用0xcert/ethereum-erc721[2]智能合約庫創建和部署我們自己的 ERC-721(NFT)。

什么是非同質化(Non-Fungible)代幣?

同質化是指相同或可互換的意思。例如,以太坊代幣、特定代幣類的所有幣,都具有相同的價值。Cardano 代幣也是如此。同質化代幣可 1:1 互換。

而 NFT 是獨一無二的,每個人都是不同的。每一個代幣都有獨特的特點和價值。可以成為 NFT 的東西類型有收藏卡、藝術品、飛機票等。它們之間都有明顯的區別,不能互換。將非同質化代幣(NFT)視為稀有的收藏品;每個代幣都有獨特的特征,不尋常的屬性,大多數時候,它利用元數據表示。

什么是 ERC-721?

ERC 是以太坊建議請求(Ethereum Request for Comment)的縮寫,721 是提案編號。ERC 是以太坊生態系統中的應用級標准,它們可以是代幣的智能合約標准,如ERC-20[3],ERC 的作者負責與以太坊社區建立共識,一旦提案被社區審核通過,就會成為標准。你可以跟蹤最近的 ERC 提案這里[4]。

ERC-721 的創建是為了提出在智能合約內跟蹤和轉移 NFT 的功能。

ERC-721[5]是一個開放的標准,它描述了如何在 EVM(以太坊虛擬機)兼容的區塊鏈上構建非同質化代幣;它是非同質化代幣的標准接口;這是一套規則,使其易於與 NFT 交互。NFT 不僅是 ERC-721 代幣,還可以是ERC-1155[6]代幣。

以下是 ERC-721 標准中定義的一組函數和事件:ERC-721 定義了一些符合 ERC-20 的函數。這使得現有錢包更容易顯示簡單的代幣信息:

ERC20 類函數:

  • name: 用於定義代幣的名稱。
  • symbol: 用於定義標記代幣的符號。
  • totalSupply: 這個函數用來定義區塊鏈上的代幣總數,供應量不必是恆定的。
  • balanceOf: 返回一個地址擁有的 NFT 數量。

Ownership 函數

本函數返回代幣所有者的地址。由於每個 ERC-721 代幣都是獨一無二的,非同質化的,它們在區塊鏈上由一個 ID 來表示。其他用戶、合約、應用可以使用這個 ID 來確定代幣的所有者。

  • approve: 此函數批准另一個實體代表所有者轉讓代幣的權限。
  • takeOwnership: 這是一個可選的函數,它的作用就像一個取款函數,因為外界可以調用它從另一個用戶的賬戶中取出代幣。當一個用戶被批准擁有一定數量的代幣,可以使用 takeOwnership。
  • transfer: 這是另一個轉移函數;它允許所有者將代幣轉讓給另一個用戶,就像加密貨幣一樣。
  • tokenOfOwnerByIndex: 這是一個可選的函數,但建議使用。每個所有者可以同時擁有一個以上的 NFT。其獨特的 ID 可以識別每一個 NFT,結果可能會變得難以跟蹤 ID。所以合約將這些 ID 存儲在一個數組中,tokenOfOwnerByIndex 函數讓我們從數組中檢索這些信息。

元數據

tokenMetadata: (可選)一個接口,讓我們可以發現代幣的元數據或其數據的鏈接。

事件

  • Transfer:當代幣的所有權從一個人變為另一個人時,該事件被觸發。發出的信息包括哪個賬戶轉移了代幣,哪個賬戶收到了代幣,以及哪個代幣(通過 ID)被轉移。
  • Approve: 當用戶批准另一個用戶獲得代幣的所有權時,該事件就會被觸發,也就是說,每當 approve 函數被執行時,該事件就會被觸發。它發出的信息包括:當前哪個賬戶擁有該代幣,哪個賬戶被批准在未來擁有該代幣,以及哪個代幣(通過 ID)被批准轉讓其所有權。

非同質化代幣的使用場景

數字藝術(或實物藝術):藝術作品是 NFT 最受歡迎的使用案例。數字藝術拍賣是 NFT 的第一個應用,並且還在繼續發展。

游戲:提供游戲內購和游戲收藏。

房地產:將房產和智能合約 Token 化,並進行買賣。

金融:貸款、期貨等金融工具,並承擔其他責任。

軟件標題:軟件授權,確保反盜版和隱私。

演唱會門票/體育比賽門票:為了保證在賣票過程中不發生欺詐行為,粉絲可以在一個地方查看以往的經歷。

KYC 合規性:為特定用戶的 KYC 創建代幣。

獲得測試 ETH

現在我們知道了什么是 ERC-721 代幣以及它們是如何工作的,讓我們看看如何構建和部署自己的代幣。

我們將在 Ropsten 測試網上部署合約。開始前,你需要安裝Metamask[7]瀏覽器擴展來創建一個 ETH 錢包和獲取一些測試 ETH,你可以通過進入Ropsten 水龍頭[8]來獲得。你需要在 Metamask 錢包上選擇 Ropsten 測試網絡,並將自己的錢包地址復制粘貼到水龍頭中的文本字段中,然后點擊“Send me test Ether”。

水龍頭 我的錢包

將文件添加到 IPFS

在寫 NFT 合約之前,我們需要托管好 NFT 所對應的藝術作品,並創建一個元數據文件;為此,我們將使用IPFS[9]--一個點對點文件存儲和共享的分布式系統。按照IPFS 文檔中的安裝指南[10]下載並安裝基於你的操作系統的 IPFS CLI。

以下是托管圖像和元數據文件的步驟:

步驟 1:創建 IPFS repo。在終端窗口中輸入以下內容來初始化 IPFS repo

 $ ipfs init

步驟 2:啟動 IPFS 守護進程。打開一個單獨的終端窗口,輸入以下內容:

$ ipfs daemon

步驟 3:添加圖像到 IPFS , 進入第一個終端窗口,將圖像添加到 IPFS 中(這里是 art.png)。

$ ipfs add art.png

復制從 Qm 開始的哈希值,並添加 https://ipfs.io/ipfs/前綴,它必須看起來像這樣

步驟 4: 向 IPFS 添加 JSON 文件。創建一個 JSON 文件 nft.json,並將其保存在與圖像相同的目錄中。JSON 文件格式:

{ "name": "NFT Art", "description": "This image shows the true nature of NFT.", "image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC", }

現在添加 JSON 文件:

$ ipfs add nft.json

復制從 Qm 開始的哈希值,並添加 https://ipfs.io/ipfs/前綴,它必須看起來像這樣, 保存這個網址。

進行將文件添加至IPFS操作的主要目的是為了獲取文件的唯一hash.我們需要這個來鑄造 NFT。

創建我們自己的代幣。

為了方便和安全,我們將使用0xcert/ethereum-erc721[11]合約來創建我們的 NFT 合約。有了 0xcert/ethereum-erc721,我們不需要寫整個 ERC-721 接口。相反,我們可以導入庫合約並使用它的函數。前往以太坊 Remix[12] IDE,制作一個新的 Solidity 文件,例如 nft.sol, 將以下代碼粘貼到 Solidity 文件中。

注意:原文中的import在我實際應用的過程中發現鏈接不符合,於是修改為,大家也可以閱讀源碼進行學習:

import "https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/ownership/ownable.sol";

大家使用的時候注意辨別:

// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol"; import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol"; contract newNFT is NFTokenMetadata, Ownable { constructor() { nftName = "Synth NFT"; nftSymbol = "SYN"; } function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner { super._mint(_to, _tokenId); super._setTokenUri(_tokenId, _uri); } } 

以下是代碼的解釋:

第 1 行:指定SPDX 許可證[13]類型,這是在 Solidity ^0.6.8 之后增加的。每當智能合約的源代碼向公眾開放時,這些許可證可以幫助解決/避免版權問題。如果你不想指定任何許可證類型,你可以使用一個特殊的值 UNLICENSED,或者直接跳過整個注釋(它不會導致錯誤,只是一個警告)。

第 2 行:聲明 Solidity 版本。

第 4-5 行:導入 0xcert/ethereum-erc721 合約。

第 7 行:合約命名為 newNFT,它繼承了 NFTokenMetadata 和 Ownable 合約。

第 9-12 行:初始化構造函數並設置名稱及代幣符號。

第 14 行:聲明函數 mint 有三個參數,類型為地址的變量_to,存儲 NFT 代幣接收者的地址,類型為 uint256 的變量_tokenId,將保存代幣 id,類型為字符串的變量_uri,將存儲 JSON 文件的 URI。將 mint 聲明為外部函數,可以從其他智能合約和當前合約之外訪問。

第 15 行:使用接收方的地址和代幣 ID 來鑄造代幣。

第 16 行:使用代幣 id 和 JSON 文件的 URI 設置代幣 URI。

編譯智能合約,並使用Injected Web3進行部署(編譯合約前一定要在 Metamask 上選擇 Ropsten testnet)。批准來 metamask 的交易。

如果沒有什么意外的話,就會提示編譯通過,我們就能夠進行部署在測試網中了!

 

現在進入 Remix 中的 Deployed Contracts(部署的合約)部分,展開部署的合約。你會看到一堆函數/方法。展開 mint 函數並添加以下參數:

  1. 在_to 中添加你的 Ropsten 地址。
  2. 在 _tokenid 中輸入任何數字值 (建議為 1,因為它是第一個)。
  3. 在_uri 字段中,添加上一節獲得的 JSON 文件的 URI。

當我們新增一條記錄的成功以后,可以通過id來查詢當前的信息:

結論

恭喜您創建了自己的 NFT,幫助您的藝術家朋友將他們的藝術作品放到以太坊區塊鏈上,或者自己成為一名藝術家。查看0xcert/ethereum-erc721 的 GitHub以獲取更多示例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM