Kontrakt nesmí sáhnout ven, jinak by se uzly neshodly. Jenže spousta užitečných věcí potřebuje vědět, kolik stojí dolar, jestli zásilka dorazila nebo kdo vyhrál zápas.
Řešení se jmenuje oracle a je to nejslabší článek většiny postavených systémů.
Problém, který nejde obejít
Blockchain je uzavřený svět. Ví jen to, co do něj někdo zapsal transakcí. Nemá hodiny podle skutečného času, nemá internet a nemá čidla.
Oracle je tedy prostě někdo, kdo data zapíše. A tím se do bezdůvěrného systému vrací otázka, komu věřit.
Kontrakt může být bezchybný a stejně se dá o všechno připravit, když ho někdo nakrmí špatným číslem. Většina velkých ztrát v téhle oblasti nevznikla chybou v kontraktu, ale manipulací se vstupem.
Jak se to dělá lépe a hůř
Nejhorší varianta: jeden zdroj. Kontrakt čte cenu z jedné adresy. Kdo ovládne ten klíč, ovládne všechno, co na ceně závisí.
Špatná varianta: cena z jednoho bazénu. Vypadá to bezdůvěrně, protože se čte přímo z blockchainu. Jenže bazén se dá na jednu transakci překlopit: půjčíš si obrovskou částku, posuneš cenu v bazénu, necháš kontrakt přečíst zmanipulovanou hodnotu, vytěžíš to a půjčku vrátíš, všechno v jediné transakci. Tomu se říká manipulace ceny a je to nejčastější způsob, jak se vybírají DeFi protokoly.
Lepší varianta: časově vážený průměr. Místo okamžité ceny se čte průměr za delší dobu. Manipulace pak vyžaduje držet cenu mimo trh po celou tu dobu, což stojí mnohonásobně víc.
Nejlepší dostupná varianta: víc nezávislých zdrojů s ekonomickou zárukou. Několik poskytovatelů podepisuje hodnoty, bere se medián a ti, kdo dodají špatná data, přijdou o vklad. Není to bezdůvěrné, ale důvěra je rozdělená a špatné chování je potrestané.
Věc, kterou blockchain neumí a nikdy nebude
Oracle problém není technická nedokonalost, kterou někdo jednou vyřeší. Je to hranice systému. Blockchain umí zaručit, že se s daty po zápisu nic nestane. Nemůže zaručit, že data byla pravdivá v okamžiku zápisu.
Odtud plyne užitečný test pro každý nápad na blockchainu:
Kolik toho závisí na datech zvenčí? Přesně tam leží skutečná důvěra celého systému.
U sledování původu zboží je to sto procent. U směny dvou tokenů uvnitř řetězu nula. Většina reálných nápadů je někde blízko té stovky, a proto u nich blockchain nedává smysl, jak jsme si řekli v první kapitole.
Cvičení
- Kontrakt na půjčky čte cenu zástavy z bazénu na burze. Popiš, proč je to nebezpečné.
- Jak pomůže časově vážený průměr a co za to zaplatíš?
- Proč se oracle problém nedá vyřešit lepší kryptografií?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
- Protože cena v bazénu se dá krátkodobě posunout obchodem a kontrakt tomu uvěří. Útočník si může v rámci jediné transakce půjčit velkou částku bez zástavy, překlopit poměr v bazénu, nechat kontrakt přečíst nesprávnou cenu, vytěžit z toho výhodu a půjčku vrátit. Vše proběhne atomicky, takže se to nedá zachytit mezi kroky. Obrana je nečíst okamžitou cenu z jednoho bazénu, ale průměr přes čas a ideálně z více zdrojů.
- Manipulace pak musí trvat celé okno průměru, což je řádově dražší. Posunout cenu na jeden blok stojí jednu transakci; udržet ji posunutou třicet minut znamená bránit se arbitražérům, kteří cenu tlačí zpět a berou si na tom zisk. Zaplatíš za to zpožděním: průměr reaguje na skutečné pohyby pomaleji, takže při rychlém pádu může kontrakt pracovat se zastaralou hodnotou a likvidace přijdou pozdě.
- Protože to není problém přenosu dat, ale jejich původu. Kryptografie umí zaručit, že zprávu poslal držitel klíče a že se cestou nezměnila. Neumí zaručit, že to, co ten držitel napsal, odpovídá skutečnosti. Jediné, co s tím jde dělat, je rozdělit důvěru mezi víc nezávislých stran a udělat lhaní ekonomicky nevýhodným, tedy problém zmenšit, ne odstranit.
Shrnutí
- Kontrakt nemá přístup ven, takže data zvenčí musí někdo zapsat transakcí.
- Tím se do bezdůvěrného systému vrací otázka, komu věřit, a je to jeho nejslabší článek.
- Čtení okamžité ceny z jednoho bazénu je nejčastější příčina velkých ztrát v DeFi.
- Časově vážený průměr manipulaci prodraží, ale zpomalí reakci na skutečné pohyby.
- Blockchain zaručí neměnnost dat po zápisu, nikdy ne jejich pravdivost při zápisu.
Proč je oracle nejslabším článkem systémů postavených na kontraktech?
Protože kontrakt nemá přístup k vnějšímu světu a musí věřit tomu, kdo mu data zapíše. I bezchybný kontrakt se dá připravit o prostředky tím, že dostane nesprávné číslo. Většina velkých ztrát v této oblasti vznikla manipulací vstupu, ne chybou v kódu.
Proč je nebezpečné číst cenu z jediného likviditního bazénu?
Protože cenu v bazénu lze posunout jedním velkým obchodem a kontrakt jí uvěří. Útočník to zvládne v rámci jediné transakce i bez vlastního kapitálu, pokud si částku půjčí a ve stejné transakci vrátí. Obranou je číst průměr za delší dobu a kombinovat víc nezávislých zdrojů.
Proč se oracle problém nedá vyřešit kryptografií?
Protože kryptografie řeší pravost a neměnnost přenosu, nikoli pravdivost obsahu. Podpis dokáže, že hodnotu zapsal držitel klíče, ale ne že hodnota odpovídá skutečnosti. Zmírnit to jde jen rozdělením důvěry mezi víc nezávislých zdrojů a ekonomickým postihem za nesprávná data.
