mcpField
R
rta — zero-knowledge proof of a threshold

rta — zero-knowledge proof of a threshold

远程服务
github.com/mrpkk安全01 天前更新
代码仓库

关于 rta — zero-knowledge proof of a threshold

rta 是用于验证隐藏数值是否达到阈值的 Groth16 零知识证明 MCP 服务,适合需要验证条件而不获取原始数值的应用。它提供可查询的谓词和按次付费的证明验证;服务明确列出仪式可信度等限制。

主要功能

  1. 01Groth16 阈值证明验证
  2. 02隐藏数值不向验证方披露
  3. 03列出可验证谓词及阈值
  4. 04nonce 一次性使用以防重放
  5. 05x402 按次支付验证

适用场景

  1. 01验证余额是否达到指定门槛
  2. 02确认质押或交易次数达到条件
  3. 03在不披露年龄时验证年龄门槛

MCP 相关

rta 通过 Streamable HTTP 提供 MCP 服务,地址为 https://rta.lat/mcp。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] 不可用:它的解析器会丢失换行符,无法编译任何电路。已于 07.10.2026 验证。

亲自验证,而非照搬文档

  • npm 上的 circom — 已损坏(解析器问题)。
  • 通过 cargo 从源代码构建的 circom — 可用,版本为 2.2.3。
  • snarkjs groth16 fullprove CLI — 已损坏,会将 zkey 读取为 JSON。 直接使用 snarkjs.groth16.fullProve API。
  • 执行 groth16 setup 前必须先运行 powersoftau prepare phase2。

这些问题每个都耗费了时间,而且都无法从文档中看出。


ИССЛЕДОВАНИЕ-RTA-стенд-2026

截图

文件用途
assets/ph-thumb-240.pngProduct Hunt 的 240×240 缩略图
assets/ph-cover-1280.png1280×800 封面——这是做什么的,以及费用是多少
assets/ph-flow-1280.png支付流程:无需注册的四个步骤
assets/ph-honesty-1280.png将限制醒目展示,而非藏在脚注里

最后一张图片是有意这样制作的。一个以信任为核心的产品,如果隐藏自身限制,就不再值得信任:只要有一位买家因未附带任何说明的承诺而上当,声誉就会毁于一旦。

从 Agent 中调用

Ṛ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 证明;通过 x402 按调用付费,与 HTTP 端点相同。
  • MCP 资源 / 提示词:目前尚未公开——resources/list 和 prompts/list 会返回空列表而非错误,因此目录扫描器不会将该服务标记为故障。
  • 传输方式:位于 https://rta.lat/mcp 的 Streamable HTTP。验证器会得知是否达到阈值,但永远不会得知该值。
连接 MCP 客户端
{
  "mcpServers": {
    "rta": { "url": "https://rta.lat/mcp" }
  }
}

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。