Ethereum, IPFS en distributed applications.

De afgelopen weken heb ik wat onderzoek gedaan naar een interesse en irritatie van mij. Onlangs moest ik een contract ondertekenen en het kwam weer neer op het gebruikelijke proces. Ik ontving het contract in pdf via de email en vervolgens moest ik een aantal stappen door om het contract (zonder te printen en te scannen) terug te kunnen sturen.

  • PDF openen met Photoshop,
  • Vector van mijn digitale handtekening er in plakken
  • Van alle pagina's weer een PDF maken
  • Terugsturen.

Behoorlijk vervelend, zeker nu er ook bedrijven zijn die dit niet meer accepteren en alleen de, nog vervelendere, print en scan methode accepteren. Nu weet ik al een tijdje dat er alternatieven bedacht worden voor dit proces via blockchain.

Zo kwam ik in aanraking concepten om de ethereum blockchain te gebruiken om documenten (en bestanden) te ondertekenen. In deze post wil ik uiteenzetten hoe dat in zijn werk gaat en wat er nu al mogelijk is. Daarnaast zal ik ook nog een paar kanttekeningen plaatsen over hoe ik dit binnen bestaande juridische kaders zie. Tot slot som ik voor- en nadelen op en vertel ik welke kant ik denk dat de ontwikkeling op moet.  

Om te beginnen moeten we eerst een aantal dingen verhelderen. Een van de meest complexe en verwarrende elementen van blockchain is de terminologie. Ik ga er gemakshalve van uit dat men weet wat blockchain technologie is. Mocht je dat niet weten geef een keer een belletje dan leg ik het uit 🙂

Laat ik een aantal termen definieren en uit elkaar halen om verwarring te voorkomen:

  • Smart contract dit is een applicatie die draait op de blockchain. Het is een zeer ongelukkig gekozen term omdat het de suggestie wekt dat het over een 'slim contract' gaat. Het is niet slim en het is geen contract. Vitalik, de uitvinder van Ethereum heeft zelfs spijt van deze term.
  • dApp staat voor distributed application en bestaat eigenlijk uit een smart contract en de (web)applicatie daaromheen. Het is dus eigenlijk het blockchain script (smart contract) zelf en de (web)interface om er mee te werken. In de praktijk is dit vaak een statische HTML pagina met een formulier om bewerkingen uit te voeren op het script.
  • IPFS Interplanetary file system staat in principe los van blockchain. Toch is het een platform dat een aantal raakvlakken met blockchain heeft. De oorspong is in ieder geval deels hetzelfde. Het lijkt een beetje op peer to peer filesharing en torrents. In dit specifieke geval is het mogelijk om bestanden gedistribueerd op te slaan. Een bestand wat je in IPFS opslaat wordt verspreid over verschillende servers (locaties) en is daarom gedecentraliseerd. Het verwijderen van het bestand van één server zal er dus niet toe leiden dat het bestand ook echt verdwijnt.
  • Wallet Je wallet is eigenlijk jouw persoonlijke blockchain toegang. Het is een applicatie waarmee je transacties kan doen. Deze transacties zijn gekoppeld aan het adres van je wallet. Je wallet is doorgaans stevig beveiligd.  Een van de meest bekende ethereum wallets is de metamask extensie voor je browser. Verder is het nog belangrijk om te weten dat er transparantie is. De transacties van een bepaalde wallet zijn publiekelijk in te zien.

Je zou je misschien af kunnen vragen wat een wallet te maken heeft met het ondertekenen van een bestand. Het is daarom van groot belang om te begrijpen dat iedere interactie met de blockchain en in die zin ook iedere interactie met een distributed app in de vorm van een transactie gaat. Om een stukje data naar de blockchain te 'verzenden' moet je een kleine transactie doen. Een transactie kan namelijk metadata bevatten en dat is de enige manier waarop je interacties met de blockchain kunt doen. Zelfs het creëren van een smart contract gaat ook op die manier, door middel van een transactie met in de metadata de code voor het smart contract.  Vervolgens kun je de functies van een script (smart contract) dan ook weer aanroepen door een transactie met die functie te doen.

Hoe werkt het?

Als we de complexiteit van de blockchain niet te veel uitdiepen zijn er eigenlijk drie elementen in het proces om een document (bestand) te ondertekenen. In de eerste plaats moeten we een unieke versie van het bestand ergens opslaan. Ten tweede moeten we bestand in kwestie  kunnen ondertekenen. Tot slot is het nodig om te verifiëren dat de ondertekenaar ook echt een (rechts)persoon is.

Voor zover ik tot nu toe kan overzien zijn stap een en twee goed te tackelen. Een unieke versie van een bestand op het internet permanent opslaan kan met behulp van IPFS. Het enige risico hiervan is dat er een kans is dat het bestand in zijn geheel verdwijnt. Momenteel is dit te voorkomen, maar dat vereist dat je zelf IPFS support door daar een server voor te draaien. Je voelt het al aankomen, dit zou je kunnen zien als soort achilleshiel van dit verhaal.

Stap 1:  Gedecentraliseerde applicatie

Om een bestand te kunnen ondertekenen is er een dApp nodig. De toepassingen die ik daar tot nu toe van gezien hebben bestaan eigenlijk uit heel eenvoudige applicaties. De dApp en het onderliggende script (smart contract) kennen een beperkt aantal functies. In de eerste plaats accepteert het script een set aan ondertekenaars. Daarnaast kan je ook de hash van een bestand meesturen. De applicatie kent dan eigenlijk ook twee mechanismes. Enerzijds is dat het publiceren van een bestand en anderzijds is dat het ondertekenen van dat bestand. We gaan deze uitleg verder met het publiceren van het bestand.

Stap 2: Een unieke versie bestand online publiceren.

De dapps maken gebruik van IPFS om een unieke versie van een bestand gedistribueerd online te zetten. Dit voltrekt zich in twee stappen. In de eerste stap wordt een unieke sleutel van een bestand berekend (hash). Zo kunnen we dit specifieke bestand altijd identificeren aan de hand van die sleutel. Zo'n sleutel klinkt misschien complex, maar in de praktijk is het niet veel meer dan een lange alfanumerieke code:

QmYuVjkGTFSqeHxicwgjNkJAnkZzvW6Xyyazm9B3VaWWGw

Dit bestand kan je dan vervolgens door middel van deze hash online terugvinden:

https://gateway.ipfs.io/ipfs/QmYuVjkGTFSqeHxicwgjNkJAnkZzvW6Xyyazm9B3VaWWGw

In de gedecentraliseerde applicatie kan je dus een bestand kiezen. De applicatie upload dit naar het IPFS alwaar het bewaard zal worden aan de hand van de unieke sleutel. Het unieke van deze toepassing is dat deze unieke sleutel vastgelegd wordt in de applicatie. Zo 'weet' de applicatie eigenlijk wat er precies  'ondertekend' wordt.

Stap 3: Digitaal ondertekenen

Het ondertekenen is het laatste en waarschijnlijk meest complexe onderdeel van dit proces. In het kort komt het er op neer dat je het adres van je ethereumwallet via de dapp verbind aan het bestand dat je net op IPFS geplaatst hebt. Jouw dapp bevat dan dus een lijst van wallet addressen en een hash van een bestand.

De distributed app heeft dus twee functies in de vorm van transacties die je met je wallet doet. De eerste functie hebben we in stap twee besproken, het toevoegen van de hash van het te ondertekenen bestand aan de blockchain. De tweede functie is simpelweg het toevoegen van je wallet adres aan de blockchain. De distributed app zorgt er vervolgens voor dat je wallet adres gekoppeld wordt aan de hash van het bestand dat je geupload hebt. Aangezien transacties en inhoud transparant zijn, kun je als externe partij 'zien' wie (welk adres) het bestand allemaal ondertekend heeft. Specifiek omdat je aan de hand van de hash van het bestand, het bestand zelf op IPFS terug kan vinden.

Schematisch overzichtje

Digitaal ondertekenen via blockchain (ethereum) & IPFS, in de hoop e.e.a. begrijpelijker te maken. 🙂

Conclusie

Het grootste probleem van deze approach wordt duidelijk in het eerste element wat ik noem. Je ondertekend met je wallet adres en hoewel ik best wat onderzoek heb gedaan naar gedistribueerde identiteit heb ik het gevoel dat het momenteel nog lastig is om dit te herleiden naar een (rechts)persoon.

In mijn ogen is dat ook best opvallend, omdat ten tijde van de crypto hype diverse bedrijven bezig waren met dit probleem. Met name rondom veelbelovende initiatieven zoals uPort en Civic is het volgens mij behoorlijk stil geworden. Dat is jammer, want ik denk dat dit nog steeds veelbelovende technologie is. Mocht iemand op dit gebied meer weten over deze technieken dan hoor ik het graag 👍

Risico's en nadelen

  • Het ondertekenende wallet adres is niet noodzakelijk te herleiden naar een (rechts-)persoon.
  • Bij het unpinnen van het bestand kan garbage collection op IPFS het bestand doen verdwijnen.
  • In deze specifieke situatie is het ondertekende bestand via de genoemde hash publiek beschikbaar, minder prettig als je de inhoud van je contract niet wilt delen. Dit neemt niet weg dat het kinderlijk eenvoudig is om het bestand in kwestie te beveiligen of te versleutelen.

Voordelen

  • Consent geven is voor mijn gevoel extreem duidelijk. Een transactie met jouw wallet doen spreekt voor zich en doe je niet zomaar. In die zin zou ik het in termen van rechtsgeldigheid hoger inschatten dan de standaard 'I agree' checkbox die je op het internet veelvuldig tegenkomt.
  • Het proces is volstrekt online en transparant.