Skip to main content
Dieses Dokument ist in Arbeit und wird weiter verfeinert.

Kernkonzepte

Dies sind die wichtigsten Konzepte, die du kennen solltest, bevor du das IQLabs SDK verwendest.

Datenspeicherung (Code In)

So speicherst du beliebige Daten (Dateien, Text, JSON) on-chain.

Wie wird es gespeichert?

Abhängig von der Datengröße wählt das SDK die optimale Methode:
  • Kleine Daten (< 900 Bytes): sofort speichern, am schnellsten
  • Mittlere Daten (< 8.5 KB): in mehrere Transaktionen aufteilen
  • Große Daten (>= 8.5 KB): parallel hochladen für mehr Geschwindigkeit

Wichtige zugehörige Funktionen

  • codeIn(): Daten hochladen und eine Transaktions-ID erhalten
  • readCodeIn(): Daten anhand einer Transaktions-ID auslesen

Benutzerstatus-PDA

Ein On-Chain-Profilkonto für einen Nutzer.

Was wird gespeichert?

  • Profilinformationen (Name, Profilbild, Bio usw.)
  • Anzahl hochgeladener Dateien
  • Einträge zu Freundschaftsanfragen
Freundschaftsanfragen werden nicht als Werte im PDA gespeichert; sie werden als Transaktionen gesendet.

Wann wird es erstellt?

Es wird automatisch erstellt, wenn du codeIn() zum ersten Mal aufrufst. Es ist keine zusätzliche Einrichtung erforderlich, aber der erste Nutzer muss möglicherweise zweimal signieren.

Verbindungs-PDA

Ein On-Chain-Konto, das Beziehungen zwischen zwei Nutzern verwaltet (Freunde, Nachrichten usw.).

Welche Zustände kann es haben?

  • pending: Eine Freundschaftsanfrage wurde gesendet, aber noch nicht akzeptiert
  • approved: Die Anfrage wurde akzeptiert und die Nutzer sind verbunden
  • blocked: Eine Seite hat die andere blockiert
Eine blockierte Verbindung kann nur von der blockierenden Person aufgehoben werden.

Wichtige zugehörige Funktionen


Datenbanktabellen

JSON-Daten in Tabellen wie in einer Datenbank speichern.

Wie werden Tabellen erstellt?

Es gibt keine spezielle “create table”-Funktion. Der erste Schreibvorgang über writeRow() erstellt die Tabelle automatisch.
Eine Tabelle wird eindeutig durch die Kombination aus dbRootId und tableSeed (Tabellenname) identifiziert.

Wichtige zugehörige Funktionen


Funktionsdetails

Datenspeicherung und -abruf

codeIn()

Parameterconnection: Solana-RPC-Verbindung
signer: signierende Wallet
data: hochzuladende Daten (einzelner String oder Array)
mode: Vertragsmodus (Standard: ‘anchor’)
RückgabeTransaktionssignatur (string)
import { codeIn } from 'iqlabs-sdk';

// Eine einzelne Datei hochladen
const signature = await codeIn(connection, signer, 'Hello, blockchain!');

// Mehrere Dateien hochladen
const multiSig = await codeIn(connection, signer, ['file1.txt', 'file2.txt', 'file3.txt']);

readCodeIn()

ParametertxSignature: Transaktionssignatur
connection: (optional) Solana-RPC-Verbindung
RückgabeGespeicherte Daten (string)
import { readCodeIn } from 'iqlabs-sdk';

const data = await readCodeIn('5Xg7...', connection);
console.log(data); // 'Hello, blockchain!'

Verbindungsverwaltung

requestConnection()

Parameterconnection: Solana-RPC-Verbindung
signer: signierende Wallet
dbRootId: Datenbank-ID
partyA, partyB: die zwei zu verbindenden Nutzer
tableName: Name der Verbindungstabelle
columns: Spaltenliste
idCol: ID-Spalte
extKeys: Erweiterungsschlüssel
RückgabeTransaktionssignatur (string)
import { requestConnection } from 'iqlabs-sdk';

// Eine Freundschaftsanfrage senden
await requestConnection(
  connection, signer, 'my-db',
  myWalletAddress, friendWalletAddress,
  'dm_table', ['message', 'timestamp'], 'message_id', []
);

manageConnection()

Parameterbuilder: InstructionBuilder
accounts: { db_root, connection_table, signer }
args: { db_root_id, connection_seed, new_status }
RückgabeTransactionInstruction
import { contract } from 'iqlabs-sdk';

// Eine Freundschaftsanfrage genehmigen
const approveIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_APPROVED }
);

// Einen Nutzer blockieren
const blockIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_BLOCKED }
);

readConnection()

ParameterdbRootId: Datenbank-ID
walletA, walletB: die beiden zu prüfenden Wallets
Rückgabe{ status: 'pending' | 'approved' | 'blocked', requester, blocker }
import { readConnection } from 'iqlabs-sdk';

const { status, requester, blocker } = await readConnection('my-db', walletA, walletB);
console.log(status); // 'pending' | 'approved' | 'blocked'

writeConnectionRow()

Parameterconnection: Solana-RPC-Verbindung
signer: signierende Wallet
dbRootId: Datenbank-ID
connectionSeed: Verbindungssamen
rowJson: JSON-Daten
RückgabeTransaktionssignatur (string)
import { writeConnectionRow } from 'iqlabs-sdk';

await writeConnectionRow(
  connection, signer, 'my-db', connectionSeed,
  JSON.stringify({ message_id: '123', message: 'Hello friend!', timestamp: Date.now() })
);

fetchUserConnections()

Ruft alle Verbindungen (Freundschaftsanfragen) eines Nutzers ab, indem der Transaktionsverlauf des UserState-PDA analysiert wird. Jede Verbindung enthält ihre dbRootId, die angibt, zu welcher App die Verbindung gehört.
ParameteruserPubkey: öffentlicher Schlüssel des Nutzers (string oder PublicKey)
options: optionale Einstellungen
Optionenlimit: maximale Anzahl an Transaktionen
before: Signatur, ab der paginiert wird
speed: Rate-Limit-Profil (‘light’, ‘medium’, ‘heavy’, ‘extreme’)
mode: Vertragsmodus (optional)
RückgabeArray von Verbindungsobjekten mit dbRootId, partyA, partyB, status, requester, blocker, timestamp
import { fetchUserConnections } from 'iqlabs-sdk/reader';

// Alle Verbindungen abrufen (über alle Apps!)
const connections = await fetchUserConnections(myPubkey, {
  speed: 'light',  // 6 RPS (Standard)
  limit: 100
});

// Nach App filtern
const solchatConnections = connections.filter(c => c.dbRootId === 'solchat');
const zoConnections = connections.filter(c => c.dbRootId === 'zo-trading');

// Nach Status filtern
const pendingRequests = connections.filter(c => c.status === 'pending');
const friends = connections.filter(c => c.status === 'approved');
const blocked = connections.filter(c => c.status === 'blocked');

// Verbindungsdetails prüfen
connections.forEach(conn => {
  console.log(`App: ${conn.dbRootId}, ${conn.partyA} <-> ${conn.partyB}, status: ${conn.status}`);
});

Tabellenverwaltung

writeRow()

Parameterconnection: Solana-RPC-Verbindung
signer: signierende Wallet
dbRootId: Datenbank-ID
tableSeed: Tabellenname
rowJson: JSON-Zeilen-Daten
RückgabeTransaktionssignatur (string)
import { writeRow } from 'iqlabs-sdk';

// Erste Zeile schreiben, um die Tabelle zu erstellen
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 1, name: 'Alice', email: 'alice@example.com'
}));

// Weitere Zeile in dieselbe Tabelle hinzufügen
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 2, name: 'Bob', email: 'bob@example.com'
}));

readTableRows()

ParameteraccountInfo: Kontoinformationen der Tabelle
RückgabeZeilen-Array (Row[])
import { readTableRows, contract } from 'iqlabs-sdk';

const dbRootPda = contract.pda.getDbRootPda('my-db');
const tablePda = contract.pda.getTablePda(dbRootPda, 'users');
const accountInfo = await connection.getAccountInfo(tablePda);
const rows = readTableRows(accountInfo);

console.log(`Total rows: ${rows.length}`);

getTablelistFromRoot()

ParameterdbRootId: Datenbank-ID
RückgabeTabellenname-Array (string[])
import { getTablelistFromRoot } from 'iqlabs-sdk';

const tables = await getTablelistFromRoot('my-db');
console.log('Table list:', tables);

fetchInventoryTransactions()

ParameteruserPubkey: öffentlicher Schlüssel des Nutzers
limit: Maximum (optional)
RückgabeTransaktions-Array
import { fetchInventoryTransactions } from 'iqlabs-sdk';

const myFiles = await fetchInventoryTransactions(myPubkey, 20);
myFiles.forEach(tx => {
  let metadata: { data?: unknown } | null = null;
  try {
    metadata = JSON.parse(tx.metadata);
  } catch {
    metadata = null;
  }

  if (metadata && metadata.data !== undefined) {
    const inlineData = typeof metadata.data === 'string'
      ? metadata.data
      : JSON.stringify(metadata.data);
    console.log(`Inline data: ${inlineData}`);
  } else {
    console.log(`Signature: ${tx.signature}`);
  }
});

Umgebungseinstellungen

setRpcUrl()

Parameterurl: Solana-RPC-URL
RückgabeKeine (void)
import { setRpcUrl } from 'iqlabs-sdk';

setRpcUrl('https://your-rpc.example.com');

Erweiterte Funktionen

Dies sind Low-Level-SDK-Funktionen. Für den typischen Gebrauch nicht nötig, aber hilfreich beim Erstellen eigener Features oder beim Debugging.

Writer-Funktionen

manageRowData()

Low-Level-Funktion zur Verwaltung von Zeilendaten in Tabellen.
Modulwriter
AnwendungsfallBenutzerdefinierte Zeilenverwaltung, Batch-Operationen
import { manageRowData } from 'iqlabs-sdk/writer';

await manageRowData(connection, signer, {
  dbRootId: 'my-db',
  tableSeed: 'users',
  operation: 'update',
  rowData: JSON.stringify({ id: 1, name: 'Updated Name' })
});

Reader-Funktionen

readUserState()

Liest den UserState-PDA eines Nutzers.
Modulreader
AnwendungsfallProfildaten abrufen, Upload-Zählung prüfen
import { readUserState } from 'iqlabs-sdk/reader';

const userState = await readUserState(userPubkey);
console.log('Profile:', userState.profile);
console.log('Upload count:', userState.fileCount);

readInventoryMetadata()

Liest Metadaten, die mit dem Inventar des Nutzers (hochgeladene Dateien) verbunden sind.
Modulreader
AnwendungsfallNutzerdateien mit Metadaten auflisten, Dateiverwaltung
import { readInventoryMetadata } from 'iqlabs-sdk/reader';

const metadata = await readInventoryMetadata(userPubkey);
metadata.forEach(item => {
  console.log(`File: ${item.name}, Size: ${item.size}, Signature: ${item.signature}`);
});

fetchAccountTransactions()

Ruft alle Transaktionen für ein bestimmtes Konto ab.
Modulreader
AnwendungsfallTransaktionsverlauf, Kontoanalyse, Debugging
import { fetchAccountTransactions } from 'iqlabs-sdk/reader';

const transactions = await fetchAccountTransactions(accountPubkey, {
  limit: 50,
  before: lastSignature
});

transactions.forEach(tx => {
  console.log(`Signature: ${tx.signature}, Block: ${tx.slot}`);
});

getSessionPdaList()

Ruft eine Liste von Session-PDAs ab.
Modulreader
AnwendungsfallSitzungsverwaltung, Nachverfolgung aktiver Sitzungen
import { getSessionPdaList } from 'iqlabs-sdk/reader';

const sessions = await getSessionPdaList(userPubkey);
sessions.forEach(session => {
  console.log(`Session PDA: ${session.pda}, Active: ${session.isActive}`);
});

Hilfsfunktionen

deriveDmSeed()

Leitet einen deterministischen Seed für Direktnachrichten (DM) zwischen zwei Nutzern ab.
Modulutils / reader
AnwendungsfallKonsistente Verbindungs-IDs erstellen, DM-Kanal einrichten
import { deriveDmSeed } from 'iqlabs-sdk/utils';

const seed1 = deriveDmSeed(walletA, walletB);
const seed2 = deriveDmSeed(walletB, walletA);
console.log(seed1 === seed2); // true

toSeedBytes()

Konvertiert einen String-Seed in das Byte-Format, das für die PDA-Ableitung erforderlich ist.
Modulutils
AnwendungsfallBenutzerdefinierte PDA-Ableitung, Low-Level-Seed-Manipulation
import { toSeedBytes } from 'iqlabs-sdk/utils';

const seedString = 'my-custom-seed';
const seedBytes = toSeedBytes(seedString);

const [pda, bump] = PublicKey.findProgramAddressSync(
  [seedBytes, otherSeed],
  programId
);