Ethereum står bag en af de mest populære kryptovalutaer – og alligevel er den meget mere end det. Takket være algoritmer kan kryptovalutaen styres helt autonomt. Men hvordan fungerer »smart contracts«, og hvor langt er vi nået?
Hvordan fungerer smarte kontrakter i Ethereum?
For at forstå princippet om smarte kontrakter i Ethereum må vi først tage en lille tur ind i programmeringssprogenes verden. Nuværende programmeringssprog er grundlæggende opdelt i to grupper: fortolkede sprog og kompilerede sprog. I den første gruppe skrives programmer i et højniveausprog og udføres derefter af en fortolker. To populære eksempler er Python og JavaScript. Fortolkede sprog er almindelige inden for mange anvendelsesområder (som f.eks. internettet), fordi de gør det muligt at komme i gang med det samme. De er også meget universelle og kan bruges på forskellige platforme uden behov for yderligere værktøjer.
I modsætning hertil er der kompilerede sprog, hvor en compiler først konverterer programteksten til et andet sprog – ofte binær maskinkode. Denne binære kode er platformsafhængig og udføres direkte på en processor. Compileren kan (og bør) producere tilpasset kode til processorens instruktionssæt, f.eks. til ARM- eller Intel-kompatible CPU’er. Kendte repræsentanter for denne type er C og Rust.
Men virkeligheden er som altid mere kompleks, end disse enkle kategorier antyder. I nogen tid har der været hybridformer, som for eksempel Java. Java-compileren oversætter ikke Java-kode direkte til »rigtig« maskinkode, men til et særligt mellemformat. Dette mellemformat udføres så igen af en fortolker – den virtuelle Java-maskine – på processorens konkrete arkitektur.
Ethereums smarte kontrakter fungerer også på samme måde. Alle de noder, der validerer transaktioner og udtrækker ny valuta i Ethereum, indeholder en instans af Ethereum Virtual Machine (EVM). The Yellow Paper, Ethereums tekniske specifikation, definerer i detaljer de instruktioner, der understøtter EVM’en – og hvordan de skal udføres.
Dette er en proprietær udvikling med en række særlige funktioner:
Interaktion med omverdenen er ikke mulig: Alle algoritmiske beslutninger skal komme fra blockchainen og dens transaktioner.
Aritmetikken er baseret på 256-bit-værdier for at gøre det lettere at håndtere større adresser og beløb.
Særlige operationer som f.eks. hashfunktioner er integreret for at øge ydeevnen.
Alle instruktioner tildeles en omkostningsfunktion (fuel), som omtrent svarer til den krævede udførelsestid og den krævede mængde hukommelse. Udtrykket metering bruges ofte på engelsk.
Programmering på EVM’en
Som med Java-økosystemet er der flere programmeringssprog, som EVM-compilere er tilgængelige for. Det mest almindelige sprog er Solidity, som overfladisk (syntaktisk) ligner JavaScript. I slutningen af 2020 nævner Ethereums dokumentation yderligere to sprog: Vyper, som er baseret på Python, og Yul Plus, som er en helt uafhængig udvikling.
Alle disse sprog har det til fælles, at de er domænespecifikke, fordi de i modsætning til generelle sprog indtager en niche med særlige egenskaber og især en særlig eksekveringsmotor: EVM. Selvfølgelig er disse domænespecifikke sprog (DSL’er) grundlæggende en god idé til at reducere kompleksiteten i applikationer.
Men når det gælder EVM, ser det ikke ud til at give meget mening. Det kan trods alt – uanset den manglende evne til at interagere med verden uden for blockchainen – udføre vilkårlige algoritmer, så det er (for at sige det enkelt) Turing-komplet.
Hvorfor ikke bruge et eksisterende sprog og eksekveringsmiljø?
Hvis det er nødvendigt, skal noget funktionalitet fjernes, men vi kan trække på længere erfaring, mere stabile værktøjer og – meget vigtigere – en bredere base af programmører. Faktisk er det almindeligt kendt, at et programmeringssprogs popularitet i dag ikke kun afgøres af, om det er særligt kortfattet, typesikkert eller dynamisk, men også af, hvor let det er at få adgang til de mange eksisterende biblioteker og pakker. Dette tidsskifte illustreres bedst af JavaScript, som ofte kritiseres for sin grove semantik, men som må betragtes som det mest populære programmeringssprog senest siden den millionte NPM-pakke.
Webassembly, et universelt mellemsprog
Folkene bag Ethereum-specifikationen kom til den konklusion, at visse problemer kunne løses ved at opgive brugerdefineret udvikling til fordel for et universelt sprog. Hvor belejligt, at der er udvikling i gang på nettet for at etablere et alternativ til den store hund JavaScript: Webassembly (WASM). Det er både et universelt mellemsprog og et binært format, kombineret med en specifikation for fortolkere. Som navnet antyder, blev denne åbne standard oprindeligt designet til internettet. I mellemtiden er andre anvendelsesområder (f.eks. smartphone-applikationer) blevet undersøgt.
Udviklingen af WASM ledes af industrigiganter som Microsoft, Google og Apple. En vigtig egenskab ved sproget er, at det fra starten er designet til at være bærbart. Det kan ses ved, at mange eksisterende programmeringssprog som Rust, C++ eller Go allerede kan kompilere til web assembly.