日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
用Python制作NFT區(qū)塊鏈作品(下)

在本文中,我們將學(xué)習(xí)如何使用 Brownie、Python 和 Chainlink 來(lái)制作非同質(zhì)化的 NFT 作品,并在 OpenSea NFT 市場(chǎng)上展示和銷(xiāo)售我們的成果。在學(xué)習(xí)本文前,請(qǐng)閱讀用 Python 制作 NFT 區(qū)塊鏈作品(上)。

目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、德化網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

動(dòng)態(tài)和高級(jí) NFT

動(dòng)態(tài) NFT 是可以隨時(shí)間變化的 NFT,或者具有我們可以用來(lái)相互交互的鏈上功能。這些 NFT 可以無(wú)限定制,讓我們可以制作整個(gè)游戲、元宇宙(metaverse)或某種互動(dòng)藝術(shù)。下面我們進(jìn)入高級(jí)部分。

高級(jí)快速入門(mén)

確保您的metamask中有足夠的測(cè)試網(wǎng) ETH 和 LINK,然后運(yùn)行以下命令:

 
 
 
 
  1. brownie run scripts/advanced_collectible/deploy_advanced.py --network rinkeby  
  2. brownie run scripts/advanced_collectible/create_collectible.py --network rinkeby 

我們的收藏品是從 Chainlink VRF 返回的隨機(jī)犬種。Chainlink VRF 是一種獲得可證明隨機(jī)數(shù)的方法,因此我們的 NFT 真正稀缺。然后我們想要?jiǎng)?chuàng)建它的元數(shù)據(jù)。 

 
 
 
 
  1. brownie run scripts/advanced_collectible/create_metadata.py --network rinkeby 

然后我們可以選擇將此數(shù)據(jù)上傳到 IPFS,以便我們可以擁有一個(gè) tokenURI。稍后我會(huì)告訴你如何做到這一點(diǎn)?,F(xiàn)在,我們將僅使用以下示例 tokenURI:

 
 
 
 
  1. https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=1-PUG.json 

如果您將 IPFS Companion 下載到您的瀏覽器中,您可以使用該 URL 來(lái)查看 URI 返回的內(nèi)容。它看起來(lái)像這樣:

 
 
 
 
  1. {  
  2.      "name": "PUG",  
  3.      "description": "An adorable PUG pup!",  
  4.      "image": "https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png",  
  5.      "attributes": [  
  6.          {  
  7.              "trait_type": "cuteness",  
  8.              "value": 100  
  9.          }  
  10.      ]  
  11.  } 

然后我們可以運(yùn)行我們的 set_tokenuri.py 腳本:

 
 
 
 
  1. brownie run scripts/advanced_collectible/set_tokenuri.py --network rinkeby 

我們會(huì)得到這樣的輸出:

 
 
 
 
  1. Running 'scripts/advanced_collectible/set_tokenuri.py::main'...  
  2.   Working on rinkeby  
  3.   Transaction sent: 0x8a83a446c306d6255952880c0ca35fa420248a84ba7484c3798d8bbad421f88e  
  4.     Gas price: 1.0 gwei   Gas limit: 44601   Nonce: 354  
  5.     AdvancedCollectible.setTokenURI confirmed - Block: 8331653   Gas used: 40547 (90.91%)  
  6.   Awesome! You can view your NFT at https://testnets.opensea.io/assets/0x679c5f9adC630663a6e63Fa27153B215fe021b34/0  
  7.   Please give up to 20 minutes, and hit the "refresh metadata" button 

我們可以點(diǎn)擊給出的鏈接,看看它在 Opensea 上的樣子!您可能需要點(diǎn)擊刷新元數(shù)據(jù)按鈕并等待幾分鐘。

隨機(jī)品種

然我們看一下剛剛做了什么。這是我們的 AdvancedCollectible.sol:

 
 
 
 
  1. pragma solidity 0.6.6;  
  2. import "@openzeppelin/contracts/token/ERC721/ERC721.sol";  
  3. import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";  
  4. contract AdvancedCollectible is ERC721, VRFConsumerBase {  
  5.     uint256 public tokenCounter;  
  6.     enum Breed{PUG, SHIBA_INU, BRENARD}  
  7.     // add other things  
  8.     mapping(bytes32 => address) public requestIdToSender;  
  9.     mapping(bytes32 => string) public requestIdToTokenURI;  
  10.     mapping(uint256 => Breed) public tokenIdToBreed;  
  11.     mapping(bytes32 => uint256) public requestIdToTokenId;  
  12.     event requestedCollectible(bytes32 indexed requestId);   
  13.     bytes32 internal keyHash;  
  14.     uint256 internal fee;  
  15.     uint256 public randomResult;  
  16.     constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash)  
  17.     public   
  18.     VRFConsumerBase(_VRFCoordinator, _LinkToken)  
  19.     ERC721("Dogie", "DOG")  
  20.     {  
  21.         tokenCounter = 0;  
  22.         keyHash = _keyhash;  
  23.         fee = 0.1 * 10 ** 18;  
  24.     }  
  25.     function createCollectible(string memory tokenURI, uint256 userProvidedSeed)   
  26.         public returns (bytes32){  
  27.             bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);  
  28.             requestIdToSender[requestId] = msg.sender;  
  29.             requestIdToTokenURI[requestId] = tokenURI;  
  30.             emit requestedCollectible(requestId);  
  31.     }  
  32.     function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override {  
  33.         address dogOwner = requestIdToSender[requestId];  
  34.         string memory tokenURI = requestIdToTokenURI[requestId];  
  35.         uint256 newItemId = tokenCounter;  
  36.         _safeMint(dogOwner, newItemId); 
  37.         _setTokenURI(newItemId, tokenURI);  
  38.         Breed breed = Breed(randomNumber % 3);   
  39.         tokenIdToBreed[newItemId] = breed;  
  40.         requestIdToTokenId[requestId] = newItemId;  
  41.         tokenCountertokenCounter = tokenCounter + 1;  
  42.     } 
  43.     function setTokenURI(uint256 tokenId, string memory _tokenURI) public {  
  44.         require(  
  45.             _isApprovedOrOwner(_msgSender(), tokenId),  
  46.             "ERC721: transfer caller is not owner nor approved"  
  47.         ); 
  48.          _setTokenURI(tokenId, _tokenURI);  
  49.     }  

我們使用 Chainlink VRF 從 PUG、SHIBA_INU、BRENARD 列表中創(chuàng)建一個(gè)隨機(jī)品種。當(dāng)我們這次調(diào)用 createCollectible 時(shí),我們實(shí)際上向鏈下的 Chainlink VRF 節(jié)點(diǎn)發(fā)起了一個(gè)請(qǐng)求,并返回一個(gè)隨機(jī)數(shù),以使用這 3 個(gè)品種之一創(chuàng)建 NFT。

在你的 NFT 中使用真正的隨機(jī)性是創(chuàng)造真正稀缺性的好方法,使用 Chainlink oracle 隨機(jī)數(shù)意味著你的數(shù)字可以證明是隨機(jī)的,并且不會(huì)受到礦工的影響。

您可以在文檔中了解有關(guān) Chainlink VRF 的更多信息。

https://docs.chain.link/docs/chainlink-vrf/

Chainlink 節(jié)點(diǎn)通過(guò)調(diào)用 fulfillRandomness 函數(shù)進(jìn)行響應(yīng),并根據(jù)隨機(jī)數(shù)創(chuàng)建收藏品。然后我們?nèi)匀恍枰{(diào)用 _setTokenURI 來(lái)為我們的 NFT 提供它需要的外觀。

我們沒(méi)有在這里給出我們的 NFT 屬性,但屬性是讓我們的 NFT 進(jìn)行交互的好方法。您可以在此 龍與地下城示例中看到具有屬性的 NFT 的一個(gè)很好的示例。

https://github.com/PatrickAlphaC/dungeons-and-dragons-nft

來(lái)自 IPFS 的元數(shù)據(jù)

我們使用 IPFS 來(lái)存儲(chǔ)兩個(gè)文件:

  •  NFT 的形象(哈巴狗形象)
  •  tokenURI 文件(JSON 文件,其中還包含圖像的鏈接)

我們使用 IPFS 是因?yàn)樗且粋€(gè)免費(fèi)的去中心化平臺(tái)。我們可以通過(guò)下載 IPFS 桌面并點(diǎn)擊導(dǎo)入按鈕將我們的 tokenURI 和圖像添加到 IPFS。

然后,我們可以通過(guò)點(diǎn)擊要共享的文件旁邊的 3 個(gè)點(diǎn)、點(diǎn)擊共享鏈接并復(fù)制給定的鏈接來(lái)共享 URI。然后我們可以將此鏈接添加到我們的 set_tokenuri.py 文件中以更改我們想要使用的 tokenURI。

持久性

但是,如果 tokenURI 僅在我們的節(jié)點(diǎn)上,這意味著當(dāng)我們的節(jié)點(diǎn)關(guān)閉時(shí),沒(méi)有其他人可以查看它。所以我們希望其他人 pin我們的 NFT。我們可以使用 Pinata 之類(lèi)的 pin服務(wù)來(lái)幫助我們的數(shù)據(jù)保持活動(dòng)狀態(tài),即使我們的 IPFS 節(jié)點(diǎn)已關(guān)閉。

我想未來(lái)會(huì)有越來(lái)越多的元數(shù)據(jù)存儲(chǔ)在 IPFS 和去中心化存儲(chǔ)平臺(tái)上。集中式服務(wù)器可能會(huì)宕機(jī),這意味著這些 NFT 上的藝術(shù)將永遠(yuǎn)丟失。請(qǐng)務(wù)必檢查您使用的 NFT 的 tokenURI 所在的位置!

我也希望更多的人會(huì)使用像 Filecoin 這樣的 dStorage 平臺(tái),因?yàn)槭褂?pin服務(wù)也沒(méi)有像它應(yīng)該的那樣去中心化。

現(xiàn)在,您已經(jīng)具備了制作漂亮有趣、可定制、交互式 NFT 的技能,并讓它們?cè)谑袌?chǎng)上呈現(xiàn)。

NFT 是一種有趣、強(qiáng)大的方式,可以補(bǔ)償藝術(shù)家們所做的辛勤工作。


名稱(chēng)欄目:用Python制作NFT區(qū)塊鏈作品(下)
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/djpgsgo.html