Nyílt forráskódú decentralizált társult program a Waves blokkláncon

A Waves blokklánc decentralizált társult programja, amelyet a Waves Labs pályázatának részeként valósított meg a Bettex csapata.

A poszt nem reklám! A program nyílt forráskódú, használata és terjesztése ingyenes. A program használata serkenti a dApp alkalmazások fejlesztését, és általában elősegíti a decentralizációt, ami minden internetfelhasználó számára előnyös.

Nyílt forráskódú decentralizált társult program a Waves blokkláncon

A bemutatott dApp affiliate programokhoz egy sablon olyan projektekhez, amelyek funkcióik részeként affiliate-t is tartalmaznak. A kód használható sablonként a másoláshoz, könyvtárként, vagy ötletgyűjteményként a műszaki megvalósításhoz.

A funkcionalitást tekintve ez egy szokásos kapcsolt rendszer, amely az utalóval történő regisztrációt, az ajánlások többszintű jutalmait és a rendszerben való regisztráció motivációját valósítja meg (cashback). A rendszer egy „tiszta” dApp, vagyis a webalkalmazás közvetlenül kommunikál a blokklánccal, anélkül, hogy saját háttérprogramja, adatbázisa stb.

Használt technikák, amelyek sok más projektben is hasznosak lehetnek:

  • Okosszámla adósságba hívása azonnali törlesztéssel (a hívás időpontjában nincs a számlán a hívás kifizetésére szolgáló token, de a hívás hatására ott megjelennek).
  • PoW-captcha —védelem az intelligens fiókfunkciók nagyfrekvenciás automatizált hívása ellen — a captcha-hoz hasonló, de a számítási erőforrások használatának igazolásán keresztül.
  • Adatkulcsok lekérdezése sablon használatával.

Az alkalmazás a következőkből áll:

  • intelligens fiók kódja a ride4dapps nyelven (amely a tervek szerint össze van vonva a fő intelligens fiókkal, amelyhez kapcsolt funkciókat kell megvalósítani);
  • js burkoló, amely absztrakciós szintet valósít meg a WAVES NODE REST API-n keresztül;
  • kódot a vuejs keretrendszeren, amely egy példa a könyvtár és a RIDE kód használatára.

Leírjuk az összes felsorolt ​​funkciót.

Okos számla felhívása tartozáshoz azonnali törlesztéssel

Az InvokeScript hívásához díjat kell fizetni a tranzakciót kezdeményező számláról. Ez nem probléma, ha olyan blokklánc-geek-ek számára készít projektet, akiknek van egy bizonyos mennyiségű WAVES token a fiókjában, de ha a termék tömegek általi felhasználásra irányul -„komoly problémává válik. Hiszen a felhasználónak gondoskodnia kell a WAVES tokenek (vagy a tranzakciók kifizetésére használható egyéb megfelelő eszköz) vásárlásáról, ami növeli a projektbe való belépés amúgy is jelentős akadályát. Kioszthatunk egy eszközt a felhasználóknak, akik képesek lesznek fizetni a tranzakciókért, és szembe kell nézniük a velük való visszaélés kockázatával, amikor automatizált rendszereket hoznak létre egy likvid eszköz rendszerünkből történő kiszivattyúzására.

Nagyon kényelmes lenne, ha az InvokeScriptet „a címzett költségére” lehetne hívni (az intelligens fiók, amelyre a szkript telepítve van), és ez a lehetőség, bár nem nyilvánvaló módon, létezik.

Ha az InvokeScripten belül ScriptTransfert hajt végre a hívó címére, ami kompenzálja az elköltött díj tokeneket, akkor egy ilyen hívás akkor is sikeres lesz, ha a hívás időpontjában nem volt vagyon a hívó számlán. Ez azért lehetséges, mert az elegendő token ellenőrzése a tranzakció lehívása után történik, nem pedig azt megelőzően, így a tranzakciók hitelre hajthatók végre, azonnali visszafizetés mellett.

ScriptTransfer(i.hívó, i.díj, egység)

Az alábbi kód az elköltött díjat intelligens számlapénz felhasználásával téríti meg. Az ezzel a funkcióval való visszaélés elleni védelem érdekében ellenőrizni kell, hogy a hívó a díjat a kívánt eszközben és ésszerű határokon belül elkölti-e:

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
}

Ezenkívül a rosszindulatú és értelmetlen pénzpazarlás elleni védelem érdekében automatikus hívásvédelemre (PoW-captcha) van szükség.

PoW-captcha

Maga a munkabizonyítási captcha ötlete nem új, és már számos projektben megvalósították, beleértve a WAVES-en alapuló projekteket is. Az ötlet az, hogy a projektünk erőforrásait felemésztő művelet végrehajtásához a hívónak saját erőforrásait is el kell költenie, ami az erőforrás-kimerítő támadást meglehetősen költségessé teszi. Annak érdekében, hogy nagyon egyszerűen és olcsón ellenőrizhessük, hogy a tranzakció feladója megoldotta a PoW problémát, van egy tranzakcióazonosító ellenőrzés:

if take(toBase58String(i.transactionId), 3) != "123" then throw("a munka sikertelen igazolása") else

A tranzakció lebonyolításához a hívónak olyan paramétereket kell kiválasztania, hogy a base58-as kódja (id) 123-as számokkal kezdődjön, ami átlagosan pár tíz másodperces processzoridőnek felel meg, és a mi feladatunk szempontjából általában ésszerű. Ha egyszerűbb vagy bonyolultabb PoW-ra van szükség, akkor a feladat kézenfekvő módon könnyen módosítható.

Adatkulcsok lekérdezése sablon használatával

Ahhoz, hogy a blokkláncot adatbázisként használhassuk, létfontosságú, hogy rendelkezzenek API-eszközökkel, amelyek az adatbázist sablonok alapján kulcs-val lekérdezhetik. Egy ilyen eszköztár 2019. július elején jelent meg paraméter formájában ?mérkőzések a REST API kérésére /addresses/data?matches=regexp. Ha egy webalkalmazásból több kulcsot kell beszereznünk, és nem az összes kulcsot egyszerre, hanem csak egy csoportot, akkor kulcsnév alapján választhatunk. Például ebben a projektben a pénzfelvételi tranzakciók kódolása a következőképpen történik:

withdraw_${userAddress}_${txid}

amely lehetővé teszi, hogy a sablon segítségével megkapja a pénzfelvételi tranzakciók listáját egy adott címre vonatkozóan:

?matches=withdraw_${userAddress}_.*

Most nézzük meg a kész megoldás összetevőit.

Vuejs kód

A kód egy működő demó, közel a valódi projekthez. A Waves Keeperen keresztül valósítja meg a bejelentkezést, és együttműködik az affiliate.js könyvtárral, amellyel regisztrálja a felhasználót a rendszerben, lekérdezi a tranzakciós adatokat, és lehetővé teszi a megkeresett pénzeszközök felvételét a felhasználó számlájára.

Nyílt forráskódú decentralizált társult program a Waves blokkláncon

RIDE kód

Nyilvántartási, pénztári és visszavonási funkciókból áll.

A regisztráció funkció regisztrál egy felhasználót a rendszerben. Két paramétere van: referer (hivatkozó cím) és a függvénykódban nem használt salt paraméter, amely a tranzakcióazonosító kiválasztásához szükséges (PoW-captcha feladat).

A funkció (a projekt többi funkciójához hasonlóan) az adóssághívás technikát használja, a funkció eredménye ennek a függvénynek a hívási díjának finanszírozása. Ennek a megoldásnak köszönhetően a pénztárcát most létrehozó felhasználó azonnal dolgozni tud a rendszerrel, és nem kell aggódnia egy olyan eszköz megvásárlása vagy átvétele miatt, amely lehetővé teszi számára a tranzakciós díjat.

A regisztrációs funkció eredménye két rekord:

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

Ez lehetővé teszi az előre és visszafelé irányuló kereséseket (egy adott felhasználó hivatkozója és egy adott felhasználó összes hivatkozása).

Az alap funkció inkább a valódi funkcionalitás fejlesztésének sablonja. A bemutatott formájában a tranzakcióval átutalt összes pénzeszközt felosztja az 1., 2., 3. szintű hivatkozók számláira, a „cashback” számlára és a „változtatási” számlára (minden, ami az előzőre történő felosztáskor megmarad a fiókok ide kerülnek).

A Cashback egy eszköz arra, hogy a végfelhasználót az ajánlórendszerben való részvételre ösztönözze. A felhasználó a rendszer által kifizetett jutalék részét „cashback” formájában az utalások jutalmaihoz hasonlóan veheti fel.

Az utaló rendszer használatakor az alap funkciót módosítani kell, és integrálni kell annak az intelligens fióknak a fő logikájába, amelyen a rendszer működni fog. Például, ha ajánlási jutalmat fizetnek egy megtett fogadásért, akkor az alap funkciót be kell építeni abba a logikába, ahol a fogadást megteszik (vagy más célzott műveletet hajtanak végre, amelyért a jutalmat kifizetik). Az ajánlási jutalmak három szintje van kódolva ebbe a funkcióba. Ha több vagy kevesebb szintet kell készíteni, akkor ez is javítva van a kódban. A jutalom százalékát a level1-level3 konstansok állítják be, a kódban a következőképpen számítják ki összeg * szint / 1000, vagyis az 1-es érték 0,1%-nak felel meg (ez is módosítható a kódban).

A függvény meghívása megváltoztatja a számlaegyenleget, és bejegyzéseket hoz létre az űrlap naplózása céljából:

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

Vagyis a tranzakció ideje annak a blokknak az ideje, amelyben található. Ez megbízhatóbb, mint magából a tranzakcióból származó időbélyeg használata, különösen, mivel az nem érhető el a hívhatóból.
A visszavonási funkció megjeleníti a felhasználó számláján felhalmozott összes jutalmat. Bejegyzéseket hoz létre naplózási célokra:

# withdraw log: withdraw_user_txid=amount:timestamp

App

Az alkalmazás fő része az affiliate.js könyvtár, amely hidat képez a társult adatmodellek és a WAVES NODE REST API között. A keretrendszertől független absztrakciós szintet valósít meg (bármelyik használható). Az aktív funkciók (regisztrálás, visszavonás) feltételezik, hogy a Waves Keeper telepítve van a rendszerre, ezt maga a könyvtár nem ellenőrzi.

Módszereket valósít meg:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

A metódusok funkcionalitása a nevekből kitűnik, a paraméterek és a visszaadott adatok a kódban vannak leírva. A regiszter funkció további megjegyzéseket igényel - elindítja a tranzakcióazonosító kiválasztásának ciklusát úgy, hogy az 123-mal kezdődik - ez a fent leírt PoW-captcha, amely véd a tömeges regisztrációk ellen. A függvény megkeresi a szükséges azonosítóval rendelkező tranzakciót, majd aláírja a Waves Keeperen keresztül.

A DEX affiliate program a következő címen érhető el GitHub.com.

Forrás: will.com

Hozzászólás