Polski

Odkryj zawiłości inteligentnych kontraktów ERC-721 dla NFT. Poznaj ich architekturę, implementację, aspekty bezpieczeństwa i rzeczywiste zastosowania.

Inteligentne Kontrakty NFT: Dogłębna Analiza Implementacji ERC-721

Niewymienialne Tokeny (NFT) zrewolucjonizowały krajobraz aktywów cyfrowych, umożliwiając reprezentację unikalnych przedmiotów na blockchainie. W sercu większości NFT leży standard ERC-721, zbiór zasad regulujących sposób tworzenia, zarządzania i transferu tych tokenów. Ten kompleksowy przewodnik oferuje dogłębną analizę inteligentnych kontraktów ERC-721, obejmując ich architekturę, szczegóły implementacji, aspekty bezpieczeństwa i praktyczne zastosowania.

Czym jest ERC-721?

ERC-721 to standard reprezentacji niewymienialnych tokenów na blockchainie Ethereum. W przeciwieństwie do tokenów ERC-20, które są wymienialne (co oznacza, że każdy token jest identyczny z każdym innym), tokeny ERC-721 są unikalne. Każdy token ma odrębny identyfikator (ID), co czyni go idealnym do reprezentowania własności unikalnych aktywów cyfrowych lub fizycznych.

Kluczowe cechy tokenów ERC-721:

Architektura Inteligentnego Kontraktu ERC-721

Inteligentny kontrakt ERC-721 to program w języku Solidity, który implementuje standard ERC-721. Zazwyczaj zawiera następujące komponenty:

Podstawowe funkcje:

Rozszerzenie Metadanych (Opcjonalne):

Rozszerzenie Wyliczeniowe (Opcjonalne):

Implementacja inteligentnego kontraktu ERC-721 z użyciem OpenZeppelin

OpenZeppelin dostarcza bezpieczną i audytowaną bibliotekę inteligentnych kontraktów, która upraszcza tworzenie tokenów ERC-721. Użycie implementacji ERC721 od OpenZeppelin zmniejsza ryzyko wprowadzenia luk do kodu. Oto przykład, jak zaimplementować inteligentny kontrakt ERC-721 przy użyciu OpenZeppelin:

Wymagania wstępne:

Kroki:

  1. Zainicjuj projekt Truffle lub Hardhat:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init

# Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
  1. Zainstaluj kontrakty OpenZeppelin:
npm install @openzeppelin/contracts
  1. Stwórz inteligentny kontrakt ERC-721: Stwórz nowy plik Solidity (np. `MyNFT.sol`) w swoim katalogu `contracts`.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string private _baseURI;

    constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
        _baseURI = baseURI;
    }

    function mintNFT(address recipient) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));

        return newItemId;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        return string(abi.encodePacked(_tokenURI));
    }

    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory baseURI) public {
        _baseURI = baseURI;
    }



    // Poniższe funkcje są nadpisaniami wymaganymi przez Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

import "@openzeppelin/contracts/utils/Strings.sol";
  1. Skompiluj inteligentny kontrakt: Użyj Truffle lub Hardhat do kompilacji swojego inteligentnego kontraktu.
# Truffle
truffle compile

# Hardhat
npx hardhat compile
  1. Stwórz skrypt wdrożeniowy: Stwórz nowy plik JavaScript (np. `deploy.js`) w swoim katalogu `migrations` lub `scripts`.
// Przykład migracji Truffle
const MyNFT = artifacts.require("MyNFT");

module.exports = async function (deployer) {
  await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};

// Przykład skryptu wdrożeniowego Hardhat
async function main() {
  const MyNFT = await ethers.getContractFactory("MyNFT");
  const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");

  await myNFT.deployed();

  console.log("MyNFT deployed to:", myNFT.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. Wdróż inteligentny kontrakt: Wdróż swój inteligentny kontrakt na lokalnym blockchainie (np. Ganache) lub w sieci testowej (np. Ropsten, Rinkeby).
# Truffle
truffle migrate

# Hardhat
npx hardhat run scripts/deploy.js --network localhost

Pamiętaj, aby zastąpić `ipfs://YOUR_IPFS_CID/` swoim rzeczywistym identyfikatorem CID (Content Identifier) z IPFS. Ten bazowy URI wskazuje na lokalizację, w której będą przechowywane pliki JSON z metadanymi Twojego NFT.

Przechowywanie metadanych NFT na IPFS

Metadane NFT są zazwyczaj przechowywane poza łańcuchem (off-chain), aby zmniejszyć koszty przechowywania danych na blockchainie. IPFS (InterPlanetary File System) to zdecentralizowana sieć przechowywania danych, która jest powszechnie używana do przechowywania metadanych NFT. Każdy NFT ma `tokenURI`, który wskazuje na plik JSON na IPFS zawierający metadane dotyczące NFT, takie jak nazwa, opis, adres URL obrazu i inne atrybuty.

Przykład metadanych NFT (JSON):

{
  "name": "Mój Niesamowity NFT",
  "description": "To jest unikalny NFT.",
  "image": "ipfs://YOUR_IPFS_CID/image.png",
  "attributes": [
    {
      "trait_type": "Tło",
      "value": "Niebieskie"
    },
    {
      "trait_type": "Postać",
      "value": "Robot"
    }
  ]
}

Zastąp `ipfs://YOUR_IPFS_CID/image.png` rzeczywistym CID Twojego obrazu w IPFS.

Kroki przesyłania metadanych do IPFS:

  1. Wybierz klienta IPFS: Wybierz klienta IPFS, takiego jak IPFS Desktop, Pinata lub NFT.Storage.
  2. Prześlij swoje metadane: Prześlij swoje pliki JSON z metadanymi NFT oraz obrazy do IPFS za pomocą wybranego klienta.
  3. Uzyskaj CID z IPFS: Po przesłaniu metadanych otrzymasz CID z IPFS. Jest to unikalny identyfikator Twoich danych w IPFS.
  4. Zaktualizuj inteligentny kontrakt: Zaktualizuj funkcję `tokenURI` w swoim inteligentnym kontrakcie, aby wskazywała na Twój CID z IPFS.

Aspekty bezpieczeństwa inteligentnych kontraktów ERC-721

Bezpieczeństwo jest najważniejsze podczas tworzenia inteligentnych kontraktów ERC-721. Oto kilka kluczowych aspektów bezpieczeństwa do rozważenia:

Rzeczywiste zastosowania NFT ERC-721

NFT ERC-721 są używane w szerokim zakresie zastosowań, w tym:

Przykłady międzynarodowe:

Zaawansowane koncepcje ERC-721

ERC-721A

ERC-721A to bardziej wydajna pod względem zużycia gazu implementacja standardu ERC-721, która optymalizuje mintowanie wielu NFT w jednej transakcji. Zmniejsza koszty gazu poprzez amortyzację kosztów przechowywania na wiele tokenów. Może to być korzystne dla projektów, które obejmują mintowanie dużej liczby NFT.

Leniwe Mintowanie (Lazy Minting)

Leniwe mintowanie to technika, w której NFT są mintowane dopiero w momencie ich zakupu. Może to zaoszczędzić koszty gazu dla projektów, które mają dużą liczbę NFT, ale nie oczekują, że wszystkie zostaną sprzedane. Metadane NFT są przechowywane poza łańcuchem do momentu zakupu NFT, po czym token jest mintowany, a metadane są dodawane do blockchaina.

Tokeny Soulbound (Soulbound Tokens)

Tokeny Soulbound to NFT, które są na stałe powiązane z określonym adresem i nie mogą być transferowane. Tokeny te mogą być używane do reprezentowania nieprzenoszalnych poświadczeń, takich jak dyplomy edukacyjne, certyfikaty zawodowe czy członkostwo w społeczności. Jest to możliwe dzięki usunięciu lub ograniczeniu funkcji `transferFrom`.

Przyszłość ERC-721 i NFT

Standard ERC-721 wciąż ewoluuje, a bieżące badania i rozwój koncentrują się na poprawie jego wydajności, bezpieczeństwa i funkcjonalności. Przyszłe zmiany mogą obejmować:

Wnioski

Inteligentne kontrakty ERC-721 są potężnym narzędziem do reprezentowania własności unikalnych aktywów cyfrowych i fizycznych na blockchainie. Rozumiejąc architekturę, szczegóły implementacji, aspekty bezpieczeństwa i praktyczne zastosowania ERC-721, deweloperzy mogą tworzyć innowacyjne i wpływowe projekty NFT. W miarę jak ekosystem NFT będzie rósł i ewoluował, standard ERC-721 będzie odgrywał kluczową rolę w kształtowaniu przyszłości cyfrowej własności.

Ten przewodnik stanowi solidną podstawę do zrozumienia i implementacji inteligentnych kontraktów ERC-721. Pamiętaj, aby zawsze priorytetowo traktować bezpieczeństwo i stosować najlepsze praktyki podczas tworzenia i wdrażania własnych projektów NFT. Powodzenia!