Ende März 2018 erhielten einige aktive Mitglieder der Ethereum-Community mysteriöse PGP-verschlüsselte E-Mails mit Einladungen zu einem „dezentralisierten Verein auf der Ethereum-Blockchain“. Der Absender gibt der Community ein Rätsel auf, mit deren Lösung sie Zugang zu der Gemeinschaft bekommen sollen. Im ersten Artikel haben wir das Ethereum-Rätsel theCyber vorgestellt. In diesem Beitrag wird der technische Zugang zu dem theCyberGatekeeper Smart Contract beschrieben.
Finde die Tür zu theCyber
Bevor die Arbeit, welche wir uns zuvor mit unseren wohlüberlegten Ethereum-Transaktionen erarbeitet haben, Früchte tragen können, müssen wir wissen, wo sich der Eingang zu theCyber befindet.
Dazu haben wir noch keine Lösung besprochen und ich habe auch diesmal nicht vor, eine Lösung zu verraten. Das bedeutet aber nicht, dass ich hier nicht hilfreiche Hinweise geben werden.
Wo ist die Tür von theCyber?
Wie wir in der theCyber-Einladung erfahren haben, wird der Zugang zu der Gemeinschaft durch den theCyberGatekeeper Smart Contract geschützt und wir können dort bereits ein wenig Aktivität sehen:
Um dem Block # 5330846 können wir sehen, dass drei Abenteurer erfolglos an die theCyber-Tür geklopft haben. Aber ist das wirklich DIE theCyber-Tür?
Schauen wir uns den Code näher an: theCyberGatekeeper enthält die folgenden Zeilen:
Wir kennen diesen Teil bereits, im vorherigen Artikel haben wir gesehen, dass 10/250 Spots beansprucht wurden.
Ein paar Tage später sind wir schon bei 47/250. Warten wir also lieber nicht zu lange.
Etherscan.io leistet kein wirkliches Hexenwerk, der Code-Ausschnitt, den wir oben gesehen haben, liefert die Werte. Dies lässt jedoch einen interessanten Schluss zu:
Die Anzahl der tx stimmt nicht mit der Anzahl der Teilnehmer überein … Es muss also einen anderen Weg geben…
Schauen wir uns den nächsten Code-Ausschnitt an:
Natürlich könnten wir versuchen, einfach eine Transaktion zu senden und zu schauen was passiert. Das wäre dann aber genauso wenig erfolgreich, wie der Versuch von der Person zuvor.
Wir können sofort aufhören: Wie wir oben lesen können, benötigt die Funktion assignAll() 250 Plätze, die vergeben sind. Da bisher nur 10 beansprucht wurden, wird diese Funktion zurückgesetzt und passieren wird nichts. Wir werden also nicht weit kommen.
Es ist interessant zu sehen, dass 0age die Funktion assignAll() ungeschützt ließ: Jeder kann sie aufrufen, aber nur dann, wenn die Warteschlange der Teilnehmer voll ist. Das macht Sinn, da Smart Contracts das Verhalten durchsetzen werden, unabhängig davon, wer ihn aufruft.
Die Funktion enter() des theCyberGatekeeper Smart Contract
Gehen wir auf die essenzielle Funktion ein: enter().
DAS IST ES! Wir haben es gefunden. Sende einfach eine Transaktion an die Funktion enter (), und Du bist drin.
Sesam öffne Dich!
Oder doch nicht … Was ist passiert? Wie im vorherigen Artikel beschrieben, reicht ein Passwort nicht aus. Warum ist das so? Weil etwas die Tür blockiert
Lasst uns einen zweiten Blick auf die enter-Funktion werfen:
Die Modifikatoren sind alle in einer einzigen Zeile im verifizierten Vertrag verpackt:
gateOne
gateTwo
gateThree
checkOne
checkTwo
checkThree
checkFour
Wenn du mehr zu Modifikatoren wissen möchtest, findest du hier die offizielle Dokumentation.
Sehen wir uns einen dieser Modifikatoren an:
Der Modifikator checkOne() stellt sicher, dass nur eine begrenzte Anzahl von Konten beitreten kann.
Wir können den Modifikator checkOne() in dieser abgespeckten Version nur mit der Funktion enter() verwenden:
Kurz gesagt, die Funktion enter() wird nur ausgeführt, wenn die _; Anweisung des Modifikators erfüllt ist. Mit anderen Worten: die Bedingung entrants_.length <= MAXENTRANTS_ muss als true interpretiert werden, was bedeutet, dass entrants_.length kleiner oder gleich 250 sein muss.
Es scheint, dass diese Modifikatoren noch bearbeitet werden müssen und wir noch etwas Lock-Picking betreiben müssen, um rein zu kommen.
Die Checks
Was bedeuten die Prüfmodifikatoren des Smart Contracts?
-
checkOne() stellt sicher, dass die Anzahl der eingereichten Beiträge das Maximum nicht überschreiten.
-
checkTwo() soll sicherstellen, dass die Interaktion jedes Teilnehmers mit dem Gatekeeper einzigartig ist.
-
checkThree() enthält viele Informationen. Er stellt sicher, dass der bereitgestellte Passcode mit einem der initialisierten Hashes übereinstimmt.
-
checkFour() stellt sicher, dass der angegebene Passcode nur einmal verwendet wird.
Die Gates
Jetzt haben wir geklärt, was die Prüfmodifikatoren bedeuten und nun müssen wir uns einem anderen Satz von Modifikatoren widmen: den Gates.
GateOne
Dieser Modifikator legt Bedingungen fest, von wem eine gültige Transaktion kommen kann. (msg.sender)
GateTwo
Dieser Modifikator legt eindeutige Bedingungen für die bereitgestellte Gasmenge fest.
GateThree
Das letzte Gate gibt viele Fragen auf. Es legt drei Bedingungen fest, die sich auf ein Argument mit dem Namen gateKey beziehen.
Was haben wir gelernt?
Wir wissen, dass die Tür, der theCyberGatekeeper Smart Contract, vielleicht nicht dort ist, wo sie zuerst zu sein schien. Wir haben gelernt, dass wir eine Passphrase brauchen, die korrekt ist und vorher nie benutzt wurde, um hineinzukommen. Wir haben auch einige Bedingungen bezüglich der Anzahl der Teilnehmer, einige Anforderungen an die Menge an Gas, die bereitgestellt wird, sowie komplexe Anforderungen bezüglich eines mysteriösen gateKey sehen können.
Fortsetzung folgt
PGP Fingerprint des Redakteurs Wilfried Kopp:
15AF C574 D3F9 F1C3 CCDD E31E 2DCE C4DC 506E 6475
[Bild: FreshPaint/Shutterstock]