Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

Hallo zusammen!

Vor kurzem hat Waves Labs eine Ankündigung gemacht 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 Ventuary plant, dApps mit sozialen Funktionen zu entwickeln: Abstimmungen, Fundraising, Treuhandverwaltung usw.
Wir haben mit einem einfachen Beispiel in der Q&A-Session auch in RIDE IDE – einem Beispiel mit einer gemeinsamen Brieftasche.

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 Faucet 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: Explorer

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:
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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].
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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. Transaktion.

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.
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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:
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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 dem Beispiel

Ride4Dapps nun 2 neue Annotationstypen enthält:

  1. @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.
  2. @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.
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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 (zum Beispiel)
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.
Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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 }]}))

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

Bob hat noch 1,99 WAVES. Das bedeutet, dass Bob eine Gebühr von 0,01 WAVES bezahlt hat.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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.

Lernen Sie, Waves Smart Contracts in RIDE und RIDE4DAPPS zu schreiben. Teil 1 (Multiplayer-Wallet)

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

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster