Skip to main content
このドキュメントは作成中で、今後改善されます。

コア概念

これらは IQLabs SDK を使う前に知っておくべき主要な概念です。

データストレージ(Code In)

あらゆるデータ(ファイル、テキスト、JSON)をオンチェーンに保存する方法です。

どのように保存されますか?

データサイズに応じて、SDK が最適な方法を選びます。
  • 小容量データ (< 900 bytes):すぐに保存、最速
  • 中容量データ (< 8.5 KB):複数のトランザクションに分割
  • 大容量データ (>= 8.5 KB):速度向上のため並列アップロード

関連する主要関数

  • codeIn():データをアップロードしてトランザクション ID を取得
  • readCodeIn():トランザクション ID からデータを読み戻す

ユーザー状態 PDA

ユーザーのためのオンチェーン・プロフィールアカウントです。

何が保存されますか?

  • プロフィール情報(名前、プロフィール画像、自己紹介 など)
  • アップロードされたファイル数
  • フレンドリクエストの記録
フレンドリクエストは PDA の値として保存されず、トランザクションとして送信されます。

いつ作成されますか?

codeIn() を初めて呼び出したときに自動で作成されます。追加の設定は不要ですが、最初のユーザーは 2 回署名が必要な場合があります。

接続 PDA

2 人のユーザー間の関係(友だち、メッセージ など)を管理するオンチェーンアカウントです。

どの状態になれますか?

  • pending:フレンドリクエストが送信されたが、まだ承認されていない
  • approved:リクエストが承認され、ユーザーが接続済み
  • blocked:どちらかが相手をブロックした
ブロックされた接続は、ブロックした側だけが解除できます。

関連する主要関数


データベーステーブル

JSON データをデータベースのようにテーブルへ保存します。

テーブルはどう作成されますか?

専用の「create table」関数はありません。writeRow() による最初の書き込みが自動的にテーブルを作成します。
テーブルは dbRootIdtableSeed(テーブル名)の組み合わせで一意に識別されます。

関連する主要関数


関数の詳細

データの保存と取得

codeIn()

パラメータconnection:Solana RPC 接続
signer:署名用ウォレット
data:アップロードするデータ(単一文字列または配列)
mode:コントラクトモード(デフォルト: ‘anchor’)
戻り値トランザクション署名(string)
import { codeIn } from 'iqlabs-sdk';

// 単一ファイルをアップロード
const signature = await codeIn(connection, signer, 'Hello, blockchain!');

// 複数ファイルをアップロード
const multiSig = await codeIn(connection, signer, ['file1.txt', 'file2.txt', 'file3.txt']);

readCodeIn()

パラメータtxSignature:トランザクション署名
connection:(任意)Solana RPC 接続
戻り値保存されたデータ(string)
import { readCodeIn } from 'iqlabs-sdk';

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

接続管理

requestConnection()

パラメータconnection:Solana RPC 接続
signer:署名用ウォレット
dbRootId:データベース ID
partyA, partyB:接続する 2 人のユーザー
tableName:接続テーブル名
columns:列リスト
idCol:ID 列
extKeys:拡張キー
戻り値トランザクション署名(string)
import { requestConnection } from 'iqlabs-sdk';

// フレンドリクエストを送信
await requestConnection(
  connection, signer, 'my-db',
  myWalletAddress, friendWalletAddress,
  'dm_table', ['message', 'timestamp'], 'message_id', []
);

manageConnection()

パラメータbuilder:InstructionBuilder
accounts{ db_root, connection_table, signer }
args{ db_root_id, connection_seed, new_status }
戻り値TransactionInstruction
import { contract } from 'iqlabs-sdk';

// フレンドリクエストを承認
const approveIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_APPROVED }
);

// ユーザーをブロック
const blockIx = contract.manageConnectionInstruction(
  builder,
  { db_root, connection_table, signer: myPubkey },
  { db_root_id, connection_seed, new_status: contract.CONNECTION_STATUS_BLOCKED }
);

readConnection()

パラメータdbRootId:データベース ID
walletA, walletB:確認する 2 つのウォレット
戻り値{ 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()

パラメータconnection:Solana RPC 接続
signer:署名用ウォレット
dbRootId:データベース ID
connectionSeed:接続シード
rowJson:JSON データ
戻り値トランザクション署名(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()

UserState PDA のトランザクション履歴を解析して、ユーザーのすべての接続(フレンドリクエスト)を取得します。各接続には、その接続が属するアプリを示す dbRootId が含まれます。
パラメータuserPubkey:ユーザー公開鍵(string または PublicKey)
options:任意の設定
オプションlimit:取得するトランザクションの最大数
before:ページネーション開始の署名
speed:レート制限プロファイル(‘light’, ‘medium’, ‘heavy’, ‘extreme’)
mode:コントラクトモード(任意)
戻り値dbRootId, partyA, partyB, status, requester, blocker, timestamp を含む接続オブジェクトの配列
import { fetchUserConnections } from 'iqlabs-sdk/reader';

// すべての接続を取得(全アプリ対象)
const connections = await fetchUserConnections(myPubkey, {
  speed: 'light',  // 6 RPS(デフォルト)
  limit: 100
});

// アプリでフィルタ
const solchatConnections = connections.filter(c => c.dbRootId === 'solchat');
const zoConnections = connections.filter(c => c.dbRootId === 'zo-trading');

// ステータスでフィルタ
const pendingRequests = connections.filter(c => c.status === 'pending');
const friends = connections.filter(c => c.status === 'approved');
const blocked = connections.filter(c => c.status === 'blocked');

// 接続の詳細を確認
connections.forEach(conn => {
  console.log(`App: ${conn.dbRootId}, ${conn.partyA} <-> ${conn.partyB}, status: ${conn.status}`);
});

テーブル管理

writeRow()

パラメータconnection:Solana RPC 接続
signer:署名用ウォレット
dbRootId:データベース ID
tableSeed:テーブル名
rowJson:JSON 行データ
戻り値トランザクション署名(string)
import { writeRow } from 'iqlabs-sdk';

// 最初の行を書き込み、テーブルを作成
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 1, name: 'Alice', email: 'alice@example.com'
}));

// 同じテーブルに別の行を追加
await writeRow(connection, signer, 'my-db', 'users', JSON.stringify({
  id: 2, name: 'Bob', email: 'bob@example.com'
}));

readTableRows()

パラメータaccountInfo:テーブルアカウント情報
戻り値行配列(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()

パラメータdbRootId:データベース ID
戻り値テーブル名配列(string[])
import { getTablelistFromRoot } from 'iqlabs-sdk';

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

fetchInventoryTransactions()

パラメータuserPubkey:ユーザー公開鍵
limit:最大数(任意)
戻り値トランザクション配列
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}`);
  }
});

環境設定

setRpcUrl()

パラメータurl:Solana RPC の URL
戻り値なし(void)
import { setRpcUrl } from 'iqlabs-sdk';

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

高度な関数

これらは低レベルの SDK 関数です。通常の利用には不要ですが、カスタム機能の構築やデバッグに役立ちます。

書き込み関数

manageRowData()

テーブル内の行データを管理する低レベル関数です。
モジュールwriter
用途カスタム行管理、バッチ操作
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' })
});

読み取り関数

readUserState()

指定したユーザーの UserState PDA を読み取ります。
モジュールreader
用途プロフィールデータの取得、アップロード数の確認
import { readUserState } from 'iqlabs-sdk/reader';

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

readInventoryMetadata()

ユーザーのインベントリ(アップロード済みファイル)に関連するメタデータを読み取ります。
モジュールreader
用途メタデータ付きのユーザーファイル一覧、ファイル管理
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()

特定のアカウントのすべてのトランザクションを取得します。
モジュールreader
用途トランザクション履歴、アカウント分析、デバッグ
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()

セッション PDA の一覧を取得します。
モジュールreader
用途セッション管理、アクティブセッションの追跡
import { getSessionPdaList } from 'iqlabs-sdk/reader';

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

ユーティリティ関数

deriveDmSeed()

2 人のユーザー間のダイレクトメッセージ(DM)用に決定的なシードを導出します。
モジュールutils / reader
用途一貫した接続 ID の作成、DM チャネルの設定
import { deriveDmSeed } from 'iqlabs-sdk/utils';

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

toSeedBytes()

文字列シードを、PDA 導出に必要なバイト形式へ変換します。
モジュールutils
用途カスタム PDA 導出、低レベルなシード操作
import { toSeedBytes } from 'iqlabs-sdk/utils';

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

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