Hajautettu, avoimen lähdekoodin kumppaniohjelma Waves-lohkoketjussa

Hajautettu affiliate-ohjelma Waves-lohkoketjussa, jonka Bettex-tiimi toteutti osana Waves Labs -apurahaa.

Viesti ei ole mainos! Ohjelma on avoimen lähdekoodin, sen käyttö ja jakelu on ilmaista. Ohjelman käyttö stimuloi dApp-sovellusten kehitystä ja edistää yleisesti hajauttamista, mikä hyödyttää jokaista Internetin käyttäjää.

Hajautettu, avoimen lähdekoodin kumppaniohjelma Waves-lohkoketjussa

Esitetty dApp kumppanuusohjelmille on malli projekteille, jotka sisältävät affiliate-sovelluksen osana toimintojaan. Koodia voidaan käyttää mallina kopiointiin, kirjastona tai ideasarjana tekniseen toteutukseen.

Toiminnallisesti tämä on tavallinen affiliate-järjestelmä, joka toteuttaa rekisteröinnin viittauksella, monitasoisen palkkion kertymisen viittauksista ja motivaation järjestelmään rekisteröitymiseen (cashback). Järjestelmä on "puhdas" dApp, eli verkkosovellus on vuorovaikutuksessa suoraan lohkoketjun kanssa ilman omaa taustajärjestelmää, tietokantaa jne.

Käytetyt tekniikat, joista voi olla hyötyä myös monissa muissa projekteissa:

  • Älytilin soittaminen velaksi välittömällä takaisinmaksulla (puhelun aikana tilillä ei ole tokeneita puhelun maksamiseen, vaan ne näkyvät siellä puhelun seurauksena).
  • PoW-captcha —Suojaus älykkäiden tilitoimintojen korkeataajuuksiselta automaattiselta kutsumiselta — analogisesti captcha:n kanssa, mutta laskentaresurssien käytön todistamisen kautta.
  • Pyydä tietoavaimia mallin avulla.

Sovellus koostuu:

  • älykäs tilikoodi ride4dapps-kielellä (joka suunnitelmien mukaan yhdistetään pääasialliseen älytiliin, jonka kumppanitoiminnot on otettava käyttöön);
  • js-kääre, joka toteuttaa abstraktiotason WAVES NODE REST -sovellusliittymän yli;
  • koodi vuejs-kehyksessä, joka on esimerkki kirjaston ja RIDE-koodin käytöstä.

Kuvataan kaikki luetellut ominaisuudet.

Älytilille soittaminen velkaa varten ja välitön takaisinmaksu

InvokeScriptin kutsuminen edellyttää maksun suorittamista tapahtuman aloittavalta tililtä. Tämä ei ole ongelma, jos teet projektin lohkoketjunörteille, joiden tilillä on tietty määrä WAVES-tunnuksia, mutta jos tuote on suunnattu massojen käyttöön —  siitä tulee vakava ongelma. Loppujen lopuksi käyttäjän on huolehdittava WAVES-tokenien (tai muun sopivan omaisuuden, jolla voidaan maksaa tapahtumat) ostaminen, mikä lisää jo ennestään huomattavaa estettä projektiin pääsylle. Voimme jakaa omaisuuden käyttäjille, jotka pystyvät maksamaan tapahtumista ja kohtaavat väärinkäytösten riskin, kun automatisoituja järjestelmiä luodaan pumppaamaan nestettä järjestelmästämme.

Olisi erittäin kätevää, jos InvokeScriptia voitaisiin kutsua "vastaanottajan kustannuksella" (älykäs tili, jolle komentosarja on asennettu), ja tällainen mahdollisuus, vaikkakaan ei ilmeisellä tavalla, on olemassa.

Jos teet InvokeScriptin sisällä ScriptTransferin soittajan osoitteeseen, joka kompensoi käytetyt maksutokenit, tällainen puhelu onnistuu, vaikka puhelun aikana soittotilillä ei olisi varoja. Tämä on mahdollista, koska merkkien riittävyys tarkistetaan tapahtuman kutsun jälkeen, eikä ennen sitä, jotta tapahtumat voidaan tehdä luotolla, ja ne maksetaan välittömästi takaisin.

ScriptTransfer (i.soittaja, i.maksu, yksikkö)

Alla oleva koodi hyvittää käytetyn maksun älytilin varoilla. Tämän ominaisuuden väärinkäytöltä suojaamiseksi on tarpeen tarkistaa, että soittaja käyttää maksun vaaditussa omaisuudessa ja kohtuullisissa rajoissa:

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
}

Lisäksi tarvitaan automaattinen puhelusuojaus (PoW-captcha) suojaamaan haitalliselta ja järjettömältä varojen tuhlaalta.

PoW-captcha

Ajatus proof-of-work captchasta ei ole uusi ja sitä on jo toteutettu useissa projekteissa, mukaan lukien WAVESin pohjalta toteutetut. Ajatuksena on, että voidakseen suorittaa projektimme resursseja kuluttavan toiminnon soittajan on käytettävä myös omia resurssejaan, mikä tekee resurssien tyhjennyshyökkäyksestä melko kalliiksi. Erittäin helppoa ja edullista varmentamista varten, että tapahtuman lähettäjä on ratkaissut PoW-ongelman, on tapahtumatunnuksen tarkistus:

if take(toBase58String(i.transactionId), 3) != "123" then throw("todiste työstä epäonnistui") else

Tapahtuman suorittamiseksi soittajan on valittava sellaiset parametrit, että sen base58-koodi (id) alkaa numeroilla 123, mikä vastaa keskimäärin parikymmentä sekuntia prosessoriaikaa ja on pääsääntöisesti kohtuullinen tehtävämme kannalta. Jos tarvitaan yksinkertaisempi tai monimutkaisempi PoW, niin tehtävää voidaan helposti muokata ilmeisellä tavalla.

Pyydä tietoavaimia mallin avulla

Jotta lohkoketjua voidaan käyttää tietokantana, on tärkeää, että sinulla on API-työkalut, joilla tietokannasta voidaan tehdä kyselyjä avainarvoina mallipohjaisten tietojen perusteella. Tällainen työkalupakki ilmestyi heinäkuun 2019 alussa parametrin muodossa ?Ottelut REST API -pyynnöstä /addresses/data?matches=regexp. Nyt, jos haluamme saada useamman kuin yhden avaimen verkkosovelluksesta, emmekä kaikkia avaimia kerralla, vaan vain jonkin ryhmän, voimme tehdä valinnan avaimen nimen perusteella. Esimerkiksi tässä projektissa nostotapahtumat on koodattu muodossa

withdraw_${userAddress}_${txid}

jonka avulla voit saada luettelon tapahtumista varojen nostamiseksi mille tahansa osoitteelle käyttämällä mallia:

?matches=withdraw_${userAddress}_.*

Katsotaan nyt valmiin ratkaisun komponentteja.

Vuejsin koodi

Koodi on toimiva demo lähellä todellista projektia. Se toteuttaa kirjautumisen Waves Keeperin kautta ja toimii affiliate.js-kirjaston kanssa, jonka avulla se rekisteröi käyttäjän järjestelmään, kyselee tapahtumatietoja ja mahdollistaa myös ansaittujen varojen nostamisen käyttäjän tilille.

Hajautettu, avoimen lähdekoodin kumppaniohjelma Waves-lohkoketjussa

RIDE koodi

Sisältää rekisteri-, rahasto- ja nostotoiminnot.

Rekisteröintitoiminto rekisteröi käyttäjän järjestelmään. Siinä on kaksi parametria: referer (viittausosoite) ja salt-parametri, jota ei käytetä toimintokoodissa, jota tarvitaan tapahtumatunnuksen valitsemiseen (PoW-captcha-tehtävä).

Toiminto (kuten muutkin tämän projektin toiminnot) käyttää velkakutsun tekniikkaa, toiminnon tuloksena rahoitetaan tämän toiminnon kutsumisesta perittävä maksu. Tämän ratkaisun ansiosta juuri lompakon luonut käyttäjä voi välittömästi työskennellä järjestelmän kanssa, eikä hänen tarvitse huolehtia omaisuuden ostamisesta tai vastaanottamisesta, jonka avulla hän voi maksaa tapahtumamaksun.

Rekisteröintitoiminnon tuloksena on kaksi tietuetta:

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

Tämä mahdollistaa eteenpäin- ja käänteiset haut (tietyn käyttäjän viittaus ja kaikki tietyn käyttäjän viittaukset).

Rahastotoiminto on enemmänkin malli todellisen toimivuuden kehittämiseen. Esitetyssä muodossaan se ottaa kaikki tapahtuman kautta siirretyt varat ja jakaa ne tasojen 1, 2, 3 viittaajien tileille, "cashback"- ja "change"-tilille (kaikki, mikä jää jäljelle, kun jaetaan edelliselle tilit menee tänne).

Cashback on keino kannustaa loppukäyttäjää osallistumaan suositusjärjestelmään. Käyttäjä voi nostaa järjestelmän maksaman palkkion osan "cashback" muodossa samalla tavalla kuin palkkiot suosituksista.

Suositusjärjestelmää käytettäessä rahastotoimintoa tulee muokata ja integroida sen älytilin päälogiikkaan, jolla järjestelmä toimii. Jos esimerkiksi panoksesta maksetaan suosituspalkkio, rahastotoiminto tulee integroida logiikkaan, jossa veto asetetaan (tai suoritetaan jokin muu kohdennettu toiminto, josta palkkio maksetaan). Tähän toimintoon on koodattu kolme tasoa suosituspalkkioita. Jos sinun on tehtävä enemmän tai vähemmän tasoja, tämä myös korjataan koodissa. Palkkioprosentti asetetaan taso1-tason3 vakioilla; koodissa se lasketaan seuraavasti määrä * taso / 1000, eli arvo 1 vastaa 0,1 % (tätä voidaan myös muuttaa koodissa).

Toiminnon kutsuminen muuttaa tilin saldoa ja luo myös merkintöjä lomakkeen kirjaamista varten:

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

Toisin sanoen tapahtumaaika on sen lohkon aika, jossa se sijaitsee. Tämä on luotettavampaa kuin itse tapahtuman aikaleiman käyttäminen, varsinkin kun se ei ole saatavilla kutsuttavasta.
Kotiutustoiminto näyttää kaikki käyttäjän tilille kertyneet palkinnot. Luo merkintöjä kirjaamista varten:

# withdraw log: withdraw_user_txid=amount:timestamp

Sovellus

Sovelluksen pääosa on affiliate.js-kirjasto, joka on silta affiliatetietomallien ja WAVES NODE REST API:n välillä. Toteuttaa viitekehyksestä riippumattoman abstraktiotason (mitä tahansa voidaan käyttää). Aktiiviset toiminnot (rekisteröinti, peruuttaminen) olettavat, että Waves Keeper on asennettu järjestelmään, kirjasto itse ei tarkista tätä.

Toteuttaa menetelmät:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Menetelmien toimivuus käy ilmi nimistä, parametrit ja palautetut tiedot on kuvattu koodissa. Rekisteritoiminto vaatii lisäkommentteja - se käynnistää tapahtumatunnuksen valintasyklin niin, että se alkaa numerosta 123 - tämä on yllä kuvattu PoW-captcha, joka suojaa massarekisteröinniltä. Funktio löytää tapahtuman vaaditulla tunnuksella ja allekirjoittaa sen sitten Waves Keeperin kautta.

DEX-kumppaniohjelma on saatavilla osoitteessa GitHub.com.

Lähde: will.com

Lisää kommentti