Stránka o Zcashi popsala tvar stíněné platby — zapečetěný závazek, jednorázový nulifikátor a důkaz s nulovou znalostí, že je celá věc poctivá — a pak se zastavila u dveří strojovny. Tato stránka ony dveře otevírá. Pojmenovává skutečné součásti: co je vlastně uvnitř noty, jak síť ukládá závazky, aby na jeden mohl důkaz ukázat, co zk-SNARK doopravdy dokazuje a jak Zcash tyto důkazy buduje bez důvěryhodného nastavení.
Jde o úroveň hlouběji, ne až úplně dolů. Úplné, přesné definice jsou normativní kryptografie
a místem pro ně je Zcash Protocol Specification a ZIPy (Zcash Improvement Proposals)
na zips.z.cash — ne jejich kopie zde, která by mohla jen zastarat a zanést chyby. Každý
kousek níže je tedy přesný obrázek plus odkaz na oddíl, který jej definuje přesně. Pravdu
čtěte ve specifikaci; tohle čtěte, abyste věděli, na co se díváte.
Stránka o blockchainu stále používala „otisk" — hodnotu vypočtenou z přesného obsahu bloku, kde jakákoli změna, byť sebemenší, vytvoří úplně jiný výsledek. Tento otisk má název: je to hash.
Hašovací funkce vezme libovolný vstup a vrátí řetězec bitů pevné velikosti. Užitečnou ji zde činí tři vlastnosti. Je deterministická — stejný vstup vždy dá stejný výstup. Je jednosměrná — z výstupu jej nemůžete spustit pozpátku a získat vstup; mohli byste jen hádat vstupy a kontrolovat. A je odolná vůči kolizím — je neproveditelné najít dva různé vstupy se stejným výstupem, takže hash fakticky zastupuje přesně tu věc, která jej vytvořila. (Proof-of-Work ze stránky o blockchainu bylo jen opakované hašování bloku, hádání jednorázového čísla, dokud hash nevyšel s dostatkem úvodních nul.)
Podržte si ty tři vlastnosti. Závazek, nulifikátor i strom níže jsou všechny postaveny z hašovacích funkcí a každý se opírá o jinou vlastnost.
Stíněná hodnota v Zcashi žije v notách. Přehled ve specifikaci tu myšlenku podává jednoduše: hodnotu ve stíněném fondu „nesou noty, které určují částku a (nepřímo) stíněnou platební adresu, což je cíl, kam lze noty posílat." Nota je soukromý ekvivalent mince sedící na adrese.
V současném stíněném protokolu, Orchard, nota zaznamenává hrstku věcí: kdo ji může utratit (stíněná adresa, technicky rozdělená na diverzifikátor a přenosový klíč), kolik má hodnotu (hodnota v zatoshi — 1 ZEC je 100 milionů zatoshi) a několik náhodných hodnot, jejichž jediným úkolem je učinit každou notu jedinečnou a umožnit jejímu vlastníkovi později vypočítat nulifikátor noty. Nic z toho se nezveřejňuje otevřeně. Samotná nota zůstává u svého vlastníka; na řetězec se dostane zapečetěná náhražka (další oddíl) a odděleně zašifrovaná kopie noty — včetně volitelného 512bajtového pole memo —, kterou může přečíst jen její zamýšlený příjemce a kdokoli, s kým sdílí prohlížecí klíč.
Přesný seznam polí je v oddílu Notes specifikace.
Když je nota vytvořena, síť notu nevidí. Vidí závazek noty — krátkou hodnotu vypočtenou z obsahu noty hašovacím závazkovým schématem (Orchard používá jedno zvané Sinsemilla). Specifikace uvádí účel přímo: když je nota vytvořena, „je veřejně odhalen pouze závazek k obsahu noty … To umožňuje udržet hodnotu a příjemce v soukromí, zatímco závazek používá důkaz zk-SNARK při utracení noty ke kontrole, že existuje na blockchainu."
Závazek dělá dvě věci najednou a obě odpovídají vlastnostem hashe výše. Skrývá: protože je hash jednosměrný, zveřejněný závazek neprozradí nic o částce ani příjemci. A zavazuje: protože je hash odolný vůči kolizím, zavazující strana nemůže později tvrdit, že obálka obsahovala nějakou jinou notu — obsah je připíchnut v okamžiku, kdy je závazek zveřejněn. To je ta zapečetěná obálka odolná proti manipulaci z minulé stránky, teď s názvem a mechanismem.
Jakmile je transakce vytěžena do blockchainu, každý závazek noty, který vytvořila, se přidá do jedné struktury: do stromu závazků not. Specifikace jej popisuje jako „inkrementální Merkleho strom pevné hloubky používaný k ukládání závazků not" a kreslí bitcoinovou analogii: jako množina neutracených výstupů „se používá k vyjádření existence hodnoty a schopnosti ji utratit," až na to, že tento strom je pouze přidávací, a tedy sám o sobě nic nedělá proti dvojímu utracení — to je úkol nulifikátoru, níže.
Merkleho strom haší dvojice hodnot dohromady, pak haší tyto výsledky dohromady, a tak dále až k jediné hodnotě na vrcholu zvané kořen. Kořen je hash, který závisí na každém závazku ve stromu, takže je to kompaktní souhrn celé množiny obálek. Zásadní je, že můžete dokázat, že je jeden konkrétní závazek ve stromu, odhalením jen hrstky sourozeneckých hashů podél cesty z onoho listu nahoru ke kořeni — Merkleho cesty — aniž byste odhalili ostatní listy nebo dokonce to, která pozice ve veřejné množině je vaše.
To je ten kousek, který stránka o Zcashi slíbila: je to to, jak se obálky ukládají, aby na jednu mohl důkaz ukázat. Důkaz utrácejícího odkazuje na zveřejněný kořen — v Orchardu se tomuto pevnému referenčnímu bodu říká kotva (anchor) — a v nulové znalosti prokazuje, že utrácená nota sedí někde pod ním.
Zapečetěná obálka, jejíž členství umíte dokázat, stále ponechává původní obavu: co vám brání utratit tutéž notu dvakrát, když nikdo nevidí, kterou notu utrácíte?
Nulifikátor. Je to značka odvozená — hašováním — z noty spolu s tajným klíčem (v Orchardu z klíče odvozujícího nulifikátor). Fungovat ho nutí dvě skutečnosti a opět jsou to jen přestrojené vlastnosti hashe:
Utracení tedy odhalí nulifikátor, který znamená „nějaká nota byla právě utracena — už ji nikdy nepovolte," a přitom mlčí o tom, kterou obálku vyprázdnil.
Nyní máme obálky (závazky) ve stromu (pod kotvou) a jednorázovou značku (nulifikátor). Poslední kousek je sváže do poctivé platby, aniž by vystavil kterékoli z tajemství — a tím je zk-SNARK. Rozbalme tu zkratku, protože každé slovo je skutečným slibem: stručný neinteraktivní argument znalosti s nulovou znalostí (zero-knowledge succinct non-interactive argument of knowledge).
U stíněného utracení v Orchardu zní to, co toto utracení prokazuje, jednoduše řečeno takto: utrácená nota má závazek, který opravdu sedí ve stromu pod zveřejněnou kotvou (platná Merkleho cesta); utrácející drží klíč, který opravňuje k jejímu utracení; nulifikátor byl z oné noty vypočten správně; a částky sedí, takže žádná hodnota nevzniká z ničeho. Přehled několik těchto povinností pojmenovává — že „pro tuto notu existuje nějaký odhalený závazek noty," že „dokazující znal autorizační klíč důkazu noty" a že „nulifikátor a závazek noty jsou vypočteny správně" — a pojmenovává vlastnost, kterou celý návrh kupuje: „když je nota utracena, utrácející pouze dokazuje, že byl odhalen nějaký závazek pro ni, aniž by odhalil který." Přesné tvrzení je vypsáno v oddílu Action Statement (Orchard) specifikace; to je oddíl, který si přečtěte, chcete-li skutečnou věc namísto tohoto shrnutí.
Zbývá jedna otázka: odkud pocházejí pravidla onoho důkazu — pevný obvod, oproti kterému se každý důkaz kontroluje — a mohl by ten, kdo je nastavil, podvádět?
Toto je opravdový historický záhyb v Zcashi. Jeho první dva dokazovací systémy potřebovaly veřejné parametry vygenerované předem: Sprout používal systém zvaný BCTV14 a Sapling používal Groth16, jehož důkazy se kontrolují oproti souboru parametrů vytvořenému jednorázovým nastavením. Toto nastavení zahrnuje tajnou náhodnost a tady je to nebezpečí — kdokoli, kdo si toto tajemství ponechal (takzvaný toxický odpad), by mohl falšovat důkazy a nezjistitelně padělat stíněnou hodnotu. Zcash toto riziko pro ony fondy nikdy neodstranil; omezil jej tím, že parametry generoval ve složitých vícestranných ceremoniích (parametry Saplingu, jak specifikace zaznamenává, vzešly přesně z takového vícestranného výpočtu) navržených tak, aby tajemství zůstalo v bezpečí, dokud byť jediný účastník zničil svůj dílek.
Orchard, aktivovaný v síťové aktualizaci NU5, odstraňuje ten problém u kořene přechodem na Halo 2. Halo 2 nepotřebuje žádný předem vygenerovaný soubor parametrů — specifikace poznamenává, že jeho parametry jsou „generovány za běhu … a nevyžadují soubory parametrů." Žádné nastavení znamená žádnou tajnou náhodnost, což znamená žádný toxický odpad a žádnou ceremonii, které je třeba věřit. Integrita stíněné platby v Orchardu spočívá pouze na matematice dokazovacího systému, ne na ničím slibu, že zahodil nebezpečné tajemství. To je to, co lidé myslí tím, že Halo 2 nemá žádné důvěryhodné nastavení, a proto současný stíněný fond stojí na smysluplně pevnějším základě než ty rané.
Vše výše je orientace, záměrně o úroveň nad normativním detailem. Když potřebujete přesné definice — přesný obsah noty, funkce závazku a nulifikátoru, úplné tvrzení Orchardu, křivky, na nichž je Halo 2 postaveno — jděte k primárním zdrojům:
zips.z.cash zaznamenávají každou změnu protokolu jako samostatný návrh —
Orchard, sjednocené adresy a zbytek — a často jsou mírnějším čtením pro jednu konkrétní
funkci.Berte tuto stránku jako mapu a ony zdroje jako území.