Skip to content

存储适配器

SDK 使用 StorageAdapter 接口进行所有持久化操作。你可以使用内置适配器或实现自定义适配器。

内置适配器

MemoryStore

内存存储。未提供 storage 时的默认选项。页面刷新或进程退出后数据丢失。

ts
import { MemoryStore } from '@ocash/sdk';

const sdk = createSdk({
  chains: [...],
  storage: new MemoryStore({ maxOperations: 100 }),
});

IndexedDbStore(浏览器)

使用 IndexedDB 的持久化浏览器存储。从 @ocash/sdk/browser 导入:

ts
import { createSdk, IndexedDbStore } from '@ocash/sdk/browser';

const sdk = createSdk({
  chains: [...],
  storage: new IndexedDbStore({
    dbName: 'myapp',
    maxOperations: 200,
  }),
});

FileStore(Node.js)

基于 JSON 文件的存储。从 @ocash/sdk/node 导入:

ts
import { createSdk, FileStore } from '@ocash/sdk/node';

const sdk = createSdk({
  chains: [...],
  storage: new FileStore({
    baseDir: './data',
    maxOperations: 500,
  }),
});

KeyValueStore / RedisStore / SqliteStore

ts
import { RedisStore, SqliteStore } from '@ocash/sdk';

const redisStore = new RedisStore({ url: 'redis://localhost:6379' });
const sqliteStore = new SqliteStore({ filename: './data.db' });

自定义适配器

实现 StorageAdapter 接口即可对接任何后端:

ts
class MyCustomStore implements StorageAdapter {
  async upsertUtxos(utxos: UtxoRecord[]) { /* ... */ }
  async listUtxos(query?: ListUtxosQuery) { /* ... */ }
  async markSpent(input: { chainId: number; nullifiers: Hex[] }) { /* ... */ }
  async getSyncCursor(chainId: number) { /* ... */ }
  async setSyncCursor(chainId: number, cursor: SyncCursor) { /* ... */ }
}

只需实现五个必需方法。可选方法(操作记录、Merkle 缓存、entry 数据缓存)可按需添加。