Waves blokçeynində mərkəzləşdirilməmiş, açıq mənbəli ortaq proqram

Bettex komandası tərəfindən Waves Labs qrantının bir hissəsi kimi həyata keçirilən Waves blokçeynində mərkəzləşdirilməmiş ortaq proqram.

Post reklam deyil! Proqram açıq mənbədir, istifadəsi və yayılması pulsuzdur. Proqramın istifadəsi dApp proqramlarının inkişafını stimullaşdırır və ümumiyyətlə mərkəzsizləşdirməni təşviq edir ki, bu da hər bir İnternet istifadəçisinin xeyrinədir.

Waves blokçeynində mərkəzləşdirilməmiş, açıq mənbəli ortaq proqram

Affiliate proqramları üçün təqdim olunan dApp onların funksionallığının bir hissəsi kimi filialı daxil edən layihələr üçün şablondur. Kod surət çıxarmaq üçün şablon kimi, kitabxana kimi və ya texniki həyata keçirmək üçün ideyalar toplusu kimi istifadə edilə bilər.

Funksionallıq baxımından bu, istinadçı ilə qeydiyyatı, müraciətlər üçün çox səviyyəli mükafatların hesablanmasını və sistemdə qeydiyyatdan keçmək üçün motivasiyanı (cashback) həyata keçirən adi bir filial sistemidir. Sistem “saf” dApp-dır, yəni veb tətbiqi öz backend, verilənlər bazası və s. olmadan birbaşa blokçeynlə qarşılıqlı əlaqədə olur.

Bir çox digər layihələrdə də faydalı ola biləcək istifadə olunan texnikalar:

  • Ağıllı hesabı dərhal ödəmə ilə borca ​​çağırmaq (zəng zamanı hesabda zəng üçün ödəniş etmək üçün əlamətlər yoxdur, lakin zəng nəticəsində orada görünür).
  • PoW-captcha - smart hesab funksiyalarına yüksək tezlikli avtomatlaşdırılmış zənglərdən qorunma - captcha-ya bənzər, lakin hesablama resurslarından istifadənin sübutu ilə.
  • Şablondan istifadə edərək məlumat açarları üçün sorğu.

Tətbiq aşağıdakılardan ibarətdir:

  • ride4dapps dilində smart hesab kodu (bu, planlaşdırıldığı kimi, filial funksionallığının həyata keçirilməli olduğu əsas smart hesaba birləşdirilir);
  • WAVES NODE REST API üzərində abstraksiya səviyyəsini həyata keçirən js paketi;
  • kitabxana və RIDE kodundan istifadə nümunəsi olan vuejs çərçivəsindəki kod.

Bütün sadalanan xüsusiyyətləri təsvir edək.

Dərhal ödəmə ilə borc üçün smart hesaba zəng etmək

InvokeScript-ə zəng etmək əməliyyatı başlatan hesabdan rüsumun ödənilməsini tələb edir. Hesabında müəyyən miqdarda WAVES tokenləri olan blockchain geeks üçün layihə edirsinizsə, bu problem deyil, lakin məhsul geniş ictimaiyyət tərəfindən istifadəyə yönəlibsə, bu ciddi problemə çevrilir. Axı, istifadəçi layihəyə daxil olmaq üçün onsuz da əhəmiyyətli həddi artıran WAVES tokenlərini (və ya əməliyyatlar üçün ödəniş etmək üçün istifadə edilə bilən başqa bir uyğun aktiv) almağa diqqət yetirməlidir. Sistemimizdən likvid aktivi çıxarmaq üçün avtomatlaşdırılmış sistemlər yaradıldıqda, əməliyyatlar üçün ödəniş edə biləcək və onlardan sui-istifadə riski ilə üzləşə biləcək istifadəçilərə aktiv paylaya bilərik.

InvokeScript-i "alıcının hesabına" (skriptin quraşdırıldığı smart hesab) adlandırmaq mümkün olsaydı, çox rahat olardı və belə bir imkan, açıq şəkildə olmasa da, mövcuddur.

Əgər InvokeScript daxilində siz zəng edənin ünvanına ScriptTransfer edirsinizsə, bu da xərclənmiş ödəniş nişanlarını kompensasiya edirsə, zəng zamanı zəng edən hesabda heç bir aktiv olmasa belə, belə bir zəng uğurlu olacaqdır. Bu mümkündür, çünki kifayət qədər tokenlərin yoxlanılması əməliyyatdan əvvəl deyil, əməliyyat çağırıldıqdan sonra aparılır ki, əməliyyatlar dərhal ödənilməklə kreditlə aparıla bilsin.

ScriptTransfer(yəni zəng edən, yəni ödəniş, vahid)

Aşağıdakı kod smart hesab vəsaitlərindən istifadə edərək xərclənmiş haqqı ödəyir. Bu funksiyadan sui-istifadədən qorunmaq üçün zəng edənin haqqı tələb olunan aktivdə və məqbul həddə xərclədiyini yoxlamaq lazımdır:

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
}

Həmçinin, zərərli və mənasız vəsait israfından qorunmaq üçün avtomatik zəng qorunması (PoW-captcha) tələb olunur.

PoW-captcha

İş sübutu captcha ideyası yeni deyil və artıq müxtəlif layihələrdə, o cümlədən WAVES əsasında həyata keçirilən layihələrdə həyata keçirilib. İdeya ondan ibarətdir ki, layihəmizin resurslarını sərf edən hərəkəti yerinə yetirmək üçün zəng edən şəxs öz resurslarını da xərcləməlidir ki, bu da resursun tükənməsi hücumunu kifayət qədər bahalı edir. Əməliyyatın göndəricisinin PoW problemini həll etdiyini çox asan və ucuz qiymətə yoxlamaq üçün əməliyyat id yoxlaması var:

əgər take(toBase58String(i.transactionId), 3) != “123” sonra atmaq(“işin sübutu uğursuz oldu”) başqa

Əməliyyatı həyata keçirmək üçün zəng edən şəxs elə parametrləri seçməlidir ki, onun baza58 kodu (id) 123 rəqəmləri ilə başlasın ki, bu da orta hesabla bir neçə on saniyəlik prosessor vaxtına uyğundur və bizim tapşırığımız üçün ümumiyyətlə məqbuldur. Daha sadə və ya daha mürəkkəb PoW tələb olunarsa, tapşırıq açıq şəkildə asanlıqla dəyişdirilə bilər.

Şablondan istifadə edərək məlumat açarları üçün sorğu

Blockchain-dən verilənlər bazası kimi istifadə etmək üçün şablonlar əsasında verilənlər bazasını açar-val kimi sorğulamaq üçün API alətlərinin olması çox vacibdir. Belə bir alət dəsti 2019-cu ilin iyul ayının əvvəlində parametr şəklində ortaya çıxdı ?matlar REST API sorğusunda /ünvanlar/data?matches=regexp. İndi bir veb tətbiqindən birdən çox açarı və bütün düymələri deyil, yalnız bəzi qrupları əldə etmək lazımdırsa, onda açar adı ilə seçim edə bilərik. Məsələn, bu layihədə pul çıxarma əməliyyatları olaraq kodlaşdırılır

withdraw_${userAddress}_${txid}

şablondan istifadə edərək istənilən ünvan üçün pul vəsaitlərinin çıxarılması üçün əməliyyatların siyahısını əldə etməyə imkan verir:

?matches=withdraw_${userAddress}_.*

İndi hazır həllin komponentlərinə baxaq.

Vuejs kodu

Kod real layihəyə yaxın işləyən demodur. O, Waves Keeper vasitəsilə girişi həyata keçirir və istifadəçini sistemdə qeydiyyatdan keçirən, əməliyyat məlumatlarını sorğulayan affiliate.js kitabxanası ilə işləyir, həmçinin qazanılmış vəsaiti istifadəçinin hesabına çıxarmağa imkan verir.

Waves blokçeynində mərkəzləşdirilməmiş, açıq mənbəli ortaq proqram

RIDE üçün kod

Qeydiyyat, fond və geri götürmə funksiyalarından ibarətdir.

Qeydiyyat funksiyası istifadəçini sistemdə qeyd edir. Onun iki parametri var: referer (referrer ünvanı) və tranzaksiya id-ni (PoW-captcha tapşırığı) seçmək üçün lazım olan funksiya kodunda istifadə edilməyən duz parametri.

Funksiya (bu layihənin digər funksiyaları kimi) borc çağırışı texnikasından istifadə edir, funksiyanın nəticəsi bu funksiyaya zəng etmək üçün haqqın ödənilməsini maliyyələşdirməkdir. Bu həll sayəsində pul kisəsini yenicə yaratmış istifadəçi dərhal sistemlə işləyə bilər və ona əməliyyat haqqı ödəməyə imkan verən aktivi almaq və ya almaqdan narahat olmayacaq.

Qeydiyyat funksiyasının nəticəsi iki qeyddir:

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

Bu, irəli və geri axtarışlara imkan verir (müəyyən istifadəçinin yönləndiricisi və verilmiş istifadəçinin bütün müraciətləri).

Fond funksiyası daha çox real funksionallığı inkişaf etdirmək üçün bir şablondur. Təqdim olunan formada o, əməliyyatla köçürülmüş bütün vəsaitləri götürür və onları 1, 2, 3 səviyyəli yönləndiricilərin hesablarına, “cashback” hesabına və “dəyişiklik” hesabına (əvvəlkilərə paylandıqda qalan hər şeyi) paylayır. hesablar bura gedir).

Cashback son istifadəçini yönləndirmə sistemində iştirak etməyə həvəsləndirmək vasitəsidir. İstifadəçi komissiyanın sistem tərəfindən ödənilmiş hissəsini “cashback” şəklində geri götürə bilər.

Yönləndirmə sistemindən istifadə edərkən fond funksiyası dəyişdirilməli və sistemin işləyəcəyi smart hesabın əsas məntiqinə inteqrasiya edilməlidir. Məsələn, edilmiş bir mərc üçün tövsiyə mükafatı ödənilirsə, o zaman fond funksiyası mərcin qoyulduğu məntiqə daxil edilməlidir (yaxud mükafatın ödənildiyi başqa məqsədyönlü hərəkət həyata keçirilir). Bu funksiyaya tövsiyə mükafatlarının üç səviyyəsi kodlaşdırılıb. Daha çox və ya daha az səviyyələr etmək lazımdırsa, bu da kodda düzəldilir. Mükafat faizi səviyyə 1-səviyyə 3 sabitləri ilə müəyyən edilir; kodda bu kimi hesablanır məbləğ * səviyyə / 1000, yəni 1 dəyəri 0,1%-ə uyğundur (bu kodda da dəyişdirilə bilər).

Funksiyaya zəng etmək hesab balansını dəyişir və həmçinin formanın giriş məqsədləri üçün qeydlər yaradır:

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

Yəni əməliyyat vaxtı onun yerləşdiyi blokun vaxtıdır. Bu, əməliyyatın özündən vaxt möhürünü istifadə etməkdən daha etibarlıdır, xüsusən də zəng edilə bilən şəxsdə mövcud olmadığı üçün.
Çıxarma funksiyası bütün yığılmış mükafatları istifadəçinin hesabına göstərir. Giriş məqsədləri üçün qeydlər yaradır:

# withdraw log: withdraw_user_txid=amount:timestamp

App

Tətbiqin əsas hissəsi filial məlumat modelləri ilə WAVES NODE REST API arasında körpü olan affiliate.js kitabxanasıdır. Çərçivədən asılı olmayaraq abstraksiya səviyyəsini həyata keçirir (hər hansı istifadə edilə bilər). Aktiv funksiyalar (qeydiyyatdan keçmək, geri çəkmək) sistemdə Waves Keeper-in quraşdırıldığını güman edir; kitabxananın özü bunu yoxlamır.

Metodları həyata keçirir:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Metodların funksionallığı adlardan aydın görünür, parametrlər və qaytarılan məlumatlar kodda təsvir edilmişdir. Qeydiyyat funksiyası əlavə şərhlər tələb edir - o, 123-dən başlaması üçün əməliyyat id-nin seçilməsi dövrünə başlayır - bu, kütləvi qeydiyyatdan qoruyan yuxarıda təsvir edilən PoW-captcha-dır. Funksiya tələb olunan id ilə əməliyyat tapır və sonra onu Waves Keeper vasitəsilə imzalayır.

DEX ortaq proqramı burada mövcuddur GitHub.com.

Mənbə: www.habr.com

Добавить комментарий