Lemma 概要

Lemma は、機密コンテンツを露出させずに検証済みデータ上で AI が推論できる、数学的に保証された真実レイヤーです。あらゆる AI インタラクションを包む汎用ラッパーではなく、ミッションクリティカルなデータの高信頼ストレージおよび参照レイヤーとして機能します。

AI エージェントは MCP 経由で Lemma にアクセスし、安全クリティカルなワークフロー、公正な権利管理、暗号学的に検証された事実に基づく正確な応答といったユースケースで信頼できるデータソースとして利用します。

主な機能とメリット

技術的基盤

仕様サマリー


ユースケース

DeFi プライベートレンディングと低担保ローン

DeFi コンプライアンス — プライバシーを守る KYC/AML

RWA — 実物資産のトークン化

自律 AI エージェント決済と個人データ

KYC、アイデンティティ、クレデンシャル証明

機密データスクリーニング — 給与・健康・ローン

オリジナリティの保護とデータクリエイターへの報酬

AI / RAG 向けの検証済み情報

属性ベースアクセス制御


最小限の開発者ワークフロー(簡略版)

1. インストールと初期化

npm install @lemmaoracle/sdk
import { create } from "@lemmaoracle/sdk";

const client = create({
  apiBase: "https://api.lemma.example.com",
  apiKey: process.env.LEMMA_API_KEY!,
});

2. スキーマと正規化の定義

import { define, schemas } from "@lemmaoracle/sdk";

type UserKycRaw = { age: number; country: string };
type UserKycNorm = { age_bucket: "adult" | "minor"; country: string };

// 1. スキーマメタデータを取得(id + NormalizeArtifact を含む)
const schemaMeta = await schemas.getById(client, "user-kyc-v1");

// 2. WASM をダウンロード、SHA-256 を検証、インスタンス化、登録
const userKycSchema = await define<UserKycRaw, UserKycNorm>(schemaMeta);

3. 暗号化と準備

import { encrypt, prepare } from "@lemmaoracle/sdk";

const rawDoc: UserKycRaw = { age: 25, country: "JP" };
const holderPubKey = "...";

const enc = await encrypt(client, {
  payload: rawDoc,
  holderKey: holderPubKey,
  algorithm: "aes-256-gcm", // オプション — デフォルトは "aes-256-gcm"
});
// enc.docHash            → ドキュメントのハッシュ(オンチェーンの主キー)
// enc.cid                → IPFS/Ceramic 上の暗号化ドキュメントの CID
// enc.ciphertext         → Base64 エンコードされた暗号化ドキュメント
// enc.algorithm          → 使用された暗号化アルゴリズム(例: "aes-256-gcm")

const prep = await prepare<UserKycRaw, UserKycNorm>(client, {
  schema: userKycSchema.id,
  payload: rawDoc,
});
// prep.normalized   → 正規化された属性(例: { age_bucket: "adult", country: "JP" })
// prep.commitments  → { scheme, root, leaves, randomness }

一行説明: encryptdocHash/cid/ciphertext/algorithm を、prepare は正規化された属性とコミットメント(scheme を含む)を返します。

4. 署名と選択的開示の作成

import { disclose } from "@lemmaoracle/sdk";

// BBS+ 鍵ペアの生成
const kp = await disclose.generateKeyPair();

// ペイロードをソートされた「キー:値」メッセージに変換
const messages = disclose.payloadToMessages({ age: 25, country: "JP" });
// → ["age:25", "country:JP"]  (キーでソート)

// 発行者が署名
const signed = await disclose.sign(client, {
  messages, // payloadToMessages からの ReadonlyArray<string>
  secretKey: kp.secretKey, // 発行者の BBS+ 秘密鍵
  header: new TextEncoder().encode("my-app-header"),
  issuerId: "issuer-1",
});
// signed.signature → BBS+ 署名

// ホルダーが選択的開示
const revealed = await disclose.reveal(client, {
  signature: signed.signature, // sign 出力から
  messages, // 元のメッセージ配列
  publicKey: signed.publicKey, // 発行者の公開鍵
  indexes: [0], // 開示するインデックス(属性名ではなく)
  header: signed.header,
});
// revealed.attributes  → { age: "25" }
// revealed.proof       → BBS+ 派生証明

// 仕様準拠のラップ
const sd = disclose.toSelectiveDisclosure(revealed);
// sd.format      → "bbs+"
// sd.attributes  → { age: "25" }
// sd.proof       → 16進エンコードされた文字列

5. ドキュメントの登録(オプションは省略)

import { documents } from "@lemmaoracle/sdk";

await documents.register(client, {
  schema: userKycSchema.id,
  docHash: enc.docHash,
  cid: enc.cid,
  commitments: {
    scheme: "poseidon",
    root: prep.commitments.root,
    leaves: prep.commitments.leaves,
    randomness: prep.commitments.randomness,
  },
  signature: {
    format: "bbs+",
    payload: "...", // 16進エンコードされた BBS+ 署名
    issuerId: "issuer-1",
  },
});

失効の詳細設定や onchainHooks などの本質的でないオプションはここでは省略しています。

6. 証明の生成と送信(オプションは省略)

import { prover, proofs } from "@lemmaoracle/sdk";

const zkResult = await prover.prove(client, {
  circuitId: "age-over-18",
  witness: {
    age_bucket: prep.normalized.age_bucket,
    randomness: prep.commitments.randomness,
    attr_commitment_root: prep.commitments.root,
  },
});
// zkResult.proof   → ZK 証明(開発環境では base64 文字列、本番ではバイナリ)
// zkResult.inputs  → 公開入力の配列

await proofs.submit(client, {
  docHash: enc.docHash,
  circuitId: "age-over-18",
  proof: zkResult.proof,
  inputs: zkResult.inputs,
  disclosure: {
    format: "bbs+",
    attributes: sd.attributes,
    proof: sd.proof,
  },
});

ここでは証明を紐づけドキュメントにリンクするために必要なコアフィールドのみを扱います。disclosure フィールドには選択的開示の情報が含まれます。

7. 検証済み属性のクエリ

import { attributes } from "@lemmaoracle/sdk";

const results = await attributes.query(client, {
  query: "users over 18 in Japan",
  mode: "natural", // "natural" | "structured"
  proof: { required: true, type: "zk-snark" }, // type: "zk-snark" | "opaque"
  targets: {
    schemas: ["user-kyc-v1"],
    chainIds: [1, 137], // ← オプション: チェーン ID でフィルター
  },
});

検証済み属性と証明状態が返され、アプリや AI エージェントが利用できます。