Decentralizēta atvērtā koda filiāļu programma Waves blokķēdē

Decentralizēta saistītā programma Waves blokķēdē, ko kā daļu no Waves Labs dotācijas ieviesusi Bettex komanda.

Ziņa nav reklāma! Programma ir atvērtā koda, tās izmantoÅ”ana un izplatÄ«Å”ana ir bezmaksas. Programmas izmantoÅ”ana stimulē dApp aplikāciju izstrādi un kopumā veicina decentralizāciju, kas nāk par labu ikvienam interneta lietotājam.

Decentralizēta atvērtā koda filiāļu programma Waves blokķēdē

Piedāvātā dApp saistÄ«tajām programmām ir veidne projektiem, kuru funkcionalitāte ietver filiāli. Kodu var izmantot kā veidni kopÄ“Å”anai, kā bibliotēku vai ideju kopumu tehniskai realizācijai.

Funkcionalitātes ziņā Ŕī ir parasta filiāļu sistēma, kas Ä«steno reÄ£istrāciju ar novirzÄ«tāju, daudzlÄ«meņu atlÄ«dzÄ«bas uzkrāŔanu par novirzÄ«Å”anu un motivāciju reÄ£istrēties sistēmā (cashback). Sistēma ir ā€œtÄ«raā€ dApp, tas ir, tÄ«mekļa lietojumprogramma mijiedarbojas tieÅ”i ar blokķēdi, bez savas aizmugursistēmas, datu bāzes utt.

Izmantotās metodes, kas var būt noderīgas arī daudzos citos projektos:

  • Viedkonta ievilkÅ”ana parādā ar tÅ«lÄ«tēju atmaksu (zvana brÄ«dÄ« kontā nav žetonu, lai samaksātu par zvanu, bet tie parādās zvana rezultātā).
  • PoW-captcha - aizsardzÄ«ba pret augstfrekvences automatizētiem izsaukumiem uz viedkonta funkcijām - analogi captcha, bet ar skaitļoÅ”anas resursu izmantoÅ”anas pierādÄ«jumu.
  • Pieprasiet datu atslēgas, izmantojot veidni.

Pieteikums sastāv no:

  • viedkonta kods ride4dapps valodā (kas, kā plānots, tiek sapludināts galvenajā viedkontā, kuram nepiecieÅ”ams ieviest filiāles funkcionalitāti);
  • js iesaiņotājs, kas ievieÅ” abstrakcijas lÄ«meni, izmantojot WAVES NODE REST API;
  • kods vuejs ietvarā, kas ir bibliotēkas un RIDE koda izmantoÅ”anas piemērs.

Ļaujiet mums aprakstīt visas uzskaitītās funkcijas.

Zvaniet uz viedo kontu parādam ar tūlītēju atmaksu

Lai izsauktu InvokeScript, ir jāmaksā nodeva no konta, kurā tiek uzsākts darÄ«jums. Tā nav problēma, ja veidojat projektu blokķēdes žekiem, kuru kontā ir noteikts daudzums WAVES žetonu, taču, ja produkts ir paredzēts plaÅ”ai sabiedrÄ«bai, tā kļūst par nopietnu problēmu. Galu galā lietotājam ir jārÅ«pējas par WAVES žetonu (vai cita piemērota aktÄ«va, ar kuru var norēķināties par darÄ«jumiem) iegādi, kas palielina jau tā ievērojamo barjeru iekļūŔanai projektā. Mēs varam izplatÄ«t aktÄ«vu lietotājiem, kuri varēs maksāt par darÄ«jumiem un saskarties ar risku, ka tie tiks ļaunprātÄ«gi izmantoti, ja tiks izveidotas automatizētas sistēmas, lai izsÅ«knētu likvÄ«dus aktÄ«vus no mÅ«su sistēmas.

BÅ«tu ļoti ērti, ja InvokeScript bÅ«tu iespējams izsaukt ā€œuz adresāta rēķinaā€ (gudrais konts, kurā ir instalēts skripts), un Ŕāda iespēja, lai arÄ« ne acÄ«mredzamā veidā, pastāv.

Ja InvokeScript ietvaros veicat ScriptTransfer uz zvanÄ«tāja adresi, kas kompensē iztērētos maksas marÄ·ierus, tad Ŕāds zvans bÅ«s veiksmÄ«gs, pat ja zvana brÄ«dÄ« zvanÄ«tāja kontā nebija lÄ«dzekļu. Tas ir iespējams, jo pārbaude, vai ir pietiekami daudz marÄ·ieru, tiek veikta pēc darÄ«juma izsaukÅ”anas, nevis pirms tā, lai darÄ«jumus varētu veikt uz kredÄ«ta ar tÅ«lÄ«tēju atmaksu.

ScriptTransfer (i.caller, i.fee, unit)

Tālāk norādÄ«tais kods atmaksā iztērēto maksu, izmantojot viedkonta lÄ«dzekļus. Lai aizsargātu pret Ŕīs funkcijas ļaunprātÄ«gu izmantoÅ”anu, ir jāpārbauda, ā€‹ā€‹vai zvanÄ«tājs iztērē maksu vajadzÄ«gajā lÄ«dzeklÄ« un saprātÄ«gās robežās:

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
}

Tāpat, lai aizsargātu pret ļaunprātÄ«gu un bezjēdzÄ«gu lÄ«dzekļu izŔķērdÄ“Å”anu, ir nepiecieÅ”ama automātiskā zvanu aizsardzÄ«ba (PoW-captcha).

PoW-captcha

Pati darba pierādÄ«juma captcha ideja nav jauna un jau ir realizēta dažādos projektos, arÄ« tajos, kas Ä«stenoti uz WAVES bāzes. Ideja ir tāda, ka, lai veiktu darbÄ«bu, kas patērē mÅ«su projekta resursus, zvanÄ«tājam ir jātērē arÄ« savi resursi, kas resursu izsmelÅ”anas uzbrukumu padara diezgan dārgu. Lai ļoti viegli un lēti pārbaudÄ«tu, vai darÄ«juma sÅ«tÄ«tājs ir atrisinājis PoW problēmu, ir transakcijas ID pārbaude:

if take(toBase58String(i.transactionId), 3) != "123" then throw("pierādījums par darbu neizdevās") else

Lai veiktu darÄ«jumu, zvanÄ«tājam ir jāizvēlas tādi parametri, lai tā base58 kods (id) sāktos ar cipariem 123, kas vidēji atbilst pāris desmitiem sekunžu procesora laika un kopumā ir saprātÄ«gs mÅ«su uzdevumam. Ja ir nepiecieÅ”ams vienkārŔāks vai sarežģītāks PoW, tad uzdevumu var viegli modificēt acÄ«mredzamā veidā.

Pieprasiet datu atslēgas, izmantojot veidni

Lai izmantotu blokķēdi kā datu bāzi, ir ļoti svarÄ«gi, lai bÅ«tu API rÄ«ki datu bāzes vaicājumam kā atslēgas vērtÄ«bai, pamatojoties uz veidnēm. Šāds rÄ«ku komplekts parādÄ«jās 2019. gada jÅ«lija sākumā parametra veidā ?sērkociņi pēc REST API pieprasÄ«juma /addresses/data?matches=regexp. Tagad, ja mums ir jāiegÅ«st vairāk nekā viena atslēga no tÄ«mekļa lietojumprogrammas un ne visas atslēgas vienlaikus, bet tikai dažas grupas, mēs varam veikt atlasi pēc atslēgas nosaukuma. Piemēram, Å”ajā projektā izņemÅ”anas darÄ«jumi tiek kodēti kā

withdraw_${userAddress}_${txid}

kas ļauj iegÅ«t sarakstu ar darÄ«jumiem naudas izņemÅ”anai uz jebkuru norādÄ«to adresi, izmantojot veidni:

?matches=withdraw_${userAddress}_.*

Tagad apskatīsim gatavā risinājuma sastāvdaļas.

Vuejs kods

Kods ir darba demonstrācija, kas ir tuvu reālajam projektam. Tas ievieÅ” pieteikÅ”anos caur Waves Keeper un strādā ar affiliate.js bibliotēku, ar kuru tā reÄ£istrē lietotāju sistēmā, vaicā darÄ«jumu datus, kā arÄ« ļauj izņemt nopelnÄ«tos lÄ«dzekļus lietotāja kontā.

Decentralizēta atvērtā koda filiāļu programma Waves blokķēdē

Kods RIDE

Sastāv no reÄ£istra, fondu un izņemÅ”anas funkcijām.

ReÄ£istrācijas funkcija reÄ£istrē lietotāju sistēmā. Tam ir divi parametri: novirzÄ«tājs (novirzÄ«tāja adrese) un sāls parametrs, kas netiek izmantots funkcijas kodā, kas ir nepiecieÅ”ams, lai izvēlētos darÄ«juma ID (PoW-captcha uzdevums).

Funkcijā (tāpat kā citās Ŕī projekta funkcijās) tiek izmantota parādu izsaukÅ”anas tehnika, funkcijas rezultātā tiek finansēta maksas samaksa par Ŕīs funkcijas izsaukÅ”anu. Pateicoties Å”im risinājumam, lietotājs, kurÅ” tikko izveidojis maku, var uzreiz strādāt ar sistēmu un viņam nav jāuztraucas par aktÄ«va iegādi vai saņemÅ”anu, kas ļauj maksāt transakcijas maksu.

Reģistrācijas funkcijas rezultāts ir divi ieraksti:

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

Tas ļauj veikt meklÄ“Å”anu uz priekÅ”u un atpakaļgaitu (noteikta lietotāja novirzÄ«tājs un visi konkrētā lietotāja novirzÄ«Å”anas gadÄ«jumi).

Fonda funkcija ir vairāk kā veidne reālas funkcionalitātes attÄ«stÄ«bai. Tā parādÄ«tajā formā ņem visus darÄ«juma pārskaitÄ«tos lÄ«dzekļus un sadala tos 1., 2., 3. lÄ«meņa novirzÄ«tāju kontos, naudas atmaksas kontā un izmaiņu kontā (viss, kas paliek, sadalot uz iepriekŔējo konti ir Å”eit).

Cashback ir lÄ«dzeklis, kas motivē gala lietotāju piedalÄ«ties novirzÄ«Å”anas sistēmā. Lietotājs var izņemt sistēmas samaksāto komisijas daļu ā€œcashbackā€ veidā tāpat kā atlÄ«dzÄ«bas par novirzÄ«Å”anu.

Izmantojot novirzÄ«Å”anas sistēmu, fonda funkcija ir jāmaina un jāintegrē viedkonta galvenajā loÄ£ikā, kurā sistēma darbosies. Piemēram, ja par izdarÄ«to likmi tiek izmaksāta novirzÄ«Å”anas atlÄ«dzÄ«ba, fonda funkcija ir jāiebÅ«vē loÄ£ikā, kurā tiek veikta likme (vai tiek veikta cita mērÄ·tiecÄ«ga darbÄ«ba, par kuru tiek izmaksāta atlÄ«dzÄ«ba). Å ajā funkcijā ir iekodēti trÄ«s novirzÄ«Å”anas atlÄ«dzÄ«bas lÄ«meņi. Ja jums ir nepiecieÅ”ams izveidot vairāk vai mazāk lÄ«meņu, tad arÄ« tas tiek labots kodā. AtlÄ«dzÄ«bas procentus nosaka 1. lÄ«meņa 3. lÄ«meņa konstantes kodā, kā tas tiek aprēķināts summa * lÄ«menis / 1000, tas ir, vērtÄ«ba 1 atbilst 0,1% (to var arÄ« mainÄ«t kodā).

Funkcijas izsaukÅ”ana maina konta atlikumu, kā arÄ« izveido ierakstus veidlapas reÄ£istrÄ“Å”anas nolÅ«kos:

fund_address_txid = address:owner:inc:level:timestamp
Š”Š»Ń ŠæŠ¾Š»ŃƒŃ‡ŠµŠ½Šøя timestamp (тŠµŠŗущŠµŠ³Š¾ Š²Ń€ŠµŠ¼ŠµŠ½Šø) ŠøсŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ся тŠ°ŠŗŠ°Ń Š²Š¾Ń‚ сŠ²ŃŠ·ŠŗŠ°
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Tas ir, darÄ«juma laiks ir tā bloka laiks, kurā tas atrodas. Tas ir uzticamāk nekā paÅ”a darÄ«juma laikspiedola izmantoÅ”ana, jo Ä«paÅ”i tāpēc, ka tas nav pieejams no izsaucamā.
IzņemÅ”anas funkcija parāda visas uzkrātās atlÄ«dzÄ«bas lietotāja kontā. Izveido ierakstus reÄ£istrÄ“Å”anas nolÅ«kos:

# withdraw log: withdraw_user_txid=amount:timestamp

Pieteikums

Lietojumprogrammas galvenā daļa ir affiliate.js bibliotēka, kas ir tilts starp saistÄ«to datu modeļiem un WAVES NODE REST API. IevieÅ” no ietvara neatkarÄ«gu abstrakcijas lÄ«meni (var izmantot jebkuru). AktÄ«vās funkcijas (reÄ£istrēties, izņemt) pieņem, ka sistēmā ir instalēts Waves Keeper, to nepārbauda pati bibliotēka.

IevieÅ” metodes:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Metožu funkcionalitāte ir acÄ«mredzama no nosaukumiem, parametri un atgrieztie dati ir aprakstÄ«ti kodā. ReÄ£istra funkcijai ir nepiecieÅ”ami papildu komentāri - tā sāk transakcijas ID atlases ciklu tā, lai tas sākas ar 123 - tas ir iepriekÅ” aprakstÄ«tais PoW-captcha, kas aizsargā pret masveida reÄ£istrāciju. Funkcija atrod darÄ«jumu ar nepiecieÅ”amo ID un pēc tam paraksta to, izmantojot Waves Keeper.

DEX saistītā programma ir pieejama vietnē GitHub.com.

Avots: www.habr.com

Pievieno komentāru