Ethereum som mørk skog

Det at Ethereum kan inneholde smarte kontrakter, det vil si små programmer som utvikles på samme måte som andre programmer, åpner opp for helt nye måter å utføre angrep på. Det er notorisk vanskelig å unngå feil i programvare, og når feilen er publisert til en blokkjede, er den også svært vanskelig å rydde opp i. I Ethereum er kildekoden åpen. Ondsinnete aktører har derfor sterke insentiver til og får god hjelp med å lete etter feil i smarte kontrakter.

Dan Robinson og Georgios Konstantopoulos beskriver én slik hendelse i artikkelen Ethereum is a Dark Forest. Med mørk skog mener de et sted hvor du er omgitt av rovdyr som er så avanserte at bare det å bli oppdaget av dem fører til en sikker død. De farligste rovdyrene i Ethereum er ikke de som leter etter feil i eksisterende kontrakter, men “arbitrage bots” som følger med på transaksjoner som ikke er utført ennå og leter etter muligheter til å utnytte disse. I en blokkjede som Ethereum legges ikke nye transaksjoner umiddelbart på blokkjeden. De legges til i en mempool, et midlertidig lagringssted. Så er det opp til utvinnerne, minerne, å sette disse sammen til blokker som kan legges til kjeden.

Altså forteller innholdet i mempoolen deg hvilke transaksjoner folk ønsker å utføre. Hvis kontrakten er satt opp riktig, har ikke dette så mye å si, men hvis den inneholder hull, kan transaksjonen brukes til å fortelle en bot hvordan hullet kan misbrukes. Ett vanlig angrep er å kjøre en generalised frontrunner, en bot som leter etter bestemte transaksjoner, kopierer dem, bytter ut adressene med sine egne, og legger sin egen transaksjon lenger frem i køen ved å betale en høyere transaksjonsavgift.

La oss for eksempel si at en smart kontrakt har en metode som heter “send ether til X”. Denne skal egentlig bare kunne kalles av meg, men jeg har gjort en feil som gjør at alle kan kalle den. Jeg oppdager feilen, men fordi jeg ikke kan endre kontrakten, bestemmer jeg meg for å skyndte meg å hente ut alle verdiene kontrakten har tilgang til, før noen andre stjeler dem. Jeg lager en transaksjon som kaller metoden med meg som mottaker. Men en bot ser transaksjonen min, kopierer den, fyller inn sin egen adresse i stedet og kjører den med høyere prioritet. Verdiene er borte.

Det er omtrent et slikt angrep Robinson og Konstantopoulos beskriver. I deres tilfelle lå ether tilsvarende $12 000 fra en transaksjon igjen inne i kontrakten på en slik måte at hvem som helst kunne hente dem ut. For å unngå frontrunners, delte de løsningen sin i to små kontrakter som måtte kalles på riktig måte i riktig rekkefølge. Dette skulle gjøre det vanskeligere for en bot å komme dem i forkjøpet. Men de gjorde en feil, fikk hastverk, slurvet, og plutselig var verdiene borte.

Ethereum-utvikleren samczsun forteller om et annet slikt rovdyrmøte i artikkelen Escaping the Dark Forest. Han snublet over en feil i kontrakt som gjorde at hvem som helst lett kunne hente ut ether tilsvarende $9.6 millioner. Sammen med en gruppe Ethereum-eksperter kom de fram til at løsningen ville være å hente ut verdiene med en hemmelig transaksjon. Det vil si, registrere transaksjonen i mempoolen til én Ethereum-utvinner og be som drev denne noden om å ikke spre transaksjone videre, slik man normalt skal gjøre. Neste gang denne utvinneren “vant” retten til å forme en blokk, ville transaksjonen dukke opp rett på blokkjeden, uten at noen ville ha mulighet til å komme den i forkjøpet.

I deres tilfelle lyktes operasjonen og verdiene ble overført til deres tiltenkte eier.

For de som lurer på hvordan man kan gjøre en så dum feil når så store verdier står på spill, kan du lese kontraktkoden her og kontrakteierens beskrivelse av feilen. Det er mer enn to tusen linjer kode.