rta — zero-knowledge proof of a threshold について
rta は、隠された値がしきい値を満たすかを検証する Groth16 ゼロ知識証明サービスです。値そのものを知らずに条件を確認したいアプリケーション向けで、利用可能な述語の照会と従量課金の検証を提供し、信頼性に関する制約も明示しています。
主な機能
- 01Groth16 によるしきい値証明の検証
- 02元の値を検証者に開示しない設計
- 03利用可能な述語としきい値の一覧
- 04リプレイ防止用の一回限りの nonce
- 05x402 による呼び出しごとの支払い
活用シーン
- 01残高が指定のしきい値を満たすか確認
- 02ステークや取引回数の条件を検証
- 03年齢を開示せずに年齢条件を確認
MCP 対応
rta は https://rta.lat/mcp で Streamable HTTP の MCP サーバーを提供します。無料で述語を照会する list_predicates と、呼び出しごとに有料の verify_proof をツールとして公開し、MCP リソースとプロンプトはありません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://rta.lat/mcpclaude mcp add --transport http lat-rta-rta https://rta.lat/mcp{"mcpServers":{"lat-rta-rta":{"type":"http","url":"https://rta.lat/mcp"}}}Cursor で開く{"servers":{"lat-rta-rta":{"type":"http","url":"https://rta.lat/mcp"}}}VS Code で開く{"mcpServers":{"lat-rta-rta":{"type":"http","url":"https://rta.lat/mcp"}}}{"mcpServers":{"lat-rta-rta":{"serverUrl":"https://rta.lat/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
RTA (ṚTA) — доказать факт, не раскрыв его
Почему так называется
Ṛta — центральное понятие ведической космологии: порядок, истина и правильное соответствие между действием и следствием.
Работа ZK-доказательства — это ровно Ṛta. Проверяющий не спрашивает
«похоже ли на правду». Он убеждается, что следствие следует из действия
по правилу, и никакого иного варианта не существует. Одно утверждение —
одна истина. В ведическом языке это называется словно: ṛta управляет тем,
что события идут в правильном порядке и дают правильный результат.
Правило именования: единый пантеон
Имена продуктов берутся из одного пантеона — ведического, потому что агент ИндрА ведический, система называется «Божественная канцелярия» и работа идёт в рамках карма-йоги. Смешивать пантеоны нельзя: греческая Ананке рядом с ведическим ИндрА — это как звать соседа по имени в чужом храме.
Отвергнуто с причинами, чтобы не предлагали заново:
- Гекате — по функции ближе всех (ключи от ворот, распутье, скрытое знание), но комплаенс-офицеру банка «Hecate» звучит как оккультизм. Это риск сделки, а не вкус.
- Варуна — в ведическом пантеоне и по смыслу сильнее (его петля́
настигает скрытое: «Ригведа» 1.24), но
Varuna Integrity Services— компания по аудиту безопасности. Прямая коллизия в нашей нише. - Агни — огонь-испытание, тоже ведический, но крипто-коллизия (AgniCash).
- Ананке — греческая, нарушала единый пантеон.
- Hermes — нейтрально, но тяжёлый товарный знак.
- Janus — прямое столкновение: Janus Software / JanusSecurity, старая антивирусная компания. В безопасности путается.
- Nox / Nyx — только сокрытие, ничего о доказательстве.
Честная цена выбора: ṛta на слух читается как «ритах», непривычно.
Объяснять придётся нам, а не рынку. Смягчает то, что имя нейтральное —
ни оккультизма, ни религиозной нагрузки.
rta занят в npm. Для продукта, распространяемого через GitHub, это не
помеха; при выходе в реестры — область @mrpkk/rta.
Первый работающий модуль: настоящее ZK-доказательство Groth16, собранное локально, без бюджета, без внешней церемонии и без платных сервисов.
Что уже работает
Схема доказывает одно утверждение: «возраст >= 18» — и не раскрывает ни возраст, ни дату рождения.
| Проверка | Результат |
|---|---|
| Возраст 18, 21, 37, 100, 255 — доказательство принимается | ok |
| Возраст 0, 5, 16, 17 — доказать нельзя | ok |
| Публичные сигналы доказательства | пустые [] |
| Публичные данные зависят от возраста | нет — одинаковые для 18, 40 и 200 |
| Подменённый verification key | отклоняется |
| Размер доказательства | 723 байта |
Итог испытаний: 12 ok, 0 FAIL (node build/test.js).
Почему «доказать нельзя» важнее «доказать можно»
Проверяющий видит только 723 байта и одно слово «верно». Он не может отличить 18 от 100 — публичные данные пусты. И он не может получить доказательство для 17 лет: ограничение невыполнимо, свидетельство не собирается, а значит ложь опровержима, а не просто недоказуема.
Как это устроено
Возраст раскладывается на 8 бит, и разность возраст − 18 тоже
раскладывается на 8 бит. Из равенства
сумма(биты разности) = возраст − 18 следует, что разность неотрицательна:
отрицательное число в двоичной записи из 8 неотрицательных бит не помещается.
accAge === age; // возраст = сумма своих битов
accAge - 18 === accDiff; // разность = сумма своих битов
Схема: circuits/age.circom. Сборка всех артефактов: build/setup.sh.
⚠️ Чего этот стенд НЕ делает
| Не сделано | Почему это важно |
|---|---|
| Церемония односторонняя | Участник один, значит toxic waste известен ему. Подделка доказательств возможна. Риск №1, не закрыт. См. build/VERIFY.md |
| Нет публичного адреса | Сервер есть и слушает localhost, но наружу не выставлен: нет TLS и аутентификации. Нужен постоянный домен: quick-туннель cloudflared умирает при перезапуске, и адрес получателя в x402 не может быть случайным |
| Facilitator не держит Base mainnet | Проверено живьём 09.10.2026: x402.org/facilitator/supported возвращает 9 сетей, и все они тестнеты — base-sepolia, eip155:84532, aptos:2, solana-devnet, stellar:testnet, xrpl:1. Mainnet eip155:8453 там отсутствует. Деньги на mainnet USDC придут на адрес, но расчёт через этот facilitator не пройдёт. Нужен facilitator с mainnet: публичный от Coinbase (api.cdp.coinbase.com/platform/v2/x402) требует API-ключ, то есть регистрации владельца |
| Состояние в памяти | Перезапуск обнуляет выданные nonce и счётчики. /healthz говорит об этом сам |
| Церемония не воспроизводима у покупателя | Начальный ptau секрета не содержит (snarkjs пишет единичные элементы, tau=1), а в каждый вклад подмешивается 64 байта случайности ОС, нигде не записанные. Пересобрать цепочку с нуля покупатель не сможет — и проверить, что оператор не сохранил случайность при генерации, тоже не сможет |
| Нет внешнего аудита схемы | Схема написана нами и нами же проверена |
Что уже сделано и раньше здесь стояло неверно (исправлено 09.10.2026):
Нет приёма оплаты— приём оплаты есть. Подпись платежа проверяется локально через кодattest, и только затем идёт расчёт у facilitator. Ответ безsuccess: trueсчитается провалом: доказательство не выдаётся.Только предикат «возраст ≥ 18»— пять пороговых схем:balance_1000,balance_100000,stake_10000,account_age_180,tx_count_50. Фантомныйage-18убран: он был объявлен в/v1/predicates, но не был собираем.Нет защиты от повтора— nonce гасится при первом предъявлении, повтор даёт 409. Граница честная: хранилище в памяти, перезапуск его обнуляет.
Про powers of tau (аудит 17.10.2026). Прежняя формулировка «сгенерированы
с детерминированной энтропией» была неточной и исправлена. Начальный ptau
секрета не содержит вовсе: snarkjs powersoftau new пишет единичные элементы
(tau=1). В каждый вклад snarkjs подмешивает 64 байта crypto.randomFillSync
поверх строки энтропии, и эти байты нигде не записываются — восстановить
трапдоор из артефактов или журнала нельзя. Настоящее ограничение одно:
участник был один, и он физически мог сохранить случайность при генерации;
проверяется это людьми, не кодом. Для стенда достаточно, для продакшна нужна
церемония с участием независимых сторон.
Как собрать с нуля
export PATH="$HOME/.cargo/bin:$PATH"
bash build/setup.sh # схема -> ключи (2-3 минуты)
node build/test.js # испытания ZK
node build/test-replay.mjs # защита от повтора
node build/test-predicates.mjs # пороговые предикаты
python3 -m pytest tests/ -q # HTTP-слой и платёж
HTTP-сервис
rta/http_api.py — сервер на localhost.
| Маршрут | Что делает |
|---|---|
GET /healthz | живо ли сервис; сам сообщает, что состояние в памяти |
GET /v1/predicates | закрытый список предикатов с порогами |
POST /v1/nonce | выдать одноразовый токен под одно доказательство |
POST /v1/verify | проверить; в режиме x402 без оплаты отвечает челленджем 402, с оплатой — расчётом и вердиктом |
Проверка идёт до дорогой верификации: без действующего nonce повторное предъявление отбрасывается с 409, иначе клиент платил бы за каждый повтор. Неверное доказательство токен не гасит — право прийти с настоящим есть.
python3 -m rta.http_api # или: python3 -c "from rta.http_api import serve; serve()"
Испытаний 31, все зелёные. Бьют по настоящему сокету: маршрутизация, коды ответов и заголовки существуют только по сети.
⚠️ コードではなく環境に関する既知の問題
Groth16 の検証はミリ秒単位で完了するはずですが、このマシンではほぼ CPU 時間を使わずに数分かかります。プロセスは計算しているのではなく、待機しています。原因は、15.5 GB 中約 445 MB しか空きがなく、snarkjs がワーカープールで行き詰まることです。strace を使うと、同じ出力が 90 秒で得られます。
純粋な Python で独自の検証器を実装しましたが、却下しました。方程式が一致せず、双線形性テストにも合格しません。experimental/groth16_verify_UNPROVEN.py にあり、信用しないよう注記されています。正しい証明を黙って拒否するサーバーは、検証機能のないサーバーよりも悪質です。
circom 2.2.3(cargo 経由でソースからビルド)と snarkjs が必要です。npm パッケージの [email protected] は使用できません。パーサーが改行を失い、どの回路もビルドできません。2026年10月7日に確認済みです。
ドキュメントではなく、実際に手を動かして確認したこと
- npm 版の
circom— 動作しません(パーサー)。 - cargo 経由でソースからビルドした
circom— 動作します(2.2.3)。 - CLI の
snarkjs groth16 fullprove— 動作しません。zkey を JSON として読み込みます。snarkjs.groth16.fullProveAPI を直接使用します。 groth16 setupの前にpowersoftau prepare phase2が必要です。
これらのエラーはいずれも時間を浪費させましたが、ドキュメントからはどれも分かりません。
ṚTA-2026調査環境
スクリーンショット
| ファイル | 用途 |
|---|---|
assets/ph-thumb-240.png | Product Hunt 用 240×240 のサムネイル |
assets/ph-cover-1280.png | 1280×800 のカバー — これは何か、料金はいくらか |
assets/ph-flow-1280.png | 支払いの流れ:登録不要の 4 ステップ |
assets/ph-honesty-1280.png | 制限事項を脚注ではなく、大きく表示 |
最後の画像は意図的にそうしています。信頼を扱う製品が制限事項を隠せば、信頼されなくなります。注意書きなしで約束を売りつけられた購入者が一人いるだけで、評判は失われます。
エージェントから呼び出す
ṚTA にはまだ MCP エンドポイントがありません。呼び出しごとの x402 支払いに対応する HTTP サービスです。
curl -X POST https://rta.lat/v1/verify \
-H 'Content-Type: application/json' \
-d '{"circuit": "balance_threshold", "public_inputs": {"balance": "1200"}, "threshold": "1000"}'
検証器はしきい値に達したことを把握しますが、残高を知ることはありません。次のステップは MCP ラッパーです(PROGRESS で追跡中)。
MCP サーバー(Model Context Protocol)
ṚTA は MCP サーバーです。Streamable HTTP(JSON-RPC 2.0)経由で Model Context Protocol を使用し、しきい値の証明を MCP ツールとして公開します。
- MCP ツール:
list_predicates— 証明できるしきい値を一覧表示します(無料、支払い不要)。verify_proof— 非公開の値がしきい値に達したことを示す Groth16 証明を検証します。HTTP エンドポイントと同様に、x402 経由で呼び出しごとに支払います。
- MCP リソース/プロンプト:まだ公開されていません。
resources/listとprompts/listはエラーではなく空のリストを返すため、ディレクトリのスキャナーでサーバーが壊れていると判定されません。 - トランスポート:
https://rta.lat/mcpの Streamable HTTP。検証器はしきい値に達したことを把握しますが、値を知ることはありません。
MCP クライアントを接続する
{
"mcpServers": {
"rta": { "url": "https://rta.lat/mcp" }
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。