# 百亿项目Alchemy Road to Web3 第三周NFT获取教程

By [Greta](https://paragraph.com/@greta888) · 2022-08-13

---

Alchemy是什么项目？
-------------

2019年12月，Alchemy完成**1500万美元A轮融资**，资方为Pantera Capital，斯坦福大学，Coinbase，三星等。

2021年4月，Alchemy以5.05亿美元估值完成**8000万美元B轮融资**，Coatue和Addition领投，DFJ Growth、K5 Global、Chainsmokers（烟鬼组合）、演员Jared Leto和Glazer家族参投。

2021年10月，Alchemy以35亿美元估值完成**2.5亿美元C轮融资**，由a16z领投的。

2022年2月，Alchemy以102亿美元估值完成**2亿美元融资**，Lightspeed与Silver Lake领投。

**Alchemy是一个**背景强大、经费充足、踏实做事、没有发币的团队，这样的项目不刷，难道去刷土狗吗？

并且，Alchemy计划将新资金用于推广Web3采用，这方面的一些举措包括推出Web3 University，就是现在的 Road to Web3 活动，活动为期10周，每周一个NFT。看了下nft数量极少，估计由于任务难度大，很多小伙伴直接放弃，这样的项目若是空投，绝对是大毛。

手把手第三周教程开始：如何使用链上元数据制作 NFT - Hardhat 和 JavaScript
-------------------------------------------------

![](https://storage.googleapis.com/papyrus_images/d1179cdd27639de4739540738103341554a0751f3768d5c32f9b9e2d286be981.png)

官方原版[教程链接](https://docs.alchemy.com/docs/how-to-make-nfts-with-on-chain-metadata-hardhat-and-javascript)，其中有长达49分钟的视频教程还有大篇幅的文字教程，我按照我的做法给大家一个易于操作的图文教程。

没有做过第二周的记得照着这个先做一下。

[https://mirror.xyz/0xCD0e394639B2D0b159B41F9dBe0583C33d85e874/JCRkc6KJPrpJX3A03E0fzF96oNzOY6tCDxn9Duz\_p3I](https://mirror.xyz/0xCD0e394639B2D0b159B41F9dBe0583C33d85e874/JCRkc6KJPrpJX3A03E0fzF96oNzOY6tCDxn9Duz_p3I)

### step1 将 Polygon Mumbai 添加到您的 Metamask 钱包

1.进入 [mumbai.polygonscan.com](https://mumbai.polygonscan.com/) 并向下滚动到页面底部。 您将看到 “添加多边形网络”按钮，单击它并确认您要将其添加到 Metamask。

![](https://storage.googleapis.com/papyrus_images/1b5d6fac37689f9e4bbf78be894a6792c9e8f1b0e220ff3fbfec6b590c85d6c9.png)

![](https://storage.googleapis.com/papyrus_images/c87b92f6701ebbd77094254bb465f460a59566c20491d7fe98bd55c695e8dc8b.png)

### step2 获取免费的 Matic 以部署您的 NFT 智能合约

获取 Test MATIC 非常简单，只需导航到以下水龙头之一：

*   [mumbaifaucet.com](https://mumbaifaucet.com/)
    
*   [faucet.polygon.technology](https://faucet.polygon.technology/) （这个貌似一直有）
    

将钱包地址复制到文本栏中，然后点击 **“Send Me MATIC”** ：

![](https://storage.googleapis.com/papyrus_images/2e56bb4b2e632f72da0bd54c61ef12eb4e0995a7c00583b3d53a9fb5a9052871.png)

### step3 如何使用链上元数据制作 NFT - 项目设置

1.按Win+R，在跳出框中输入cmd。

![](https://storage.googleapis.com/papyrus_images/1e243ddb0ab1f93ab1f31935658919481801eca8a6bf5b446c0ab227f8793c31.png)

2.进入控制台，输入mkdir ChainBattled 新建一个文件夹，再输入cd ChainBattled 按回车进入该文件夹。

![](https://storage.googleapis.com/papyrus_images/68a2d8d47daaa31ad5e41594d3e026de923676146ca1c2a9db4222ad1a2a1c4b.png)

3.输入npm install -g yarn 安装yarn。

![](https://storage.googleapis.com/papyrus_images/7216ea9cd38362879138bb58103cb37b1dc81b4a7e4ccc438a61dfb103bb1a3d.png)

4.再输入yarn add hardhat 安装hardhat。

![](https://storage.googleapis.com/papyrus_images/fe7ff65d3bca368eea6875236d980627453071996083d8c39386ab79ab3600c5.png)

5.然后输入npx hardhat init，连按三下回车即可。

![](https://storage.googleapis.com/papyrus_images/8fcc78055927e5d0e3574867b907cbce3b0ac480bd811514f8c5d8b2021193b2.png)

![](https://storage.googleapis.com/papyrus_images/eeb6dd56c289cd868f4f46d2f15c168f4a826fcd9a2db1d7cdc93b4076dfa5b0.png)

6.输入yarn add @openzeppelin/contracts 安装 OpenZeppelin 智能合约库。

![](https://storage.googleapis.com/papyrus_images/d8232f574144f78116dac906c08e8aab5b3b58604989dc73dbcd3dce2e0f1e64.png)

7.输入yarn add @nomiclabs/hardhat-etherscan ，按回车。

![](https://storage.googleapis.com/papyrus_images/5c3c8dc0d439d6ed6a16c60eca925afa0fc419f2392c7b2ef9cb8be79d83e8e3.png)

### step4 修改 hardhat.config.js 文件

1.打开Vscode，点击file，再点击open folder。（不要管右侧代码，那是上一个项目的哈哈）

![](https://storage.googleapis.com/papyrus_images/16e1fb27761ecf63638e3b02e0f6424969532b4afb9a1befea58855ee00f7517.png)

2.找到刚才创建的文件夹，点击选择文件夹。

![](https://storage.googleapis.com/papyrus_images/bd5f1899974de167aaf87e696f3c07546c9d4109d72a3b8847f2d698a07cad8f.png)

3.打开后是这个样子的。

![](https://storage.googleapis.com/papyrus_images/97d424abb45080961574093514f53b46600a64fe8b584dfaa179e061a7d1ee18.png)

4.右键点击，然后delete lock.sol和deploy.js这两个文件。

![](https://storage.googleapis.com/papyrus_images/3f26359e2d6f3b5aebf3201aab3b1eea7366d7ff2295a108106432a88d6e6a82.png)

5.点击hardhat.config.js，将下面代码粘贴进去！如图所示！

    require("dotenv").config();
    require("@nomiclabs/hardhat-waffle");
    require("@nomiclabs/hardhat-etherscan");
    
    module.exports = {
      solidity: "0.8.10",
      networks: {
        mumbai: {
          url: process.env.TESTNET_RPC,
          accounts: [process.env.PRIVATE_KEY]
        },
      },
      etherscan: {
        apiKey: process.env.POLYGONSCAN_API_KEY
      }
    };
    

![](https://storage.googleapis.com/papyrus_images/33607288697c457f388e05ae1da6d68ecdd3acf4c9f660d559dceae2ba20fe4e.png)

### step5 具有链上元数据的 NFT：开发智能合约

在 contracts 文件夹中，创建一个新文件并将其命名为“ChainBattles.sol” ,然后将以下代码粘贴进去（注意，这个粘贴我的，官方的有错误！！），如图所示，**记得保存，记得保存！**

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
    import "@openzeppelin/contracts/utils/Counters.sol";
    import "@openzeppelin/contracts/utils/Strings.sol";
    import "@openzeppelin/contracts/utils/Base64.sol";
    
    contract ChainBattles is ERC721URIStorage  {
        using Strings for uint256;
        using Counters for Counters.Counter;
        Counters.Counter private _tokenIds;
    
        mapping(uint256 => uint256) public tokenIdToLevels;
    
        constructor() ERC721 ("Chain Battles", "CBTLS"){
        }
    
    function generateCharacter(uint256 tokenId) public returns(string memory){
    
        bytes memory svg = abi.encodePacked(
            '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350">',
            '<style>.base { fill: white; font-family: serif; font-size: 14px; }</style>',
            '<rect width="100%" height="100%" fill="black" />',
            '<text x="50%" y="40%" class="base" dominant-baseline="middle" text-anchor="middle">',"Warrior",'</text>',
            '<text x="50%" y="50%" class="base" dominant-baseline="middle" text-anchor="middle">', "Levels: ",getLevels(tokenId),'</text>',
            '</svg>'
        );
        return string(
            abi.encodePacked(
                "data:image/svg+xml;base64,",
                Base64.encode(svg)
            )    
        );
    }
    function getLevels(uint256 tokenId) public view returns (string memory) {
        uint256 levels = tokenIdToLevels[tokenId];
        return levels.toString();
    }
    function getTokenURI(uint256 tokenId) public returns (string memory){
        bytes memory dataURI = abi.encodePacked(
            '{',
                '"name": "Chain Battles #', tokenId.toString(), '",',
                '"description": "Battles on chain",',
                '"image": "', generateCharacter(tokenId), '"',
            '}'
        );
        return string(
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(dataURI)
            )
        );
    }
    function mint() public {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _safeMint(msg.sender, newItemId);
        tokenIdToLevels[newItemId] = 0;
        _setTokenURI(newItemId, getTokenURI(newItemId));
    }
        function train(uint256 tokenId)public{
            require(_exists(tokenId));
            require(ownerOf(tokenId)==msg.sender,"You must own this token to train it");
            uint256 currentLevel=tokenIdToLevels[tokenId];
            tokenIdToLevels[tokenId]=currentLevel+1;
            _setTokenURI(tokenId,getTokenURI(tokenId));
            }
    }
    

![](https://storage.googleapis.com/papyrus_images/6b7fef82d1dd1791702178fe5dccc1ee0ac4bf8d6ad369ddb3281f310d444d3e.png)

### step6 使用链上元数据智能合约部署 NFT

1.在控制台输入echo test>.env 创建一个.env文件。

![](https://storage.googleapis.com/papyrus_images/bcb3b13031542a55025dce9c27fde4a350925e62aa5cf5ff84f7f1a1a72aa100.png)

2.回到vscode，在env文件中粘贴以下代码，如图所示！

    TESTNET_RPC=""
    PRIVATE_KEY=""
    POLYGONSCAN_API_KEY=""
    

![](https://storage.googleapis.com/papyrus_images/e9643740f8301978621afa8a4376d0c1e1ed3653e4564230c4042e8dea1e7b90.png)

3.进入 [alchemy.com](https://alchemy.com/?a=cn-road-to-week-three) [](https://www.alchemy.com/)并创建一个新的 Polygon Mumbai 应用程序。

点击create app。

![](https://storage.googleapis.com/papyrus_images/ae09c989578fbc2ff7cac2cb92ef5819a6bb65a94676ce7980b96c68c35b0e66.png)

如下图输入，再点击create app。

![](https://storage.googleapis.com/papyrus_images/c4201f61d640c7cf86fbffb6e3aecc16f3485b8bbefa0e9eb9b097e196ffc8d1.png)

4.点击刚才创建的app的view key。复制HTTPS的链接，粘贴到vscode中env文件的第一行，如图所示。

![](https://storage.googleapis.com/papyrus_images/5bd25dc38c86dd4cee66bbf17baffeb27d7c96f85f7e587d171d39ccddd1b983.png)

![](https://storage.googleapis.com/papyrus_images/5bf4606b69343d88851b07366f7ddbf8b5f69c239a691eb8fcfeffe129d18b2b.png)

![](https://storage.googleapis.com/papyrus_images/5535937125fd2e89501dcae942b4f78b9e328e18dd784c04062913ac5ba1459f.png)

5.打开 Metamask 钱包，点击三点菜单 > 账户详情 > 并将您的私钥复制粘贴为“ **PRIVATE\_KEY** ”值，如图所示。

![](https://storage.googleapis.com/papyrus_images/c46792a42dc90c428f73811a973d3f8a18cd8afd9cefe5598ee9e5a900eb9a86.png)

![](https://storage.googleapis.com/papyrus_images/89a79b4bcf7965f2b31a0ba67a8da7cf17c4fda52d8f887b2b96fd6973d57bfa.png)

6.最后，进入[polygonscan.com，](https://polygonscan.com/) 并点击右上角创建一个新帐户。

![](https://storage.googleapis.com/papyrus_images/a3463db1b1ac03bd99ff5a5fd071235adfcfec40df4d8e06d24f63a3a9169773.png)

进入API-KEY，点击ADD，添加完毕后将红框内字符串复制，粘贴到env文件第三行，如图所示。保存！！！

![](https://storage.googleapis.com/papyrus_images/4e227290dc7b07002755021b5921e6a8095bcea9462af6fcde439a24054068d1.png)

![](https://storage.googleapis.com/papyrus_images/26becf18a09605f9f1faf57fce28ccf5b0ee7c84ba86eb8993b80a903a075a69.png)

### step7 创建部署脚本

1.在script问价夹下创建deploy.js文件，并粘贴以下代码，如图所示，记得保存。

    const main = async () => {
      try {
        const nftContractFactory = await hre.ethers.getContractFactory(
          "ChainBattles"
        );
        const nftContract = await nftContractFactory.deploy();
        await nftContract.deployed();
    
        console.log("Contract deployed to:", nftContract.address);
        process.exit(0);
      } catch (error) {
        console.log(error);
        process.exit(1);
      }
    };
      
    main();
    

![](https://storage.googleapis.com/papyrus_images/847347641058a38794365d45f446b87ae4f6a77a0f88af35eff2910de86e3d59.png)

### step8 编译和部署智能合约

1.在控制台输入 npm install dotenv ，点击回车安装。

![](https://storage.googleapis.com/papyrus_images/2fc43126c4d76ed9d3e5ea713db118b1a6e4fdaf8588bdeb15cc03ac1762920c.png)

2.在控制台输入 npm install @nomiclabs/hardhat-waffle，点击回车安装。

![](https://storage.googleapis.com/papyrus_images/793c3b45a20780f560229443c0cb153f013cac0f5f099a4b25c43991999c15d8.png)

3.在控制台输入npx hardhat compile，按回车，如图所示即可。

![](https://storage.googleapis.com/papyrus_images/c3d5fdac3691d274924da22b94b1638c23b4ae27d50863e75a71aa28d43253d7.png)

4.在控制台输入npx hardhat run scripts/deploy.js --network mumbai ,等待 10-15 秒，在终端中看到智能合约地址。

![](https://storage.googleapis.com/papyrus_images/919a28b7413152800d4afe8be9bc6c79fe7dd8c5db9e438b525c0364c7efa074.png)

### step9 在 Polygon Scan 上检查您的智能合约

1.复制刚刚部署的智能合约地址，进入 [mumbai.polygonscan.com](https://mumbai.polygonscan.com/) ， \*\*在搜索栏中粘贴智能合约的地址。\*\*然后点击contract，会发现合约代码不可读。

![](https://storage.googleapis.com/papyrus_images/ce120e933b7771c4c0e20b2783e3eef1e9c49e006178ed5d27315ef6873ae5d6.png)

2.回到控制台，输入npx hardhat verify --network mumbai +你的合约地址，如图所示。（由于请求的人比较多，有时候会错误，多请求几次即可）（我这里是地址已经验证过了，所以出现下面那个错误）

![](https://storage.googleapis.com/papyrus_images/d7b558184a53c72c4289b6765979bdaa4b8537d4771f771a69087b22ba60f816.png)

### step10 通过多边形扫描与您的智能合约交互

1.现在智能合约已经通过验证，mumbai.polygonscan.com 将在其附近显示一个绿色小勾。

![](https://storage.googleapis.com/papyrus_images/33fd788a7ad3b62623b460b69ca3a6882626c67e65258bdec59c71eb6545048e.png)

2.点击connect to web3，链接小狐狸。

![](https://storage.googleapis.com/papyrus_images/829ca0f154e51572b360d53eaa971023f933327bcde9fe53b8fee335a732f341.png)

3.点击write connect，然后点击第四个mint下的write，在小狐狸中确认。

![](https://storage.googleapis.com/papyrus_images/518d4823a9801620145ab956b8e5a1e0c12d93a00110c0ac2edb590fdf6c9466.png)

![](https://storage.googleapis.com/papyrus_images/cc30757a109218448bf6a90968cb639b1a49cadffbff35e1d9f31958293618cb.png)

### step11 在 OpenSea 上查看您的动态 NFT

1.复制智能合约地址，前往 [testnet.opensea.com](https://testnets.opensea.io/) ，并将其粘贴到搜索栏中。

![](https://storage.googleapis.com/papyrus_images/b2f6cab4d8a78dca344364a191bd70e0d37ff22293eaaaf2dbaf25ff25146c13.png)

### step12 更新动态 NFT 图像训练 NFT

1.回到 [mumbai.polygonscan.com](https://mumbai.polygonscan.com/) ， 单击write connect，然后看到第8个train，在其中输入1点击write，然后点击小狐狸确认。

![](https://storage.googleapis.com/papyrus_images/be3cd17b2bb2ed29a5e731b96d143a4596ecaf8bfd035cf83da0434a374a9adb.png)

2.再回到刚才的界面并刷新几次，如图所示即可。

![](https://storage.googleapis.com/papyrus_images/641c030d8420bdb5e5426c1cee118c3175ae854d7402bc919f88186d2ba221ac.png)

### step13 项目提交。

提交[链接](https://alchemyapi.typeform.com/roadtoweekthree)。

**好了全部完毕，坐等项目方快照，领取NFT即可！**

---

*Originally published on [Greta](https://paragraph.com/@greta888/alchemy-road-to-web3-nft-2)*
