Ein dezentrales Partnerprogramm für die Waves-Blockchain, das im Rahmen des Waves Labs-Stipendiums des Bettex-Teams implementiert wurde.
Die Post ist keine Werbung! Das Programm ist Open Source, seine Nutzung und Verbreitung ist kostenlos. Die Anwendung des Programms stimuliert die Entwicklung von dApp-Anwendungen und fördert insgesamt die Dezentralisierung, was für jeden Webbenutzer von Vorteil ist.

Von dApp für Partnerprogramme eingeführt, ist eine Vorlage für Projekte, die Partner als Teil ihrer Funktionalität enthalten. Der Code kann als Vorlage zum Kopieren, als Bibliothek oder als Ideen für die technische Implementierung verwendet werden.
In Bezug auf die Funktionalität ist dies ein reguläres Affiliate-System, das die Registrierung mit der Angabe eines Empfehlers, der mehrstufigen Ansammlung von Belohnungen für Empfehlungen und der Motivation für die Registrierung im System (Cashback) implementiert. Das System ist eine „reine“ dApp, dh die Webanwendung interagiert direkt mit der Blockchain ohne Backend, Datenbank usw.
Es werden Techniken verwendet, die auch in vielen anderen Projekten nützlich sein können:
- Anrufen eines Smart-Kontos auf Kredit mit sofortiger Rückzahlung (zum Zeitpunkt des Anrufs befinden sich keine Token auf dem Konto, um den Anruf zu bezahlen, aber sie werden dort als Ergebnis des Anrufs angezeigt).
- PoW-Captcha - Schutz gegen hochfrequentes automatisiertes Aufrufen von Smart-Account-Funktionen - ein Analogon zu Captcha, jedoch durch Nachweis des Einsatzes von Rechenressourcen.
- Anforderung von Datenschlüsseln per Vorlage.
Die Anwendung besteht aus:
- Smart-Account-Code in der Spracheritt4dapps (der standardmäßig mit dem Haupt-Smart-Account zusammengeführt wird, für den Sie die Affiliate-Funktionalität implementieren müssen);
- js-Wrapper, die die Abstraktionsebene über die WAVES NODE REST-API implementieren;
- Code im vuejs-Framework, ein Beispiel für die Verwendung der Bibliothek und des RIDE-Codes.
Wir beschreiben alle diese Funktionen.
Rufen Sie das Smart-Konto mit sofortiger Rückzahlung auf Kredit anInvokeScript-Aufrufe erfordern eine Gebühr vom Konto, das die Transaktion initiiert. Dies ist kein Problem, wenn Sie ein Projekt für Blockchain-Freaks durchführen, die einige WAVES-Token auf ihrem Konto haben. Wenn das Produkt jedoch auf eine weit verbreitete Verwendung ausgerichtet ist, wird dies zu einem ernsthaften Problem. Schließlich muss sich der Benutzer um den Kauf von WAVES-Token (oder eines anderen geeigneten Vermögenswerts, mit dem Sie für Transaktionen bezahlen können) kümmern, wodurch sich die bereits erhebliche Schwelle für die Eingabe des Projekts erhöht. Wir können Vermögenswerte an Benutzer verteilen, wodurch wir für Transaktionen bezahlen und dem Risiko ihres Missbrauchs ausgesetzt sind, wenn automatisierte Systeme erstellt werden, um flüssige Vermögenswerte aus unserem System abzupumpen.
Es wäre sehr praktisch, wenn es möglich wäre, einen InvokeScript-Aufruf „auf Kosten des Empfängers“ (des Smart-Kontos, auf dem das Skript installiert ist) zu tätigen, und eine solche Möglichkeit besteht, obwohl nicht auf offensichtliche Weise.
Wenn Sie ScriptTransfer in InvokeScript an die Adresse des Anrufers ausführen, wodurch die für die Gebühr ausgegebenen Token kompensiert werden, ist ein solcher Anruf erfolgreich, selbst wenn zum Zeitpunkt des Anrufs keine Vermögenswerte auf dem anrufenden Konto vorhanden waren. Dies ist möglich, weil nach dem Aufruf einer Transaktion und nicht davor eine ausreichende Anzahl von Token geprüft wird, so dass Transaktionen auf Kredit von ihrer sofortigen Rückzahlung abhängig gemacht werden können.
ScriptTransfer (i.caller, i.fee, unit)Der folgende Code erstattet die Gebühr, die auf Kosten des Smart-Kontos ausgegeben wurde. Um sich vor Missbrauch dieser Funktion zu schützen, müssen Sie überprüfen, ob der Anrufer eine Gebühr für das richtige Asset und innerhalb angemessener Grenzen ausgibt:
func checkFee(i:Invocation) = { if i.fee > maxFee then throw(“unreasonable large fee”) else if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true }
Der Schutz vor böswilliger und sinnloser Geldverschwendung erfordert auch den Schutz vor automatischen Anrufen (PoW-Captcha).
PoW-CaptchaDie Idee des Captcha zum Nachweis der Arbeit ist nicht neu und wurde bereits in verschiedenen Projekten umgesetzt, einschließlich solcher, die auf der Basis von WAVES umgesetzt wurden. Die Idee ist, dass der Anrufer für die Aktion, die die Ressourcen unseres Projekts verschwendet, auch seine eigenen Ressourcen ausgeben muss, was den Angriff auf die Ressourcenverarmung ziemlich teuer macht. Für eine sehr einfache und kostengünstige Überprüfung, ob der Absender der Transaktion die PoW-Aufgabe gelöst hat, wird die Transaktions-ID überprüft:
Wenn take (toBase58String (i.transactionId), 3)! = "123", dann werfen Sie ("Proof of Work Failed")Um eine Transaktion durchzuführen, muss der Anrufer solche Parameter so auswählen, dass sein Base58-Code (ID) bei 123 beginnt, was einem Durchschnitt von einigen zehn Sekunden Prozessorzeit entspricht und für unsere Aufgabe im Allgemeinen angemessen ist. Wenn ein einfacheres oder komplexeres PoW erforderlich ist, kann die Aufgabe auf offensichtliche Weise leicht verfeinert werden.
Anforderung von Datenschlüsseln per VorlageUm Blockchain als Datenbank zu verwenden, ist es wichtig, über API-Tools zum Abfragen der Datenbank als Schlüsselwertvorlagen zu verfügen. Ein solches Toolkit wurde Anfang Juli 2019 als Parameter "
Übereinstimmungen" für die REST-API-Anforderung
/ Adressen / Daten "Übereinstimmungen = regulärer Ausdruck" angezeigt . Wenn wir nicht einen Schlüssel und nicht alle Schlüssel gleichzeitig aus einer Webanwendung abrufen müssen, sondern nur eine Gruppe, können wir eine Auswahl anhand des Schlüsselnamens treffen. In diesem Projekt werden Auszahlungstransaktionen beispielsweise als codiert
withdraw_${userAddress}_${txid}
Hiermit können Sie eine Liste der Transaktionen zum Abheben von Geldern für eine bestimmte Adresse gemäß der Vorlage abrufen:
?matches=withdraw_${userAddress}_.*
Jetzt analysieren wir die Komponenten der schlüsselfertigen Lösung.
Vuejs CodeDer Code ist eine funktionierende Demo in der Nähe eines realen Projekts. Es implementiert die Anmeldung über Waves Keeper und arbeitet mit der Bibliothek "partneriate.js" zusammen, mit deren Hilfe der Benutzer im System registriert, Transaktionsdaten abgefragt und verdientes Geld auf das Konto des Benutzers abgebucht werden kann.
RIDE CodeEs besteht aus Register-, Fonds- und Auszahlungsfunktionen.
Die Registerfunktion registriert sich beim Benutzersystem. Es hat zwei Parameter: Referer (Referrer-Adresse) und den Salt-Parameter, der nicht im Funktionscode verwendet wird, der zur Auswahl der Transaktions-ID benötigt wird (PoW-Captcha-Task).
Die Funktion (wie auch die anderen Funktionen aus diesem Projekt) verwendet die Ausleihtechnik. Das Ergebnis der Funktion ist die Finanzierung einer Gebühr für den Aufruf dieser Funktion. Dank dieser Entscheidung kann der Benutzer, der gerade die Brieftasche erstellt hat, sofort mit dem System arbeiten und muss sich nicht über das Problem des Kaufs oder Empfangs eines Vermögenswerts wundern, mit dem Sie eine Transaktionsgebühr zahlen können.
Das Ergebnis der Registrierungsfunktion sind zwei Einträge:
${owner)_referer = referer ${referer}_referral_${owner} = owner
Dies ermöglicht eine direkte und umgekehrte Suche (Verweis dieses Benutzers und alle Verweise dieses Benutzers).
Die Fondsfunktion ist eher eine Vorlage für die Entwicklung realer Funktionen. In der dargestellten Form werden alle durch die Transaktion überwiesenen Beträge auf die Konten der Überweiser 1, 2, 3, auf das Cashback-Konto und das Änderungskonto verteilt (alles, was bei der Verteilung auf die vorherigen Konten übrig bleibt, fällt hierher).
Cashback ist ein Mittel, um den Endbenutzer zur Teilnahme am Überweisungssystem anzuregen. Der Benutzer kann den vom System gezahlten Teil der Provision in Form eines "Cashbacks" auf die gleiche Weise wie die Belohnungen für Empfehlungen abheben.
Bei Verwendung des Überweisungssystems sollte die Fondsfunktion geändert werden, die in die Hauptlogik des Smart-Kontos integriert ist, auf dem das System arbeiten wird. Wenn beispielsweise die Empfehlungsgebühr für die getätigte Wette gezahlt wird, sollte die Fondsfunktion in die Logik integriert werden, in der die Wette abgeschlossen wird (oder eine andere gezielte Aktion ausgeführt wird, für die die Gebühr gezahlt wird). Diese Funktion codiert drei Ebenen von Empfehlungsbelohnungen. Wenn Sie mehr oder weniger Ebenen ausführen müssen, wird dies auch im Code korrigiert. Der Prozentsatz der Vergütung wird durch die Konstanten der Stufen 1 bis 3 festgelegt. Im Code wird er als
Betrag * Stufe / 1000 betrachtet , dh der Wert 1 entspricht 0,1% (dies kann auch im Code geändert werden).
Der Funktionsaufruf ändert den Kontostand und erstellt Einträge zum Anmelden im Formular:
fund_address_txid = address:owner:inc:level:timestamp timestamp ( ) func getTimestamp() = { let block = extract(blockInfoByHeight(height)) toString(block.timestamp) }
Das heißt, die Transaktionszeit ist die Zeit des Blocks, in dem sie sich befindet. Dies ist zuverlässiger als die Verwendung eines Zeitstempels aus der Transaktion selbst, zumal von Callable aus nicht darauf zugegriffen werden kann.
Die Auszahlungsfunktion zeigt alle auf dem Benutzerkonto angesammelten Prämien an. Erstellt Einträge für Protokollierungszwecke:
# withdraw log: withdraw_user_txid=amount:timestamp
AppDer Hauptteil der Anwendung ist die Bibliothek "iate.js ", die eine Brücke zwischen den Partnerdatenmodellen und der WAVES NODE REST-API darstellt. Implementiert eine vom Framework unabhängige Abstraktionsebene (jede kann verwendet werden). Aktive Funktionen (registrieren, zurückziehen) setzen voraus, dass Waves Keeper im System installiert ist, die Bibliothek selbst überprüft dies nicht.
Implementiert Methoden:
fetchReferralTransactions fetchWithdrawTransactions fetchMyBalance fetchReferrals fetchReferer withdraw register
Die Funktionalität der Methoden ergibt sich aus den Namen, den Parametern und den zurückgegebenen Daten, die im Code beschrieben sind. Die Registerfunktion erfordert zusätzliche Kommentare - sie startet den Transaktions-ID-Übereinstimmungszyklus so, dass er bei 123 beginnt - dies ist das oben beschriebene PoW-Captcha, das vor Massenregistrierungen schützt. Die Funktion findet die Transaktion mit der gewünschten ID und signiert sie dann über Waves Keeper.
Das DEX-Partnerprogramm ist auf
GitHub.com verfügbar.