Uurige NFT-de ERC-721 nutilepingute peensusi. Õppige nende arhitektuuri, implementeerimise, turvalisuse kaalutluste ja reaalsete rakenduste kohta.
NFT nutilepingud: sügav sukeldumine ERC-721 implementeerimisse
Mitteasendatavad tokenid (NFT-d) on revolutsioneerinud digitaalsete varade maastikku, võimaldades esindada unikaalseid esemeid plokiahelas. Enamiku NFT-de keskmes on ERC-721 standard, reeglite kogum, mis reguleerib, kuidas neid tokeneid luuakse, hallatakse ja edastatakse. See põhjalik juhend pakub sügavat ülevaadet ERC-721 nutilepingutest, käsitledes nende arhitektuuri, implementeerimise detaile, turvalisuse kaalutlusi ja praktilisi rakendusi.
Mis on ERC-721?
ERC-721 on standard mitteasendatavate tokenite esindamiseks Ethereumi plokiahelas. Erinevalt ERC-20 tokenitest, mis on asendatavad (st iga token on identne iga teise tokeniga), on ERC-721 tokenid unikaalsed. Igal tokenil on eristav ID, mis teeb selle sobivaks unikaalsete digitaalsete või füüsiliste varade omandiõiguse esindamiseks.
ERC-721 tokenite põhiomadused:
- Mitteasendatav: Iga token on unikaalne ja teistest eristatav.
- Unikaalne identifitseerimine: Igal tokenil on unikaalne ID.
- Omandiõiguse jälgimine: Standard jälgib iga tokeni omandiõigust.
- Ülekantavus: Tokeneid saab üle kanda ühelt kontolt teisele.
- Metaandmed: Tokeneid saab siduda metaandmetega, mis pakuvad lisateavet vara kohta, mida nad esindavad.
ERC-721 nutilepingu arhitektuur
ERC-721 nutileping on Solidity programm, mis implementeerib ERC-721 standardi. See sisaldab tavaliselt järgmisi komponente:
Põhifunktsioonid:
- balanceOf(address _owner): Tagastab antud aadressi omandis olevate tokenite arvu.
- ownerOf(uint256 _tokenId): Tagastab konkreetse tokeni omaniku aadressi.
- transferFrom(address _from, address _to, uint256 _tokenId): Kannab tokeni omandiõiguse ühelt aadressilt teisele. Nõuab heakskiitu, kui seda ei algata omanik.
- approve(address _approved, uint256 _tokenId): Annab teisele aadressile heakskiidu konkreetse tokeni omandiõiguse ülekandmiseks.
- getApproved(uint256 _tokenId): Tagastab aadressi, millele on antud luba konkreetse tokeni omandiõiguse ülekandmiseks.
- setApprovalForAll(address _operator, bool _approved): Lubab või keelab operaatoril hallata kõiki kutsuja omanduses olevaid tokeneid.
- isApprovedForAll(address _owner, address _operator): Kontrollib, kas operaatoril on luba hallata kõiki aadressi omanduses olevaid tokeneid.
Metaandmete laiendus (valikuline):
- name(): Tagastab tokenite kollektsiooni nime.
- symbol(): Tagastab tokenite kollektsiooni sümboli.
- tokenURI(uint256 _tokenId): Tagastab URI, mis viitab JSON-failile, mis sisaldab konkreetse tokeni metaandmeid. See URI viitab tavaliselt InterPlanetary File System (IPFS) aadressile.
Loetelu laiendus (valikuline):
- totalSupply(): Tagastab olemasolevate tokenite koguarvu.
- tokenByIndex(uint256 _index): Tagastab lepingu poolt salvestatud kõikide tokenite hulgast antud indeksi juures oleva tokeni ID.
- tokenOfOwnerByIndex(address _owner, uint256 _index): Tagastab konkreetse aadressi omanduses olevate tokenite hulgast antud indeksi juures oleva tokeni ID.
ERC-721 nutilepingu implementeerimine OpenZeppeliniga
OpenZeppelin pakub turvalist ja auditeeritud nutilepingute teeki, mis lihtsustab ERC-721 tokenite arendamist. OpenZeppelini ERC721 implementatsiooni kasutamine vähendab haavatavuste sissetoomise riski teie koodi. Siin on näide, kuidas implementeerida ERC-721 nutilepingut OpenZeppelini abil:
Eeltingimused:
- Node.js ja npm: Veenduge, et teil on Node.js ja npm installitud.
- Truffle või Hardhat: Valige arenduskeskkond (nt Truffle või Hardhat) oma nutilepingu kompileerimiseks ja kasutuselevõtuks.
- Ganache: Installige Ganache, isiklik plokiahel Ethereumi arendamiseks.
Sammud:
- Initsialiseerige Truffle'i või Hardhati projekt:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init
# Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
- Installige OpenZeppelini lepingud:
npm install @openzeppelin/contracts
- Looge ERC-721 nutileping: Looge uus Solidity fail (nt `MyNFT.sol`) oma `contracts` kataloogi.
// 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;
}
// Järgmised funktsioonid on Solidity poolt nõutavad ülekirjutused.
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
super._beforeTokenTransfer(from, to, tokenId);
}
}
import "@openzeppelin/contracts/utils/Strings.sol";
- Kompileerige nutileping: Kasutage oma nutilepingu kompileerimiseks Truffle'it või Hardhati.
# Truffle
truffle compile
# Hardhat
npx hardhat compile
- Looge kasutuselevõtu skript: Looge uus JavaScripti fail (nt `deploy.js`) oma `migrations` või `scripts` kataloogi.
// Truffle'i migratsiooni näide
const MyNFT = artifacts.require("MyNFT");
module.exports = async function (deployer) {
await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};
// Hardhati kasutuselevõtu skripti näide
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);
});
- Võtke nutileping kasutusele: Võtke oma nutileping kasutusele lokaalses plokiahelas (nt Ganache) või testvõrgus (nt Ropsten, Rinkeby).
# Truffle
truffle migrate
# Hardhat
npx hardhat run scripts/deploy.js --network localhost
Ärge unustage asendada `ipfs://YOUR_IPFS_CID/` oma tegeliku IPFS CID-ga (sisu identifikaator). See baas-URI viitab asukohale, kuhu teie NFT metaandmete JSON-failid salvestatakse.
NFT metaandmete salvestamine IPFS-is
NFT metaandmed salvestatakse tavaliselt ahelaväliselt, et vähendada andmete salvestamise kulusid plokiahelas. IPFS (InterPlanetary File System) on detsentraliseeritud salvestusvõrk, mida kasutatakse tavaliselt NFT metaandmete salvestamiseks. Igal NFT-l on `tokenURI`, mis viitab IPFS-is asuvale JSON-failile, mis sisaldab NFT kohta metaandmeid, nagu selle nimi, kirjeldus, pildi URL ja muud atribuudid.
NFT metaandmete näide (JSON):
{
"name": "My Awesome NFT",
"description": "This is a unique NFT.",
"image": "ipfs://YOUR_IPFS_CID/image.png",
"attributes": [
{
"trait_type": "Background",
"value": "Blue"
},
{
"trait_type": "Character",
"value": "Robot"
}
]
}
Asendage `ipfs://YOUR_IPFS_CID/image.png` oma pildi tegeliku IPFS CID-ga.
Sammud metaandmete üleslaadimiseks IPFS-i:
- Valige IPFS-i klient: Valige IPFS-i klient, näiteks IPFS Desktop, Pinata või NFT.Storage.
- Laadige oma metaandmed üles: Laadige oma NFT metaandmete JSON-failid ja pildid IPFS-i, kasutades valitud klienti.
- Hankige IPFS CID: Pärast metaandmete üleslaadimist saate IPFS CID. See on teie andmete unikaalne identifikaator IPFS-is.
- Uuendage nutilepingut: Uuendage oma nutilepingu `tokenURI` funktsiooni, et see viitaks teie IPFS CID-le.
ERC-721 nutilepingute turvalisuse kaalutlused
Turvalisus on ERC-721 nutilepingute arendamisel esmatähtis. Siin on mõned kriitilised turvalisuse kaalutlused:
- Tagasisisenemise rünnakud (Reentrancy Attacks): Vältige tagasisisenemise rünnakuid, kasutades "kontrollid-mõjud-interaktsioonid" (Checks-Effects-Interactions) mustrit. See hõlmab kontrollide teostamist enne olekumuudatuste tegemist, seejärel olekumuudatuste rakendamist ja lõpuks väliste lepingutega suhtlemist. OpenZeppelini `ReentrancyGuard` leping aitab seda haavatavust leevendada.
- Täisarvu ületäitumine/alatäitumine (Integer Overflow/Underflow): Kasutage Solidity versioone >= 0.8.0, millel on sisseehitatud ületäitumise/alatäitumise kontrollid. Vanemate versioonide puhul kasutage OpenZeppelini `SafeMath` teeki.
- Juurdepääsukontroll: Rakendage nõuetekohaseid juurdepääsukontrolli mehhanisme, et piirata, kes saab tokeneid vermida (mint), põletada (burn) või muuta. Kasutage OpenZeppelini `Ownable` või `AccessControl` lepinguid omandiõiguse ja lubade haldamiseks.
- Teenusetõkestamise rünne (DoS): Olge teadlik potentsiaalsetest DoS-i haavatavustest, näiteks gaasi limiidi probleemidest. Optimeerige oma koodi, et vähendada gaasikulu ja vältida toiminguid, mis võiksid lepingut blokeerida.
- Ennetav kauplemine (Front Running): Rakendage meetmeid ennetava kauplemise vältimiseks, näiteks kasutades "pühendu-avalda" (commit-reveal) skeeme või ahelavälist tehingute sobitamist.
- Andmete valideerimine: Valideerige kõik kasutaja sisendid, et vältida ootamatut käitumist või turvarikkumisi.
- Regulaarsed auditid: Viige läbi regulaarseid turvaauditeid mainekate turvafirmade poolt, et tuvastada ja lahendada potentsiaalseid haavatavusi.
ERC-721 NFT-de reaalsed rakendused
ERC-721 NFT-sid kasutatakse laias valikus rakendustes, sealhulgas:
- Digitaalne kunst: Unikaalsete digitaalsete kunstiteoste omandiõiguse esindamine. Platvormid nagu SuperRare, Foundation ja Nifty Gateway hõlbustavad NFT-kunsti ostmist ja müümist.
- Kogumisobjektid: Digitaalsete kogumisobjektide, nagu kauplemiskaartide, virtuaalsete lemmikloomade ja muude esemete loomine. CryptoPunks ja Bored Ape Yacht Club on näited edukatest NFT kogumisprojektidest.
- Mängundus: Mängusiseste esemete, nagu relvade, tegelaste ja maa, esindamine. Axie Infinity ja Decentraland on näited plokiahelamängudest, mis kasutavad NFT-sid.
- Kinnisvara: Kinnisvaraobjektide omandiõiguse tokeniseerimine. See võimaldab osaomandit ja lihtsamat varaõiguste ülekandmist.
- Tarneahela juhtimine: Toodete päritolu ja autentsuse jälgimine tarneahelas. See aitab vältida võltsimist ja tagada toote kvaliteeti.
- Piletite müük: Piletite väljastamine sündmustele, kontsertidele ja muudele tegevustele. NFT-d aitavad vältida piletipettusi ning pakuvad turvalisemat ja läbipaistvamat piletisüsteemi.
- Identiteedihaldus: Digitaalsete identiteetide ja volituste esindamine. See aitab inimestel kontrollida oma isikuandmeid ja vältida identiteedivargust.
Rahvusvahelised näited:
- Digitaalne kunst: Kunstnikud üle kogu maailma kasutavad NFT-platvorme oma digitaalse kunsti müümiseks, sealhulgas teoseid, mis on inspireeritud Jaapani animest, Aafrika hõimukunstist ja Euroopa klassikalisest maalikunstist.
- Mängundus: Plokiahelamängud nagu Axie Infinity on saavutanud populaarsuse Kagu-Aasias, kus mängijad teenivad sissetulekut mängu mängides ja NFT-dega kaubeldes.
- Kinnisvara: Ettevõtted Ameerika Ühendriikides, Euroopas ja Aasias uurivad NFT-de kasutamist kinnisvaraobjektide tokeniseerimiseks ja osaomandi hõlbustamiseks.
ERC-721 täiustatud kontseptsioonid
ERC-721A
ERC-721A on gaasisäästlikum ERC-721 standardi implementatsioon, mis optimeerib mitme NFT vermimist (minting) ühes tehingus. See vähendab gaasikulusid, amortiseerides salvestuskulud mitme tokeni peale. See võib olla kasulik projektidele, mis hõlmavad suure hulga NFT-de vermimist.
Laisk vermimine (Lazy Minting)
Laisk vermimine on tehnika, kus NFT-d vermitakse alles siis, kui need ostetakse. See võib säästa gaasikulusid projektide puhul, millel on suur hulk NFT-sid, kuid ei eeldata, et kõik need müüakse. NFT metaandmed salvestatakse ahelaväliselt kuni NFT ostmiseni, misjärel token vermitakse ja metaandmed lisatakse plokiahelasse.
Hingesiduvad tokenid (Soulbound Tokens)
Hingesiduvad tokenid on NFT-d, mis on püsivalt seotud konkreetse aadressiga ja mida ei saa üle kanda. Neid tokeneid saab kasutada mitteülekantavate volituste, näiteks haridust tõendavate dokumentide, kutsetunnistuste või kogukonna liikmelisuse esindamiseks. See on võimalik, eemaldades või piirates `transferFrom` funktsiooni.
ERC-721 ja NFT-de tulevik
ERC-721 standard areneb pidevalt, käimasoleva teadus- ja arendustegevusega, mis keskendub selle tõhususe, turvalisuse ja funktsionaalsuse parandamisele. Tulevased arengud võivad hõlmata:
- Täiustatud metaandmete standardid: Standardiseeritumad ja koostalitlusvõimelisemad metaandmete formaadid NFT-de avastatavuse ja kasutatavuse parandamiseks.
- Ahelatevaheline koostalitlusvõime: Lahendused, mis võimaldavad NFT-sid üle kanda ja kasutada erinevates plokiahelavõrkudes.
- Parendatud turvameetmed: Uued turvaprotokollid ja tööriistad haavatavuste ja rünnakute eest kaitsmiseks.
- Integratsioon reaalsete varadega: NFT-de laialdasem kasutuselevõtt füüsiliste varade, nagu kinnisvara, kogumisobjektide ja intellektuaalomandi, omandiõiguse esindamiseks.
Kokkuvõte
ERC-721 nutilepingud on võimas vahend unikaalsete digitaalsete ja füüsiliste varade omandiõiguse esindamiseks plokiahelas. Mõistes ERC-721 arhitektuuri, implementeerimise detaile, turvalisuse kaalutlusi ja praktilisi rakendusi, saavad arendajad luua uuenduslikke ja mõjusaid NFT-projekte. Kuna NFT ökosüsteem kasvab ja areneb, mängib ERC-721 standard digitaalse omandiõiguse tuleviku kujundamisel kriitilist rolli.
See juhend pakub tugeva aluse ERC-721 nutilepingute mõistmiseks ja implementeerimiseks. Pidage meeles, et oma NFT-projektide arendamisel ja kasutuselevõtmisel tuleb alati eelistada turvalisust ja järgida parimaid tavasid. Edu!