Введение

Технология Web3 произвела революцию в мире децентрализованных приложений (DApps) и невзаимозаменяемых токенов (NFT). В этом руководстве мы познакомим вас с созданием вашего первого DApp Web3, торговой площадки NFT для коллекционирования крикета, с использованием Solidity, Truffle и React. Это руководство предназначено для полных новичков; мы предоставим подробные пояснения и примеры кода, чтобы обеспечить беспроблемное обучение.

Предпосылки:

  1. Базовое понимание JavaScript и HTML.
  2. Node.js и NPM установлены в вашей системе.

Шаг 1: Настройка среды разработки

1.1 Установите Truffle: Truffle — это среда разработки для Ethereum, которая упрощает процесс разработки и тестирования. Чтобы установить Truffle, выполните следующую команду:

npm install -g truffle

1.2 Создайте новый проект Truffle:

mkdir cricket-nft-marketplace
cd cricket-nft-marketplace
truffle init

Шаг 2: Написание смарт-контракта

2.1 Создайте новый файл «CricketCollectible.sol» в папке «contracts»:

touch contracts/CricketCollectible.sol

2.2 Напишите смарт-контракт, используя Solidity:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract CricketCollectible is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    constructor() ERC721("CricketCollectible", "CRICK") {}
    function mintCollectible(address recipient, string memory tokenURI) public returns (uint256) {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);
        return newItemId;
    }
}

Шаг 3: Компиляция и развертывание смарт-контракта

3.1 Настройка Трюфеля:

Откройте «truffle-config.js» и добавьте следующую конфигурацию:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  },
  compilers: {
    solc: {
      version: "0.8.0"
    }
  }
};

3.2 Скомпилируйте смарт-контракт:

truffle compile

3.3 Разверните смарт-контракт:

Создайте новый файл «2_deploy_contracts.js» в папке «migrations»:

touch migrations/2_deploy_contracts.js

Добавьте следующий код для развертывания смарт-контракта:

const CricketCollectible = artifacts.require("CricketCollectible");
module.exports = function (deployer) {
  deployer.deploy(CricketCollectible);
};

Шаг 4: Создание внешнего интерфейса

4.1 Настройте React:

npx create-react-app client
cd client
npm install @truffle/contract

4.2 Замените «src/App.js» следующим кодом:

import React, { useState, useEffect } from "react";
import CricketCollectibleArtifact from "../artifacts/CricketCollectible.json";
import getWeb3 from "./getWeb3";

function App() {
  const [web3, setWeb3] = useState(null);
  const [accounts, setAccounts] = useState(null);
  const [contract, setContract] = useState(null);

  useEffect(() => {
    const init = async () => {
      const web3Instance = await getWeb3();
      const accounts = await web3Instance.eth.getAccounts();
      const networkId = await web3Instance.eth.net.getId();
      const deployedNetwork = CricketCollectibleArtifact.networks[networkId];
      const contractInstance = new web3Instance.eth.Contract(
        CricketCollectibleArtifact.abi,
        deployedNetwork && deployedNetwork.address
      );

      setWeb3(web3Instance);
      setAccounts(accounts);
      setContract(contractInstance);
    };

    init();
  }, []);

  const mintCollectible = async () => {
    const tokenId = await contract.methods
      .mintCollectible(accounts[0], "https://path-to-metadata.json")
      .send({ from: accounts[0] });
    console.log("Minted Token ID:", tokenId);
  };

  if (!web3 || !accounts || !contract) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>Cricket Collectibles NFT Marketplace</h1>
      <button onClick={mintCollectible}>Mint Collectible</button>
    </div>
  );
}

export default App;

4.3 Создайте новый файл src/getWeb3.js и добавьте следующий код:

import Web3 from "web3";

const getWeb3 = () =>
  new Promise(async (resolve, reject) => {
    if (window.ethereum) {
      const web3 = new Web3(window.ethereum);
      try {
        await window.ethereum.enable();
        resolve(web3);
      } catch (error) {
        reject(error);
      }
    } else if (window.web3) {
      resolve(window.web3);
    } else {
      reject(new Error("No Ethereum provider detected."));
    }
  });

export default getWeb3;

4.4 Обновите public/index.html, чтобы добавить поддержку MetaMask:

Добавьте следующий код перед закрывающим тегом </head>:

<script async src="https://cdn.jsdelivr.net/npm/@metamask/detect-provider"></script>

Шаг 5: Запуск DApp

5.1 Запустите локальный блокчейн:

Используйте локальный блокчейн, такой как Ganache, для тестирования:

ganache-cli

5.2 Разверните смарт-контракт:

В новом терминале перейдите в папку cricket-nft-marketplace и запустите:

truffle migrate --reset

5.3 Запустите приложение React:

В новом терминале перейдите в папку клиента и запустите:

npm start

Теперь приложение должно работать на http://localhost:3000. Убедитесь, что у вас установлено расширение браузера MetaMask и подключено к вашему локальному блокчейну.

Шаг 6: Развертывание смарт-контракта в общедоступной тестовой сети

6.1 Выберите тестовую сеть:

В этом уроке мы будем использовать тестовую сеть Rinkeby. Вы также можете выбрать развертывание в других тестовых сетях, таких как Ropsten или Kovan.

6.2 Установите и настройте кошелек Ethereum:

Установите браузерное расширение MetaMask и создайте новый кошелек или импортируйте существующий. После настройки кошелька переключитесь на тестовую сеть Rinkeby в настройках MetaMask. Убедитесь, что в вашем кошельке есть тестовый эфир для развертывания. Вы можете получить тестовый эфир из сборщика, такого как Rinkeby Authenticated Faucet (https://faucet.rinkeby.io/).

6.3 Настройка Трюфеля:

Установите пакет @truffle/hdwallet-provider для подписи транзакций для развертывания:

npm install @truffle/hdwallet-provider

Обновите файл «truffle-config.js», включив в него конфигурацию сети Rinkeby:

const HDWalletProvider = require("@truffle/hdwallet-provider");

const mnemonic = "your mnemonic phrase here";
const infuraProjectId = "your infura project id here";
module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    rinkeby: {
      provider: () => new HDWalletProvider(mnemonic, `https://rinkeby.infura.io/v3/${infuraProjectId}`),
      network_id: 4,
      gas: 4500000,
      gasPrice: 10000000000
    }
  },
  compilers: {
    solc: {
      version: "0.8.0"
    }
  }
};

Замените «ваша мнемоническая фраза здесь» на мнемоническую фразу вашего кошелька MetaMask, а «ваш идентификатор проекта infura здесь» — на идентификатор вашего проекта Infura.

6.4 Развертывание в тестовой сети Rinkeby:

Выполните следующую команду, чтобы развернуть смарт-контракт в тестовой сети Rinkeby:

truffle migrate --network rinkeby

Эта команда скомпилирует и развернет ваш смарт-контракт в тестовой сети Rinkeby с помощью Infura API.

6.5 Обновите интерфейс:

Измените файл «src/App.js», чтобы использовать сеть Rinkeby:

useEffect(() => {
  const init = async () => {
    const web3Instance = await getWeb3();
    const accounts = await web3Instance.eth.getAccounts();
    const networkId = await web3Instance.eth.net.getId();
    const deployedNetwork = CricketCollectibleArtifact.networks[networkId];
    const contractInstance = new web3Instance.eth.Contract(
      CricketCollectibleArtifact.abi,
      deployedNetwork && deployedNetwork.address
    );
// Update this line to use Rinkeby network ID (4)
    if (networkId !== 4) {
      alert("Please switch to the Rinkeby test network.");
      return;
    }
    setWeb3(web3Instance);
    setAccounts(accounts);
    setContract(contractInstance);
  };
  init();
}, []);

Теперь ваше DApp готово к взаимодействию со смарт-контрактом, развернутым в тестовой сети Rinkeby. Убедитесь, что ваш MetaMask подключен к сети Rinkeby и имеет тестовый эфир для выполнения транзакций.

Заключение:

В этом руководстве мы предоставили пошаговое руководство по созданию торговой площадки NFT для коллекционирования крикета с использованием Web3, Solidity, Truffle и React. Выполнив эти шаги, у вас должно получиться работающее DApp, в котором пользователи смогут создавать коллекционные NFT для крикета. Вы можете расширить этот проект, добавив дополнительные функции, такие как покупка, продажа или обмен предметами коллекционирования.