关于 rta — zero-knowledge proof of a threshold
rta 是用于验证隐藏数值是否达到阈值的 Groth16 零知识证明 MCP 服务,适合需要验证条件而不获取原始数值的应用。它提供可查询的谓词和按次付费的证明验证;服务明确列出仪式可信度等限制。
主要功能
- 01Groth16 阈值证明验证
- 02隐藏数值不向验证方披露
- 03列出可验证谓词及阈值
- 04nonce 一次性使用以防重放
- 05x402 按次支付验证
适用场景
- 01验证余额是否达到指定门槛
- 02确认质押或交易次数达到条件
- 03在不披露年龄时验证年龄门槛
MCP 相关
rta 通过 Streamable HTTP 提供 MCP 服务,地址为 https://rta.lat/mcp。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] 不可用:它的解析器会丢失换行符,无法编译任何电路。已于 07.10.2026 验证。
亲自验证,而非照搬文档
- npm 上的
circom— 已损坏(解析器问题)。 - 通过 cargo 从源代码构建的
circom— 可用,版本为 2.2.3。 snarkjs groth16 fullproveCLI — 已损坏,会将 zkey 读取为 JSON。 直接使用snarkjs.groth16.fullProveAPI。- 执行
groth16 setup前必须先运行powersoftau prepare phase2。
这些问题每个都耗费了时间,而且都无法从文档中看出。
ИССЛЕДОВАНИЕ-RTA-стенд-2026
截图
| 文件 | 用途 |
|---|---|
assets/ph-thumb-240.png | Product Hunt 的 240×240 缩略图 |
assets/ph-cover-1280.png | 1280×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" }
}
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。