KittyHats packt digitale Accessoires auf CryptoKitties. Wie das geht? Lotte wirft einen Blick auf die Ethereum ERC20 und ERC721 Tokens, die sich hinter den Katzen und Gurken verbergen.

ERC721 grüßt ERC20: die KittyHats Chrome Extention

Natürlich könnte ich auch heute wieder über Schnurrhaare, Fellfarben und digitale Katzenzucht berichten. Es gibt aber noch andere interessante Themen rund um die Kitties. Was? Interessanter als digitale Schnurrhaare?

Ja.

Es gibt Zuchtlogarithmen mit regressiven und progressiven Eigenschaften, Spekulationen über Weiterentwicklungen und Updates vom CryptoKitties Team. Aber vor allem gibt es jetzt auch KittyHats. Ein digitaler Marktplatz für CryptoKitty-Accessoires. Bis vor kurzem war es nur eine Chrome Extention, aber jetzt hat KittyHats auch eine ordentliche Seite, auf der du Sachen für deine CryptoKitties kaufen kannst. Vom Aufbau her ist es ein bisschen wie DaWanda, allerdings mit nur digitalen Produkten. Irgendjemand „bastelt“ ein Accessoire und bietet dies über KittyHats an.

Wie läuft das in der Praxis? Ganz easy. Ich öffne meinen Browser (Brave, Firefox, Chrome) und besuche https://kittyhats.co/. Wie bei den CryptoKitties nutze ich das MetaMask Add-on um mich einzuloggen und schon geht es los. Für 0,025 ETH kann ich #640020 ein schweinchenrosa Ballerinakleid anziehen. Design von Kittyhawk.

KittyHats Ballerinakleid
KittyHats Ballerinakleid

Na, wenn das nicht… Ähh… Absolut bescheuert ist?! Wer gibt denn bitte knapp 20 Euro für ein digitales Kleid für eine digitale Katze aus? Nicht mal die Tatsache, dass *vier* Schühchen inbegriffen sind, rechtfertigt diesen Preis. Anscheinend gibt es aber einige Leute, denn es sind nur noch 27 Ballerina Kostüme übrig. Der Haarreif mit Poop Emojis (laut Umschreibung „Schokoladenpudding“, ist klar) ist komplett ausverkauft.

Warum interessiert mich diese DApp Extention trotzdem? Aus zwei Gründen. Erstens bietet sie mir eine ausgezeichnete Gelegenheit, endlich die Technik unter dem digitalen Fell zu erklären. Zweitens gibt es eine Kategorie mit Memes.

Oh yeah.

So gibt es das Breading aus der Kampagne für Sterilisation und gegen Inzucht (inbred cats). Sherlock demonstriert:

Inbread Cat Meme (inbred=Inzucht)
Inbread Cat Meme (inbred=Inzucht)

Zugegeben, das ist lustig. Aber kommt jetzt ein Beitrag mit Tausend Bildern von meinen Kitties mit unterschiedlichen Hütchen? Nicht ganz. Eins muss noch sein, denn für eine gründliche Analyse brauchen wir ein passendes Beispiel.

Ja, Brot wäre auch gegangen, aber…

Kevin ahnt noch nicht, dass eine Gurke hinter ihm liegt.
Kevin ahnt noch nicht, dass eine Gurke hinter ihm liegt.

Dies hier ist CryptoKitty #663673 (Kevin) mit einer Gurke. Du hast es richtig gesehen: Wir können eine digitale Gurke hinter einer digitalen Katze legen. Wer will jetzt noch behaupten, dass CryptoKitties ein sinnloses Hobby sind? Award für die beste Verwendung eines Memes 2018 geht an BxKat.

An dieser Stelle finde ich die 0,003 ETH dann auch völlig gerechtfertigt.

Achso – für diejenigen, die unter einem Stein geschlafen haben:

Katzen und Gurken. Mehr auf YouTube.
Katzen und Gurken. Mehr auf YouTube.

 

Was passiert hinter den Pixelkulissen?

Spaß beiseite. Ich will wissen, was hier passiert. Nicht, was mir das Interface zeigt, sondern was sich hier auf der Blockchain und in den Smart Contracts tut. Um zu verstehen, wie man einer Katze Poop Emojis auf den Kopf setzt oder eine Gurke hinter ihr legt, müssen wir in die Technik tauchen.

Es stellen sich hierbei zwei konkrete Fragen:

  1. Was sind CryptoKitties?
  2. Was sind Gurken?

Die Antwort ist einfach. CryptoKitties sind ERC721 und Gurken ERC20 Tokens. Es sind Abkürzungen, denen man ständig im Netz begegnet. Aber was bedeuten sie genau? Wie in der analogen Welt sind Katzen komplizierter als Gurken, also fangen wir mit dem Kryptogemüse an.

Analysieren wir die Gurke.

Die Salat- oder Schlangengurke (Cucumis sativus) stammt aus der Familie der Kürbisgewächse. Katzen haben in der Regel keine wirkliche Angst vor Gurken. Sie erschrecken sich nur, wenn man diese hinterlistig hinter ihnen hinlegt, während sie gerade essen oder die Waschmachine anstarren. Man sollte das nicht machen. Es ist böse.

Digitale Gurken bestehen aus unterschiedlichen Schichten. Sichtbar für den Nutzer ist der Sticker – im Grunde genommen eine ziemlich unspektakuläre Grafik. Was du aber kaufst, ist ein Token. Tokens haben keine eigene Blockchain. ERC20 Tokens nutzen die Etherchain von Ethereum.

ERC20 sind verhandelbare Tokens – Du kannst eine Gurke genauso kaufen wie Ether, OMG-Tokens oder SophiaTX. Im Gegensatz zu den meisten anderen Tokens ist es aber (noch) nicht möglich, deine Gurke auch wieder zu verkaufen. Im Normalfall geht das bei ERC20 Tokens schon: sie eignen sich zum Hodln oder Traden und können auf einem Wallet (MetaMask, MyEtherWallet) oder einer Exchange liegen.

ERC steht für Ethereum Request for Comment – quasi „bitte um Feedback“. Wenn ein Entwickler eine neue Idee für z.B. Smart Contracts hat, veröffentlicht er diese als Ethereum Improvement Proposal (EIP) oder „Ethereum Verbesserungsvorschlag“ auf einer Plattform wie Github. Hier wird der Vorschlag diskutiert und überarbeitet. Wenn das finalisierte Konzept angenommen wird, verwandelt es in ein ERC. Die Nummer hinter dem Kürzel entspricht der Nummer des Proposals.

ERC20 Tokens sind also Smart Contracts, die mit der Vorlage aus dem EIP/ERC erstellt werden. Ist das kompliziert?

Ein Bisschen. Aber zusammen werden wir uns durcharbeiten.

 

Funktionen und Events in ERC20 Smart Contracts

Schauen wir uns die Vorlage einfach mal an:

Vorlage für einen ERC20 Smart Contract
Vorlage für einen ERC20 Smart Contract

Wir sehen das 6 Funktionen und zwei Events aufgenommen sind.

  1. totalSupply (a)
    Hier wird die totale Anzahl der Tokens festgehalten. Es geht dabei um die Anzahl von existierenden Tokens. Das umfasst die Tokens, die im Umlauf sind (circulating supply) und die, die beim ICO nicht freigegeben wurden, sondern z.B. beim Team liegen.
  2. balanceOf (address (a) owner (b))
    Diese Funktion überprüft das Guthaben im Account vom Transaktionspartner. Bei a erscheint seine Ethereum-Adresse und bei b seine Identifikation.
  3. transfer (address (a) value (b))
    Diese Funktion leitet eine Transaktion ein. Die erste Variable (a) ist die Adresse vom Empfänger, die zweite Variable (b) ist die Anzahl von Tokens, die verschickt werden. 
  1. transferFrom (address from, address to, value)
  2. approve (address spender, value)
  3. allowance

Wenn eine Transaktion nicht mit einer Person, sondern mit einem Smart Contract direkt gemacht wird, sind die Voraussetzungen etwas anders. Die Funktionen transferFrom, approve und allowance ermöglichen diese Art von Transaktionen.

Ein Beispiel:

Ich will eine Gurke hinter Kevin hinlegen. Die Tokens, die ich überweise, gehen nicht an das Wallet eines digitalen Gemüsehändlers, der mir die Gurke einprogrammiert. Diese Aktion wird natürlich von einem Smart Contract ausgeführt.

Der Contract [PickleRick] hat die Funktion [Gurke hinlegen], was 10 Tokens erfordert. Ich will, dass [Gurke hinlegen] aktiviert wird und habe 50 Tokens in meinem Account.

Um die Funktion zu aktivieren, muss ich [PickleRick] Zugang zu meinem Account geben. [PickleRick] braucht Zugriff auf einen Teil meiner Tokens, um überhaupt anfangen zu können. Ich mache 25 Tokens frei, die [PickleRick] jetzt in meinem Auftrag an sich selbst überweisen darf.

Im Code: transferFrom: von [meine Adresse], an [PickleRick]s Adresse, Wert = 25 Tokens

Approve ist Teil der gleichen Transaktion und erlaubt [PickleRick], mehrmals Tokens zu entnehmen. „Value“ entspricht der Gesamtanzahl der Tokens, die entnommen werden dürfen – im Beispiel immer noch 25.

Dieser Betrag nennt sich auch Allowance oder „bereitgestellte Summe“. [PickleRick] führt die Aktion [Gurke hinlegen] aus. Alle Tokens aus der bereitgestellten Summe, die nach der Aktion [Gurke hinlegen] übrig sind, werden an meine Adresse zurückgeschickt.

Wie die aufmerksame Hobbyprogrammiererin (#feminism) bereits bemerkt hat, steht vor den Werten immer uint (unsigned integer). Dies hat zur Folge, dass keine negativen Zahlen möglich sind. Auf Normaldeutsch: es gibt keinen Dispo. Allerdings ist es möglich, dass die Gesamtzahl von Allowances das Guthaben übersteigt. Deswegen muss [PickleRick] im Beispiel selber prüfen, ob er an ausreichend viele Tokens herankommt. Sollte er feststellen, dass die bereitgestellte Summe nicht reicht, oder dass mein Guthaben zu niedrig ist, wird die Aktion [Gurke hinlegen] fehlschlagen.

Jetzt bleiben nur noch die zwei Events: Transfer und Approval. Diese werden getriggert, wenn die oben genannten Funktionen greifen. 

  1. Event Transfer
    Wenn eine Transaktion stattgefunden hat, gibt Event Transfer die entsprechenden Daten raus und sorgt dafür, dass die Guthaben aktualisiert werden.
  2. Event Approval
    Approval generiert alle Daten, die die Transaktion bestätigen und die Aktualisierung der Guthaben ermöglichen. Die „Zählerstände“ von Guthaben und Allowances können durch diese Funktion im Smart Contract aktualisiert werden, ohne dass diese Anpassungen auf der Blockchain festgehalten werden müssen.

Sonstige Daten, die in den meisten ERC20 Contracts festgehalten werden, sind

  1. Der Name des Tokens (Ether, OmiseGo, SophiaTX)
  2. Das Symbol oder die Kürzel des Tokens (ETH, OMG, SPHTX)
  3. Die Teilbarkeit der Tokens in Dezimalen > in der Regel 18

Die Gurke hat darüber hinaus eine IPFS Hash*, in der das genaue Design und die Urheberrechte gespeichert sind.

Kommen wir zu Kevin.

Was steckt unter Kevins Fell?
Was steckt unter Kevins Fell?

Wenn wir unter seinem schönen schwarzen #onyx Fell gucken, sehen wir, dass Kevin in Wahrheit ein ERC721 Token ist. Dies sind verhandelbare Tokens – Kevin kann, genau wie ein ETH, OMG oder SophiaTX gekauft und verkauft werden. Allerdings gibt es einen großen Unterschied. Kevin ist non-fungible. Auf Deutsch: nicht austauschbar.

ERC20 Tokens sind im Grunde genommen wie Münzen. Wenn ich zwei Euromünzen habe, kann es dir herzlich egal sein, welche Münze ich dir gebe. Sagen wir, dass es zwei deutsche Münzen sind, die beide 2002 geprägt wurden. Sie sehen gleich aus (Bundesadler, Jahreszahl / EU-Karte mit einer 1) und jede Münze hat einen Wert von 1,00 EUR. Die Münzen sind komplett austauschbar oder fungible.

Kevin dagegen ist einzigartig. Keine Katze auf der Blockchain ist exakt wie Kevin. Deswegen ist Kevin unbezahlbar. Oder wertlos – je nachdem, wen du fragst. ERC721 ist eine Ethereum-Standard, die es seit Ende 2017 gibt. Im Gegensatz zu den „normalen“ ERC20 Tokens werden in ERC721 zusätzliche, unterschiedliche Informationen oder Eigenschaften im Smart Contract festgehalten.

Funktionen und Events in ERC721 Smart Contracts

Schauen wir doch mal in eine ERC721 Vorlage rein:

Vorlage für einen ERC721 Smart Contract
Vorlage für einen ERC721 Smart Contract

Vieles aus der Vorlage kennen wir bereits aus dem ERC20 und muss nicht nochmal erklärt werden. Manche sind neu, aber kompatibel mit ERC20. Sie können sowohl in ERC20 als auch in ERC721 implementiert werden. Name, Symbol, Total Supply – alles bekannt. BalanceOf nennt die Zahl der Tokens, die auf der eigenen Adresse liegen – zum Beispiel 25 CryptoKitties oder 1.986 OMG.

Was ERC721 Tokens auf struktureller Ebene anders macht, sind die Ownership Funktionen.

  1. ownerOf
    Da CryptoKitties einzigartig sind, können sie nicht wie austauschbare Tokens über withdraw und send-Funktionen verschickt werden. Deswegen gibt es hier takeOwnership und transfer. Jedes Kitty hat eine eigene Identifikationsnummer auf der Blockchain. Über diese Nummer kriegst du raus, wer das Kitty besitzt.
  2. approve und takeOwnership
    Mit approve wird einem anderen User erlaubt, jetzt oder zu einem späteren Zeitpunkt über Kevin zu verfügen. Diese Funktion greift, wenn jemand Kevin kaufen will. Mit takeOwnership kann der andere User dann die Übergabe einleiten. Die Daten „old Owner“ (ich) und new Owner (Käufer) werden aktualisiert.
  3. transfer
    Wenn ich Kevin verschenke, greift zuerst die approve Funktion beim glücklichen Empfänger. Diese ermöglicht es, Kevin zu empfangen. Dann leite ich über transfer die Transaktion ein. Kevin wird an die andere Adresse übergeben.
  4. tokenOfOwnerByIndex
    Diese Funktion ist optional in ERC721 Tokens. Wenn ich eine Unmenge von CryptoKitties besitze, kann jedes Kitty einen Index mit den Identifikationsnummern seiner Freunde in meiner Kollektion mit sich führen. So kann ich über Kevin auch Sherlock und GLaDOS wiederfinden.
  5. tokenMetadata
    Um die einzigartigen Eigenschaften von Kevin festzuhalten, braucht es im Token auch Platz für seine DNS. Er hat 8 sichtbare Eigenschaften und eine Menge unsichtbarer Eigenschaften, die er seinen Kittens weitergeben würde. Ausgeschrieben wäre das viel zu viele Infos, die auf der Blockchain gespeichert werden müssten. Deswegen werden diese als IPFS Hash* eingetragen.

Bleiben jetzt nur noch die zwei Events im Contract, Transfer und Approval, die wie beim ERC20 die ganzen Commands abwickeln und die Daten im Contract aktualisieren.

 

Ok. Gurke. Katze. Aber wie kommen sie zusammen?

Kevin ist ein Token. Die Gurke ist ein Token. Beide kaufe ich mit Ether (ETH). Da ich für den Kauf die gleiche MetaMask Adresse verwenden muss, bin ich ausschließlich mit dieser Adresse Besitzer von beiden Tokens. Wenn ich mich mit einer anderen Adresse anmelde, werden mir weder Kevin, noch die Gurke angezeigt.

Wenn ich bei KittyHats eine Gurke kaufe, muss ich im Vorhinein festlegen, für welches CryptoKitty ich die Gurke kaufe. Die Tokens werden mit einander verbunden; Die Gurke wird mit Kevins ID verknüpft. Wenn ich Kevin verkaufen will, geht die Gurke automatisch mit an den neuen Besitzer. Wenn ich oder der nächste Besitzer die Gurke löscht, ist der Tokenweg und kann nicht mehr aktiviert werden.

Diese Idee ist übrigens nicht neu. Im Gegenteil – Stickers und Skins begleiten uns schon längere Zeit im Netz und in Games. KittyHats basiert auf den Skins, die man für Counter Strike: Global Offensive (CS:GO) kaufen kann. Diese Skins werden über die Darstellung in Steam gelegt, damit dem User die selbstgekauften Waffen, Cases oder Candy angezeigt werden.

Wie CS:GO Skins ist KittyHats nicht dezentralisiert. Hieran wird aber gearbeitet. Ab der zweiten Version sollten die Tokens, Buchhaltung und urheberrechtlichen Daten zu den Designs über Distributed Ledger Technologie gespeichert werden. Bis dahin gibt es eine theoretische Möglichkeit, dass die zentrale Datenbank angegriffen werden kann. Die ERC20 Tokens sind aber jetzt schon mit dem Kürzel KH markiert und es gibt keine Gründe anzunehmen, dass die Umstellung zu Problemen führen würde.

 

Kaufe eine Gurke – rette Katzen und das Internetz

Wie jeder auf den ersten Blick erkennen kann, hat KittyHats andere Probleme. Die Accessoires bzw. Tokens sind viel zu teuer. Dieses Problem plagt auch die CryptoKitties DApp. Breeding fees, Transaktionskosten, der Preis für ein Ballerina-Kostümchen – alles noch viel zu kostspielig für den Mainstream. Aber wir zahlen hier für digitale Innovation, Weiterentwicklung und den guten Zweck. Ein Teil der Einnahmen von KittyHats geht laut dem White Pa-purrrr an gemeinnützige Initiativen, die sich für Netzneutralität, die Freiheit von Meinungsäußerung im Netz und den echten, analogen Tierschutz gehen.

Halten wir fest (TL;DR):

CryptoKitties sind non-fungible Tokens – Kevin ist ein ERC721 Smart Contract mit einzigartigen Metadaten auf der Blockchain. Kevin ist anders als Sherlock. Wenn die Nachfrage nach schwarzen (#onyx) CryptoKitties steigt, wird Kevin teurer. Wenn in den nächsten Wochen 1.000 CryptoKitties mit #onyx geboren werden, wird Kevin günstiger – es sei denn, seine anderen Eigenschaften sind sehr gefragt. Mit der Nachfrage verändert sich sein Preis.

Gurken dagegen sind fungible Tokens – sie sind relativ einfache ERC20 Smart Contracts auf der Blockchain. Die Gurke hinter Kevin ist eine Kopie von der Gurke hinter Sherlock. Jede Gurke hat auf KittyHats denselben Preis. Wenn sich niemand mehr an das Meme erinnern kann, wird keiner noch Gurken kaufen. Der Preis bleib gleich, aber der Wert fällt: der Gurkenkurs sinkt.

Die Gurke gehört nicht zu Kevins Eigenschaften. Die Metadata in dem Kitty-Token werden nicht angepasst. Die Gurke ist lediglich ein grafisches Template oder Sticker, der über das CryptoKitty gelegt wird. Deswegen ist sie auch nur dann sichtbar, wenn die KittyHats Extention läuft. Allerdings sind die Tokens schon miteinander verbunden: Ich kaufe die gurke nur für Kevin und kann sie nicht mit einer anderen Katze verbinden.

Da beide Tokens über die Etheradresse im MetaMask-Wallet gekauft werden, kann die Gurke als Token ohne Probleme mitgeschickt werden, wenn ich Kevin verkaufe. Der neue Besitzer kann selber entscheiden, ob er die Gurke beibehalten will, oder die Grafik löscht. Um gebrauchte gurken und vintage Poop Emoji Haarreife weiter zu verkaufen, müsste KittyHats seine App und die Marktplatz-Funktion ausbreiten.

Warum geht das noch nicht?!

Dezentralisierte Apps sind noch neu und viele Möglichkeiten sind noch nicht erkundet. KittyHats ist die erste Extention von einem Drittanbieter, der an die CryptoKitties DApp angehängt wird. Bevor alles wie am Schnürchen läuft, müssen wir den Programmierern und Entwicklern noch ein wenig Zeit gönnen. Vergiss nicht, dass du vor wenigen Jahren noch nie was von Ethereum gehört hattest und der Begriff DApp erst vor sechs Monaten in deiner Vokabelliste erschienen ist.

So. Du hast es geschafft.

Hätte ich noch tiefer auf die Technik eingehen können? Ja – aber irgendwann ist auch mal gut. Du hast jetzt erstmal eine klarere Vorstellung, wenn Begriffe wie Smart Contract, ERC-Standard oder Gurke auftauchen. Habe ich was übersehen oder komplett falsch erklärt? Dann schreibe mir doch eine Mail oder melde dich in den Kommentaren!

 

Aus Halle an der Saale grüßen Lotte und ihre CryptoKitties

 

*IPSF Hashing: Eine Datei, in diesem Fall mit den ganzen Eigenschaften von Kevin, wird mit einem Hash versehen und dezentral gespeichert. Wer an die Datei gelangen will, trägt die Hash ein und IPSF sucht nach dem Server, wo die Datei gelagert ist. Das System lässt sich mit Torrents vergleichen – das „Abholen“ der Datei erfolgt über die notwendigen Nodes in einem Peer-to-Peer (P2P) System, was eine Überbelastung des Netzwerkes ausschließt.

 

Quellen:

 

ERC20 Vorlage von Aunyks (Screenshot)
ERC721 Vorlage von Aunyks (Screenshot)
Die grobsten Grundlagen bei Wikipedia
Und nochmal beim Ethereum Wiki
Artikel zu ERC Standards von Lauren Stephanian
EIPs auf Github
IPFS Hashes erklärt von John Lilic
KittyHats Review von Andrew Rangel
ERC721 erklärt von Gerald Nash
Begriffserklärungen auf CMC
Code Erklärungen auf StackExchange
KittyHats White Pa-Purrrr
CS:GO Skins (Screenshot)

 

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.