Skip to main content
Este documento está em andamento e será refinado.

Conceitos principais

Estes são os conceitos principais que você precisa conhecer antes de usar o SDK da IQLabs.

Armazenamento de dados (Code In)

É assim que você armazena qualquer dado (arquivos, texto, JSON) on-chain.

Como é armazenado?

Dependendo do tamanho dos dados, o SDK escolhe o método ideal:
  • Dados pequenos (< 900 bytes): armazenar imediatamente, mais rápido
  • Dados médios (< 8.5 KB): dividir em várias transações
  • Dados grandes (>= 8.5 KB): enviar em paralelo para mais velocidade

Funções principais relacionadas

  • codeIn(): enviar dados e obter um ID de transação
  • readCodeIn(): ler dados a partir de um ID de transação

PDA de estado do usuário

Uma conta de perfil on-chain para um usuário.

O que é armazenado?

  • Informações de perfil (nome, foto de perfil, bio, etc.)
  • Número de arquivos enviados
  • Registros de solicitações de amizade
Solicitações de amizade não são armazenadas como valores no PDA; elas são enviadas como transações.

Quando é criado?

É criado automaticamente na primeira vez que você chama codeIn(). Nenhuma configuração extra é necessária, mas o primeiro usuário pode precisar assinar duas vezes.

PDA de conexão

Uma conta on-chain que gerencia relacionamentos entre dois usuários (amigos, mensagens, etc.).

Quais estados pode ter?

  • pending: uma solicitação de amizade foi enviada, mas ainda não foi aceita
  • approved: a solicitação foi aceita e os usuários estão conectados
  • blocked: um lado bloqueou o outro
Uma conexão bloqueada só pode ser desbloqueada por quem bloqueou.

Funções principais relacionadas


Tabelas de banco de dados

Armazene dados JSON em tabelas como um banco de dados.

Como as tabelas são criadas?

Não existe uma função dedicada de “criar tabela”. A primeira gravação via writeRow() cria a tabela automaticamente.
Uma tabela é identificada de forma única pela combinação de dbRootId e tableSeed (nome da tabela).

Funções principais relacionadas


Detalhes das funções

Armazenamento e recuperação de dados

codeIn()

Parâmetrosconnection: conexão RPC Solana
signer: carteira assinante
data: dados para envio (string única ou array)
mode: modo de contrato (padrão: ‘anchor’)
RetornaAssinatura da transação (string)
import { codeIn } from 'iqlabs-sdk';

// Enviar um único arquivo
const signature = await codeIn(connection, signer, 'Hello, blockchain!');

// Enviar vários arquivos
const multiSig = await codeIn(connection, signer, ['file1.txt', 'file2.txt', 'file3.txt']);

readCodeIn()

ParâmetrostxSignature: assinatura da transação
connection: (opcional) conexão RPC Solana
RetornaDados armazenados (string)
import { readCodeIn } from 'iqlabs-sdk';

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

Gerenciamento de conexões

requestConnection()

Parâmetrosconnection: conexão RPC Solana
signer: carteira assinante
dbRootId: ID do banco de dados
partyA, partyB: os dois usuários a conectar
tableName: nome da tabela de conexão
columns: lista de colunas
idCol: coluna de ID
extKeys: chaves de extensão
RetornaAssinatura da transação (string)
import { requestConnection } from 'iqlabs-sdk';

// Enviar uma solicitação de amizade
await requestConnection(
  connection, signer, 'my-db',
  myWalletAddress, friendWalletAddress,
  'dm_table', ['message', 'timestamp'], 'message_id', []
);

manageConnection()

Parâmetrosbuilder: InstructionBuilder
accounts: { db_root, connection_table, signer }
args: { db_root_id, connection_seed, new_status }
RetornaTransactionInstruction
import { contract } from 'iqlabs-sdk';

// Aprovar uma solicitação de amizade
const approveIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_APPROVED }
);

// Bloquear um usuário
const blockIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_BLOCKED }
);

readConnection()

ParâmetrosdbRootId: ID do banco de dados
walletA, walletB: as duas carteiras a verificar
Retorna{ 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()

Parâmetrosconnection: conexão RPC Solana
signer: carteira assinante
dbRootId: ID do banco de dados
connectionSeed: semente de conexão
rowJson: dados JSON
RetornaAssinatura da transação (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()

Busca todas as conexões (solicitações de amizade) de um usuário analisando o histórico de transações do PDA UserState. Cada conexão inclui seu dbRootId, identificando a qual app a conexão pertence.
ParâmetrosuserPubkey: chave pública do usuário (string ou PublicKey)
options: opções opcionais
Opçõeslimit: número máximo de transações para buscar
before: assinatura para paginar a partir de
speed: perfil de limite de taxa (‘light’, ‘medium’, ‘heavy’, ‘extreme’)
mode: modo de contrato (opcional)
RetornaArray de objetos de conexão com dbRootId, partyA, partyB, status, requester, blocker, timestamp
import { fetchUserConnections } from 'iqlabs-sdk/reader';

// Buscar todas as conexões (em todos os apps!)
const connections = await fetchUserConnections(myPubkey, {
  speed: 'light',  // 6 RPS (padrão)
  limit: 100
});

// Filtrar por app
const solchatConnections = connections.filter(c => c.dbRootId === 'solchat');
const zoConnections = connections.filter(c => c.dbRootId === 'zo-trading');

// Filtrar por status
const pendingRequests = connections.filter(c => c.status === 'pending');
const friends = connections.filter(c => c.status === 'approved');
const blocked = connections.filter(c => c.status === 'blocked');

// Verificar detalhes da conexão
connections.forEach(conn => {
  console.log(`App: ${conn.dbRootId}, ${conn.partyA} <-> ${conn.partyB}, status: ${conn.status}`);
});

Gerenciamento de tabelas

writeRow()

Parâmetrosconnection: conexão RPC Solana
signer: carteira assinante
dbRootId: ID do banco de dados
tableSeed: nome da tabela
rowJson: dados JSON da linha
RetornaAssinatura da transação (string)
import { writeRow } from 'iqlabs-sdk';

// Escrever a primeira linha para criar a tabela
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 1, name: 'Alice', email: 'alice@example.com'
}));

// Adicionar outra linha à mesma tabela
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 2, name: 'Bob', email: 'bob@example.com'
}));

readTableRows()

ParâmetrosaccountInfo: informações da conta da tabela
RetornaArray de linhas (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()

ParâmetrosdbRootId: ID do banco de dados
RetornaArray de nomes de tabela (string[])
import { getTablelistFromRoot } from 'iqlabs-sdk';

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

fetchInventoryTransactions()

ParâmetrosuserPubkey: chave pública do usuário
limit: máximo (opcional)
RetornaArray de transações
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}`);
  }
});

Configurações de ambiente

setRpcUrl()

Parâmetrosurl: URL de RPC Solana
RetornaNenhum (void)
import { setRpcUrl } from 'iqlabs-sdk';

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

Funções avançadas

Estas são funções de baixo nível do SDK. Não são necessárias para uso típico, mas são úteis ao criar recursos personalizados ou depurar.

Funções de escrita

manageRowData()

Função de baixo nível para gerenciar dados de linhas em tabelas.
Módulowriter
Caso de usoGerenciamento personalizado de linhas, operações em lote
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' })
});

Funções de leitura

readUserState()

Lê o PDA UserState de um usuário.
Móduloreader
Caso de usoBuscar dados de perfil, conferir contagens de upload
import { readUserState } from 'iqlabs-sdk/reader';

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

readInventoryMetadata()

Lê os metadados associados ao inventário do usuário (arquivos enviados).
Móduloreader
Caso de usoListar arquivos do usuário com metadados, gerenciamento de arquivos
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()

Busca todas as transações de uma conta específica.
Móduloreader
Caso de usoHistórico de transações, análise de conta, depuração
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()

Recupera uma lista de PDAs de sessão.
Móduloreader
Caso de usoGerenciamento de sessões, acompanhamento de sessões ativas
import { getSessionPdaList } from 'iqlabs-sdk/reader';

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

Funções utilitárias

deriveDmSeed()

Deriva uma semente determinística para mensagens diretas (DM) entre dois usuários.
Móduloutils / reader
Caso de usoCriar identificadores de conexão consistentes, configuração de canal DM
import { deriveDmSeed } from 'iqlabs-sdk/utils';

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

toSeedBytes()

Converte uma semente de string para o formato de bytes necessário para derivação de PDA.
Móduloutils
Caso de usoDerivação personalizada de PDA, manipulação de sementes de baixo nível
import { toSeedBytes } from 'iqlabs-sdk/utils';

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

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