mcpField
R
rta — zero-knowledge proof of a threshold

rta — zero-knowledge proof of a threshold

リモート
github.com/mrpkkセキュリティ0今日更新
リポジトリ

rta — zero-knowledge proof of a threshold について

rta は、隠された値がしきい値を満たすかを検証する Groth16 ゼロ知識証明サービスです。値そのものを知らずに条件を確認したいアプリケーション向けで、利用可能な述語の照会と従量課金の検証を提供し、信頼性に関する制約も明示しています。

主な機能

  1. 01Groth16 によるしきい値証明の検証
  2. 02元の値を検証者に開示しない設計
  3. 03利用可能な述語としきい値の一覧
  4. 04リプレイ防止用の一回限りの nonce
  5. 05x402 による呼び出しごとの支払い

活用シーン

  1. 01残高が指定のしきい値を満たすか確認
  2. 02ステークや取引回数の条件を検証
  3. 03年齢を開示せずに年齢条件を確認

MCP 対応

rta は https://rta.lat/mcp で Streamable HTTP の MCP サーバーを提供します。無料で述語を照会する list_predicates と、呼び出しごとに有料の verify_proof をツールとして公開し、MCP リソースとプロンプトはありません。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://rta.lat/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、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.fullProve API を直接使用します。
  • groth16 setup の前に powersoftau prepare phase2 が必要です。

これらのエラーはいずれも時間を浪費させましたが、ドキュメントからはどれも分かりません。


ṚTA-2026調査環境

スクリーンショット

ファイル用途
assets/ph-thumb-240.pngProduct Hunt 用 240×240 のサムネイル
assets/ph-cover-1280.png1280×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" }
  }
}

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。