聲明:
本文章整體參考,並且親身做了實驗,順利運行,遂寫下此文章僅供學習交流使用哦~現在鏈上數據空間非常的珍貴,主流的做法都是將文件數據放置進到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/前綴,它必須看起來像這樣https://ipfs.io/ipfs/QmdrswwrbcfPeknN2BRLVmyWbWRsKSC3vSNhV9Gkvhk1mL。
步驟 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/前綴,它必須看起來像這樣https://ipfs.io/ipfs/QmWKqwMJQHSfpfRFGUVGPFFtkBJ5WkFzhjQpruhSLtLWXB, 保存這個網址。
進行將文件添加至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 函數並添加以下參數:
- 在_to 中添加你的 Ropsten 地址。
- 在 _tokenid 中輸入任何數字值 (建議為 1,因為它是第一個)。
- 在_uri 字段中,添加上一節獲得的 JSON 文件的 URI。
當我們新增一條記錄的成功以后,可以通過id來查詢當前的信息:
結論
恭喜您創建了自己的 NFT,幫助您的藝術家朋友將他們的藝術作品放到以太坊區塊鏈上,或者自己成為一名藝術家。查看0xcert/ethereum-erc721 的 GitHub以獲取更多示例。
