Meer dan een timestamp
Laten zien dat je iets bezit, een ander laten weten dat jij de eigenaar bent, eigenaar van iets unieks: daar zijn we als mens heel goed in; we houden ervan. Een uniek olieverfschilderij van Rembrandt, de eerste of juist laatste afdruk van een exclusieve foto of een gesigneerd album in gelimiteerde oplage van je favoriete band. In de echte wereld zijn we gewend dat eigenlijk alles uniek is, het een iets unieker dan het ander. Volledige uitwisselbaarheid of fungibiliteit, zoals met geld, dat is pas een bijzondere eigenschap.
In onze digitale wereld, ons ecosysteem dat bestaat uit enen en nullen, onze vrijplaats waar alles kan wat in het echt niet kan, daar is het heel lastig om zaken uniek te maken. Hoe ben je er zeker van dat iets niet gekopieerd is en niet ook bij duizenden anderen is? Dat kun je oplossen met een timestamp of tijdstempel. Als je die dan ook nog vastlegt op een zwaar beveiligd netwerk als de bitcoinblockchain, dan ben je helemaal klaar. Leg een hash van je contract, plaatje of document met een timestamp vast door het te ondertekenen met een geheime sleutel van de eigenaar en niemand anders kan er nog wat mee doen. Klaar.
/i/2004279538.png?f=imagenormal)
Wil de mens een timestamp als bewijsje, als reçuutje? Nee blijkt, we willen meer, ook digitaal. In sommige landen is het zelfs volstrekt normaal om na een ruzie met je geliefde een digitaal stickerpack met bloemetjes te sturen. Zelfs een stickerpack voor een begrafenis is oké. Gamers herkennen dat gevoel van digitaal bezit ook en dat sijpelt nu langzaam door naar de gewonemensenwereld. Dat verklaart de recente aandacht voor non-fungible tokens of nft's. Wat is zo’n non-fungible token en hoe maak je zo’n ding eigenlijk? Deels is het een kwestie van gevoel, maar gelukkig is er ook een technische kant die je gewoon in code kunt stoppen. Gevoel beveiligd door keiharde cryptografie.
Timestamps
Timestamps worden al heel lang toegepast, een blockchain met een goed consensusmechanisme zorgt er hooguit voor dat je zeker weet dat die timestamp in de toekomst niet kan worden aangepast en dat dus niemand iets kan wijzigen. Dat wordt ook al lang gedaan met behulp van bijvoorbeeld de bitcoinblockchain of sidechains daar bovenop of andere blockchains, zoals die van ethereum of eosio. Het Nederlandse NRC begon niet zo lang geleden met het timestampen van zijn berichten via WordProof, een Nederlandse start-up die in het afgelopen jaar een innovatieprijs won in de blockchain for social good-wedstrijd van de EU. Die timestamps kun je, samen met de verwijzing naar de eosio-blockchain, terugvinden in de bron van de berichten van die krant. De krant past dit toe om zo onder andere de betrouwbaarheid richting zoekmachines te vergroten.
Dat is slechts een timestamp, zonder verdere eigenschappen, behalve een hash. Na een eventuele wijziging moet het artikel opnieuw een stempel krijgen. Technisch solide, maar weinig franje.
Iets unieks bezitten, daar begonnen we dit verhaal mee. In de Tweakers-podcast van 11 maart ging het ook over nft’s. Jur en Wout verbaasden zich over die nieuwe blockchaingekkigheid met dingen als NBA Topshots, korte videootjes van belangrijke momenten in de footballgeschiedenis, die je kunt kopen als nft. En dat je daar niet eens de rechten op hebt; je koopt alleen de bragging rights en 'daar is die hele handel op gebaseerd!' roept een verbolgen Jur vervolgens uit.
/i/2004279544.png?f=imagenormal)
Daarin lijken nft’s soms precies op het fysieke leven. Al jaren zijn er koekblikken, placemats en schorten met afbeeldingen van Rembrandts Nachtwacht te krijgen. Als je diep in de buidel tast, kun je van steeds meer kunstwerken 3d-geprinte, fysieke exemplaren krijgen, voor de leek op afstand niet van echt te onderscheiden. Toch vinden de meesten dat het werk in het museum meer waard is. Hoe laat je zien dat jij het enige echte hebt?
In de kunstwereld is het vastleggen van eigenaarschap, echtheid en herkomst al lang een gewoonte, iets wat in Nederland begon bij het opkomen van de kunsthandel in de zeventiende eeuw. De fase van experimenteren met het vastleggen van de herkomst op verschillende blockchains is ook al een tijdje voorbij. Het gaat dan om een digitaal bewijs dat bij elke keer dat een fysiek kunstwerk van eigenaar wisselt, ook de digitale token van eigenaar verandert. Letterlijk gaat het van het ene, vaak ethereum-, adres naar het andere, al zullen de meeste kunstbezitters daar geen weet van hebben omdat het achter de schermen van bedrijven als Artory gebeurt. Ook gerenommeerde veilinghuizen en andere kunsthandelaren maken gebruik van dat soort diensten, maar vooralsnog ging het slechts om het vastleggen van voorheen analoge contracten in een beter te volgen digitale vorm.
Waarom staan nft's dan nu ineens zo in de belangstelling? Dat komt doordat Christie's, een traditioneel kunstveilinghuis, ineens een nft ging veilen. Dat leidde direct tot een hype en veel bekendheid. Dat leidt weer tot hoge prijzen en in de nabije toekomst vermoedelijk veel tranen, maar het heeft ook tot gevolg dat een hele nieuwe groep aan de slag gaat met het onderzoeken van hoe je gebruik kunt maken van dit soort digitale tokens.
Foto: gremlin / Getty Images
Een nft van 69 miljoen dollar
Christie’s deed in maart 2021 een stevige duit in het zakje rond digitale kunst; het verkocht een kunstwerk als nft via zijn platform. Kunstenaar Beeple stelde de nft genaamd ‘Everydays: the first 5000 days’ samen uit vijfduizend dagelijkse werkjes. Onder het Beeple-pseudoniem maakte Michael Winkelmann vijfduizend dagen achter elkaar, dus zo’n dertien jaar, elke dag een prentje. Dat begon heel knullig en eindigde best aardig. De veiling ging van start met een openingsbod van 100 dollar en sloot uiteindelijk op 11 maart met een bod van 69 miljoen dollar. De werkjes kon je overigens al eerder krijgen als losse nft’s.
De in de cryptovalutawereld bekende Justin Sun, oprichter van onder andere Tron, wilde het kunstwerk koste wat het kost hebben, maar werd op het laatste moment met een miljoentje of wat overtroefd door de eigenaar van nft-tokeninvesteringsvehikel MetaPurse, die zich MetaKovan noemt.
/i/2004256062.png?f=imagenormal)
Op de site van Christie’s is het walletadres te zien, evenals het smartcontractadres, waarmee je in principe tot in lengte van dagen het werk moet kunnen volgen. Verder verwijst het smart contract naar een hash op het Interplanetary File System, die weer verwijst naar de plek waar het ruim 300MB grote werk opgeslagen is, al is daar het laatste woord op Twitter nog niet over gezegd.
Is dit kunstwerk nu dan in het bezit van de koper? Wie heeft het copyright? Dat hangt helemaal af van de afspraken die er vervolgens gemaakt zijn. In geval van de Topshots-serie heb je alleen de rechten op de token die je zelf bezit, niet op het videootje. Toch leidt dit tot digitale schaarste, ook al kan iedereen nog steeds hetzelfde beeld naar voren halen op het eigen scherm.
Bij de huidige hype lijkt het ook belangrijk om te laten zien dat je behoort tot de nieuwe rijken, de nouveau riche van de cryptovalutawereld. De bedragen liegen er niet om. Zo werd de eerste tweet van Jack Dorsey voor 2,5 miljoen dollar geveild als nft. Dat riep direct veel vragen op: waar gaat het hier om? Zo kun je alles wel nft'en.
De eerste hype
Eind 2017 was er een iets minder bekende hype rond nft’s met de zogenaamde Cryptokitties. Ze bestaan nog, maar zijn veel minder waard dan toen. Het is eigenlijk een spel en door je katjes met elkaar te laten ‘paren’ of 'siren', kun je nieuwe katjes krijgen. Je kunt je katjes verkopen of veilen, of verhuren om te laten paren. Dit kan allemaal door een destijds nieuwe standaard die was toegevoegd aan ethereum: de ERC-721-standaard. Door aan dit specifieke type smart contract bepaalde eigenschappen toe te kennen, had elk katje een unieke verschijningsvorm.

Een ERC721-token bevat wat data, heeft een eigenaar en kan weer van eigenaar veranderen. De data kan uit verschillende zaken bestaan, zoals een token-URI die verwijst naar een externe opslaglocatie van bijvoorbeeld het plaatje of de video. Meestal is dat een centraal beheerde server, maar het kan ook op het IPFS zijn. Het is niet eens verplicht om een hash van die data te maken, waarmee je in ieder geval nog iets van uniciteit kunt meegeven. Eigenlijk is het niet veel meer dan een timestamp met wat meer informatie. Om eventueel rechten over te dragen, zul je vooralsnog andere systemen moeten gebruiken, bijvoorbeeld met een ander smart contract of iets in de fysieke wereld.
Inmiddels bestaat ook de ERC-1155-standaard, een enkel contract om verschillende tokens te beheren, zoals in-game items die op zich uniek zijn, maar wel een klasse van items vormen. Of de zogenaamde composables onder ERC-998 voor combinaties tussen fungibele en niet-fungibele tokens. Daarnaast zijn het natuurlijk niet alleen op ethereum gebaseerde systemen, maar er zijn ook andere systemen actief, zoals Cosmos en natuurlijk de Colored Coins op bitcoin.
Hoe werkt het eigenlijk?
De meeste nft’s zijn plaatjes of video’s, maar sommige zijn als nft 'geboren' door een smart contract een actie uit te laten voeren en daarmee nft’s te creëren, zoals Cryptokitties en de CryptoPunks. Andere items die je als nft kunt zien, zijn items in games, van kleding in Fortnite tot Gods Unchained-kaarten. Ook zaken als domeinnamen zou je onder nft’s kunnen scharen.
Mick de Graaf, ethereumdeveloper, is al jaren bezig met smart contracts. Hij geeft aan dat het heel fijn is dat er standaarden zijn gekomen voor nft’s, omdat je anders geen applicaties om de tokens heen kunt bouwen, zoals een marktplaats. “Je had vroeger bijvoorbeeld de Cryptopunks en Mooncats. Die worden nu gewrapt in ERC721-tokens. Dat wrappen kun je dan doen door zelf een contract in Solidity te schrijven, maar makkelijker is het om bestaande contracten om te werken voor je eigen doel, zoals van OpenZeppelin.”
/i/2004279548.png?f=imagenormal)
De Graaf legt uit dat iedereen voordat er standaarden bestonden, zijn eigen implementaties schreef. Daardoor was het lastig om nft’s in verschillende wallets of andere plaatsen weer te geven of te gebruiken. “Met de standaard zijn bepaalde dingen veel makkelijker geworden”, zegt hij. “Denk aan het versturen van tokens en iemand anders toestaan een token van jou te versturen. Dat kan bijvoorbeeld als je een derde applicatie hebt om een token te verkopen. Dan hou je hem wel zelf in bezit, maar als de token dan verkocht wordt, swapt de applicatie het geld voor de nft. Maar denk ook aan metadata: welk stukje hoort bij jouw token? Zoals het verwijzen naar een URI of URL, dat heeft een standaardformat waarin je kunt zien wat het plaatje is en wat de attributen zijn. Nu wordt vaak naar een IPFS-link doorverwezen. De vraag is natuurlijk: hoeveel eigenaarschap heb je als de URI naar een centrale locatie verwijst?”
Toch is het verdwijnen van bestanden geen enorm probleem volgens De Graaf. “Als niemand het meer host, is het weg, net als bij een torrent: als niemand meer seedt, is het weg. Als je echter de originele afbeelding hebt en die weer host, dan wordt die weer gekoppeld aan dezelfde hash, waardoor de afbeelding terug is. De verwijzingen zelf verdwijnen niet. Kwestie van rechtermuisknop, opslaan en als je het er een jaar later weer opzet, is het er weer.”
Iets dat waarde heeft, blijft volgens hem dan ook wel bestaan. “Als je Rollercoaster Tycoon uit 2001 wil downloaden via een torrent, lukt je dat ook nog steeds. Als het toch al geen waarde heeft en je zelf geen back-up hebt, tja, dan verdwijnt het wel. Is toch ook wel iets moois, die vergankelijkheid.”
"Als ik zelf een nft zou willen maken, zou ik dat bij iets als OpenZeppelin doen. Daar staan contracten en die kun je verder zelf samenstellen. Mensen die minder verstand hebben van smart contracts, maar die een plaatje willen koppelen, kunnen dat met iets als OpenSea of Raribles. Vergeet trouwens niet dat als je zelf een smart contract maakt en uitrolt, je er daarna niets meer aan kunt veranderen." Het ‘minder verstand van hebben’ is overigens betrekkelijk. Je moet wel iets met web3-apps kunnen, zoals Metamask als browserextensie en tokens als ether.
"Als je naar de toekomst kijkt, kun je natuurlijk alles tokenizen. Je kunt hypotheken verpakken, hele wallets tokenizen, beleggingspakketten enzovoort. Voordat je het weet, zit je bij de credit default swaps. Aan de andere kant: je kunt wel alles volgen wat er gebeurt. Dit in tegenstelling tot wat er in de traditionele financiële wereld gebeurt." De meeste tokens ‘leven’ op dit moment op de ethereumblockchain, maar de tokenstandaarden worden ook door andere chains gebruikt. Zo is het mogelijk om ook tokens via bridges van de ene naar de andere chain te verplaatsen.
Ethereum, hoe werkt dat ook weer?
De bekendste versie van een blockchain, de bitcoinblockchain, werkt op basis van zogenaamde utxo's, oftewel niet-uitgegeven transactie-outputs. In principe is het goed gebruik om bij zo'n blockchain altijd transacties naar een nieuw adres uit te voeren; dit in verband met privacy en eventuele toekomstige risico’s met quantumcomputers, omdat anders je publieke sleutel zichtbaar is (dat is iets anders dan een bitcoinadres).
Bij een blockchain als ethereum is dat anders. Je gebruikt altijd hetzelfde adres, want bij interactie met smart contracts, of eigenlijk heel basale applicaties, is het van belang dat je niet van adres wijzigt. Dit type blockchain is dan ook niet in hoofdzaak bedoeld als geldsysteem, maar als systeem voor applicaties.
Een belangrijk verschil is dat transacties bij een utxo-blockchain parallel uitgevoerd kunnen worden, want de ene transactie beïnvloedt de andere niet. Bij een systeem gebaseerd op accounts kan elke transactie invloed hebben op een andere en worden ze achter elkaar uitgevoerd. Dat kan tot vertraging leiden als een transactie te weinig 'brandstof' in de vorm van gas heeft meegekregen en er gewacht moet worden op het afmaken van de vorige transactie.
Interessant is dat bij ethereum ook de smart contracts een eigen adres hebben. Het maakt voor de meeste tokens en applicaties niet uit of een ander contract of een normale walletfunctie wordt aangeroepen. Dit is vergelijkbaar met een publieke api, waarvan andere applicaties gebruik kunnen maken.
Voorbeeld: je koopt een ERC-721-token. Je vrolijke CryptoKittie staat in het smart contract waar hij gecreëerd is met een verwijzing naar jouw eigen walletadres. Je kunt oneindig nieuwe adressen aanmaken, maar je cryptokittie is alleen zichtbaar 'op' het adres waaraan je hem ooit hebt gekoppeld.
Een andere plek waar nft’s hun praktische nut kunnen bewijzen, is in de concertkaartjesbranche. Kasper Keunen, ontwikkelaar bij Guts Tickets en van het achterliggende GET-protocol: “Nft’s in de ticketbranche zijn een uitkomst. Je kunt van alles koppelen aan een ticket. Zo kun je bijvoorbeeld programmeren dat royalty's uitgekeerd worden aan de artiest voor tickets die worden doorverkocht op de tweedehandsmarkt. Je kunt bijvoorbeeld programmeren dat twintig procent van de doorverkoopopbrengst naar de artiest gaat. Zo hou je de bron van inkomsten bij de artiest zelf. Daarnaast kan een nft maar bij één persoon op z’n wallet staan, in tegenstelling tot een ERC20-token, die in principe uitwisselbaar is. Dan creëer je bijvoorbeeld een QR-code die de ticketeigenaar op z’n telefoon kan laten zien en laten scannen bij de ingang van een concertzaal. Die QR-code kun je encrypten met de eigenaar van de nft, de ticketkoper dus. Je kunt dan heel makkelijk bewijzen dat jij de eigenaar van de nft bent. Makkelijk en inzichtelijk, daarom zijn nft’s heel handig voor tickets.”
Keunen zegt wel dat royalty’s op zich niet via een blockchain moeten, maar dat het wel makkelijk is voor het verhandelen op secundaire markten, zoals OpenSea. Om ticketscalping tegen te gaan, kunnen de tickets waar Guts nu mee bezig is, niet doorverkocht worden via open markten voordat ze gebruikt zijn. Na gebruik kunnen ze wel via open markten verhandeld worden als collectibles.
"Het voordeel van die ERC721-standaard is dat wij zelf geen systeem hoeven te bouwen om dat te verhandelen, wat we wel moesten met ons huidige systeem, dat gebruikmaakt van de ERC20-standaard", zegt hij. Wel zijn er zijn nog veel uitdagingen voor de start-up, want uiteindelijk kun je niet van iedereen verlangen dat ze met een wallet met ether of stablecoins rondlopen. "Je moet wel met de Adyens van de wereld kunnen samenwerken voor betalingen."
De ethereumblockchain is niet heilig voor Guts. "We gebruiken verschillende blockchains, afhankelijk van onze wensen. Zo zijn we nu de mogelijkheden van Polygon aan het testen, een plasmachain van ethereum. Ze hebben ethereum geforkt met heel veel bridges naar ethereum. Je kunt dus dezelfde adressen en contracten gebruiken, maar het is wel gecentraliseerd. Dat kan in ons soort markt; we gebruiken wat we nodig hebben."
Guts Tickets werkt veel in Zuid-Korea en volgens Keunen is de Koreaanse markt met K-Pop helemaal in de ban van digitale tokens. "Ze zijn daar zo digital native, daar wordt echt alles een token. Mensen kijken daar ook heel anders naar bezit, iets wat nu ook hier enigszins lijkt door te dringen."
Op dit moment is het nog veel experimenteren met de technische aanpak van bepaalde zaken, zoals tokenomics, crowdfunding, artiesten, venues en alles wat er verder bij komt kijken. Op den duur kun je aan een nft-kaartje van alles koppelen, zoals eerder dan de rest toegang krijgen tot een album dat uitkomt. Of een meet-and-greet met de artiest, of korting in de toekomst. Voor de artiest is het fijn dat hij veel directer contact heeft met zijn fanbase.
Ieder maakt zijn eigen tokens
Door de interoperabiliteit van de tokens kun je ze makkelijk op allerlei plekken verhandelen, terwijl je ze ook rechtstreeks aan elkaar kunt ‘overmaken’, al kun je daar wel paal en perk aan stellen in je smart contracts.
Misschien is het interessantste aan nft’s dat iedereen zonder al te veel problemen z’n eigen tokens kan maken. Dat hebben we echter eerder gehoord met de komst van internet en websites. Het maken van een nft kan dus door zelf een smart contract te maken of door gestandaardiseerde processen te doorlopen bij verschillende marktplaatsen die zelf natuurlijk weer voordeel hebben bij meer tokens. Je merkt al: nft’s zijn lastig te doorgronden, omdat ze op het snijvlak van heel veel verschillende systemen opereren, waaronder iets dat slecht in cijfertjes te vatten is: gevoel. De een vindt voetbalplaatjes heel gaaf, de ander zal zijn neus daarvoor ophalen en zweert bij Pokémon. Was de Amiibo eigenlijk niet een soort fysieke nft als je hem koppelde met je Wii?
Daarnaast kan het een soort van standaardvehikel worden voor het verkopen van normale, alledaagse items in de vorm van - buzzword - digital twins. Daarbij blijft het altijd de vraag: hoe koppel je de digitale wereld aan de fysieke? Als je die auto verkoopt, waarom verplaats je dan niet gewoon de eigenaarstoken naar de wallet van de nieuwe eigenaar? Daar heb je geen tussenhandel meer voor nodig. Koppel ook alle papieren eraan en klaar. Die belofte werd echter ook gedaan bij de vorige blockchainhype. Vergeet ook niet het bezit van bijvoorbeeld virtuele locaties in virtuele werelden of onderdelen daarvan, of musea met virtuele kunst: alles zit als een matroesjka in elkaar.
De eerste serieuze pogingen van de afgelopen tijd om de fysieke en tokenwereld te combineren, leveren lessen op voor de toekomst. De band Kings of Leon verkocht onlangs zijn album 'When you see yourself' als nft met als extra dat je dan een fysiek stuk vinyl opgestuurd krijgt. The New York Times verkocht een column voor 350 (!) ether, al gaat dat geld naar een goed doel. Zo zullen er tal van experimenten plaatsvinden waarvan een deel zal falen, een deel verder evolueert tot iets dat beter past en een deel zal bestaan uit speculatie.
Zelf aan de slag met een nft
Een nft scheppen door gewoon een medium te uploaden naar een site die er vervolgens een nft van maakt, dat is voor een tweaker veel te makkelijk. Ook leer je er niets van. Om toch een beetje wegwijs te worden in een ERC721-smart contract, heeft ontwikkelaar Marc Buma een minitutorial gemaakt om zelf een token te maken.
We gebruiken de MetaMask-browserplug-in, samen met wat testnet-ether voor het Rinkeby-netwerk en de Remix-ontwikkelomgeving. Als je MetaMask kent, kun je het volgende stukje overslaan en direct aan de slag.
MetaMask installeren
Voordat we aan de slag kunnen gaan, hebben we een MetaMask nodig om een ethereum-testnetaccount aan te kunnen maken. De plug-in is een interface tussen de ethereumblockchain en je browser. Zo kun je interageren met zogenaamde Web3-applicaties. Let wel op bij het installeren van MetaMask; het is een gewild object om malware mee te verspreiden. Ga dus zelf naar metamask.io, klik daar op de extensie om te installeren en let op dat er inderdaad een groot aantal downloads staat. Zo staat in Chrome dat de extensie meer dan 3 miljoen gebruikers heeft.
Vervolgens doorloop je een aantal menu’s in een tab van je browser met zaken als 'get started' en 'new to MetaMask'. Als je een nieuwe gebruiker bent, vraagt de app of je een wachtwoord wilt instellen. Dit wachtwoord heeft niets te maken met je daadwerkelijke ethereumadres, maar alleen met deze specifieke installatie van MetaMask. Dat klinkt een beetje verwarrend, maar wat écht belangrijk is om op te slaan, is de seed die bij MetaMask ‘Secret Backup Phrase’ heet. Deze moet je goed opslaan; zonder de seed kun je nooit meer bij je account.
Daarna krijg je een scherm met: ‘Token swapping is here!’ Dat mag je snel wegklikken. Normaal gebruik je MetaMask via het vos-icoontje, rechts naast de adresbalk van je browser. Nu zit je nog in de overzichtelijkere versie in een browsertab. Daarna ga je naar het Rinkeby Test Network voor het testnetwerk. Dat kun je rechtsboven selecteren bij het pulldownmenuutje waar standaard 'Ethereum Mainnet' staat.
Tijd om testnet-ether te krijgen. Die haal je via een zogenaamde faucet. Je klikt midden op het scherm op ‘Buy’ en dan krijg je de mogelijkheid om naar de testfaucet te gaan. Daar zit een addertje onder het gras; je moet een socialemediapost doen om het te krijgen of iemand anders moet het naar je toesturen. Dit is in verband met misbruik. Je klikt op 'Get Ether' en klikt in het volgende scherm links op 'Crypto Faucet' bij een icoontje van een badkuip met douche.
Maak een socialemediapost, bijvoorbeeld een tweet met alleen je ethereumadres daarin, kopieer de URL van de tweet in het tekstveld en klik 'Give me Ether'. Overigens, je kunt je ethereumadres kopiëren door in MetaMask één keer te klikken op Account 1; dan kopieert ie automatisch je adres. Et voilà: een x aantal ether in je account. Dan kun je aan de slag.
Contract maken en op de blockchain zetten
Voor deze miniworkshop gebruiken we de Remix-editor. Dit is een ide-omgeving waarin je smart contracts voor de ethereumblockchain kunt bewerken en daarnaartoe versturen. Ook kun je hier de verschillende functies van het smart contract uitvoeren.
Ga naar https://remix.ethereum.org.
/i/2004276960.png?f=imagenormal)
In het menu aan de linkerkant staan vier iconen waarvan de eerste drie van belang zijn voor deze workshop. Van boven naar beneden:
- File explorers - Hier plaats je het smart contract en de scriptcode voor de communicatie met de blockchain.
- Solidity compiler - Op deze tab kun je de programmacode van het smart contract omzetten in binaire code die op de blockchain kan worden geplaatst.
- Deploy & run transactions - Hier verstuur je de binaire code naar de blockchain en kun je methodes van het smart contract aanroepen.
Je ziet nu dat er al een standaardproject met een aantal mappen voor je is aangemaakt in de basisworkspace. Gooi alle mappen weg door ze te selecteren en dan rechtermuisknop-delete, zodat je met een leeg project begint. Laat het readme.txt-bestand staan.
Heb je in het verleden al een keer van de remix gebruikgemaakt, dan kan het voorkomen dat er geen standaardproject wordt aangemaakt. Verwijder in dit geval de cookies en sitedata van remix.ethereum.org uit de cache van de webbrowser.
Alle programmacode die je nodig hebt, kun je vinden op de GitHub van Marc. Je kunt deze bestanden eenvoudig importeren via de GitHub-knop in Remix met het 'Import from Github'-formulier.
Importeer de volgende bestanden:
Smart contract: https://github.com/mosbuma/tweakers-nft/blob/master/1_Nft.sol
Deploy-script: https://github.com/mosbuma/tweakers-nft/blob/master/2_deploy.js
Nft-script: https://github.com/mosbuma/tweakers-nft/blob/master/3_create_nft.js

Het smart contract
Zoals je eerder hebt kunnen lezen, is het niet nodig om het wiel opnieuw uit te vinden. Dit smart contract maakt gebruik van de OpenZeppelin-suite met standaardcontracten. De contracten in deze suite zijn grondig getest, waardoor het risico op fouten minimaal is. Dit is belangrijk, omdat je van een smart contract immers geen nieuwe versie kunt implementeren nadat het naar de blockchain is verstuurd.
/i/2004273026.png?f=imagenormal)
Als je de broncode van het smart contract in 1_Nft.sol bekijkt, zie je op regel #11 dat het contract is afgeleid van het standaard ERC721-contract. Daarnaast wordt gebruikgemaakt van een teller of counter-contract voor het bijhouden van het aantal uitgegeven tokens, zoals je ziet op regel #12 en #14. Op regels #6 en #9 wordt een koppeling naar de standaardcontracten gemaakt.
Het contract bevat een extra functie waarmee tokens kunnen worden aangemaakt, ofwel minting, en toegekend aan een ethereumadres, regels #21 en #22. Ook kan een URL aan de token worden toegekend waarmee extra metadata kan worden gekoppeld aan de token, regel #25. Deze metadata wordt later gebruikt als je de token wilt verkopen.
/i/2004273020.png?f=imagenormal)
De metadata zelf wordt niet in het contract opgeslagen. Opslag van gegevens in een blockchain zelf is extreem duur, omdat deze data door iedere node in het netwerk permanent moet worden opgeslagen.
Het smart contract compileren
Voordat het contract kan worden opgeslagen in de blockchain, moet het omgezet worden in zogeheten bytecode. Dit is vergelijkbaar met het omzetten van programmacode in instructies die door een microprocessor moeten worden uitgevoerd. Selecteer eerst het smart contract en ga daarna naar de tweede tab: 'Solidity compiler'. Stel hier de compiler in op versie 0.7.6.

Klik nu op de blauwe knop 'Compile 1_Nft.sol' om het contract om te zetten in bytecode. Als alles goed gaat, verschijnt nu een aantal grijze knoppen.
Naar de blockchain
Ga nu naar de derde tab 'Deploy & Run Transactions'. Stel Environment in op 'Injected Web3' om aan te geven dat je transacties via Metamask wilt afhandelen en afrekenen. Nadat het contract is opgenomen in de blockchain, kun je hier ook zien wat het bijbehorende adres is.
Let op: check voor de zekerheid of je MetaMask op Rinkeby is ingesteld.

Het versturen van het contract wordt gedaan met behulp van JavaScript-code. Ga hiervoor terug naar de eerste tab en open het script bestand '2_deploy.js'.

In de scriptcode wordt eerst een unieke naam voor de nft aangemaakt op basis van de huidige datum en tijd. Dit zorgt ervoor dat er bij de verkoop van tokens onderscheid tussen de verschillende tweakertokens kan worden gemaakt. Je kunt hier natuurlijk ook een eigen naam gebruiken.
/i/2004279526.png?f=imagenormal)
Het tweede deel van de code zorgt ervoor dat er een transactie wordt aangemaakt waarmee een nieuw exemplaar van het contract op de blockchain wordt geplaatst. Hiervoor is wat informatie over het smart contract nodig. Die wordt gelezen uit een bestand dat is aangemaakt tijdens het compileren van het contract. De tokennaam en het tokensymbool worden meegegeven als extra parameters in de transactie.
Hierna kan de transactie naar de blockchain worden verstuurd.
/i/2004279528.png?f=imagenormal)
De afzender wordt ingesteld op het huidige adres in Metamask en er wordt aangegeven dat er maximaal een bepaalde hoeveelheid gas in de vorm van ether mag worden gebruikt voor het verwerken van de transactie. Naarmate het contract complexer is, zijn de verwerkingskosten hoger. Voordat de transactie kan worden verstuurd, moet die eerst getekend worden door de afzender. Dit gebeurt in Metamask. Je kunt hier ook zien wat de transactiekosten in dollars of euro zouden zijn geweest als je dit op het mainnet met echte ether zou hebben uitgevoerd.

Voer het script nu uit door met de rechtermuisknop op het bestand te klikken en 'run' te kiezen in het menu, in het bestandsoverzicht links. Keur de transactie goed in Metamask en wacht tot deze bevestigd is.
In het consolevenster rechtsonder verschijnt nu het contractadres op de blockchain. Via dit adres vindt alle interactie met het smart contract plaats. Om de activiteit op Etherscan te zien, moet je wel 'rinkeby' voor etherscan.io plaatsen.
Kopieer dit adres naar een tijdelijk document; je hebt het later in de workshop een paar keer nodig.
/i/2004273012.png?f=imagenormal)
Open nu het smart contract opnieuw in het rechterpaneel en ga hierna terug naar de derde tab. Kopieer het contractadres in de box bij 'At Address'. Let op: dit adres is alleen zichtbaar zolang het smart contract in het paneel rechts zichtbaar is. Als je daarna op de 'At Address'-knop zelf drukt, wordt het contract ingeladen. Je ziet dit aan 'NFT AT ...' Nu heb je toegang tot alle functies in het smart contract. Je ziet dit als je het bijbehorende menu openklapt met het >-teken.


Tokens uitgeven
Nu wordt het tijd om een echte nft te gaan maken en het eigendom over te dragen aan een adres op de blockchain. Hiervoor gebruik je het '3_create_nft'-script. Om dit script te kunnen uitvoeren, gebruik je het adres van het contract zoals je dat in de vorige stap hebt genoteerd. Vul dit in op regel #8.
/i/2004279530.png?f=imagenormal)
Daarnaast kun je kiezen wie eigenaar wordt van de nieuwe nft. Dit gebeurt op regels #17 tot #22 van het script. Hier wordt het geselecteerde account in Metamask aangewezen als de eigenaar van de nieuwe nft. Je kunt eventueel een tweede account in Metamask aanmaken of handmatig een adres invullen als je een andere ontvanger wilt aanwijzen.
/i/2004279532.png?f=imagenormal)
Nadat een instantie van het bestaande contract op de blockchain is aangemaakt (regel #24 tot #28), vindt het echte werk plaats.
/i/2004279534.png?f=imagenormal)
Eerst wordt bepaald wat het nummer van de eerstvolgende niet-bestaande nft is en wordt een link gemaakt naar de metadata van de token. Deze metadata bevat de informatie over de nft, zoals een naam, een beschrijving en een link naar de nft zelf. In dit geval wordt deze informatie opgehaald uit de GitHub-repository van het project. Een voorbeeld kun je inzien via deze link.
/i/2004279536.png?f=imagenormal)
Je kunt zien dat in de metadata naar een tweede bestand wordt verwezen. Dit is de eigenlijke informatie die aan de nft is gekoppeld. In dit geval is dat een link naar een afbeelding op een website. In de praktijk vind je hier vaak een link met een hash waarmee de gekoppelde asset uniek verbonden wordt met de token. De daadwerkelijke asset kan dan op een decentraal bestandssysteem zoals IPFS geplaatst worden. Mocht je met eigen assets willen experimenteren, dan kun je een koppeling naar een eigen JSON-bestand maken.
Nu wordt een transactie op het smart contract aangemaakt waarin de functie sendNFT, regel #37, wordt uitgevoerd. Door deze met Metamask te tekenen en naar het blockchainnetwerk te versturen, wordt de nieuwe nft daadwerkelijk aangemaakt. Let op dat je het account gebruikt waarmee ook het contract is aangemaakt, anders wordt de transactie afgewezen.
Vul nu op regel #8 tussen de aanhalingstekens het contractadres in en pas eventueel het adres van de ontvangende partij aan op regel #17 en #18. Je kunt nu het script uitvoeren; klik met de rechtermuisknop op het '3_create_nft'-script en kies run in het menu in het bestandsoverzicht links. Keur de transactie goed in Metamask en wacht totdat deze bevestigd is.
Gefeliciteerd! Je hebt net een nieuwe nft gemaakt.

In Metamask kun je zien dat je eigenaar van de token bent geworden; hiervoor kun je een custom token toevoegen. Open Metamask, selecteer de tab 'assets' (onderaan) en scrol naar beneden tot je op de knop 'Add Token' kunt klikken. Vul nu op de tab 'Custom Token' het contractadres in en klik 'next'. Je nieuwe token verschijnt nu in de lijst.

Omdat Metamask gemaakt is voor het verwerken van fungible tokens, zoals ERC20-tokens, is het niet mogelijk om hiermee een ander adres eigenaar te maken van een nft. Hiervoor kun je een marktplaats als Opensea gebruiken. Er zijn ook andere plekken waar je je ERC721-tokens kunt zien, zoals in de daarvoor bedoelde tab op Etherscan.
Naar de markt
Zodra de nft aangemaakt is in de blockchain, kun je deze gaan verhandelen op een marktplaats zoals Opensea. Het basisidee is eenvoudig; je machtigt de marktplaats om namens jou de nft over te dragen naar een andere partij als de ingestelde prijs is voldaan. Daarbij hanteren de meeste marktplaatsen een model waarbij ze een deel van de betaalde prijs verdienen.
Open nu de testnetversie van de website van Opensea, https://testnets.opensea.io/, en vul daar het adres van het smart contract in in de zoekbox. Je krijgt nu een overzicht van de tokens die je in het smart contract hebt aangemaakt. Je ziet nu ook de metadata terug die we aan de token hebben meegegeven.
Open nu het detailscherm voor een van de nft's die je ziet. Als je in Metamask het account hebt geselecteerd dat eigenaar van de token is, zie je rechtsbovenaan een knop waarmee je de nft te koop kunt zetten.
Opensea biedt verschillende manieren waarop je de prijs van de nft kunt vastleggen: door in Metamask een tweede account aan te maken via de optie 'create account' in het menu. Door te funden via Send vanuit het eerste account kun je hiermee experimenteren. Probeer maar eens om de nft voor een vaste en niet te hoge prijs op de markt te plaatsen en dit met het tweede account te kopen. Let hierbij ook eens op de kosten in dollars die je zou maken als je van ether op het mainnet gebruik zou maken voor de transacties.
Conclusie
In deze miniworkshop hebben we je een blik onder de motorkap gegeven. Je hebt nu een beeld bij wat er gebeurt bij het maken van nft's op de ethereumblockchain met een smart contract. Normaliter zou je hier veel minder van te zien krijgen; de acties die hier met JavaScript op het smart contract werden uitgevoerd, zijn dan opgenomen in een gelikte app of worden door de website voor je uitgevoerd. Dit kan bijvoorbeeld via Opensea of op sites zoals Rarible of Mintable.
Het is nu aan jou om te gaan experimenteren als je daar zin in hebt. Bijvoorbeeld met eigen assets of met een smart contract met meer functies. Omdat de techniek nog in de kinderschoenen staat, valt er nog een boel uit te vinden.
Heb je een eigen serie nft's gemaakt? Doneer er dan een aan de Tweakers nft-expositie via de knop 'Transfer' rechtsboven als je ingelogd bent in OpenSea met je eigen MetaMask. Het adres is 0xae664E94D916Fb945188B6785506505d925E1DAC. Wil je zien wat andere tweakers hebben gemaakt? Bezoek dan deze link voor het Tweakers-NFT-Museum.

Bronnen
Veel dank aan Marc Buma voor het opstellen van deze minitutorial, waarover hij zelf zegt: "Echt begrijpen wat er komt kijken bij het maken en verkopen van nft's, lukt pas door het te doen."