Ihr erstes NFT
Dieses Tutorial führt Sie durch den Prozess der Verwendung des Aptos TypeScript SDK (@aptos-labs/ts-sdk
) zur Erstellung eines neuen digitalen Assets (oft als NFT bezeichnet) auf Aptos. Am Ende dieses Tutorials werden Sie wissen, wie Sie:
- Eine Sammlung digitaler Assets (NFTs) erstellen.
- Ein neues digitales Asset (NFT) innerhalb dieser Sammlung prägen.
- Das digitale Asset (NFT) zwischen Konten übertragen.
- Die Bewegung des digitalen Assets (NFT) durch Überprüfung der aktualisierten Salden verifizieren.
Durchgehen des Codes
Abschnitt betitelt „Durchgehen des Codes“Unten finden Sie die schrittweise Erklärung, wie man ein digitales Asset on-chain erstellt, überträgt und damit interagiert. Wir gehen durch, wie der Beispielcode (am Ende vollständig gezeigt) es macht. Um direkt zum Ausführen des Codes zu springen, siehe Ein Beispiel ausführen.
Code-Walkthrough
Abschnitt betitelt „Code-Walkthrough“-
Den Client einrichten
Wir importieren und konfigurieren den
Aptos
-Client aus dem SDK, um sich mit dem angegebenen Netzwerk zu verbinden:const APTOS_NETWORK = NetworkToNetworkName[process.env.APTOS_NETWORK] || Network.DEVNET;const config = new AptosConfig({ network: APTOS_NETWORK });const aptos = new Aptos(config);Dieses
aptos
-Objekt ermöglicht es uns, mit der Aptos-Blockchain zu interagieren (Konten finanzieren, Assets erstellen, Transaktionen senden usw.). -
Konten erstellen und finanzieren
Wir generieren zwei Konten, Alice und Bob. Auf devnet können wir sie einfach mit Test-APT finanzieren.
const alice = Account.generate();const bob = Account.generate();await aptos.fundAccount({ accountAddress: alice.accountAddress, amount: INITIAL_BALANCE });await aptos.fundAccount({ accountAddress: bob.accountAddress, amount: INITIAL_BALANCE }); -
Eine Sammlung erstellen
Wir erstellen eine Sammlung in Alices Konto. Eine Sammlung fungiert wie ein “Ordner” oder eine “Kategorie” für digitale Assets. In diesem Fall erstellen wir
"Example Collection"
.const createCollectionTransaction = await aptos.createCollectionTransaction({creator: alice,description: "This is an example collection.",name: "Example Collection",uri: "aptos.dev",});const committedTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: createCollectionTransaction,});await aptos.waitForTransaction({ transactionHash: committedTxn.hash }); -
Ein digitales Asset prägen
Mit der erstellten Sammlung können wir nun ein digitales Asset (ein NFT) für die Sammlung prägen. Dies beinhaltet die Bereitstellung von Details wie Name, Beschreibung und einer URI (oft verlinkt zu Metadaten wie Bildern).
const mintTokenTransaction = await aptos.mintDigitalAssetTransaction({creator: alice,collection: "Example Collection",description: "This is an example digital asset.",name: "Example Asset",uri: "https://aptos.dev/asset.png",});const mintTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: mintTokenTransaction,});await aptos.waitForTransaction({ transactionHash: mintTxn.hash }); -
Das digitale Asset übertragen
Einmal geprägt, gehört das Asset Alice. Wir können dies überprüfen, indem wir Alices digitale Assets abrufen. Dann erstellen und senden wir eine Transaktion, um dieses Asset an Bob zu übertragen.
const aliceDigitalAssets = await aptos.getOwnedDigitalAssets({ ownerAddress: alice.accountAddress });const digitalAssetAddress = aliceDigitalAssets[0].token_data_id;const transferTransaction = await aptos.transferDigitalAssetTransaction({sender: alice,digitalAssetAddress,recipient: bob.accountAddress,});const transferTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: transferTransaction,});await aptos.waitForTransaction({ transactionHash: transferTxn.hash });Nach Abschluss sollte das Asset nun in Bobs Konto erscheinen.
-
Die Salden verifizieren
Schließlich überprüfen wir sowohl Alices als auch Bobs Konten, um sicherzustellen, dass Alice das Asset nicht mehr hat und Bob es jetzt hat.
const aliceDigitalAssetsAfter = await aptos.getOwnedDigitalAssets({ ownerAddress: alice.accountAddress });const bobDigitalAssetsAfter = await aptos.getOwnedDigitalAssets({ ownerAddress: bob.accountAddress });console.log(`Alice's digital asset balance: ${aliceDigitalAssetsAfter.length}`);console.log(`Bob's digital asset balance: ${bobDigitalAssetsAfter.length}`);
Ein Beispiel ausführen
Abschnitt betitelt „Ein Beispiel ausführen“Erste Schritte
Abschnitt betitelt „Erste Schritte“-
Ihr Projekt einrichten
Erstellen Sie ein neues Verzeichnis für Ihr Projekt und initialisieren Sie ein Node.js-Projekt:
Terminal-Fenster mkdir aptos-digital-asset-tutorialcd aptos-digital-asset-tutorialnpm init -yDies erstellt eine
package.json
-Datei, die es Ihnen ermöglicht, Abhängigkeiten zu installieren und Skripte auszuführen. -
Abhängigkeiten installieren
Sie benötigen das Aptos TypeScript SDK und
dotenv
zur Verwaltung von Umgebungsvariablen:Terminal-Fenster npm install @aptos-labs/ts-sdk dotenvnpm install --save-dev @types/node -
tsconfig.json erstellen
Erstellen Sie eine
tsconfig.json
-Datei mit folgendem Inhalt:{"compilerOptions": {"target": "es2020","module": "commonjs","esModuleInterop": true,"forceConsistentCasingInFileNames": true,"strict": true,"skipLibCheck": true,"types": ["node"],"lib": ["es2020"]}}Diese Konfiguration stellt sicher, dass TypeScript Node.js-Typen ordnungsgemäß erkennt und angemessene Typprüfung bereitstellt.
-
Umgebungsvariablen konfigurieren
Erstellen Sie eine
.env
-Datei mit folgendem Inhalt:Terminal-Fenster APTOS_NETWORK=devnet -
index.ts hinzufügen
Erstellen Sie eine
index.ts
-Datei mit folgendem Inhalt:// Aktualisieren Sie die TODOs unten, um dieses digitale Asset an Ihre Bedürfnisse anzupassen.// Sie werden die Collection-Werte und individuellen Digital Asset-Werte anpassen wollen.// Dieses Beispiel demonstriert das Erstellen einer Sammlung, das Befüllen mit digitalen Assets und deren Übertragung.import "dotenv/config";import {Account,Aptos,AptosConfig,Network,NetworkToNetworkName,} from "@aptos-labs/ts-sdk";// Überprüfen, ob Umgebungsvariablen geladen sindconsole.log("Environment variables loaded:", {APTOS_NETWORK: process.env.APTOS_NETWORK || "not set"});const INITIAL_BALANCE = 100_000_000;console.log("Schritt 1: Einen Client zur Verbindung mit Aptos einrichten");const APTOS_NETWORK = NetworkToNetworkName[process.env.APTOS_NETWORK!] || Network.DEVNET;const config = new AptosConfig({ network: APTOS_NETWORK });const aptos = new Aptos(config);async function example() {console.log("\n=== Schritt 2: Konten erstellen und finanzieren ===\n");const alice = Account.generate();const bob = Account.generate();console.log(`Alices Adresse: ${alice.accountAddress}`);console.log(`Bobs Adresse: ${bob.accountAddress}`);console.log("Alices Konto finanzieren...");await aptos.fundAccount({ accountAddress: alice.accountAddress, amount: INITIAL_BALANCE });console.log("Alices Konto finanziert!");console.log("Bobs Konto finanzieren...");await aptos.fundAccount({ accountAddress: bob.accountAddress, amount: INITIAL_BALANCE });console.log("Bobs Konto finanziert!");console.log("\n=== Schritt 3: Eine Sammlung erstellen ===\n");// TODO: Aktualisieren Sie diese Werte, um Ihr digitales Asset anzupassen!const collectionName = "Example Collection";const collectionDescription = "This is an example collection.";const collectionURI = "aptos.dev";console.log("Die Sammlungserstellungstransaktion erstellen...");const createCollectionTransaction = await aptos.createCollectionTransaction({creator: alice,description: collectionDescription,name: collectionName,uri: collectionURI,});console.log("Die Sammlungserstellungstransaktion senden...");const committedTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: createCollectionTransaction,});console.log("Auf den Abschluss der Sammlungserstellungstransaktion warten...");await aptos.waitForTransaction({ transactionHash: committedTxn.hash });console.log("Sammlung erfolgreich erstellt!");console.log("\n=== Schritt 4: Ein digitales Asset prägen ===\n");// TODO: Aktualisieren Sie die Werte der digitalen Assets, die Sie prägen!const tokenName = "Example Asset";const tokenDescription = "This is an example digital asset.";const tokenURI = "aptos.dev/asset";console.log("Die Prägetransaktion erstellen...");const mintTokenTransaction = await aptos.mintDigitalAssetTransaction({creator: alice,collection: collectionName,description: tokenDescription,name: tokenName,uri: tokenURI,});console.log(mintTokenTransaction)console.log("Die Prägetransaktion senden...");const mintTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: mintTokenTransaction,});console.log(mintTxn)console.log("Auf den Abschluss der Prägetransaktion warten...");await aptos.waitForTransaction({ transactionHash: mintTxn.hash });console.log("Digitales Asset erfolgreich geprägt!");console.log("\n=== Schritt 5: Das digitale Asset übertragen ===\n");// Auf die Aktualisierung des Indexers mit den neuesten Daten von on-chain wartenawait new Promise((resolve) => setTimeout(resolve, 5000));const aliceDigitalAssets = await aptos.getOwnedDigitalAssets({ownerAddress: alice.accountAddress,});// Überprüfen, ob Alice digitale Assets hat, bevor darauf zugegriffen wirdif (aliceDigitalAssets.length === 0) {console.error("Keine digitalen Assets für Alice gefunden. Stellen Sie sicher, dass das Prägen erfolgreich war.");return;}const digitalAssetAddress = aliceDigitalAssets[0].token_data_id;console.log("Die Übertragungstransaktion erstellen...");const transferTransaction = await aptos.transferDigitalAssetTransaction({sender: alice,digitalAssetAddress,recipient: bob.accountAddress,});console.log("Die Übertragungstransaktion senden...");const transferTxn = await aptos.signAndSubmitTransaction({signer: alice,transaction: transferTransaction,});console.log("Auf den Abschluss der Übertragungstransaktion warten...");await aptos.waitForTransaction({ transactionHash: transferTxn.hash });console.log("Digitales Asset erfolgreich übertragen!");console.log("\n=== Schritt 6: Digitale Asset-Salden verifizieren ===\n");const aliceDigitalAssetsAfter = await aptos.getOwnedDigitalAssets({ownerAddress: alice.accountAddress,});const bobDigitalAssetsAfter = await aptos.getOwnedDigitalAssets({ownerAddress: bob.accountAddress,});console.log(`Alices digitaler Asset-Saldo: ${aliceDigitalAssetsAfter.length}`);console.log(`Bobs digitaler Asset-Saldo: ${bobDigitalAssetsAfter.length}`);console.log("\n=== Schritt 7: Transaktionshashes für Explorer ===\n");console.log(`Sammlungserstellungstransaktion: ${committedTxn.hash}`);console.log(`Prägetransaktion: ${mintTxn.hash}`);console.log(`Übertragungstransaktion: ${transferTxn.hash}`);console.log("\nSie können diese Transaktionen im Aptos Explorer anzeigen:");console.log("https://explorer.aptoslabs.com/?network=devnet");}example(); -
Den Code ausführen
Terminal-Fenster npx ts-node index.tsWenn alles korrekt eingerichtet ist, sehen Sie Ausgabelogs, die jeden Schritt, Transaktionshashes und finale Salden detailliert beschreiben.
-
Ihre Transaktionen im Explorer anzeigen
Nach dem Ausführen des Codes sehen Sie Transaktionshashes in der Konsolenausgabe, insbesondere in Schritt 7, der alle Transaktionshashes zur einfachen Referenz anzeigt:
Terminal-Fenster === Schritt 7: Transaktionshashes für Explorer ===Sammlungserstellungstransaktion: 0x8c5d2a4ce32d76349bfb4f3830740c1c103399e8cbc31d6e2c7a871c88e6ad48Prägetransaktion: 0x673d2cbb9fef468fe41f271c0fcf20872e9fa79afb6a2000368394000071b02eÜbertragungstransaktion: 0x3a1e99d6fd3f8e7e962c311f3dfd92c11e468da5b6084123b8f7e0248a37ffa7Sie können diese Transaktionen im Aptos Explorer anzeigen:https://explorer.aptoslabs.com/?network=devnetSie können diese Transaktionen im Aptos Explorer anzeigen:
- Kopieren Sie den Transaktionshash aus Ihrer Konsole
- Besuchen Sie Aptos Explorer
- Stellen Sie sicher, dass Sie im richtigen Netzwerk sind (Devnet)
- Fügen Sie den Transaktionshash in die Suchleiste ein
- Sehen Sie sich die Details Ihrer Transaktion an, einschließlich:
- Den Sender- und Empfängeradressen
- Der genauen Zeit, zu der die Transaktion verarbeitet wurde
- Gezahlte Gasgebühren
- Das digitale Asset, das übertragen wurde
Dies ist ein großartiger Weg, um Ihre Transaktionen zu verifizieren und zu verstehen, wie sie auf der Blockchain aufgezeichnet werden.