Avatud lähtekoodiga detsentraliseeritud sidusprogramm Waves'i plokiahelas

Waves'i plokiahela detsentraliseeritud sidusprogramm, mille rakendas Waves Labsi toetuse osana Bettexi meeskond.

Postitus ei ole reklaam! Programm on avatud lähtekoodiga, selle kasutamine ja levitamine on tasuta. Programmi kasutamine stimuleerib dApp rakenduste arendamist ja üldiselt soodustab detsentraliseerimist, millest on kasu igale internetikasutajale.

Avatud lähtekoodiga detsentraliseeritud sidusprogramm Waves'i plokiahelas

Esitletud dApp sidusprogrammidele on mall projektidele, mis sisaldavad oma funktsioonide osana sidusettevõtteid. Koodi saab kasutada kopeerimise mallina, raamatukoguna või ideede kogumina tehniliseks teostuseks.

Funktsionaalsuse poolest on tegemist tavalise sidusettevõtte süsteemiga, mis rakendab suunajaga registreerimist, mitmetasandilist preemiate kogumist soovitamise eest ja motivatsiooni süsteemis registreerumiseks (cashback). Süsteem on "puhas" dApp, see tähendab, et veebirakendus suhtleb otse plokiahelaga, ilma oma taustaprogrammi, andmebaasi jne.

Kasutatud tehnikad, mis võivad olla kasulikud ka paljudes teistes projektides:

  • Nutikonto võlgadesse kutsumine kohese tagasimaksega (kõne ajal ei ole kontol tokeneid kõne eest tasumiseks, vaid need ilmuvad sinna kõne tulemusena).
  • PoW-captcha - kaitse kõrgsageduslike automatiseeritud kõnede eest nutika konto funktsioonidele - analoogne captchaga, kuid arvutiressursside kasutamise tõendamise kaudu.
  • Andmevõtmete päring malli abil.

Rakendus koosneb:

  • кода смарт-аккаунта на языке ride4dapps (который по задумке мержится в основной смарт-аккаунт, для которого надо реализовать affiliate-функционал);
  • js-i ümbris, mis rakendab abstraktsioonitaset üle WAVES NODE REST API;
  • koodi vuejs raamistikus, mis on näide teegi ja RIDE koodi kasutamisest.

Kirjeldame kõiki loetletud funktsioone.

Nutikontole helistamine võlgade jaoks kohese tagasimaksega

InvokeScripti helistamine nõuab tasu maksmist tehingu algatanud kontolt. See pole probleem, kui teete projekti plokiahela geekidele, kelle kontol on teatud kogus WAVES-märke, kuid kui toode on mõeldud laiemale avalikkusele kasutamiseks, muutub see tõsiseks probleemiks. Kasutaja peab ju hoolitsema WAVES-i žetoonide (või mõne muu sobiva vara, millega saab tehingute eest tasuda) ostmise eest, mis tõstab juba niigi arvestatavat projekti sisenemise läve. Saame jagada vara kasutajatele, kes suudavad tehingute eest tasuda ja seisavad silmitsi nende väärkasutuse ohuga, kui luuakse automatiseeritud süsteemid likviidsete varade väljapumpamiseks meie süsteemist.

Oleks väga mugav, kui InvokeScripti oleks võimalik kutsuda "saaja kulul" (nutikonto, millele skript installitakse) ja selline võimalus, kuigi mitte ilmselgelt, on olemas.

Kui InvokeScripti sees teete helistaja aadressile ScriptTransferi, mis kompenseerib kulutatud tasumärgid, siis selline kõne õnnestub isegi siis, kui helistamise hetkel ei olnud helistaja kontol vara. See on võimalik, kuna piisavate žetoonide kontrollimine toimub pärast tehingu väljakutsumist, mitte enne seda, nii et tehinguid saab teha krediidiga, mis tuleb kohe tagasi maksta.

ScriptTransfer (i.helistaja, i.tasu, ühik)

Allolev kood hüvitab kulutatud tasu nutika konto vahendite abil. Selle funktsiooni väärkasutamise eest kaitsmiseks on vaja kontrollida, kas helistaja kulutab tasu nõutud vara ja mõistlikes piirides:

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
}

Samuti on pahatahtliku ja mõttetu raha raiskamise eest kaitsmiseks vajalik automaatne kõnekaitse (PoW-captcha).

PoW-captcha

Töötõenduse captcha idee pole uus ja seda on juba rakendatud erinevates projektides, sealhulgas WAVES-i alusel rakendatud projektides. Idee seisneb selles, et meie projekti ressursse kulutava toimingu sooritamiseks peab helistaja kulutama ka oma ressursse, mis teeb ressursside ammendumise rünnaku üsna kulukaks. Väga lihtsaks ja odavaks kinnitamiseks, et tehingu saatja on PoW probleemi lahendanud, on olemas tehingu ID kontroll:

if take(toBase58String(i.transactionId), 3) != "123" then throw("tõend töö ebaõnnestumisest") else

Tehingu sooritamiseks peab helistaja valima sellised parameetrid, et tema base58 kood (id) algaks numbritega 123, mis vastab keskmiselt paarikümnesekundilisele protsessoriajale ja on meie ülesande jaoks üldiselt mõistlik. Kui on vaja lihtsamat või keerukamat PoW-d, saab ülesannet hõlpsasti ja arusaadaval viisil muuta.

Andmevõtmete päring malli abil

Для того, чтобы использовать blockchain в качестве базы данных, жизненно необходимо иметь инструменты API для запросов к базе как key-val по шаблонам. Такой инструментарий появился в начале июля 2019 в виде параметра ?tikud REST API taotlusel /addresses/data?matches=regexp. Kui nüüd on vaja veebirakendusest saada rohkem kui üks võti ja mitte kõik võtmed korraga, vaid ainult mõni rühm, siis saame teha valiku võtme nime järgi. Näiteks selles projektis on väljamaksete tehingud kodeeritud kui

withdraw_${userAddress}_${txid}

mis võimaldab teil malli kasutades hankida mis tahes aadressi jaoks raha väljavõtmise tehingute loend:

?matches=withdraw_${userAddress}_.*

Nüüd vaatame valmis lahenduse komponente.

Vuejsi kood

Kood on reaalsele projektile lähedane töötav demo. See rakendab sisselogimist Waves Keeperi kaudu ja töötab koos teegiga affiliate.js, millega see registreerib kasutaja süsteemis, pärib tehinguandmeid ja võimaldab teil ka teenitud raha kasutaja kontole välja võtta.

Avatud lähtekoodiga detsentraliseeritud sidusprogramm Waves'i plokiahelas

RIDE kood

Koosneb registri-, fondi- ja väljavõtmisfunktsioonidest.

Registreerimisfunktsioon registreerib kasutaja süsteemis. Sellel on kaks parameetrit: referer (viitaja aadress) ja soola parameeter, mida funktsiooni koodis ei kasutata, mis on vajalik tehingu ID valimiseks (PoW-captcha ülesanne).

Funktsioon (nagu ka teised selle projekti funktsioonid) kasutab võlakõne tehnikat, funktsiooni tulemuseks on selle funktsiooni kutsumise tasu maksmise finantseerimine. Tänu sellele lahendusele saab äsja rahakoti loonud kasutaja kohe süsteemiga töötada ega pea muretsema tehingutasu maksmist võimaldava vara ostmise või kättesaamise pärast.

Registreerimisfunktsiooni tulemuseks on kaks kirjet:

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

See võimaldab edasi- ja tagasiotsingut (antud kasutaja suunaja ja kõik antud kasutaja viited).

Функция fund является скорее шаблоном для разработки настоящего функционала. В представленном виде она берет все перечисляемые транзакцией средства и распределяет их на аккаунты рефереров 1, 2, 3 уровня, на аккаунт “кешбэка” и аккаунт “сдачи” (сюда попадает все, что осталось при распределении по предыдущим аккаунтам).

Кешбэк — это средство стимулирования конечного пользователя для участия в реферальной системе. Выплачиваемую часть комиссии системой в виде “кешбэка” пользователь может снять так же, как вознаграждения за рефералов.

Suunamissüsteemi kasutamisel tuleks fondi funktsiooni muuta ja integreerida selle nutikonto põhiloogikasse, millel süsteem töötab. Näiteks kui tehtud panuse eest makstakse soovituspreemiat, siis peaks fondi funktsioon olema sisse ehitatud sellesse loogikasse, kus panus tehakse (või tehakse mõni muu suunatud tegevus, mille eest tasu makstakse). Sellesse funktsiooni on kodeeritud kolm suunamispreemiate taset. Kui teil on vaja teha rohkem või vähem tasemeid, siis on see ka koodis parandatud. Preemia protsent määratakse level1-level3 konstantidega; koodis arvutatakse see järgmiselt summa * tase / 1000, то есть значение 1 соответствует 0,1% (это тоже можно менять в коде).

Funktsiooni kutsumine muudab konto saldot ja loob ka sissekanded vormi logimiseks:

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

See tähendab, et tehingu aeg on selle ploki aeg, milles see asub. See on usaldusväärsem kui tehingu enda ajatempli kasutamine, eriti kuna see pole helistatavast saadaval.
Väljavõtmise funktsioon kuvab kõik kasutaja kontole kogunenud preemiad. Loob sissekanded logimise eesmärgil:

# withdraw log: withdraw_user_txid=amount:timestamp

Taotlus

Rakenduse põhiosa on affiliate.js teek, mis on sild sidusettevõtte andmemudelite ja WAVES NODE REST API vahel. Rakendab raamistikust sõltumatut abstraktsioonitaset (kasutada võib ükskõik millist). Aktiivsed funktsioonid (registreerimine, eemaldamine) eeldavad, et Waves Keeper on süsteemi installitud, raamatukogu ise seda ei kontrolli.

Rakendab meetodeid:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Meetodite funktsionaalsus selgub nimedest, parameetrid ja tagastatavad andmed on kirjeldatud koodis. Registri funktsioon nõuab täiendavaid kommentaare - see käivitab tehingu ID valimise tsükli nii, et see algab 123-st - see on ülalkirjeldatud PoW-captcha, mis kaitseb massregistreerimise eest. Funktsioon leiab vajaliku ID-ga tehingu ja allkirjastab selle seejärel Waves Keeperi kaudu.

DEXi sidusprogramm on saadaval aadressil Github.com.

Allikas: www.habr.com

Lisa kommentaar