
在本文中,我們將學習如何使用 Brownie、Python 和 Chainlink 來制作非同質化的 NFT 作品,并在 OpenSea NFT 市場上展示和銷售我們的成果,
什么是 NFT?
NFT英文全稱為Non-Fungible Token,翻譯成中文就是:非同質化代幣,具有不可分割、不可替代、獨一無二等特點,NFT由于其非同質化、不可拆分的特性,使得它可以和現實世界中的一些商品系結,換言之,其實就是發行在區塊鏈上的數字資產,這個資產可以是游戲道具、數字藝術品、門票等,并且具有唯一性和不可復制性,由于NFT具備天然的收藏屬性和便于交易,加密藝術家們可以利用NFT創造出獨一無二的數字藝術品,
ERC20 與 ERC721
NFT 是類似于 ERC20 的區塊鏈token標準,如 AAVE、SNX 和 LINK(技術上為 ERC677),ERC20 是“可替代”的代幣,意思是“可替換”或“可互換”,
例如,無論您使用什么美元紙幣,您的美元紙幣都將值 1 美元,美元鈔票上的序列號可能不同,但鈔票是可以互換的,無論如何它們都值 1 美元,
另一方面,NFT 是“不可替代的”,它們遵循自己的代幣標準 ERC721,例如,蒙娜麗莎是“不可替代的”,即使有人可以復制它,但永遠只有一個蒙娜麗莎,如果蒙娜麗莎是在區塊鏈上創建的,它將是 NFT,

NFT 有什么用?
NFT 通過將合約永久地部署在鏈上,讓創作者、藝術家、游戲設計師等創造價值,
你將永遠知道誰創造了 NFT,誰擁有 NFT,它來自哪里等等,這種獨特性讓他們比傳統藝術更有價值,在傳統藝術中,理解什么是“假貨”可能很棘手,而鏈上的歷史很容易追溯,
由于智能合約和 NFT 是 100% 可編程的,NFT 還可以添加內置的版稅和任何其他功能,補償藝術家一直是一個問題,因為通常藝術家的作品在沒有任何歸屬的情況下四處傳播,
越來越多的藝術家和工程師開始利用這一巨大的附加值,因為這最終成為藝術家獲得作業報酬的好方法,不僅如此,NFT 還是一種展示您的創造力并成為數字世界收藏家的有趣方式,
NFT 的價值
NFT 已經走過了漫長的道路,我們不斷看到 NFT 的銷售額創下紀錄,例如下面這幅名為“每天:前 5,000 天”的畫作售價為 6930 萬美元,

NFT也是在數字世界中創造藝術和了解智能合約創建的一種有趣、動態和引人入勝的方式,所以現在將教你制作 NFT 所需的一切知識,
如何制作 NFT
現在,制作 NFT 的最簡單方法就是前往 Opensea、Rarible 或 Mintible 等平臺,并按照他們的分步指南在他們的平臺上進行部署即可,
你可以 100% 走這條路,但是你可能會被平臺系結,你無法實作無限的定制,或者真正利用 NFT 的任何優勢,
如果你想用代碼來實作,學習一些扎實的知識,并有能力以無限的創造力創造出一些東西,那么請繼續閱讀!
如何進行無限定制的 NFT
首先介紹NFT Brownie Mix,這是一個包含大量樣板代碼的作業倉庫,
https://github.com/PatrickAlphaC/nft-mix
先決條件
我們需要安裝一些東西才能開始:
Python
Nodejs 和 npm
Metamask
如果您不熟悉 Metamask,您可以按照下面教程進行設定,
https://docs.chain.link/docs/install-metamask/
Rinkeby Testnet ETH 和 LINK
我們還將部署在 Rinkeby 以太坊測驗鏈上!
測驗鏈是測驗我們的智能合約在現實世界中表現的好方法,我們需要 Rinkeby ETH 和 Rinkeby LINK,我們可以從 Chainlink 檔案中最新水龍頭的鏈接中免費獲得它們,
我們還需要將 rinkeby LINK 的token添加到metamask中,我們可以按照 LINK 檔案進行操作,
https://docs.chain.link/docs/acquire-link/
注意一定要使用 Rinkeby 而不是 Ropsten,在使用像以太坊這樣的智能合約平臺時,我們需要支付一點 ETH,而從鏈下獲取資料時,我們需要支付一點 LINK,這就是我們需要獲取測驗鏈上的LINK 和 ETH 的原因,
下面這件作品就是我們要部署到 OpenSea 的 NFT,
https://testnets.opensea.io/assets/0x8acb7ca932892eb83e4411b59309d44dddbc4cdf/0

快速上手
git clone https://github.com/PatrickAlphaC/nft-mix
cd nft-mix
現在我們需要安裝 ganache-cli 和 eth-brownie,
pip install eth-brownie
npm install -g ganache-cli
現在我們可以設定我們的環境變數,如果您不熟悉環境變數,只需將它們添加到 .env 檔案中,然后運行:
source .env
.env的示例應該在你剛剛克隆的 repo 中,并注釋掉了環境變數,請確保取消注釋以使用它們!
您需要一個 WEB3_INFURA_PROJECT_ID和一個 PRIVATE_KEY ,WEB3_INFURA_PROJECT_ID 可以在注冊免費 Infura 帳戶時找到,這將為我們提供一種將交易發送到區塊鏈的方法,
我們還需要一個私鑰,您可以從您的 Metamask 中獲取,點擊 3 個小點,然后單擊帳戶詳細資訊和匯出私鑰,如果您投入現金進去,請不要與任何人分享此密鑰!
export PRIVATE_KEY=YOUR_KEY_HERE
export WEB3_INFURA_PROJECT_ID=YOUR_PROJECT_ID_HERE
現在我們可以部署我們的 NFT 合約并使用以下兩個命令創建我們的第一個收藏品,
brownie run scripts/simple_collectible/deploy_simple.py --network rinkeby
brownie run scripts/simple_collectible/create_collectible.py --network rinkeby
第一個腳本將我們的 NFT 合約部署到 Rinkeby 區塊鏈,第二個腳本創建了我們的第一個收藏品,
您剛剛部署了第一個智能合約!
它根本沒有什么作用,但別擔心——我將在本教程的高級部分向您展示如何在 OpenSea 上渲染它,首先,讓我們看看 ERC721 代幣標準,
ERC721 代幣標準
我們來看看我們剛剛部署的合約,在 SimpleCollectible.sol 檔案中,
// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;
import"@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract SimpleCollectibleis ERC721 {
uint256 public tokenCounter;
constructor () public ERC721 ("Dogie", "DOG"){
tokenCounter = 0;
}
function createCollectible(string memory tokenURI) public returns (uint256) {
uint256 newItemId = tokenCounter;
_safeMint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
tokenCounter = tokenCounter + 1;
return newItemId;
}
}
我們將 OpenZeplin 包用于 ERC721 token,匯入的這個包允許我們使用典型 ERC721 token的所有功能,這定義了我們的代幣將具有的所有功能,例如 transfer——將代幣轉移給新用戶, safeMint——創建新代幣,等等,
您可以通過查看 OpenZepplin ERC721 代幣合約找到賦予我們合約的所有功能,我們的合約在下面一行繼承了這些功能:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
contract SimpleCollectibleis ERC721 {
這就是 Solidity 繼承的方式,當我們部署一個合約時,建構式會被自動呼叫,它需要一些引數,
constructor () public ERC721 ("Dogie", "DOG"){
tokenCounter = 0;
}
我們還使用了 ERC721 的建構式,在我們的建構式中,我們只需要給它一個名稱和一個符號,在我們的例子中,它是“Dogie”和“DOG”,這意味著我們創建的每個 NFT 都將是 Dogie/DOG 型別,
這就像每張口袋妖怪卡仍然是口袋妖怪,或者交易卡上的每個棒球運動員仍然是棒球運動員,每個棒球運動員都是獨一無二的,但他們仍然都是棒球運動員,我們只是使用 DOG 型別,
我們在頂部有 tokenCounter 來計算我們創建了多少這種型別的 NFT,每個新token都會根據當前的 tokenCounter 獲得一個 tokenId,
實際上可以使用 createCollectible 函式創建 NFT,這就是我們在 create_collectible.py 腳本中所寫的,
function createCollectible(string memory tokenURI) public returns (uint256) {
uint256 newItemId = tokenCounter;
_safeMint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
tokenCounter = tokenCounter + 1;
return newItemId;
}
_safeMint函式創建新的 NFT,并將其分配給呼叫 createdCollectible的人,也就是 msg.sender,并使用從 tokenCounter 派生的 newItemId,這就是我們如何通過檢查 tokenId的所有者來跟蹤誰擁有什么,
您會注意到我們還呼叫了 _setTokenURI,讓我們來看一下,
什么是 NFT 元資料和 TokenURI?
當創建智能合約和創建 NFT 時,人們很快意識到將大量資料部署到區塊鏈是非常昂貴的,小至 1 KB 的影像的存盤成本很容易超過 100 萬美元,
這顯然是 NFT 的一個問題,因為擁有創意藝術意味著您必須將這些資訊存盤在某個地方,他們還想要一種輕量級的方式來存盤有關 NFT 的屬性——這就是 tokenURI 和元資料發揮作用的地方,
TokenURI
NFT 上的 tokenURI 是token“外觀”的唯一識別符號,URI 可以是通過 HTTPS 的 API 呼叫、IPFS 哈希值或任何其他獨特的東西,
它們遵循顯示元資料的標準,如下所示:
{
"name": "name",
"description": "description",
"image": "https://ipfs.io/ipfs/QmTgqnhFBMkfT9s8PHKcdXBn1f5bG3Q5hmBaR4U6hoTvb1?filename=Chainlink_Elf.png",
"attributes": [
{
"trait_type": "trait",
"value": 100
}
]
}
這些顯示了 NFT 的外觀及其屬性,影像部分指向 NFT 外觀的另一個 URI,這使得 Opensea、Rarible 和 Mintable 等 NFT 平臺可以輕松地在其平臺上呈現 NFT,因為它們都在尋找這種元資料,
鏈下元資料與鏈上元資料
現在你可能會想“等等......如果元資料不在鏈上,這是否意味著我的 NFT 可能會在某個時候消失”?你是對的,
您認為鏈下元資料意味著您不能使用該元資料讓您的智能合約相互互動也是正確的,
這就是為什么我們要專注于鏈上元資料,以便我們可以對 NFT 進行編程以相互互動,
但是,我們仍然需要鏈下元資料的影像部分,因為我們沒有一種很好的方法來在鏈上存盤大影像,但是別擔心,我們仍然可以通過使用 IPFS 在去中心化網路上免費做到這一點,
這是來自 IPFS 的 imageURI示例,它顯示了在龍與地下城教程中創建的 ChainlinkElf,
https://blog.chain.link/build-deploy-and-sell-your-own-dynamic-nft/

我們沒有為簡單的 NFT 設定 tokenURI,因為我們只想展示一個基本示例,
下一篇將講解 NFT 進階知識,這樣就可以看到我們用鏈上元資料實作的一些驚人功能,在 opeansea 上渲染 NFT,并讓我們的狗狗振作起來!
歡迎添加下方二維碼加入社群
一起探討Python與區塊鏈開發技術


點擊下方閱讀原文加入社區會員
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/287789.html
標籤:區塊鏈
