routstr-confidential je experimentálny dôverný režim pre Routstr, trh s AI inferenciou, kde uzlu zaplatíš cez Cashu ecash alebo Lightning a on tvoju požiadavku pošle poskytovateľovi, napríklad Venice, pod svojím API kľúčom. V dôvernom režime uzol tvoje prompty ani odpovede neprečíta a ty jeho API kľúč nikdy neuvidíš. Enklávy ani iný špeciálny hardvér nepotrebuje, stačí mu TLS certifikát poskytovateľa, dvojstranný výpočet a dôkazy s nulovou znalosťou. Predstavil som ho v článku Confidential inference on Routstr without trusted hardware (po anglicky), kde nájdeš aj obmedzenia a merania.
Vyskúšaj si to alebo si pozri kód:
- demo PWA: nabiješ ju cez Lightning alebo Cashu token a môžeš chatovať (zdrojový kód: routstr-confidential-pwa)
- routstr-confidential: protokol, paper a návod na spustenie
- routstr-core (vetva
confidential-2pc): strana uzla - routstr-sdk (vetva
confidential-2pc): klientsky transport - routstrd (vetva
confidential-upstream): zapnutie v lokálnom démone - routstr-confidential-web: knižnica na použitie vo vlastnej webovej aplikácii
Príručka pre programátorov
Ak chceš namiesto kúzelníckeho predstavenia samotný protokol, napísal som príručku pre programátorov: Ako funguje dôverný režim routstr (PDF, 75 strán). Prechádza protokol krok za krokom a opisuje kód v repozitároch vyššie. Je aj v anglickej verzii.

Keď pošleš prompt AI modelu cez sprostredkovateľa, sprostredkovateľ vidí všetko. V sieti routstr sa volá uzol. Má u poskytovateľa účet a API kľúč, ty mu platíš drobnými sumami v bitcoinovom e-cashi alebo z predplateného kreditu a on tvoju požiadavku pošle pod svojím kľúčom. Je to praktické: účet u poskytovateľa nepotrebuješ a uzlov je na výber veľa. Z uzla to však robí dokonalého muža uprostred. Číta tvoj prompt aj odpoveď, mohol by model, ktorý si chcel, vymeniť za lacnejší alebo upraviť volanie nástroja, a koľko mu dlhuješ, ti hovorí sám.
Aj uzol má svoju starosť. S jeho API kľúčom sa dajú míňať jeho peniaze u poskytovateľa, takže ti ho nikdy nemôže dať.
Dôverná verzia routstru vyrieši oboje naraz. Uzol pošle požiadavku pod svojím tajným kľúčom a tvoj prompt ani odpoveď neuvidí. Ty sa s poskytovateľom rozprávaš cez TLS, šifrovane od konca po koniec, a kľúč nikdy neuvidíš. Účet je číslo, ktoré nahlásil sám poskytovateľ. Nepotrebuje enklávu ani špeciálny hardvér. Opiera sa o TLS certifikát poskytovateľa, ten istý, vďaka ktorému vidíš v prehliadači zámok.
V podcaste som protokol porozprával ako rad kúzelníckych trikov, z ktorých každý má na starosti jednu malú vec. Video hore je táto epizóda s ilustráciami (39 minút). Článok je skrátená verzia.
Scéna: dvaja, čo držia jedno pero
Tvoj počítač sa stane TLS klientom poskytovateľa. Uzol nosí zašifrované balíčky sem a tam, ako poštár, ktorý obálky otvoriť nevie, a smie do rozhovoru napísať presne jeden kúsok: hlavičku požiadavky s „Authorization: Bearer“ a svojím API kľúčom. Všetko ostatné je zašifrované kľúčmi, ktoré máš iba ty.
Prvý trik: rodokmeň kľúčov

TLS 1.3 nepoužíva spoločné tajomstvo priamo. Vyrastie z neho strom: tajomstvo handshaku, kľúče handshaku, master secret a nakoniec kľúče pre samotný rozhovor. Každý krok je jednosmerný hash. Od rodiča sa dostaneš k dieťaťu, späť nikdy, a jedno dieťa ti o súrodencovi neprezradí nič.
TLS 1.3 má aj KeyUpdate: klient môže prejsť na nový kľúč na odosielanie, odvodený o krok nižšie. Starý a nový kľúč sú súrodenci. Uzlu dáš iba starý, tebe pripadne iba nový plus kľúč pre odpovede servera. Uzol napíše hlavičku, pošle KeyUpdate (odovzdanie pera) a odvtedy píšeš prompt ty, pod kľúčom, ktorý uzol nemá. Poskytovateľ vidí klienta, ktorý poslal hlavičku, vymenil kľúč, ako to TLS dovoľuje, a poslal zvyšok.
Niekto ten strom ešte musí vypočítať, a na javisku nie je nikto, komu by verili obaja. Vypočítate ho teda spolu a koreň nebude nikdy v ničích rukách.
Druhý trik: zapečatená obálka
Ty aj uzol si zvolíte tajné číslo a verejnú hodnotu a poskytovateľovi ide súčet oboch verejných hodnôt. Keby uzol ukázal svoju hodnotu prvý, mohol by si svoju zvoliť tak, že tú jeho vyruší, a celý strom by bol tvoj. Najprv preto pošleš commitment, hash svojej hodnoty zmiešanej s náhodným číslom, teda zapečatenú obálku, a otvoríš ju až potom, čo uzol ukáže svoju hodnotu. Uzol navyše skontroluje tvoju prvú TLS správu a neodošle ju, ak nenesie presne spoločnú hodnotu. (Kvôli tomuto sčítaniu protokol používa krivku P-256, X25519 ho nedovoľuje.)
Tretí trik: tajomstvo, ktoré nemá nikto
Poskytovateľ odpovie svojou verejnou hodnotou. Malý prevodový protokol z nej nechá tebe aj uzlu po jednom náhodne vyzerajúcom čísle a dokopy dajú spoločné tajomstvo. To samotné nie je nikde zapísané.
Štvrtý trik: zamknuté škatuľky

Zvyšok stromu sa z dvoch polovíc počíta cez garbled circuit, voľne „zamiešaný obvod“. Výpočet kľúčov je zapísaný ako približne 650 000 hradiel AND. Uzol vymyslí pre každý vodič dva náhodné labely, jeden pre nulu a jeden pre jednotku, a pre každé hradlo postaví štyri zamknuté škatuľky, v každej správny výstupný label, premiešané. Ty držíš jeden label na vodič, v každom hradle otvoríš práve jednu škatuľku a prejdeš celým obvodom bez toho, aby si vedel, čo ktorý label znamenal.
Na konci má uzol kľúč pre svoj jediný záznam a ty kľúč pre telo požiadavky a kľúč pre odpoveď. Koreň, tajomstvo handshaku aj master secret existovali iba vnútri škatuliek. Obvod vydá aj hashe troch kľúčov, kotvy, ku ktorým sa neskôr priväzujú dôkazy.
Piaty trik: karta, ktorú kúzelník nevidí

Ako dostaneš labely pre svoje tajné vstupy, aby uzol nezistil, ktoré to sú? Oblivious transfer: kúzelník drží dve karty lícom nadol, ty si zoberieš tú, ktorú si vybral, o druhej sa nedozvieš nič a kúzelník sa nedozvie, ktorú si vzal. Pár drahých základných prenosov sa roztiahne (algoritmami KOS a Ferret) na milióny lacných.
Šiesty trik: ako chytiť podvádzajúceho kúzelníka
Škatuľky stavia uzol, takže by mohol postaviť iný obvod, napríklad taký, ktorý skopíruje tvoj kľúč do svojho výstupu. Toto je najnovšia časť protokolu: autentifikované zamiešanie vo variante, kde obvod mieša iba uzol a ty mu kontroluješ prácu. Uzol sa zaviaže k tajnej maske pre každý vodič a každú označí pečaťou vyrobenou kľúčom, ktorý máš iba ty, ako voskovú pečať odtlačenú tvojím vlastným pečatným prsteňom. Pečate sú lineárne, takže sa dá skontrolovať veľa hradiel naraz. Uzol pošle všetky škatuľky (okolo 16 MB) a až potom pošleš ty náhodné semienko, ktoré zmieša všetky hradlá do jednej kontroly. Ak je čo i len jedno hradlo zlé, kontrola zlyhá, iba ak by uzol naslepo uhádol 64-bitové číslo. Kým kontrola neprejde, žiadny výstup nepoužiješ.
Je tu aj drobné písmo. Podvádzajúci uzol môže spôsobiť zlyhanie kontroly len v niektorých prípadoch a z tvojho prerušenia sa niečo dozvedieť. Keď spočítame možné konce relácie, vychádza najviac asi 2,3 bitu a týkajú sa hodnôt čerstvo vytiahnutých pre jedinú reláciu, ktoré sa potom zahodia. API kľúč do obvodu nevstupuje. Pre túto konkrétnu kontrolu zatiaľ neexistuje publikovaný dôkaz ani externé posúdenie a projekt to hovorí otvorene.
Siedmy trik: dokázať niečo a nič neukázať

Dôkazy s nulovou znalosťou sú trik „Kde je Waldo“: veľký kartón s malou dierkou, cez ktorú vidíš Walda, no nie to, kde na stránke je. Protokol ich používa tri. Sú interaktívne a presvedčia druhú stranu v relácii, nikoho iného.
- Uzol dokazuje, že jeho zapečatený záznam je zverejnená šablóna požiadavky s kľúčom správneho tvaru na mieste kľúča, zašifrovaná kľúčom zo spoločného výpočtu.
- Ty dokazuješ, že tvoja požiadavka končí dohodnutým sufixom: názov modelu, maximum tokenov, prepínače ovplyvňujúce cenu. JSON parser poskytovateľa nechá vyhrať posledné pole, takže sufix prebije všetko skoršie. Uzol tvoj posledný záznam zadrží, kým dôkaz neprejde, a poskytovateľ nerobí nič, kým nemá celé telo.
- Na konci odhalíš iba údaj o spotrebe od poskytovateľa a dokážeš, že je skutočným koncom odpovede. Falošný nevyrobí žiadny výstup modelu, lebo všetko, čo model napíše, skončí vnútri escapovaného JSON reťazca. Projekt to skúsil.
Skôr než čokoľvek dokážeš, porovnáš každý parameter od uzla so svojimi záznamami. Uzol tak nemôže namieriť dôkaz na inú časť tvojej komunikácie a použiť áno alebo nie ako nápovedu.
Účet a predhriata rúra
Účtovanie funguje ako hotelová záloha. Uzol tvoj prompt nevidí, takže rezervuje najhorší prípad a potom strhne to, čo nahlásil poskytovateľ. V jednom príklade bola záloha 2 282 milisatoshi a platba 63. Dostaneš podpísanú potvrdenku a porovnáš ju so svojou kópiou údaja o spotrebe.
Všetko to stojí prenos dát: okolo 22 MB od uzla a 1,2 MB späť na jednu požiadavku, plus pár MB na dôkazy. Pri štarte od nuly prišiel prvý token po 14 až 16 sekundách. Nič z toho však nezávisí od tvojho promptu, preto klient relácie predhrieva vopred a zastaví sa tesne pred pozdravom poskytovateľovi. S takou nabitou reláciou prišiel prvý token asi po sekunde, väčšinu z nej premýšľal sám poskytovateľ.
Čo mágia neskryje
Poskytovateľ stále vidí všetko: prompt, odpoveď aj kľúč uzla. Uzol stále vidí veľkosti a časovanie záznamov a z takých vzorcov publikované útoky zrekonštruovali časti AI odpovedí. Pre svoj vlastný záznam môže použiť iný účet, na tvoj obsah siahnuť nemôže. A ak preruší prúd pred údajom o spotrebe, nechá si zálohu. Je to rovnaká dôvera, akú uzlu dávaš dnes, najviac do výšky zálohy.
Pre poskytovateľa je celé predstavenie jeden obyčajný TLS klient. Netuší, že pero držia dvaja.
