
Hallo zusammen!
Vor kurzem hat Waves Labs einen Wettbewerb für Entwickler anlässlich der Einführung des Testnetzwerks zur Erweiterung der Programmiersprache RIDE für dezentrale Anwendungen Ride4Dapps veranstaltet!
Wir haben den DAO-Fall gewählt, da plant, dApps mit sozialen Funktionen zu entwickeln: Abstimmungen, Fundraising, Treuhandverwaltung usw.
Wir haben mit einem einfachen Beispiel in und in — Beispiel mit .
Lassen Sie uns dieses Beispiel durchgehen, Hypothesen überprüfen und einige Merkwürdigkeiten betrachten:
Angenommen, wir haben Alice – dApp-Besitzerin
Boob und Cooper – Partner von Alice, Mitgründer von Alice-BC DAO
Neli – Geschäftsinhaberin, die Finanzierung benötigt
Bank – die Bank, die Token verteilt
Schritt 1. Initialisierung der Salden
Um im Testnetz von Waves Token zu erhalten, müssen wir die ansprechen und die Adresse angeben, an die die Token gesendet werden sollen.
Die Adresse kann im IDE ermittelt werden, indem die Kontoinformationen angezeigt werden.
Wir weisen der Bank 10 WAVES zu. Danach überprüfen wir, ob sie über den Block- und Transaktions-Explorer eingegangen sind:
Nun lassen Sie uns die Token von der Bank an die anderen Teilnehmer verteilen. (Hinweis: Alle Transaktionen im Waves-Netzwerk sind nicht kostenlos, daher ist ein minimales positives Guthaben bei allen Teilnehmern erforderlich, um Transaktionen durchzuführen).
1 WAVES = 100000000 Einheiten (wavelets), da die Beträge nur ganze Zahlen sein können.
0.01 WAVES (Transaktionsgebühr) = 1000000
Bank -> [3 WAVES] -> Alice, über TransferTransaction (Typ: 4).
Wir überprüfen, ob env.SEED, mit dem die Transaktionen signiert werden, mit unserer Bank übereinstimmt:


Wenn Sie kein entsprechendes Seed-Phrase haben, wechseln Sie einfach im Tab 'Konten' zu ihm und überprüfen Sie es noch einmal.
Danach erstellen, kündigen und signieren wir die Transaktion über die Übertragung von 3 WAVES an Alice.
Die Daten von Alice können auch über die Variable env.accounts abgerufen werden. Die Nummerierung beginnt bei 0, daher ist Alice env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Das Ergebnis kann auch im Explorer beobachtet werden, der Link wird uns sofort nach der Ausführung der .
Wir stellen sicher, dass Alicas Guthaben um 3 WAVES aufgestockt wurde, während in der Bank 10 — 3 — 0.01 = 0.699 verbleiben.


Wir senden Boob und Cooper je 3 WAVES und Neli, Xena und Mark je 0.2 WAVES auf dieselbe Weise.
(Hinweis: Wir haben einen Fehler bei einer Ziffer gemacht und Neli 0.02 WAVES geschickt. Seien Sie vorsichtig!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Nach dem Aufstocken der Salden aller Teilnehmer sehen wir:

Schritt 2. Erstellung eines dApp-Kontos
Wir haben uns darauf geeinigt, dass der Ersteller und Besitzer der dezentralen Anwendung Alice sein wird.
In den Konten gehen wir und setzen sie als SEED fest und überprüfen, ob env.SEED mit Alice übereinstimmt.
Lassen Sie uns den einfachsten Skript (Vertrag) auf dem Account Alice installieren, der möglich ist.
Smart Contracts in Waves sind Prädikate, die es bestimmten Arten von ausgehenden Transaktionen unter bestimmten Bedingungen erlauben oder verbieten. In diesem Fall ist die Bedingung - ALWAYS. Der Code des Vertrags - true. Wir rufen deploy() auf.

Die Gebühr für die setScript-Transaktion beträgt 1400000/100000000 = 0.014 WAVES. Alice hat noch 2.986 WAVES auf ihrem Konto.
Jetzt versuchen wir, auf das Konto von Alice eine komplexere Logik des Smart Contracts zu installieren, wie sie in
Ride4Dapps jetzt 2 neue Annotationstypen umfasst:
- @Callable(i) - akzeptiert als Parameter i, die Informationen darüber, welches Konto die Transaktion aufgerufen/unterzeichnet hat. Das Ergebnis dieser Funktion bestimmt den Zustand des dApp Kontos. Andere Konten können Transaktionen erstellen und Funktionen mit dieser Annotation ausführen und den Zustand des dApp Kontos ändern.
- @Verifier(tx) - Der Verifier der Transaktion mit dem Parameter tx der Transaktion. Entspricht der Logik der Prädikate aus RIDE. In diesem Ausdruck kann man erlauben oder verbieten, dass weitere Änderungen an der Logik der Smart Contracts auf dem dApp Konto vorgenommen werden.
Lass uns machen dApp das Konto zu einer gemeinsamen Geldbörse für alle Teilnehmer.

Um zu überprüfen, welcher Vertrag jetzt aktiv ist, können wir im Blockexplorer den base64-Code des Smart Contracts kopieren und ihn durch den Dekompilator erkennen ()



Wir stellen sicher, dass die Logik des Smart Contracts dem entspricht, was wir erwarten.
Alice hat noch 2.972 WAVES auf ihrem Konto.
Dieser dApp verfolgt, wie viel jeder Teilnehmer in den gemeinsamen Fond einbringt, durch das Mechanismus data transaction — DataEntry(currentKey, newAmount), wobei currentKey das Konto ist, das die Funktion deposit aufruft, und newAmount der Betrag des aufgeladenen Guthabens ist.
Boob und Cooper bringen jeweils 1 WAVES auf das dApp Konto ein.

Wir machen einen Fehler und die Transaktion schlägt fehl. Obwohl wir uns vergewissert haben, dass die Transaktion im Namen von Bob durchgeführt wird, haben wir im Index einen Fehler gemacht und das Konto Bank angegeben, das keinen Smart Contract hat. An dieser Stelle ist es wichtig zu beachten — für erfolglose Versuche, Transaktionen zu initiieren, wird keine Gebühr erhoben! Wird nicht abgezogen! Alice hat noch 2.972 WAVES auf ihrem Konto. Bob hat 3 WAVES.
Bob hat 1 WAVES an das dApp-Konto gesendet.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob hat 1,99 WAVES übrig. Das bedeutet, dass Bob 0,01 WAVES an Gebühren gezahlt hat.

Alice hatten ursprünglich 2,972 WAVES auf ihrem Konto, jetzt sind es 3,972. Auf dem Konto von Alice wurde ebenfalls eine Transaktion registriert, jedoch wurde von dApp Account (Alice) keine Gebühr abgezogen.
Nachdem auch Cooper das Konto aufgeladen hat, beträgt der Stand auf Alices Konto jetzt 4,972 WAVES.

Wer wie viele WAVES im gemeinsamen Wallet besitzt, kann im Block-Explorer im Tab Daten nachsehen.
Cooper hat sich entschieden, den Betrag von 1 WAVES nicht im gemeinsamen Wallet zu belassen und möchte die Hälfte der Mittel abheben. Dazu muss er die Funktion withdraw aufrufen.

Wir haben jedoch erneut einen Fehler gemacht, da die Funktion withdraw ganz andere Parameter und eine andere Signatur hat. Bei der Gestaltung von Smart Contracts in RIDE4DAPPS sollte auf diesen Punkt geachtet werden.

Cooper hat nun 2,48 WAVES auf seinem Konto. Somit 3 WAVES – 1 – 0,01, dann + 0,5 – 0,01. Deshalb kostet jeder Aufruf von deposit und withdraw 0,01 WAVES. Damit haben sich die Einträge in der Tabelle der dApp-Eigentümer wie folgt geändert.

Bob wollte ebenfalls einen Betrag aus dem gemeinsamen Wallet abheben, hat jedoch einen Fehler gemacht und versucht, 1,5 WAVES abzuheben.

Allerdings gab es im Smart Contract eine Überprüfung für eine solche Situation.
Xena ist eine Betrügerin, die versuchte, 1 WAVES vom gemeinsamen Konto abzuheben.

Auch sie hatte damit keinen Erfolg.
Im nächsten Teil werden wir kompliziertere Aspekte diskutieren, die mit der Unzulänglichkeit des dApp-Kontos von Alice verbunden sind.
Quelle: habr.com
