<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 制作 NFT 區(qū)塊鏈作品(下)

          共 5183字,需瀏覽 11分鐘

           ·

          2021-06-20 00:34

          在本文中,我們將學習如何使用 Brownie、Python 和 Chainlink 來制作非同質化的 NFT 作品,并在 OpenSea NFT 市場上展示和銷售我們的成果。在學習本文前,請閱讀用 Python 制作 NFT 區(qū)塊鏈作品(上)。

          動態(tài)和高級 NFT

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

          高級快速入門

          確保您的metamask中有足夠的測試網 ETH 和 LINK,然后運行以下命令:

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

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

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

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

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

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

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

          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. }

          然后我們可以運行我們的 set_tokenuri.py 腳本:

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

          我們會得到這樣的輸出:

          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

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

          隨機品種

          然我們看一下剛剛做了什么。這是我們的 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. tokenCounter = 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. }

          50. }

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

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

          您可以在文檔中了解有關 Chainlink VRF 的更多信息。

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

          Chainlink 節(jié)點通過調用 fulfillRandomness 函數進行響應,并根據隨機數創(chuàng)建收藏品。然后我們仍然需要調用 _setTokenURI 來為我們的 NFT 提供它需要的外觀。

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

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

          來自 IPFS 的元數據

          我們使用 IPFS 來存儲兩個文件:

          • NFT 的形象(哈巴狗形象)

          • tokenURI 文件(JSON 文件,其中還包含圖像的鏈接)

          我們使用 IPFS 是因為它是一個免費的去中心化平臺。我們可以通過下載 IPFS 桌面并點擊導入按鈕將我們的 tokenURI 和圖像添加到 IPFS。

          然后,我們可以通過點擊要共享的文件旁邊的 3 個點、點擊共享鏈接并復制給定的鏈接來共享 URI。然后我們可以將此鏈接添加到我們的 set_tokenuri.py 文件中以更改我們想要使用的 tokenURI。

          持久性

          但是,如果 tokenURI 僅在我們的節(jié)點上,這意味著當我們的節(jié)點關閉時,沒有其他人可以查看它。所以我們希望其他人 pin我們的 NFT。我們可以使用 Pinata 之類的 pin服務來幫助我們的數據保持活動狀態(tài),即使我們的 IPFS 節(jié)點已關閉。

          我想未來會有越來越多的元數據存儲在 IPFS 和去中心化存儲平臺上。集中式服務器可能會宕機,這意味著這些 NFT 上的藝術將永遠丟失。請務必檢查您使用的 NFT 的 tokenURI 所在的位置!

          我也希望更多的人會使用像 Filecoin 這樣的 dStorage 平臺,因為使用 pin服務也沒有像它應該的那樣去中心化。

          現(xiàn)在,您已經具備了制作漂亮有趣、可定制、交互式 NFT 的技能,并讓它們在市場上呈現(xiàn)。

          NFT 是一種有趣、強大的方式,可以補償藝術家們所做的辛勤工作。


          歡迎添加下方二維碼加入社群

          一起探討Python與區(qū)塊鏈開發(fā)技術




          點擊下方閱讀原文加入社區(qū)會員

          瀏覽 111
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女扒开屁股 | 亚洲天堂电影网站 | 黄色片在线看 | 亚日韩综合 | 亚洲欧洲一区二区三区视频 |