
Hallo zusammen!
Vor kurzem hat Waves Labs zu einem Wettbewerb für Entwickler anlässlich des Releases des Testnet-Expansionsprojekts für die Programmiersprache von Smart Contracts RIDE für dezentrale Anwendungen Ride4Dapps!
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 der auch in – einem Beispiel mit .
Lassen Sie uns dieses Beispiel durchgehen, Hypothesen überprüfen und einige Merkwürdigkeiten betrachten:
Angenommen, wir haben Alice – die dApp-Eigentümerin
Boob und Cooper – Partner von Alice, Mitbegründer des Alice-BC DAO
Neli – Geschäftsinhaberin, die Finanzmittel benötigt
Bank – die Bank, die Token verteilt
Schritt 1. Initialisierung der Salden
Um im Waves-Testnetz Token zu erhalten, müssen Sie sich an den wenden und die Adresse angeben, an die die Token gesendet werden sollen.
Die Adresse kann im IDE ermittelt werden, indem die Kontodaten aufgerufen werden.
Wir weisen der Bank 10 WAVES zu. Danach überprüfen wir, ob sie über den Block- und Transaktions-Explorer angekommen sind:
Jetzt lassen Sie uns die Tokens aus der Bank an die anderen Teilnehmer verteilen. (Hinweis: Alle Transaktionen im Waves-Netzwerk sind nicht kostenlos, daher ist ein minimales Guthaben erforderlich, um Transaktionen durchzuführen).
1 WAVES = 100000000 Einheiten (Wavelets), da Beträge nur ganze Zahlen sein können.
0,01 WAVES (Transaktionsgebühr) = 1000000
Bank -> [3 WAVES] -> Alice, über TransferTransaction (Typ: 4).
Überprüfen Sie, ob der env.SEED, mit dem die Transaktionen signiert werden, mit unserer Bank übereinstimmt:


Wenn Sie keine übereinstimmende Seed-Phrase haben, wechseln Sie einfach im Tab 'Konten' und überprüfen Sie es erneut.
Danach erstellen, kündigen und signieren wir die Transaktion zur Ü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, entsprechend 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 dazu wird uns sofort nach der Ausführung der Transaktion zurückgegeben. .
Stellen Sie sicher, dass Alices Guthaben um 3 WAVES erhöht wurde und das Guthaben der Bank 10 - 3 - 0,01 = 0,699 beträgt.


Wir senden Boob und Cooper jeweils 3 WAVES und Neli, Xena sowie Mark jeweils 0,2 WAVES auf die gleiche Weise.
(Hinweis: Wir haben einen Fehler um ein Zeichen gemacht und Neli 0,02 WAVES gesendet. Bitte seien Sie vorsichtig!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Nach dem Auffüllen der Konten aller Teilnehmer sehen wir:

Schritt 2. Erstellung des dApp-Kontos
Wir haben vereinbart, dass Alice die Schöpferin und Eigentümerin der dezentralen Anwendung sein wird.
Gehen Sie zu Accounts, setzen Sie sie als SEED fest und überprüfen Sie, ob env.SEED mit Alice übereinstimmt.
Wir versuchen, das einfachste Skript (Vertrag) auf das Konto von Alice zu installieren.
Smart Contracts in Waves sind Prädikate, die irgendeinen Typ von ausgehender Transaktion unter bestimmten Bedingungen verbieten oder erlauben. In diesem Fall ist die Bedingung – ALWAYS. Der Vertragscode ist – 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 dem Konto.
Jetzt versuchen wir, auf dem Konto von Alice eine komplexere Logik des Smart Contracts zu installieren, die in
Ride4Dapps nun 2 neue Annotationstypen enthält:
- @Callable(i) — nimmt i als Parameter und die Informationen darüber, welches Konto die Transaktion initiiert oder signiert hat. Das Ergebnis dieser Funktion bestimmt den Zustand des dApp-Kontos. Andere Konten können Transaktionen initiieren und Funktionen mit dieser Annotation ausführen, um den Zustand des dApp-Kontos zu ändern.
- @Verifier(tx) — Überprüfer der Transaktion mit dem Parameter tx der Transaktion. Entspricht der Logik von Prädikaten aus RIDE. In diesem Ausdruck können weitere Änderungen an der Logik der Smart Contracts auf dem dApp-Konto erlaubt oder verweigert werden.
Lassen Sie uns dApp das Konto als gemeinsamen Geldbeutel für alle Teilnehmer konfigurieren.

Um zu überprüfen, welcher Vertrag derzeit auf dem Konto aktiv ist, kann der base64-Code des Smart Contracts im Block-Explorer kopiert und über den Dekompilierer erkannt werden ()



Stellen Sie sicher, dass die Logik des Smart Contracts dem entspricht, was wir erwarten.
Alice hat noch 2,972 WAVES auf ihrem Konto.
Dieser dApp führt Buch über die Beiträge jedes Teilnehmers zum gemeinsamen Fonds über den Mechanismus data transaction — DataEntry(currentKey, newAmount), wobei currentKey das Konto ist, das die Funktion deposit aufruft, und newAmount der Betrag ist, der zum Guthaben hinzugefügt wird.
Boob und Cooper hinterlegen ihre Einzahlungen auf dem dApp-Konto mit jeweils 1 WAVES.

Wir machen einen Fehler und die Transaktion schlägt fehl. Obwohl wir sicher sind, dass wir die Transaktion im Namen von Bob durchführen, haben wir beim Index einen Fehler gemacht und das Bankkonto angegeben, auf dem kein Smart Contract existiert. Hier ist ein wichtiger Punkt zu beachten – für fehlgeschlagene Versuche, Transaktionen zu initiieren, wird keine Gebühr erhoben. Die Gebühr wird nicht abgezogen! Alice hat noch 2,972 WAVES in ihrem Konto. Bob hat 3 WAVES.
Bob hat 1 WAVES auf das dApp-Konto gesendet.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob hat noch 1,99 WAVES. Das bedeutet, dass Bob eine Gebühr von 0,01 WAVES bezahlt hat.

Alice hatte 2,972 WAVES, nun hat sie 3,972 WAVES. Auf Alices Konto wurde ebenfalls eine Transaktion registriert, jedoch wurde von dem dApp-Konto (Alice) keine Gebühr abgezogen.
Nachdem Cooper ebenfalls den Betrag auf Alices Konto eingezahlt hat, hat sie nun 4,972 WAVES.

Wer wie viele WAVES im gemeinsamen Wallet besitzt, kann im Block-Explorer im Tab Daten eingesehen werden.
Cooper hat es sich anders überlegt und möchte die Summe von 1 WAVES im gemeinsamen Wallet nicht behalten und beschloss, die Hälfte der Mittel abzuheben. Dazu muss er die Funktion withdraw aufrufen.

Wir haben jedoch wieder einen Fehler gemacht, da die Funktion withdraw ganz andere Parameter und eine andere Signatur hat. Bei der Gestaltung von Smart Contracts auf RIDE4DAPPS sollte man darauf achten.

Cooper hat jetzt 2,48 WAVES auf dem Konto. Entsprechend sind 3 WAVES — 1 — 0,01, und dann + 0,5 — 0,01. Jeder Aufruf von deposit und withdraw kostet also 0,01 WAVES. Infolgedessen haben sich die Einträge in der Tabelle der dApps-Besitzer wie folgt geändert.

Bob hat ebenfalls beschlossen, einen bestimmten Betrag aus dem gemeinsamen Wallet abzuheben, aber er hat einen Fehler gemacht und versucht, 1,5 WAVES abzuheben.

Im Smart Contract gab es jedoch eine Überprüfung für so eine Situation.
Xena ist eine Betrügerin, die versucht hat, 1 WAVES vom gemeinsamen Konto abzuheben.

Auch ihr ist es nicht gelungen.
Im nächsten Teil werden wir kompliziertere Aspekte im Zusammenhang mit der Unvollkommenheit des Alice dApp Accounts betrachten.
Quelle: habr.com
