Programi i decentralizuar i filialeve me burim të hapur në zinxhirin e bllokut Waves

Një program i decentralizuar shoqërues në zinxhirin e bllokut Waves, i zbatuar si pjesë e një granti të Waves Labs nga ekipi Bettex.

Postimi nuk është reklamues! Programi është me kod të hapur, përdorimi dhe shpërndarja e tij janë falas. Përdorimi i programit stimulon zhvillimin e aplikacioneve dApp dhe në përgjithësi promovon decentralizimin, nga i cili përfiton çdo përdorues i internetit.

Programi i decentralizuar i filialeve me burim të hapur në zinxhirin e bllokut Waves

dApp i paraqitur për programet e filialeve është një shabllon për projektet që përfshijnë filialin si pjesë të funksionalitetit të tyre. Kodi mund të përdoret si një shabllon për kopjim, si një bibliotekë ose si një grup idesh për zbatimin teknik.

Për sa i përket funksionalitetit, ky është një sistem i rregullt i filialeve që zbaton regjistrimin me një referues, akumulim në shumë nivele të shpërblimeve për referime dhe motivim për regjistrim në sistem (cashback). Sistemi është një dApp "i pastër", domethënë aplikacioni në internet ndërvepron drejtpërdrejt me blockchain, pa pasur backend, bazën e të dhënave, etj.

Teknika të përdorura që mund të jenë të dobishme edhe në shumë projekte të tjera:

  • Thirrja e një llogarie inteligjente në borxh me shlyerje të menjëhershme (në momentin e thirrjes nuk ka shenja në llogari për të paguar thirrjen, por ato shfaqen atje si rezultat i thirrjes).
  • PoW-captcha - mbrojtje kundër thirrjeve të automatizuara me frekuencë të lartë drejt funksioneve të llogarisë inteligjente - analoge me captcha, por përmes vërtetimit të përdorimit të burimeve kompjuterike.
  • Kërko për çelësat e të dhënave duke përdorur një shabllon.

Aplikacioni përbëhet nga:

  • kodi i llogarisë inteligjente në gjuhën ride4dapps (e cila, siç është planifikuar, shkrihet në llogarinë kryesore inteligjente për të cilën duhet të zbatohet funksionaliteti i filialit);
  • js mbështjellës që zbaton një nivel abstraksioni mbi API-në WAVES NODE REST;
  • kodi në kornizën vuejs, i cili është një shembull i përdorimit të bibliotekës dhe kodit RIDE.

Le të përshkruajmë të gjitha tiparet e listuara.

Thirrja e një llogarie inteligjente për borxhin me shlyerje të menjëhershme

Thirrja e InvokeScript kërkon pagesën e një tarife nga llogaria që fillon transaksionin. Ky nuk është problem nëse jeni duke bërë një projekt për geeks blockchain që kanë një sasi të caktuar të shenjave WAVES në llogarinë e tyre, por nëse produkti synohet të përdoret nga publiku i gjerë, ky bëhet një problem serioz. Në fund të fundit, përdoruesi duhet të kujdeset për blerjen e shenjave WAVES (ose një aktiv tjetër të përshtatshëm që mund të përdoret për të paguar për transaksionet), gjë që rrit pengesën tashmë të konsiderueshme për hyrjen në projekt. Ne mund të shpërndajmë një aktiv për përdoruesit të cilët do të jenë në gjendje të paguajnë për transaksionet dhe të përballen me rrezikun e keqpërdorimit të tyre kur krijohen sisteme të automatizuara për të nxjerrë një aktiv likuid nga sistemi ynë.

Do të ishte shumë e përshtatshme nëse do të ishte e mundur të thirrej InvokeScript "në kurriz të marrësit" (llogaria inteligjente në të cilën është instaluar skripti), dhe një mundësi e tillë, megjithëse jo në mënyrë të dukshme, ekziston.

Nëse brenda InvokeScript bëni një Transferim Skripti në adresën e telefonuesit, i cili kompenson tarifat e harxhuara, atëherë një telefonatë e tillë do të jetë e suksesshme, edhe nëse në kohën e thirrjes nuk kishte asete në llogarinë thirrëse. Kjo është e mundur sepse kontrolli për token të mjaftueshëm bëhet pasi të thirret transaksioni, dhe jo para tij, në mënyrë që transaksionet të mund të kryhen me kredi, duke iu nënshtruar shlyerjes së menjëhershme.

Transferimi i Skriptit (i. thirrësi, i. tarifë, njësi)

Kodi më poshtë rimburson tarifën e shpenzuar duke përdorur fondet e llogarisë inteligjente. Për t'u mbrojtur nga keqpërdorimi i kësaj veçorie, është e nevojshme të përdorni një kontroll që telefonuesi të shpenzojë tarifën në aktivin e kërkuar dhe brenda kufijve të arsyeshëm:

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
}

Gjithashtu, për t'u mbrojtur nga shpërdorimi keqdashës dhe i pakuptimtë i fondeve, kërkohet mbrojtja automatike e thirrjeve (PoW-captcha).

PoW-captcha

Vetë ideja e captcha-s së provës së punës nuk është e re dhe tashmë është zbatuar në projekte të ndryshme, përfshirë ato të zbatuara në bazë të WAVES. Ideja është që për të kryer një veprim që konsumon burimet e projektit tonë, thirrësi duhet të shpenzojë gjithashtu burimet e veta, gjë që e bën mjaft të kushtueshëm një sulm të varfërimit të burimeve. Për një vërtetim shumë të lehtë dhe me kosto të ulët që dërguesi i transaksionit ka zgjidhur problemin PoW, ekziston një kontroll i identitetit të transaksionit:

nëse take(toBase58String(i.transactionId), 3) != "123" atëherë hedh ("prova e punës dështoi") tjetër

Për të kryer një transaksion, thirrësi duhet të zgjedhë parametra të tillë në mënyrë që kodi i tij bazë58 (id) të fillojë me numrat 123, i cili korrespondon mesatarisht me disa dhjetëra sekonda të kohës së procesorit dhe në përgjithësi është i arsyeshëm për detyrën tonë. Nëse kërkohet një PoW më e thjeshtë ose më komplekse, atëherë detyra mund të modifikohet lehtësisht në një mënyrë të qartë.

Kërko për çelësat e të dhënave duke përdorur një shabllon

Për të përdorur blockchain si bazë të dhënash, është jetike që të keni mjete API për kërkimin e bazës së të dhënave si çelës-val bazuar në shabllone. Një mjet i tillë u shfaq në fillim të korrikut 2019 në formën e një parametri ?ndeshjet me kërkesën REST API /adresat/data?matches=regexp. Tani, nëse na duhet të marrim më shumë se një çelës nga një aplikacion ueb dhe jo të gjithë çelësat menjëherë, por vetëm një grup, atëherë mund të bëjmë një përzgjedhje me emrin e çelësit. Për shembull, në këtë projekt, transaksionet e tërheqjes janë të koduara si

withdraw_${userAddress}_${txid}

e cila ju lejon të merrni një listë të transaksioneve për tërheqjen e fondeve për çdo adresë të caktuar duke përdorur shabllonin:

?matches=withdraw_${userAddress}_.*

Tani le të shohim përbërësit e zgjidhjes së përfunduar.

Kodi Vuejs

Kodi është një demonstrim pune afër projektit real. Ai zbaton hyrjen përmes Waves Keeper dhe punon me bibliotekën affiliate.js, me të cilën regjistron përdoruesin në sistem, kërkon të dhënat e transaksionit dhe gjithashtu ju lejon të tërheqni fondet e fituara në llogarinë e përdoruesit.

Programi i decentralizuar i filialeve me burim të hapur në zinxhirin e bllokut Waves

Kodi për RIDE

Përbëhet nga funksionet e regjistrimit, financimit dhe tërheqjes.

Funksioni i regjistrimit regjistron një përdorues në sistem. Ka dy parametra: referues (adresa e referuesit) dhe parametri salt, i cili nuk përdoret në kodin e funksionit, i cili nevojitet për të zgjedhur ID-në e transaksionit (detyrë PoW-captcha).

Funksioni (si funksionet e tjera nga ky projekt) përdor teknikën e thirrjes së borxhit, rezultati i funksionit është financimi i pagesës së një tarife për thirrjen e këtij funksioni. Falë kësaj zgjidhjeje, një përdorues që sapo ka krijuar një portofol mund të punojë menjëherë me sistemin dhe nuk duhet të shqetësohet për blerjen ose marrjen e një aktivi që i lejon atij të paguajë një tarifë transaksioni.

Rezultati i funksionit të regjistrimit është dy regjistrime:

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

Kjo lejon kërkimet përpara dhe të kundërta (referuesi i një përdoruesi të caktuar dhe të gjitha referimet e një përdoruesi të caktuar).

Funksioni i fondit është më shumë një shabllon për zhvillimin e funksionalitetit real. Në formën e tij të paraqitur, ai merr të gjitha fondet e transferuara nga transaksioni dhe i shpërndan ato në llogaritë e referuesve të niveleve 1, 2, 3, në llogarinë "cashback" dhe llogarinë "ndryshim" (gjithçka që mbetet kur shpërndahet në të mëparshmen llogaritë shkojnë këtu).

Cashback është një mjet për të motivuar përdoruesin përfundimtar për të marrë pjesë në sistemin e referimit. Përdoruesi mund të tërheqë pjesën e komisionit të paguar nga sistemi në formën e "cashback" në të njëjtën mënyrë si shpërblimet për referime.

Kur përdorni një sistem referimi, funksioni i fondit duhet të modifikohet dhe të integrohet në logjikën kryesore të llogarisë inteligjente në të cilën do të funksionojë sistemi. Për shembull, nëse një shpërblim referimi paguhet për një bast të bërë, atëherë funksioni i fondit duhet të ndërtohet në logjikën ku vendoset basti (ose kryhet një veprim tjetër i synuar për të cilin paguhet shpërblimi). Tre nivele të shpërblimeve të referimit janë të koduara në këtë funksion. Nëse keni nevojë të bëni më shumë ose më pak nivele, atëherë kjo korrigjohet gjithashtu në kod. Përqindja e shpërblimit përcaktohet nga konstantet e nivelit 1-nivel3 në kodin si është llogaritur shuma * niveli / 1000, domethënë, vlera 1 korrespondon me 0,1% (kjo mund të ndryshohet edhe në kod).

Thirrja e funksionit ndryshon gjendjen e llogarisë dhe gjithashtu krijon hyrje për qëllime të regjistrimit të formularit:

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

Kjo do të thotë, koha e transaksionit është koha e bllokut në të cilin ndodhet. Kjo është më e besueshme sesa përdorimi i vulës kohore nga vetë transaksioni, veçanërisht pasi nuk është i disponueshëm nga thirrësi.
Funksioni i tërheqjes shfaq të gjitha shpërblimet e grumbulluara në llogarinë e përdoruesit. Krijon hyrje për qëllime regjistrimi:

# withdraw log: withdraw_user_txid=amount:timestamp

Aplikim

Pjesa kryesore e aplikacionit është biblioteka affiliate.js, e cila është një urë lidhëse midis modeleve të të dhënave të filialeve dhe API-së WAVES NODE REST. Zbaton një nivel abstraksioni të pavarur nga korniza (mund të përdoret çdo). Funksionet aktive (regjistrohu, tërhiqeni) supozojnë se Waves Keeper është i instaluar në sistem vetë biblioteka nuk e kontrollon këtë.

Zbaton metodat:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funksionaliteti i metodave është i dukshëm nga emrat e parametrave dhe të dhënave të kthyera në kod. Funksioni i regjistrit kërkon komente shtesë - fillon një cikël të zgjedhjes së ID-së së transaksionit në mënyrë që të fillojë në 123 - kjo është PoW-captcha e përshkruar më sipër, e cila mbron nga regjistrimet masive. Funksioni gjen një transaksion me ID-në e kërkuar dhe më pas e nënshkruan atë përmes Waves Keeper.

Programi i Filialit DEX është i disponueshëm në GitHub.Com.

Burimi: www.habr.com

Shto një koment