NEU: Helius übernimmt Light Protocol
Neu: Schnellere getProgramAccounts-Aufrufe (gPA)
Blog/Updates

Neu: Schnellere getProgramAccounts-Aufrufe (gPA)

Developer Experience Engineer0xIchigo auf X0xIchigo auf LinkedIn0xIchigo auf GitHub
3 Min. Lesezeit

getProgramAccounts-Aufrufe (gPA) sind für ihre Probleme berüchtigt. Diese RPC-Methode ist aufwendig und ineffizient. Sie fragt einen Node ab, um alle Accounts abzurufen, die einem bestimmten öffentlichen Schlüssel gehören. Diese Aufrufe sind oft langsam und unterliegen strengen Rate-Limits. Manchmal werden sie sogar vollständig blockiert, etwa bei einem gPA-Aufruf für das Programm von Serum, sofern die Ergebnisse nicht bereits im Cache liegen. Diese Probleme haben Entwickler gezwungen, mühsame und weniger effiziente Alternativen zu suchen. 

Das ändert sich heute.

Helius führt schnellere getProgramAccounts-Aufrufe für alle Solana-Entwickler ein. 

Das ist neu:

  • Wir haben unsere Account-Indexierung deutlich verbessert
  • gPA-Aufrufe sind jetzt voraussichtlich 2- bis 10-mal schneller als zuvor, insbesondere bei Filtern für größere Programme
  • Wir indexieren ein Programm automatisch nach einem einzigen Aufruf durch einen beliebigen Entwickler. Davon profitieren alle durch eine bessere Performance

Erste Schritte

Registriere dich zunächst im Helius Developer Dashboard und rufe im Bereich „API-Schlüssel“ einen API-Schlüssel ab. 

getProgramAccounts-Beispiel

Fragen wir in JavaScript alle Accounts ab, die dem Ore-V2-Programm gehören:

Code
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getProgramAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "test",
        method: "getProgramAccounts",
        params: [
          "oreV2ZymfyeXgNgBdqMkumTqqAprVqgBWQfoYkrtKWQ",
          {
            "encoding": "base64",
          },

        ],

      })
    });

    const data = await response.json();

    console.log(`All Accounts Owned By The Ore v2 Program: ${JSON.stringify(data, null, 2)}`);
  } catch (error) {
    console.error(error);
  }
};

getProgramAccounts();

Sehen wir uns an, wie der Code funktioniert:

  1. URL-Konfiguration: Wir erstellen eine URL, die auf den Helius RPC-Endpunkt verweist, und übergeben unseren API-Schlüssel
  2. Struktur der RPC-Anfrage
    • Methode: „getProgramAccounts“ gibt an, dass wir Accounts abfragen möchten, die einem Programm gehören
    • params ist ein Array mit zwei Elementen: der ID des abzufragenden Programms, in diesem Fall das V2-Programm von Ore, und einem Konfigurationsobjekt für die Abfrage
  3. Codierung: Wir fordern die Account-Daten in base64-Codierung an
  4. Fehlerbehandlung: Wir behandeln alle ausgelösten Fehler mit einem try/catch-Block

Wenn du diesen Code ausführst, werden alle Accounts des Ore-V2-Programms in der Konsole protokolliert. 

Dies ist jedoch nur ein einfaches Beispiel. Normalerweise solltest du Filter verwenden, um die Ergebnisse einzugrenzen und die Performance zu verbessern.

getProgramAccounts-Beispiel mit Filtern

Sehen wir uns ein praxisnäheres Beispiel an. Dabei fragen wir mithilfe von Filtern alle Token-Accounts ab, die einer bestimmten Adresse gehören:

Code
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getTokenAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "token-accounts",
        method: "getProgramAccounts",
        params: [
          "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",  // Token Program address
          {
            "encoding": "jsonParsed",  // Get parsed token data
            "filters": [
              {
                "dataSize": 165,  // Size of token account data
              },
              {
                "memcmp": {
                  "offset": 32,  // Location of owner address in the token account
                  "bytes": "YOUR_WALLET_ADDRESS"
                }
              }
            ]
          }
        ]
      })
    });
    const data = await response.json();

    data.result.forEach((account, i) => {
      const parsed = account.account.data.parsed.info;

      console.log(`-- Token Account ${i + 1}: ${account.pubkey} --`);
      console.log(`Mint: ${parsed.mint}`);
      console.log(`Amount: ${parsed.tokenAmount.uiAmount}`);
    });
  } catch (error) {
    console.error("Error fetching token accounts:", error);
  }
};

getTokenAccounts();

Dieses Beispiel baut auf dem einfachen Beispiel auf und zeigt zwei wichtige Filtertechniken: die Verwendung eines dataSize- und eines memcmp-Filters.

dataSize

Der Filter dataSize prüft die genaue Datengröße eines bestimmten Accounts. In unserem Fall interessieren uns Token-Accounts mit einer Größe von 165 Byte. Dadurch werden sofort alle anderen Accounts der angegebenen Wallet herausgefiltert, die keine Token-Accounts sind.

memcmp-Filter (Speichervergleich)

Mit dem Filter memcmp, auch Speichervergleichsfilter genannt, können wir Daten vergleichen, die an einer bestimmten Stelle im Speicher abgelegt sind. Mit einem Offset geben wir an, ab welcher Position der Datenvergleich beginnen soll. 

In unserem Beispiel verwenden wir einen Offset von 32, um die Mint-Adresse zu überspringen. Sie befindet sich in den ersten 32 Byte des Speichers. Uns interessiert nur die Adresse des Eigentümers. Dieser Filter gibt ausschließlich Accounts zurück, die der angegebenen Wallet-Adresse gehören.

Wenn du diesen Code ausführst, wird in der Konsole eine Liste aller Token-Accounts und ihrer Guthaben für die angegebene Wallet-Adresse protokolliert. Dank der verbesserten Indexierung von Helius sind diese gefilterten Abfragen deutlich schneller als bei anderen herkömmlichen RPC-Anbietern.

Weitere Hilfe

Bereit für weniger Probleme und schnellere getProgramAccounts-Aufrufe? 

Registriere dich im Helius Developer Dashboard und entwickle noch heute mit besserer Performance. Brauchst du Hilfe? Besuche den Helius Discord, wenn du Fragen hast oder Unterstützung benötigst!

Wenn du bis hierher gelesen hast: Danke, Anon! Gib unten deine E-Mail-Adresse ein, damit du keine Neuigkeiten zu Solana verpasst. Noch nicht genug gelernt? Entdecke die neuesten Artikel in unserem Blog und beschleunige deine Reise mit Solana.

Helius abonnieren

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