Waves blokcheynidagi markazlashtirilmagan, ochiq manbali hamkorlik dasturi

Bettex jamoasi tomonidan Waves Labs granti doirasida amalga oshirilgan Waves blokcheynidagi markazlashtirilmagan hamkorlik dasturi.

Post reklama emas! Dastur ochiq manba bo'lib, undan foydalanish va tarqatish bepul. Dasturdan foydalanish dApp ilovalarini ishlab chiqishni rag'batlantiradi va umuman markazsizlashtirishga yordam beradi, bu har bir Internet foydalanuvchisiga foyda keltiradi.

Waves blokcheynidagi markazlashtirilmagan, ochiq manbali hamkorlik dasturi

Hamkorlik dasturlari uchun taqdim etilgan dApp bu o'z funksionalligining bir qismi sifatida filialni o'z ichiga olgan loyihalar uchun shablondir. Kod nusxa ko'chirish uchun shablon sifatida, kutubxona sifatida yoki texnik amalga oshirish uchun g'oyalar to'plami sifatida ishlatilishi mumkin.

Funktsionallik nuqtai nazaridan, bu yo'naltiruvchi bilan ro'yxatdan o'tish, yo'llanmalar uchun ko'p darajali mukofotlarni hisoblash va tizimda ro'yxatdan o'tish uchun motivatsiyani (cashback) amalga oshiradigan muntazam sheriklik tizimi. Tizim "sof" dApp bo'lib, ya'ni veb-ilova o'zining backend, ma'lumotlar bazasi va boshqalarga ega bo'lmasdan to'g'ridan-to'g'ri blokcheyn bilan o'zaro ta'sir qiladi.

Boshqa ko'plab loyihalarda ham foydali bo'lishi mumkin bo'lgan texnikalar:

  • Smart hisobni zudlik bilan to'lash bilan qarzga qo'ng'iroq qilish (qo'ng'iroq paytida hisobda qo'ng'iroqni to'lash uchun tokenlar yo'q, lekin ular qo'ng'iroq natijasida paydo bo'ladi).
  • PoW-captcha - aqlli hisob funktsiyalariga yuqori chastotali avtomatlashtirilgan qo'ng'iroqlardan himoya - captcha-ga o'xshash, lekin hisoblash resurslaridan foydalanishni isbotlash orqali.
  • Shablon yordamida ma'lumotlar kalitlari uchun so'rov.

Ilova quyidagilardan iborat:

  • ride4dapps tilidagi aqlli hisob kodi (u rejalashtirilganidek, sheriklik funksiyasini amalga oshirish kerak bo'lgan asosiy aqlli hisob bilan birlashtirilgan);
  • WAVES NODE REST API orqali abstraksiya darajasini amalga oshiradigan js paketi;
  • Vuejs ramkasidagi kod, bu kutubxona va RIDE kodidan foydalanishga misoldir.

Keling, barcha sanab o'tilgan xususiyatlarni tavsiflaymiz.

Darhol to'lash bilan qarz uchun aqlli hisobni chaqirish

InvokeScript-ga qo'ng'iroq qilish tranzaktsiyani boshlagan hisobdan to'lovni to'lashni talab qiladi. Agar siz o'z hisoblarida ma'lum miqdordagi WAVES tokenlariga ega bo'lgan blokcheyn geekslari uchun loyiha tuzayotgan bo'lsangiz, bu muammo emas, lekin agar mahsulot keng jamoatchilik tomonidan foydalanishga qaratilgan bo'lsa, bu jiddiy muammoga aylanadi. Axir, foydalanuvchi WAVES tokenlarini (yoki tranzaktsiyalarni to'lash uchun ishlatilishi mumkin bo'lgan boshqa mos aktivni) sotib olish haqida g'amxo'rlik qilishi kerak, bu esa loyihaga kirish uchun allaqachon sezilarli to'siqni oshiradi. Tizimimizdan likvid aktivni chiqarib tashlash uchun avtomatlashtirilgan tizimlar yaratilganda, tranzaktsiyalar uchun to'lovni amalga oshirish va ulardan noto'g'ri foydalanish xavfiga duch keladigan foydalanuvchilarga aktivni tarqatishimiz mumkin.

Agar InvokeScript-ni "qabul qiluvchining hisobidan" (skript o'rnatilgan aqlli hisob) deb atash mumkin bo'lsa, juda qulay bo'lar edi va bunday imkoniyat, garchi aniq bo'lmasa ham, mavjud.

Agar InvokeScript ichida siz qo'ng'iroq qiluvchining manziliga ScriptTransferni amalga oshirsangiz, bu sarflangan tokenlarni qoplaydi, bunday qo'ng'iroq muvaffaqiyatli bo'ladi, hatto qo'ng'iroq paytida qo'ng'iroq qiluvchi hisobda aktivlar bo'lmasa ham. Bu mumkin, chunki etarli tokenlarni tekshirish operatsiyadan oldin emas, balki operatsiya chaqirilgandan so'ng amalga oshiriladi, shuning uchun operatsiyalarni darhol to'lash sharti bilan kredit bo'yicha amalga oshirish mumkin.

ScriptTransfer (ya'ni qo'ng'iroq qiluvchi, ya'ni to'lov, birlik)

Quyidagi kod aqlli hisob mablag'lari yordamida sarflangan to'lovni qoplaydi. Ushbu xususiyatdan noto'g'ri foydalanishdan himoya qilish uchun qo'ng'iroq qiluvchining to'lovni kerakli aktivda va oqilona chegaralar ichida sarflaganligini tekshirishdan foydalanish kerak:

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
}

Shuningdek, pul mablag'larini zararli va bema'ni isrof qilishdan himoya qilish uchun avtomatik qo'ng'iroqlarni himoya qilish (PoW-captcha) talab qilinadi.

PoW-captcha

Ishni isbotlovchi captcha g'oyasi yangi emas va u allaqachon turli loyihalarda, shu jumladan WAVES asosida amalga oshirilgan loyihalarda amalga oshirilgan. G'oya shundan iboratki, loyihamiz resurslarini iste'mol qiladigan harakatni amalga oshirish uchun qo'ng'iroq qiluvchi o'z resurslarini ham sarflashi kerak, bu esa resurslarni tugatish hujumini ancha qimmatga keltiradi. Tranzaktsiya jo'natuvchisi PoW muammosini hal qilganligini juda oson va arzon narxlarda tekshirish uchun tranzaksiya identifikatori tekshiruvi mavjud:

agar take(toBase58String(i.transactionId), 3) != “123” boʻlsa, throw(“ishning isboti bajarilmadi”) else

Tranzaktsiyani amalga oshirish uchun qo'ng'iroq qiluvchi shunday parametrlarni tanlashi kerakki, uning asosiy58 kodi (id) 123 raqamlari bilan boshlanadi, bu protsessor vaqtining o'rtacha bir necha o'n soniyasiga to'g'ri keladi va bizning vazifamiz uchun odatda oqilona bo'ladi. Agar oddiyroq yoki murakkabroq PoW talab qilinsa, vazifani aniq tarzda osongina o'zgartirish mumkin.

Shablon yordamida ma'lumotlar kalitlari uchun so'rov

Blockchain-dan ma'lumotlar bazasi sifatida foydalanish uchun ma'lumotlar bazasini shablonlarga asoslangan kalit-val sifatida so'rash uchun API vositalariga ega bo'lish juda muhimdir. Bunday asboblar to'plami 2019 yil iyul oyi boshida parametr ko'rinishida paydo bo'lgan ?gugurtlar REST API so'rovida /adreslar/data?matches=regexp. Endi, agar veb-ilovadan bir nechta kalitlarni olish kerak bo'lsa va bir vaqtning o'zida barcha kalitlarni emas, balki faqat ba'zi bir guruhni olish kerak bo'lsa, biz kalit nomi bo'yicha tanlashimiz mumkin. Misol uchun, ushbu loyihada pul olish operatsiyalari sifatida kodlangan

withdraw_${userAddress}_${txid}

shablon yordamida istalgan manzil bo'yicha pul mablag'larini yechib olish bo'yicha operatsiyalar ro'yxatini olish imkonini beradi:

?matches=withdraw_${userAddress}_.*

Endi tayyor eritmaning tarkibiy qismlarini ko'rib chiqamiz.

Vuejs kodi

Kod haqiqiy loyihaga yaqin ishlaydigan demo hisoblanadi. U Waves Keeper orqali tizimga kirishni amalga oshiradi va affiliate.js kutubxonasi bilan ishlaydi, uning yordamida u foydalanuvchini tizimda ro'yxatdan o'tkazadi, tranzaksiya ma'lumotlarini so'raydi, shuningdek, foydalanuvchi hisobiga ishlagan pul mablag'larini olish imkonini beradi.

Waves blokcheynidagi markazlashtirilmagan, ochiq manbali hamkorlik dasturi

RIDE uchun kod

Ro'yxatga olish, jamg'arma va yechib olish funktsiyalaridan iborat.

Ro'yxatga olish funktsiyasi foydalanuvchini tizimda ro'yxatdan o'tkazadi. U ikkita parametrga ega: referer (referrer manzili) va tranzaksiya identifikatorini tanlash uchun zarur bo'lgan funksiya kodida ishlatilmaydigan tuz parametri (PoW-captcha vazifasi).

Funktsiya (ushbu loyihaning boshqa funktsiyalari kabi) qarzni chaqirish texnikasidan foydalanadi, funktsiyaning natijasi ushbu funktsiyani chaqirish uchun to'lovni moliyalashtirishdir. Ushbu yechim tufayli endigina hamyonni yaratgan foydalanuvchi tizim bilan darhol ishlay oladi va unga tranzaksiya to‘lovini to‘lash imkonini beruvchi aktivni sotib olish yoki olish haqida tashvishlanmaydi.

Ro'yxatga olish funktsiyasining natijasi ikkita yozuvdir:

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

Bu to'g'ridan-to'g'ri va teskari qidiruvlarni amalga oshirishga imkon beradi (ma'lum bir foydalanuvchining yo'naltiruvchisi va ma'lum foydalanuvchining barcha tavsiyalari).

Fond funktsiyasi haqiqiy funksionallikni rivojlantirish uchun ko'proq shablondir. Taqdim etilgan shaklda u tranzaksiya bo'yicha o'tkazilgan barcha mablag'larni oladi va ularni 1, 2, 3-darajali yo'naltiruvchilarning hisobvaraqlariga, "cashback" hisobvarag'iga va "o'zgartirish" hisobvarag'iga (avvalgiga taqsimlanganda qolgan hamma narsa) taqsimlaydi. hisoblar shu yerda).

Cashback - bu oxirgi foydalanuvchini referal tizimida ishtirok etishga undash vositasi. Foydalanuvchi "cashback" shaklida tizim tomonidan to'langan komissiya qismini referallar uchun mukofotlar bilan bir xil tarzda olib qo'yishi mumkin.

Yo'naltiruvchi tizimdan foydalanganda, fond funktsiyasi o'zgartirilishi va tizim ishlaydigan aqlli hisobning asosiy mantig'iga birlashtirilishi kerak. Misol uchun, agar tikilgan garov uchun tavsiyanoma mukofoti to'langan bo'lsa, u holda fond funktsiyasi garov qo'yilgan mantiqqa o'rnatilishi kerak (yoki mukofot to'lanadigan boshqa maqsadli harakat amalga oshiriladi). Ushbu funktsiyaga uchta darajadagi yo'naltiruvchi mukofotlar kodlangan. Agar siz ko'proq yoki kamroq darajalarni yaratishingiz kerak bo'lsa, bu kodda ham tuzatiladi. Mukofot foizi 1-darajali 3-darajali konstantalar bilan belgilanadi; kodda u quyidagicha hisoblanadi miqdori * darajasi / 1000, ya'ni 1 qiymati 0,1% ga to'g'ri keladi (bu kodda ham o'zgartirilishi mumkin).

Funktsiyaga qo'ng'iroq qilish hisob balansini o'zgartiradi, shuningdek, formani ro'yxatdan o'tkazish uchun yozuvlarni yaratadi:

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

Ya'ni, tranzaksiya vaqti - u joylashgan blokning vaqti. Bu tranzaksiyaning o'zidan vaqt tamg'asidan foydalanishdan ko'ra ishonchliroqdir, ayniqsa uni chaqirish mumkin bo'lmagani uchun.
Yetkazib berish funksiyasi foydalanuvchi hisobiga barcha to'plangan mukofotlarni ko'rsatadi. Jurnal maqsadlari uchun yozuvlarni yaratadi:

# withdraw log: withdraw_user_txid=amount:timestamp

ariza

Ilovaning asosiy qismi affiliate.js kutubxonasi bo'lib, u filial ma'lumotlari modellari va WAVES NODE REST API o'rtasidagi ko'prikdir. Ramkadan mustaqil mavhumlik darajasini amalga oshiradi (har qandayidan foydalanish mumkin). Faol funktsiyalar (ro'yxatdan o'tish, olib tashlash) tizimda Waves Keeper o'rnatilgan deb taxmin qiladi; kutubxonaning o'zi buni tekshirmaydi.

Usullarni amalga oshiradi:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Usullarning funksionalligi nomlardan yaqqol ko'rinadi, parametrlar va qaytarilgan ma'lumotlar kodda tasvirlangan. Ro'yxatga olish funktsiyasi qo'shimcha izohlarni talab qiladi - u 123 dan boshlanadigan tranzaksiya identifikatorini tanlash siklini boshlaydi - bu yuqorida tavsiflangan PoW-captcha bo'lib, ommaviy ro'yxatga olishdan himoya qiladi. Funktsiya kerakli identifikator bilan tranzaktsiyani topadi va keyin uni Waves Keeper orqali imzolaydi.

DEX hamkorlik dasturi quyidagi manzilda mavjud GitHub.com.

Manba: www.habr.com

a Izoh qo'shish