NEU: Helius übernimmt Light Protocol
Dateien auf Shadow Drive in Solana hochladen
Blog/Entwicklung

Dateien auf Shadow Drive in Solana hochladen

Leiter Developer RelationsHunter Davis auf LinkedIn
4 Min. Lesezeit

Überblick

Die hohen Kosten und die begrenzte Speicherkapazität von Solana machen das Speichern großer Datenmengen unerschwinglich. Off-Chain-Speicherlösungen wie das von GenesysGo entwickelte Shadow Drive setzen sich zunehmend durch, um diese Einschränkungen zu überwinden.

Shadow Drive bietet eine kosteneffiziente und leistungsstarke Möglichkeit, große Datenmengen in Solana zu speichern. Dafür benötigst du jedoch einen Mainnet-Token, den du über einen SOL → SHDW-Swap erhältst.

In diesem Tutorial zeigen wir dir, wie du mit TypeScript Dateien auf Shadow Drive hochlädst.

Voraussetzungen

Bevor du beginnst, stelle sicher, dass du die Backpack-Wallet-Erweiterung und die folgenden Voraussetzungen installiert hast:

Node.js

Code
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"

Installierte Solana CLI

Code
npm install -g ts-node

Umgebung einrichten

Projekt erstellen

  1. Erstelle über dein Terminal einen neuen Ordner namens Shadow.
  2. Erstelle im Ordner Shadow eine neue Datei namens upload.ts.
  3. Installiere die erforderlichen Pakete:
Code
npm install @shadow-drive/sdk @project-serum/anchor

     4. Erstelle mit dem folgenden Befehl eine Wallet:

Code
solana-keygen grind --starts-with N:1

     5. Erstelle im Ordner "Shadow" eine Datei namens "helius.txt" und füge ihr Inhalt hinzu. In diesem Beispiel verwenden wir einfach Folgendes:

Nachdem du diese Schritte abgeschlossen hast, sollte deine Verzeichnisstruktur wie folgt aussehen:

  1. Öffne die Datei [walletAddress].json und kopiere den geheimen Schlüssel. Für dieses Beispiel müssen wir die Wallet mit Guthaben aufladen.
  2. Installiere die Backpack-Wallet-Erweiterung für deinen Browser aus dem Chrome Web Store.
  3. Öffne die Backpack-Wallet-Erweiterung und gehe zu "Einstellungen".

      4. Wähle im Einstellungsmenü "Wallets" aus.

      5. Klicke oben rechts auf die Schaltfläche "+", um eine neue Wallet hinzuzufügen.

      6. Wähle Solana als Wallet-Typ aus. Wähle "Über privaten Schlüssel importieren" aus.

        7. Füge den Inhalt der Wallet-Datei in das Importfeld ein und klicke auf "Importieren".

Kopiere nach dem Import den öffentlichen Schlüssel aus der Wallet. Du kannst diese Test-Wallet von einer anderen Solana-Wallet mit weniger als 0,03 SOL aufladen.

SHDW-Token beziehen

SHDW Drive benötigt einen Token namens SHDW (SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y), um Speicherkonten zu erstellen. Du kannst SHDW-Token über einen Swap mit Jupiter auf Solana beziehen.

  1. Öffne Jupiter, um den Token-Swap von SOL zu SHDW durchzuführen.
  2. Gib die gewünschte Menge SOL ein, die du gegen SHDW tauschen möchtest, und klicke auf "Swap". Für diesen Test benötigen wir weniger als 1 SHDW, was 0,01 SOL entspricht.

      3. Bestätige die Transaktion. Nachdem die Transaktion genehmigt wurde, erscheint der SHDW-Token in deiner Wallet.

Implementierungsschritte

1. Verbindung zu SHDW einrichten

In deiner Datei upload.ts importieren wir die erforderlichen Module und stellen eine Verbindung zum SHDW-Netzwerk her. Wir erstellen eine asynchrone Funktion namens main, die unseren Code enthält:

Code
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key = require('./{wallet_address}.json');
const fs = require('fs');
const rpc = "https://rpc.helius.xyz/?api-key="
async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        rpc , "confirmed"
    );    
		const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		console.log(drive)
}
main();

Ersetze api-key in der Variable rpc durch einen gültigen API-Schlüssel, den du im Helius-Developer-Portal erhältst. Ersetze außerdem const key durch den korrekten Dateinamen der zuvor erstellten Wallet.

Wenn du die Datei jetzt mit ts-node upload.ts ausführst, siehst du in deinem Terminal folgende Ausgabe:

Code
ShdwDrive {
  connection: Connection {
    _commitment: 'confirmed',
    _confirmTransactionInitialTimeout: undefined,
    _rpcEndpoint: 'https://rpc.helius.xyz/?api-key=',
...

2. Speicherkonto erstellen

Füge den folgenden Code in die Funktion main ein, um ein Speicherkonto zu erstellen:

Code
const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
console.log(newAccount);

Wenn du hier den Befehl ts-node upload.ts ausführst, werden die ID des neu erstellten Speicherkontos und die Transaktionssignatur ausgegeben.

Code
{
  shdw_bucket: '5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1',
  transaction_signature: '4EFw2R7KNw45Rngg6MASqfhGDpeZvcaoQHApADhopD9WQxB6XMYBcshd7neyLFa6QtKZC5H9U5iTnggUuhdNDLfE'
}

3. Datei hochladen

Sobald wir ein Speicherkonto haben, können wir eine Datei darauf hochladen. Füge den folgenden Code in die Funktion main ein:

Code
const accts = await drive.getStorageAccounts("v2");
const fileBuff = fs.readFileSync("./helius.txt");
let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
const fileToUpload: ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
console.log(uploadFile);

Der obige Code führt vier zentrale Aktionen aus:

  1. Er liest die lokale Datei helius.txt als Buffer ein.
  2. Er findet das von uns erstellte Speicherkonto und definiert es als öffentlichen Schlüssel unseres Kontos.
  3. Er erstellt ein ShadowFile-Objekt mit dem Namen und den Daten der Datei.
  4. Er lädt die Datei mit der Funktion uploadFile in das angegebene Speicherkonto hoch.

Jetzt können wir den Upload mit folgendem Befehl starten:

Code
ts-node upload.ts

Dadurch erhalten wir folgende Konsolenausgabe:

Code
{
  finalized_locations: [
    'https://shdw-drive.genesysgo.net/5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1/helius.txt'
  ],
  message: '3UNhH2UMys8GxqSouVPtKLAd3rcP7m3oP8LwvwH8HSp3yChaYPSaAhjub5iV2i1LDvSU3JZ9ck322kt7QhRdbMhY',
  upload_errors: []
}

Die Datei ist jetzt hochgeladen! Öffne den erzeugten Link finalized_location und prüfe, ob die Datei korrekt hochgeladen wurde.

Die URL der Datei lautet https://shdw-drive.genesysgo.net/[storage_account_address]/[file_name]

Das bedeutet, dass alle in dieses Speicherkonto hochgeladenen Dateien dieselbe ursprüngliche URL verwenden. Nur der Dateiname ändert sich. Du kannst auch separate Speicherkonten für deine Dateien erstellen.

Wenn du anschließend deine Wallet überprüfst, siehst du außerdem: Dieser Vorgang hat nur 0,00244 SHDW gekostet.

Vollständiger Code

Code
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key =  require('./wallet.json');
const fs = require('fs');

async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        "https://rpc.helius.xyz/?api-key=", "confirmed"
    );    const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
		console.log(newAccount);  
    const accts = await drive.getStorageAccounts("v2");
    const fileBuff = fs.readFileSync("./helius.txt");
    let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
    const fileToUpload: typeof ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
    const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
    console.log(uploadFile);

}
main();

Fazit

Das war's! Du hast erfolgreich eine Datei mit TypeScript auf Shadow Drive hochgeladen. Mit diesem Grundlagenwissen kannst du die dezentralen Funktionen von SHDW nutzen und komplexere Anwendungsfälle umsetzen. Du könntest dieses Tutorial beispielsweise erweitern, indem du den Datei-Upload in eine Webanwendung integrierst oder einen Dienst für die dezentrale Dateispeicherung erstellst. Weitere Möglichkeiten findest du in der offiziellen Dokumentation zum Shadow Drive SDK.

‍

Helius abonnieren

Bleib bei der Solana-Entwicklung auf dem Laufenden und erhalte Updates, wenn wir neue Beiträge veröffentlichen

Vergrößertes Bild