Izpētiet ERC-721 viedlīgumu sarežģītību NFT jomā. Uzziniet par to arhitektūru, ieviešanu, drošības apsvērumiem un reāliem pielietojumiem.
NFT viedlīgumi: ERC-721 ieviešanas dziļā analīze
Neaizvietojamie žetoni (NFT) ir radījuši revolūciju digitālo aktīvu vidē, ļaujot attēlot unikālus priekšmetus blokķēdē. Lielākās daļas NFT pamatā ir ERC-721 standarts – noteikumu kopums, kas regulē, kā šie žetoni tiek radīti, pārvaldīti un pārsūtīti. Šis visaptverošais ceļvedis sniedz padziļinātu ERC-721 viedlīgumu izpēti, aptverot to arhitektūru, ieviešanas detaļas, drošības apsvērumus un praktiskos pielietojumus.
Kas ir ERC-721?
ERC-721 ir standarts neaizvietojamo žetonu attēlošanai Ethereum blokķēdē. Atšķirībā no ERC-20 žetoniem, kas ir aizvietojami (tas nozīmē, ka katrs žetons ir identisks visiem pārējiem), ERC-721 žetoni ir unikāli. Katram žetonam ir atšķirīgs ID, kas to padara piemērotu unikālu digitālu vai fizisku aktīvu īpašumtiesību attēlošanai.
Galvenās ERC-721 žetonu īpašības:
- Neaizvietojami: Katrs žetons ir unikāls un atšķiras no citiem.
- Unikāla identifikācija: Katram žetonam ir unikāls ID.
- Īpašumtiesību izsekošana: Standarts izseko katra žetona īpašumtiesības.
- Pārsūtāmība: Žetonus var pārsūtīt no viena konta uz citu.
- Metadati: Žetonus var saistīt ar metadatiem, sniedzot papildu informāciju par aktīvu, ko tie pārstāv.
ERC-721 viedlīguma arhitektūra
ERC-721 viedlīgums ir Solidity programma, kas ievieš ERC-721 standartu. Tas parasti ietver šādus komponentus:
Pamatfunkcijas:
- balanceOf(address _owner): Atgriež žetonu skaitu, kas pieder konkrētai adresei.
- ownerOf(uint256 _tokenId): Atgriež konkrēta žetona īpašnieka adresi.
- transferFrom(address _from, address _to, uint256 _tokenId): Pārsūta žetona īpašumtiesības no vienas adreses uz citu. Nepieciešams apstiprinājums, ja to neuzsāk īpašnieks.
- approve(address _approved, uint256 _tokenId): Apstiprina citu adresi konkrēta žetona īpašumtiesību pārsūtīšanai.
- getApproved(uint256 _tokenId): Atgriež adresi, kas apstiprināta konkrēta žetona īpašumtiesību pārsūtīšanai.
- setApprovalForAll(address _operator, bool _approved): Iespējo vai atspējo operatoram pārvaldīt visus žetonus, kas pieder izsaucējam.
- isApprovedForAll(address _owner, address _operator): Pārbauda, vai operators ir apstiprināts pārvaldīt visus žetonus, kas pieder konkrētai adresei.
Metadatu paplašinājums (pēc izvēles):
- name(): Atgriež žetonu kolekcijas nosaukumu.
- symbol(): Atgriež žetonu kolekcijas simbolu.
- tokenURI(uint256 _tokenId): Atgriež URI, kas norāda uz JSON failu, kurā ir metadati par konkrētu žetonu. Šis URI parasti norāda uz InterPlanetary File System (IPFS) adresi.
Uzskaitījuma paplašinājums (pēc izvēles):
- totalSupply(): Atgriež kopējo esošo žetonu skaitu.
- tokenByIndex(uint256 _index): Atgriež žetona ID pēc norādītā indeksa no visiem līgumā glabātajiem žetoniem.
- tokenOfOwnerByIndex(address _owner, uint256 _index): Atgriež žetona ID pēc norādītā indeksa, kas pieder konkrētai adresei.
ERC-721 viedlīguma ieviešana ar OpenZeppelin
OpenZeppelin nodrošina drošu un auditētu viedlīgumu bibliotēku, kas vienkāršo ERC-721 žetonu izstrādi. OpenZeppelin ERC721 implementācijas izmantošana samazina risku ievadīt ievainojamības jūsu kodā. Šeit ir piemērs, kā ieviest ERC-721 viedlīgumu, izmantojot OpenZeppelin:
Priekšnosacījumi:
- Node.js un npm: Pārliecinieties, ka jums ir instalēts Node.js un npm.
- Truffle vai Hardhat: Izvēlieties izstrādes vidi (piemēram, Truffle vai Hardhat) sava viedlīguma kompilēšanai un izvietošanai.
- Ganache: Instalējiet Ganache, personīgo blokķēdi Ethereum izstrādei.
Soļi:
- Inicializējiet Truffle vai Hardhat projektu:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init
# Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
- Instalējiet OpenZeppelin Contracts:
npm install @openzeppelin/contracts
- Izveidojiet ERC-721 viedlīgumu: Izveidojiet jaunu Solidity failu (piemēram, `MyNFT.sol`) savā `contracts` direktorijā.
// 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;
}
// Šīs funkcijas ir Solidity nepieciešamie pārsniegumi.
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
super._beforeTokenTransfer(from, to, tokenId);
}
}
import "@openzeppelin/contracts/utils/Strings.sol";
- Kompilējiet viedlīgumu: Izmantojiet Truffle vai Hardhat, lai kompilētu savu viedlīgumu.
# Truffle
truffle compile
# Hardhat
npx hardhat compile
- Izveidojiet izvietošanas skriptu: Izveidojiet jaunu JavaScript failu (piemēram, `deploy.js`) savā `migrations` vai `scripts` direktorijā.
// Truffle migrācijas piemērs
const MyNFT = artifacts.require("MyNFT");
module.exports = async function (deployer) {
await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};
// Hardhat izvietošanas skripta piemērs
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);
});
- Izvietojiet viedlīgumu: Izvietojiet savu viedlīgumu uz lokālās blokķēdes (piemēram, Ganache) vai testa tīkla (piemēram, Ropsten, Rinkeby).
# Truffle
truffle migrate
# Hardhat
npx hardhat run scripts/deploy.js --network localhost
Atcerieties aizstāt `ipfs://YOUR_IPFS_CID/` ar savu faktisko IPFS CID (Satura Identifikatoru). Šis bāzes URI norāda uz vietu, kur tiks glabāti jūsu NFT metadatu JSON faili.
NFT metadatu glabāšana IPFS
NFT metadati parasti tiek glabāti ārpus ķēdes (off-chain), lai samazinātu datu glabāšanas izmaksas blokķēdē. IPFS (InterPlanetary File System) ir decentralizēts uzglabāšanas tīkls, ko parasti izmanto NFT metadatu glabāšanai. Katram NFT ir `tokenURI`, kas norāda uz JSON failu IPFS, kurā ir metadati par NFT, piemēram, tā nosaukums, apraksts, attēla URL un citi atribūti.
NFT metadatu piemērs (JSON):
{
"name": "Mans lieliskais NFT",
"description": "Šis ir unikāls NFT.",
"image": "ipfs://YOUR_IPFS_CID/image.png",
"attributes": [
{
"trait_type": "Fons",
"value": "Zils"
},
{
"trait_type": "Tēls",
"value": "Robots"
}
]
}
Aizstājiet `ipfs://YOUR_IPFS_CID/image.png` ar faktisko sava attēla IPFS CID.
Soļi metadatu augšupielādei IPFS:
- Izvēlieties IPFS klientu: Izvēlieties IPFS klientu, piemēram, IPFS Desktop, Pinata vai NFT.Storage.
- Augšupielādējiet savus metadatus: Augšupielādējiet savus NFT metadatu JSON failus un attēlus IPFS, izmantojot izvēlēto klientu.
- Iegūstiet IPFS CID: Pēc metadatu augšupielādes jūs saņemsiet IPFS CID. Tas ir unikāls jūsu datu identifikators IPFS.
- Atjauniniet viedlīgumu: Atjauniniet `tokenURI` funkciju savā viedlīgumā, lai tā norādītu uz jūsu IPFS CID.
Drošības apsvērumi ERC-721 viedlīgumiem
Drošība ir vissvarīgākā, izstrādājot ERC-721 viedlīgumus. Šeit ir daži kritiski drošības apsvērumi:
- Atkārtotas ieejas uzbrukumi (Reentrancy Attacks): Novērsiet atkārtotas ieejas uzbrukumus, izmantojot Pārbaudes-Efekti-Mijiedarbības modeli. Tas ietver pārbaužu veikšanu pirms jebkādu stāvokļa izmaiņu veikšanas, pēc tam stāvokļa izmaiņu piemērošanu un visbeidzot mijiedarbību ar ārējiem līgumiem. OpenZeppelin `ReentrancyGuard` līgums var palīdzēt mazināt šo ievainojamību.
- Veselo skaitļu pārpilde/nepietiekamība: Izmantojiet Solidity versijas >= 0.8.0, kurām ir iebūvētas pārpildes/nepietiekamības pārbaudes. Ja izmantojat vecākas versijas, lietojiet OpenZeppelin `SafeMath` bibliotēku.
- Piekļuves kontrole: Ieviesiet atbilstošus piekļuves kontroles mehānismus, lai ierobežotu, kurš var kalt, dedzināt vai modificēt žetonus. Izmantojiet OpenZeppelin `Ownable` vai `AccessControl` līgumus, lai pārvaldītu īpašumtiesības un atļaujas.
- Pakalpojuma atteikuma (DoS) uzbrukumi: Apzinieties potenciālās DoS ievainojamības, piemēram, gāzes limita problēmas. Optimizējiet savu kodu, lai samazinātu gāzes patēriņu un izvairītos no operācijām, kas varētu bloķēt līgumu.
- Apsteidzošā tirdzniecība (Front Running): Ieviesiet pasākumus, lai novērstu apsteidzošo tirdzniecību, piemēram, izmantojot commit-reveal shēmas vai ārpusķēdes pasūtījumu saskaņošanu.
- Datu validācija: Validējiet visus lietotāja ievaddatus, lai novērstu neparedzētu uzvedību vai drošības pārkāpumus.
- Regulāri auditi: Veiciet regulārus drošības auditus, ko veic cienījamas drošības firmas, lai identificētu un novērstu potenciālās ievainojamības.
ERC-721 NFT reālie pielietojumi
ERC-721 NFT tiek izmantoti plašā lietojumu klāstā, tostarp:
- Digitālā māksla: Unikālu digitālās mākslas darbu īpašumtiesību attēlošana. Platformas, piemēram, SuperRare, Foundation un Nifty Gateway, veicina NFT mākslas pirkšanu un pārdošanu.
- Kolekcionējamie priekšmeti: Digitālu kolekcionējamu priekšmetu, piemēram, tirdzniecības kāršu, virtuālo mājdzīvnieku un citu priekšmetu, radīšana. CryptoPunks un Bored Ape Yacht Club ir veiksmīgu NFT kolekcionējamo projektu piemēri.
- Spēles: Spēles priekšmetu, piemēram, ieroču, tēlu un zemes, attēlošana. Axie Infinity un Decentraland ir blokķēdes spēļu piemēri, kas izmanto NFT.
- Nekustamais īpašums: Nekustamā īpašuma īpašumtiesību tokenizācija. Tas ļauj veikt daļējas īpašumtiesības un vieglāku īpašuma tiesību nodošanu.
- Piegādes ķēdes pārvaldība: Produktu izcelsmes un autentiskuma izsekošana piegādes ķēdē. Tas var palīdzēt novērst viltošanu un nodrošināt produktu kvalitāti.
- Biļešu tirdzniecība: Biļešu izsniegšana pasākumiem, koncertiem un citām aktivitātēm. NFT var palīdzēt novērst biļešu krāpšanu un nodrošināt drošāku un caurspīdīgāku biļešu sistēmu.
- Identitātes pārvaldība: Digitālo identitāšu un akreditācijas datu attēlošana. Tas var palīdzēt indivīdiem kontrolēt savus personas datus un novērst identitātes zādzību.
Starptautiski piemēri:
- Digitālā māksla: Mākslinieki no visas pasaules izmanto NFT platformas, lai pārdotu savus digitālos mākslas darbus, tostarp darbus, ko iedvesmojusi japāņu anime, Āfrikas cilšu māksla un Eiropas klasiskās gleznas.
- Spēles: Blokķēdes spēles, piemēram, Axie Infinity, ir ieguvušas popularitāti Dienvidaustrumāzijā, kur spēlētāji gūst ienākumus, spēlējot spēli un tirgojot NFT.
- Nekustamais īpašums: Uzņēmumi Amerikas Savienotajās Valstīs, Eiropā un Āzijā pēta NFT izmantošanu, lai tokenizētu nekustamā īpašuma objektus un veicinātu daļējas īpašumtiesības.
Padziļināti ERC-721 koncepti
ERC-721A
ERC-721A ir gāzes ziņā efektīvāka ERC-721 standarta implementācija, kas optimizē vairāku NFT kalšanu vienā transakcijā. Tā samazina gāzes izmaksas, amortizējot uzglabāšanas izmaksas uz vairākiem žetoniem. Tas var būt noderīgi projektiem, kas ietver lielu skaitu NFT kalšanu.
Slinkā kalšana (Lazy Minting)
Slinkā kalšana ir tehnika, kurā NFT tiek kalti tikai tad, kad tie tiek nopirkti. Tas var ietaupīt gāzes izmaksas projektiem, kuriem ir liels skaits NFT, bet nav paredzēts, ka visi tiks pārdoti. NFT metadati tiek glabāti ārpus ķēdes, līdz NFT tiek nopirkts, un tad žetons tiek kalts un metadati tiek pievienoti blokķēdei.
Dvēselei piesaistītie žetoni (Soulbound Tokens)
Dvēselei piesaistītie žetoni ir NFT, kas ir neatgriezeniski piesaistīti konkrētai adresei un nav pārsūtāmi. Šos žetonus var izmantot, lai attēlotu nepārsūtāmus akreditācijas datus, piemēram, izglītības grādus, profesionālos sertifikātus vai dalību kopienā. To panāk, noņemot vai ierobežojot `transferFrom` funkciju.
ERC-721 un NFT nākotne
ERC-721 standarts turpina attīstīties, un notiek pastāvīga izpēte un izstrāde, kas vērsta uz tā efektivitātes, drošības un funkcionalitātes uzlabošanu. Nākotnes attīstība var ietvert:
- Uzlaboti metadatu standarti: Standartizētāki un sadarbspējīgāki metadatu formāti, lai uzlabotu NFT atklājamību un lietojamību.
- Starpķēžu sadarbspēja: Risinājumi, kas ļauj NFT pārsūtīt un izmantot dažādos blokķēdes tīklos.
- Uzlaboti drošības pasākumi: Jauni drošības protokoli un rīki, lai aizsargātos pret ievainojamībām un uzbrukumiem.
- Integrācija ar reālās pasaules aktīviem: Plašāka NFT pieņemšana fizisko aktīvu, piemēram, nekustamā īpašuma, kolekcionējamu priekšmetu un intelektuālā īpašuma, īpašumtiesību attēlošanai.
Noslēgums
ERC-721 viedlīgumi ir spēcīgs rīks unikālu digitālo un fizisko aktīvu īpašumtiesību attēlošanai blokķēdē. Izprotot ERC-721 arhitektūru, ieviešanas detaļas, drošības apsvērumus un praktiskos pielietojumus, izstrādātāji var veidot inovatīvus un ietekmīgus NFT projektus. NFT ekosistēmai turpinot augt un attīstīties, ERC-721 standartam būs izšķiroša loma digitālo īpašumtiesību nākotnes veidošanā.
Šis ceļvedis sniedz stabilu pamatu ERC-721 viedlīgumu izpratnei un ieviešanai. Atcerieties vienmēr prioritizēt drošību un ievērot labāko praksi, izstrādājot un izvietojot savus NFT projektus. Veiksmi!