Dezentrales Open-Source-Partnerprogramm auf der Waves-Blockchain

Ein dezentrales Partnerprogramm basierend auf der Waves-Blockchain, implementiert im Rahmen eines Waves Labs-Stipendiums vom Bettex-Team.

Der Beitrag wird nicht gesponsert! Das Programm ist Open Source, seine Nutzung und Verbreitung ist kostenlos. Die Nutzung des Programms stimuliert die Entwicklung von dApp-Anwendungen und fördert im Allgemeinen die Dezentralisierung, was für jeden Benutzer des Netzwerks von Vorteil ist.

Dezentrales Open-Source-Partnerprogramm auf der Waves-Blockchain

Die vorgestellte dApp für Affiliate-Programme ist eine Vorlage für Projekte, die Affiliate als Teil ihrer Funktionalität beinhalten. Der Code kann als Vorlage zum Kopieren, als Bibliothek oder als Ideensammlung für die technische Umsetzung genutzt werden.

Von der Funktionalität her handelt es sich um ein gewöhnliches Affiliate-System, das die Registrierung bei einem Empfehlungsgeber, die mehrstufige Abgrenzung der Vergütung für Empfehlungen und die Motivation zur Registrierung im System (Cashback) umsetzt. Das System ist eine „reine“ dApp, das heißt, die Webanwendung interagiert direkt mit der Blockchain ohne eigenes Backend, Datenbank etc.

Dabei kommen Techniken zum Einsatz, die auch bei vielen anderen Projekten nützlich sein können:

  • Aufruf eines Smart-Kontos auf Guthaben mit sofortiger Rückzahlung (zum Zeitpunkt des Anrufs sind keine Tokens auf dem Konto vorhanden, um den Anruf zu bezahlen, diese erscheinen jedoch dort als Ergebnis des Anrufs).
  • PoW-Captcha – Schutz vor hochfrequentem automatisiertem Aufruf von Smart-Account-Funktionen – ähnlich wie Captcha, jedoch durch Nachweis der Nutzung von Rechenressourcen.
  • Anforderung von Datenschlüsseln per Vorlage.

Der Antrag besteht aus:

  • Smart-Account-Code in der Sprache ride4dapps (der wie geplant in den Haupt-Smart-Account integriert wird, für den Sie die Affiliate-Funktionalität implementieren müssen);
  • js-Wrapper, der eine Abstraktionsschicht über die WAVES NODE REST API implementiert;
  • Code im VueJS-Framework, der ein Beispiel für die Verwendung der Bibliothek und des RIDE-Codes ist.

Lassen Sie uns alle aufgeführten Funktionen beschreiben.

Ein Smart-Konto mit sofortiger Rückzahlung verschulden

Der Aufruf von InvokeScript erfordert die Zahlung einer Gebühr von dem Konto, das die Transaktion initiiert. Dies ist kein Problem, wenn Sie ein Projekt für Blockchain-Freaks durchführen, die eine bestimmte Anzahl von WAVES-Tokens auf ihrem Konto haben. Wenn das Produkt jedoch auf die breite Masse ausgerichtet ist, wird dies zu einem ernsthaften Problem. Schließlich muss sich der Benutzer um den Kauf von WAVES-Tokens (oder einem anderen geeigneten Vermögenswert, mit dem Transaktionen bezahlt werden können) kümmern, was die ohnehin schon beträchtliche Hürde für den Einstieg in das Projekt erhöht. Wir können Vermögenswerte an Benutzer verteilen, die für Transaktionen bezahlen dürfen, und sind dem Risiko ausgesetzt, dass sie missbraucht werden, wenn automatisierte Systeme geschaffen werden, um liquide Vermögenswerte aus unserem System zu pumpen.

Es wäre sehr praktisch, wenn es möglich wäre, InvokeScript „auf Kosten des Empfängers“ (des Smart-Kontos, auf dem das Skript installiert ist) aufzurufen, und diese Möglichkeit besteht, wenn auch nicht auf offensichtliche Weise.

Wenn innerhalb von InvokeScript ein ScriptTransfer an die Adresse des Anrufers durchgeführt wird, der die für die Gebühr ausgegebenen Token kompensiert, dann ist ein solcher Anruf erfolgreich, auch wenn zum Zeitpunkt des Anrufs kein Guthaben auf dem anrufenden Konto vorhanden war. Dies ist möglich, da die Prüfung der ausreichenden Anzahl an Token erst nach dem Aufruf der Transaktion und nicht davor erfolgt, so dass Transaktionen auf Guthaben möglich sind, sofern diese sofort eingelöst werden.

ScriptTransfer(i.Anrufer, i.Gebühr, Einheit)

Der untenstehende Code erstattet die ausgegebene Gebühr mit Smart-Account-Guthaben. Um sich vor einem Missbrauch dieser Funktion zu schützen, müssen Sie überprüfen, ob der Anrufer die Gebühr in der richtigen Höhe 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
}

Zum Schutz vor böswilliger und sinnloser Geldverschwendung ist außerdem ein Schutz vor automatischen Anrufen (PoW-Captcha) erforderlich.

PoW-Captcha

Die Idee des Proof-of-Work-Captchas ist nicht neu und wurde bereits in verschiedenen Projekten umgesetzt, darunter auch auf Basis von WAVES. Der Sinn der Idee besteht darin, dass der Aufrufer zum Ausführen einer Aktion, die die Ressourcen unseres Projekts verschwendet, auch seine eigenen Ressourcen aufwenden muss, was einen Angriff zur Ressourcenverarmung ziemlich kostspielig macht. Für eine sehr einfache und kostengünstige Validierung, dass der Absender der Transaktion das PoW-Problem gelöst hat, gibt es eine Transaktions-ID-Prüfung:

if take(toBase58String(i.transactionId), 3) != „123“ then throw(“Proof of Work failed“) else

Um eine Transaktion durchzuführen, muss der Aufrufer solche Parameter so wählen, dass sein Base58-Code (ID) mit den Zahlen 123 beginnt, was durchschnittlich 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 leicht und auf offensichtliche Weise geändert werden.

Datenschlüssel nach Vorlage abfragen

Um die Blockchain als Datenbank nutzen zu können, ist es wichtig, über API-Tools zum Abfragen der Datenbank als Schlüsselwert mithilfe von Vorlagen zu verfügen. Ein solches Toolkit erschien Anfang Juli 2019 als Parameter ?Streichhölzer auf Anfrage der REST-API /addresses/data?matches=regexp. Wenn wir nun mehr als einen Schlüssel und nicht alle Schlüssel auf einmal von der Webanwendung erhalten müssen, sondern nur eine Gruppe, können wir eine Auswahl anhand des Namens des Schlüssels treffen. In diesem Projekt werden beispielsweise Auszahlungstransaktionen als kodiert

withdraw_${userAddress}_${txid}

Damit können Sie mithilfe der Vorlage eine Liste der Transaktionen zum Abheben von Geldern für eine bestimmte Adresse abrufen:

?matches=withdraw_${userAddress}_.*

Lassen Sie uns nun die Komponenten der fertigen Lösung analysieren.

vuejs-Code

Der Code ist eine funktionierende Demo, die einem echten Projekt nahe kommt. Es implementiert die Anmeldung über Waves Keeper und arbeitet mit der Affiliate.js-Bibliothek zusammen, mit deren Hilfe es einen Benutzer im System registriert, Transaktionsdaten abfragt und Ihnen auch ermöglicht, verdiente Gelder auf das Konto des Benutzers abzuheben.

Dezentrales Open-Source-Partnerprogramm auf der Waves-Blockchain

Code auf RIDE

Besteht aus Registrierungs-, Einzahlungs- und Auszahlungsfunktionen.

Die Registerfunktion registriert einen Benutzer im System. Es verfügt über zwei Parameter: Referer (Referr-Adresse) und den Salt-Parameter, der nicht im Funktionscode verwendet wird und zur Auswahl der Transaktions-ID (PoW-Captcha-Aufgabe) benötigt wird.

Die Funktion verwendet (wie die übrigen Funktionen in diesem Projekt) die Kredittechnik. Das Ergebnis der Funktion ist die Zahlung einer Gebühr für den Aufruf dieser Funktion. Dank dieser Lösung kann ein Benutzer, der gerade ein Wallet erstellt hat, sofort mit dem System arbeiten und muss sich nicht mit der Frage des Erwerbs oder Erhalts eines Vermögenswerts herumschlagen, der es ihm ermöglicht, eine Transaktionsgebühr zu zahlen.

Das Ergebnis der Registrierungsfunktion sind zwei Datensätze:

${owner)_referer = referer
${referer}_referral_${owner} = owner

Dies ermöglicht Vorwärts- und Rückwärtssuchen (Referrer des angegebenen Benutzers und alle Verweise des angegebenen Benutzers).

Die Fondsfunktion ist eher eine Vorlage für die Entwicklung echter Funktionalität. In der dargestellten Form nimmt es alle durch die Transaktion übertragenen Gelder und verteilt sie auf die Referrer-Konten der 1., 2., 3. Ebene, auf das „Cashback“-Konto und das „Change“-Konto (alles, was bei der Verteilung auf frühere Konten übrig bleibt, kommt hierher).

Cashback ist ein Anreiz für den Endbenutzer, am Empfehlungssystem teilzunehmen. Der vom System in Form von „Cashback“ gezahlte Teil der Provision kann vom Nutzer ebenso wie Prämien für Empfehlungen ausgezahlt werden.

Bei Verwendung des Empfehlungssystems sollte die Fondsfunktion geändert und in die Hauptlogik des Smart-Kontos integriert werden, auf dem das System funktioniert. Wenn beispielsweise eine Empfehlungsprämie für eine abgeschlossene Wette ausgezahlt wird, sollte die Fondsfunktion in die Logik integriert werden, in der die Wette abgeschlossen wird (oder eine andere Zielaktion ausgeführt wird, für die die Prämie ausgezahlt wird). In dieser Funktion sind drei Ebenen von Empfehlungsprämien codiert. Wenn Sie mehr oder weniger Ebenen erstellen möchten, wird dies auch im Code korrigiert. Der Belohnungsprozentsatz wird durch die Level1-Level3-Konstanten festgelegt und im Code wie folgt berechnet Betrag * Level / 1000, also der Wert 1 entspricht 0,1 % (dies kann auch im Code geändert werden).

Der Funktionsaufruf ändert den Kontostand und erstellt außerdem Einträge zur Protokollierung des Formulars:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Das heißt, der Zeitpunkt der Transaktion ist der Zeitpunkt des Blocks, in dem sie sich befindet. Dies ist zuverlässiger als die Verwendung des Zeitstempels der Transaktion selbst, insbesondere da dieser nicht im Callable verfügbar ist.
Die Auszahlungsfunktion hebt alle angesammelten Prämien auf das Konto des Benutzers ab. Erstellt Einträge zu Protokollierungszwecken:

# withdraw log: withdraw_user_txid=amount:timestamp

Anwendung

Der Hauptteil der Anwendung ist die Affiliate.js-Bibliothek, die eine Brücke zwischen den Affiliate-Datenmodellen und der WAVES NODE REST API darstellt. Implementiert eine Framework-unabhängige Abstraktionsschicht (jede kann verwendet werden). Aktive Funktionen (Anmelden, Abheben) setzen voraus, dass Waves Keeper im System installiert ist, die Bibliothek selbst prüft dies nicht.

Implementiert Methoden:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Die Funktionalität der Methoden ist anhand der Namen ersichtlich, die Parameter und Rückgabedaten sind im Code beschrieben. Die Registrierungsfunktion erfordert zusätzliche Kommentare – sie startet den Transaktions-ID-Auswahlzyklus, sodass er bei 123 beginnt – dies ist das oben beschriebene PoW-Captcha, das vor Massenregistrierungen schützt. Die Funktion findet eine Transaktion mit der erforderlichen ID und signiert sie dann über Waves Keeper.

DEX-Partnerprogramm verfügbar unter GitHub.com.

Source: habr.com

Kommentar hinzufügen