документ SHR-2026-01 · полный протокол · без маркетинга Главная · Лаборатория
S Shroud
protocol papers
DOC / SHR-2026-01

Протокол целиком

Один абзац: пользователь шифрует запись на своём устройстве сетевым FHE-ключом и публикует только шифротекст. Покупатель кладёт бюджет в USDC и публикует спек модели. Любой узел может выполнить обучение по шифротекстам — арифметика FHE даёт шифротексты. Узлы коммитят каждую эпоху в ZK proof-of-compute; по принятии эскроу стримится контрибьюторам и узлам. Веса покупатель получает через пороговый комитет и только после settlement. Отдельные записи не расшифровываются никем и никогда.

Три инвариантаINV-1: plaintext виден только владельцу; в открытую выходит лишь выход модели и лишь после TaskSettled. INV-2: секрет FHE-ключа никогда не собран в одной памяти — Шамир t-of-n, n ≥ 3t−1. INV-3: врать узлу невыгодно — либо STARK сошёлся на настоящих дайджестах, либо fraud-окно и слэш большинством.

Коротко своими словами

Чужие таблицы учат твою модель, не показывая тебе ни одной строки. Деньги лежат в сейфе-контракте и раздаются только за проверенную работу. Ниже — детали для любопытных, в лаборатории — всё руками.

01 / TRUST

Модель доверия и ключи

СторонаДовереноНе доверено
Пользовательсвой plaintext, свой ключвсё остальное
Web2 + SDKничего — plaintext не покидает браузер—
Покупательбюджет, спек моделиplaintext чужих строк
Узелнабор шифротекстов (уже публичен в DA)plaintext, секретный ключ
Комитет (t-of-n)совместно — только выходные шифротекстыиндивидуальные записи
Секвенсорпорядок транзакцийplaintext
fhEVM-сопроцессороперации над шифротекстом, ротация ключейplaintext
DKG n=7 · t=4

Иерархия ключей

s_pub публикуется в params-бандле и пинится в NetworkParams (защита от подмены). committeePub — BLS-агрегат для reveal без транзакции на члена. nodeId = keccak(blsPubKey[0:20] ‖ operator) связывает узел со стейком.

LAYOUT

Правило раскладки

В цепочке — обязательства и зашифрованное состояние; bulk-шифротекст — в DA. STARK проверяется по ончейн-ctRoot, поэтому fhEVM-нагрузка ограничена, а проверяемость сохранена.

02 / FLOW

Сквозной путь: 29 шагов

#ШагКто → куда
1–3GET s_pub → вектор + Groth16 «знаю строку такой формы» → FHEWasm-шифрование батчами по 8устройство
4–6PUT bundle в DA → EIP-712 привязка хэша к кошельку → submitContributionSDK → DA → секвенсор
7–9tx в CipherTask.submitContribution → учёт эскроу → событие нового ctRootL3
10–13openEpoch → чекпоинт encState → EpochOpened → узлы тянут шарды range-pullпокупатель → узлы
14–18TFHE SGD без расшифровки → хэш-чейн трейса → STARK → PUT в DA → commitEpochузел → цепочка
19–23verify по publicInputs → слайс узлу; при споре fraud-окно, ре-экзекьюшн, слэшконтракт
24–29requestReveal → BLS-гейт → t частичных расшифровок выходов → withdrawWeightsпокупатель + комитет
Автомат состояний CipherTaskвсе переходы — событиями
createTask (escrow) → OPENING → COLLECTING → SEALED
  → EPOCH_OPEN → EPOCH_COMMITTING → EPOCH_SETTLED (×E)
  → SETTLING → REVEALING → DISCLOSED
  fraud quorum / timeout → ABORTED (refund незапущенного)
03 / MATH

FHE-выбор и математика выплат

ВопросРешение
СхемаTFHE (tfhe-rs / Zama fhEVM) — программируемый бутстреп для глубоких конвейеров
Лейныeuint32: табличные данные и веса без взрыва шума CKKS
Непрерывные признакиквантование в u32, scale 1e4 — целочисленный SGD точен и дешёв для STARK
Батчинг8 лейнов на шифротекст — амортизация бутстрепов
Шумбюджет 2^40 safe-msg-bits; рекей каждые 2 эпохи (RekeyGuard)
SETTLE

Деление бюджета B, эпох E

contributorPool = B·8000/10000; nodePool = B·1500/10000; committeePool — в treasury, а нераспределённый остаток — возврат покупателю. contributor_i = pool · w_i / Σw, где w_i = rows_i·liveness — линейно: дележ не даёт и не отнимает, китов душат minRows и бонд. node_n = nodePool / (E·q) поровну по валидным коммитам. Пыль contributor-пула — участнику с наибольшим address (детерминировано); остаток epoch lock и невостребованное уходят покупателю.

попробуй числа на стенде 03–06 в лаборатории
04 / ATTACKS

Атаки и контрмеры

#АтакаКонтрмера
A1Мусорные строки ради эскроуGroth16-привязка к shape-корню покупателя + слэш кворумом
A2STARK под другой датасетpublic input: ctRoot, эпоха, chainId, адрес контракта
A3Веса с чужого наборахэш-чейн AIR по дайджестам шардов до ctRoot
A4Накрутка прогресса ради микроплатежейслайсы подписываются лишь за EPOCH_SETTLED
A5–A6Сговор комитета (< t / ≥ t)расшифровка только выходов settled-задач; сговор большинства — остаточный риск F-10
A7Подмена s_pub секвенсоромпин keccak(s_pub) в NetworkParams; SDK отказывается при настроенном пине, узел проверяет пин на старте
A8Фронтраннинг чужого шардаодин шард на адрес + уникальность CID + EIP-712 привязка к отправителю
A9Abort после трат узловэскроу лочится на openEpoch; возврат — только незапущенные эпохи
A10DoS размером датасеталимиты maxContributors/maxShards/maxCiphertextBytes/minRowsPerShard
A11Реорг settled-эпохивотчеры только по finalized; settlement идемпотентен
A12Декомпрессионная бомба на узелrange-pull с бюджетом + проверка дайджеста до парсинга
05 / CODE

Код: контракты, SDK, узел

КонтрактРоль
CipherTaskэскроу + FSM + дивиденды + fraud-окно; только коммиты по 32 байта
PaymentVaultстриминг-каналы EIP-712; инвариант totalLocked == subBalances + channelLocks за O(1)
DecryptionGateBLS-гейт частичных расшифровок; withdraw требует реального threshold
NetworkParamsпин FHE-ключа; ротация: предложение → таймлок → исполнение
ProofVerifierсэмплированная ончейн-проверка + 7-дневный таймлок ротации
SDK · @shroud/sdk

uploadAndMonetize

sdk.uploadAndMonetize(data, taskId, { features, allowUnencrypted }) — шифрует локально, кладёт в DA, проверяет все условия submitContribution до траты газа. publishWeights — генезис-веса shroud/weights/v1. Key-pin, chainId-check, hardened DA-клиент с getVerified.

реальное шифрование — @shroud/sdk/relayer (нода); по умолчанию NoopEncryptor только для dev
NODE · Rust

Исполнитель эпох

Reorg-safe вотчер → derived fold; reference-cpu движок (golden-тесты) + tfhe-rs за prover; контент-адресный DA (da — remote); споры из собственных коммитов; сбор каналов finalize/settle/redeem/reclaim/claim/bond.

конфиг: бэкенды, DA, key-pin, таймауты — infra/README §3
06 / RUN

Запуск и роли

Покупатель

fund a task
Эскроу: createTask(budget, params) → sealTask → openEpoch на каждую эпоху → requestReveal и withdraw. Пример: packages/contracts/scripts/devnet-e2e-check.ts.

Контрибьютор

sell value, not data
Шифруй локально: sdk.uploadAndMonetize(data, taskId, { features }). В проде — @shroud/sdk/relayer. Механику попробуй в лаборатории.

Оператор узла

earn epochs
docker compose up -d node-a (ручки — infra/README.md §3) или собери node/. Узел регистрируется, исполняет, коммитит, спорит и забирает каналы.

Наблюдатель

ops-bot
Telegram-бот из bot/ (токен + allowlist в bot/.env): /menu-хаб, /pool, /task <id>, алерты споров, ротаций ключей и казны.
# contracts  cd packages/contracts && npm ci && npx hardhat test && npx tsc --noEmit
# sdk         cd packages/sdk && npm ci && npm test
# bot         cd bot && npm ci && npm test
# node             cd node && cargo check --all-features
# site             cd web && python -m http.server 4173
08 / PARAMS

Параметры для прошаренных

УзелПоля и форматы
TaskParamsminRowsPerShard, maxContributors, maxShards, maxCiphertextBytes, окно взносов, minContributors до seal — всё валидируется при createTask
Транскрипт эпохиtaskId · epoch · chainId · CipherTask · ctRoot · prevDigest · features · scale · lrQ16 · l2Q16 · minibatch · seed · nRows · lossMeanQ · листья · nextDigest
Proof-референс0x53544152 («STAR») + 28 байт keccak(транскрипт); верифицируется только на mock-верифаере
Шард shroud/noop/v1magic + «features\\0rows\\0» + f64 LE-матрица; commitment — keccak по строкам
СеттлментsettleFrom(taskId, cursor) по 200; финальная страница платит комитету и возвращает остаток покупателю
07 / ROAD

Сделано и дальше

DONE

Ядро готово

FSM + эскроу + каналы + threshold-reveal + таймлоки; кворум споров со слэшем бонда + commit-reveal репортов и PoP-привязкой BLS-ключей; бонд взносов (opt-in); детерминированный движок + tfhe-rs; SDK с key-pin и DA-закалкой; бот с покрытием; devnet; fuzz и газ-снапшот.

NEXT · 3–4

Доказательства и экономика

zkVM-гость поверх 8-полевого транскрипта + рекурсивная агрегация (ончейн-проверка буквально); stake-взвешенные ре-экзекьюторы со слэшем в обе стороны, Gateway re-encryption, Foundry-инварианты, бенчмарки CPU/GPU.

Документы: 01-architecture · 02-cryptography · 03-proof-of-compute · 04-threat-model · 05-honest-limitations. docs →