Waves блокчейніндегі ашық бастапқы орталықтандырылмаған серіктестік бағдарламасы

Bettex командасының Waves Labs грантының бөлігі ретінде жүзеге асырылған Waves блокчейніне негізделген орталықтандырылмаған серіктестік бағдарламасы.

Постқа демеушілік көрсетілмейді! Бағдарлама ашық бастапқы болып табылады, оны пайдалану және тарату тегін. Бағдарламаны пайдалану dApp қолданбаларының дамуын ынталандырады және тұтастай алғанда орталықсыздандыруға ықпал етеді, бұл Желінің әрбір пайдаланушысы үшін тиімді.

Waves блокчейніндегі ашық бастапқы орталықтандырылмаған серіктестік бағдарламасы

Серіктестік бағдарламаларына арналған ұсынылған dApp - бұл олардың функционалдық бөлігі ретінде серіктесті қамтитын жобаларға арналған үлгі. Кодты көшіру үшін үлгі ретінде, кітапхана ретінде немесе техникалық іске асыру үшін идеялар жиынтығы ретінде пайдалануға болады.

Функционалдылық тұрғысынан бұл реферермен тіркеуді, жолдамалар үшін сыйақыны көп деңгейлі есептеуді және жүйеде тіркелу мотивациясын (кэшбэк) жүзеге асыратын қарапайым серіктестік жүйе. Жүйе «таза» dApp болып табылады, яғни веб-қосымша блокчейнмен өзінің сервері, дерекқоры және т.б.сыз тікелей әрекеттеседі.

Көптеген басқа жобаларда да пайдалы болуы мүмкін әдістер қолданылады:

  • Бірден өтеумен несиеге смарт-шотқа қоңырау шалу (қоңырау шалу кезінде шотта қоңырауды төлеуге арналған белгілер жоқ, бірақ олар қоңырау нәтижесінде пайда болады).
  • PoW-captcha - смарт тіркелгі функцияларын жоғары жиілікті автоматтандырылған шақырудан қорғау - captcha сияқты, бірақ есептеу ресурстарын пайдалануды дәлелдеу арқылы.
  • Үлгі бойынша деректер кілттерін сұрау.

Қолданба мыналардан тұрады:

  • ride4dapps тіліндегі смарт тіркелгі коды (ол жоспарланғандай негізгі смарт тіркелгіге біріктірілген, ол үшін серіктестік функционалдығын енгізу қажет);
  • WAVES NODE REST API үстінен абстракциялық қабатты жүзеге асыратын js қаптамасы;
  • Vuejs жақтауындағы код, бұл кітапхана мен RIDE кодын пайдаланудың мысалы болып табылады.

Барлық аталған мүмкіндіктерді сипаттап көрейік.

Смарт-шотты дереу өтеу арқылы қарызға шақыру

InvokeScript қызметіне қоңырау шалу транзакцияны бастайтын есептік жазбадан комиссия төлеуді талап етеді. Есептік жазбасында белгілі бір WAVES таңбалауыштары бар blockchain гектері үшін жоба жасап жатсаңыз, бұл проблема емес, бірақ егер өнім көпшілікке бағытталған болса, бұл күрделі мәселеге айналады. Ақыр соңында, пайдаланушы WAVES токендерін (немесе транзакцияларды төлеу үшін пайдалануға болатын басқа қолайлы активті) сатып алуға қатысуы керек, бұл жобаға кірудің айтарлықтай шегін арттырады. Біз активтерді транзакциялар үшін төлеуге рұқсат етілген және жүйемізден өтімді активтерді айдау үшін автоматтандырылған жүйелер жасалған кезде оларды дұрыс пайдалану қаупіне тап болатын пайдаланушыларға тарата аламыз.

InvokeScript-ті «алушы есебінен» (скрипт орнатылған смарт тіркелгі) деп атауға болатын болса, өте ыңғайлы болар еді және бұл мүмкіндік анық түрде болмаса да бар.

Егер InvokeScript ішінде ScriptTransfer қоңырау шалушы мекенжайына ақыға жұмсалған таңбалауыштарды өтейтін орындалса, қоңырау шалу кезінде қоңырау шалушы тіркелгіде ешқандай активтер болмаса да, мұндай қоңырау сәтті болады. Бұл мүмкін, себебі жеткілікті маркерлерді тексеру транзакция шақырылғаннан кейін емес, оның алдында емес, олар дереу өтелген жағдайда несие бойынша операцияларды жасауға мүмкіндік береді.

ScriptTransfer(яғни қоңырау шалушы, яғни төлем, бірлік)

Төмендегі код смарт-шот қаражатын пайдаланып жұмсалған төлемді қайтарады. Бұл мүмкіндікті теріс пайдаланудан қорғау үшін қоңырау шалушының төлемді дұрыс активке және ақылға қонымды шектерде жұмсағанын тексеру керек:

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
}

Сондай-ақ, ақшаны зиянды және мағынасыз ысырап етуден қорғау үшін автоматты қоңыраудан (PoW-captcha) қорғау қажет.

PoW-captcha

Жұмысты дәлелдейтін captcha идеясының өзі жаңа емес және ол әртүрлі жобаларда, соның ішінде WAVES негізіндегі жобаларда іске асырылған. Идеяның мәні мынада: жобамыздың ресурстарын ысырап ететін әрекетті орындау үшін қоңырау шалушы өз ресурстарын да жұмсауы керек, бұл ресурстардың таусылуына шабуылды айтарлықтай қымбатқа түсіреді. Транзакция жіберушінің PoW мәселесін шешкенін өте оңай және арзан тексеру үшін транзакция идентификаторын тексеру бар:

if take(toBase58String(i.transactionId), 3) != “123” болса, throw(“жұмыс дәлелі орындалмады”) else

Транзакцияны жүргізу үшін қоңырау шалушы оның базалық58 коды (id) 123 сандарынан басталатындай етіп таңдауы керек, ол процессордың бірнеше ондаған секундтық орташа уақытына сәйкес келеді және біздің тапсырмамыз үшін әдетте орынды болады. Егер қарапайым немесе күрделірек PoW қажет болса, тапсырманы анық түрде оңай өзгертуге болады.

Үлгі бойынша деректер кілттерін сұрау

Блокчейнді дерекқор ретінде пайдалану үшін үлгілерді пайдаланып, кілт-val ретінде дерекқорды сұрауға арналған API құралдарының болуы өте маңызды. Мұндай құралдар жинағы параметр ретінде 2019 жылдың шілде айының басында пайда болды ?сәйкес келеді REST API сұрауында /адрестер/деректер?matches=regexp. Енді веб-бағдарламадан барлық кілттерді емес, тек кейбір топтарды бірден бірнеше кілт алу қажет болса, онда кілттің аты бойынша таңдау жасай аламыз. Мысалы, бұл жобада алу транзакциялары кодталған

withdraw_${userAddress}_${txid}

шаблонды пайдалана отырып, кез келген мекен-жай бойынша қаражатты алу бойынша транзакциялар тізімін алуға мүмкіндік береді:

?matches=withdraw_${userAddress}_.*

Енді дайын ерітіндінің компоненттерін талдап көрейік.

vuejs коды

Код нақты жобаға жақын жұмыс істейтін демонстрация болып табылады. Ол Waves Keeper арқылы логинді жүзеге асырады және affiliate.js кітапханасымен жұмыс істейді, оның көмегімен ол жүйеде пайдаланушыны тіркейді, транзакция деректерін сұрайды, сондай-ақ пайдаланушының шотына тапқан қаражатты алуға мүмкіндік береді.

Waves блокчейніндегі ашық бастапқы орталықтандырылмаған серіктестік бағдарламасы

RIDE жолындағы код

Тіркеу, қорландыру және алу функцияларынан тұрады.

Тіркеу функциясы жүйеде пайдаланушыны тіркейді. Оның екі параметрі бар: сілтеме жасаушы (сілтеме мекенжайы) және транзакция идентификаторын таңдау үшін қажет функция кодында пайдаланылмаған тұз параметрі (PoW-captcha тапсырмасы).

Функция (осы жобадағы қалған функциялар сияқты) қарыз алу техникасын пайдаланады, функцияның нәтижесі осы функцияны шақырғаны үшін ақы төлеуді қаржыландыру болып табылады. Осы шешімнің арқасында әмиянды жаңадан жасаған пайдаланушы жүйемен бірден жұмыс істей алады және транзакциялық комиссияны төлеуге мүмкіндік беретін активті алу немесе алу мәселесіне таң қалудың қажеті жоқ.

Тіркеу функциясының нәтижесі екі жазба болып табылады:

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

Бұл алға және кері іздеуге мүмкіндік береді (берілген пайдаланушының сілтемесі және берілген пайдаланушының барлық сілтемелері).

Қор функциясы нақты функционалдылықты дамытуға арналған үлгі болып табылады. Ұсынылған нысанда ол транзакция бойынша аударылған барлық қаражатты алып, оларды 1-ші, 2-ші, 3-ші деңгейдегі реферер шоттарына, «кэшбэк» шотына және «өзгерту» шотына таратады (бұрынғы шоттарға бөлу кезінде қалғанның бәрі осында болады).

Кэшбэк – соңғы пайдаланушыны реферал жүйесіне қатысуға ынталандыру құралы. Жүйемен «кэшбэк» түрінде төленген комиссияның бір бөлігін пайдаланушы жолдамалар үшін сыйақылар сияқты алып тастай алады.

Реферал жүйесін пайдаланған кезде қор функциясы жүйе жұмыс істейтін смарт-шоттың негізгі логикасына енгізілген өзгертілуі керек. Мысалы, егер жасалған ставка үшін жолдама сыйақы төленсе, онда қор функциясы ставка жасалатын логикаға салынуы керек (немесе сыйақы төленетін басқа мақсатты әрекет орындалады). Бұл мүмкіндікте кодталған жолдама сыйлығының үш деңгейі бар. Егер сіз көп немесе аз деңгейлер жасағыңыз келсе, бұл кодта да түзетіледі. Сыйақы пайызы 1-деңгейдің 3 тұрақтыларымен белгіленеді, кодта ол келесідей есептеледі сома * деңгей / 1000, яғни 1 мәні 0,1% сәйкес келеді (бұл кодта да өзгертілуі мүмкін).

Функция шақыруы тіркелгі балансын өзгертеді, сонымен қатар пішінді тіркеу мақсатында жазбаларды жасайды:

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

Яғни, транзакцияның уақыты ол орналасқан блоктың уақыты болып табылады. Бұл транзакцияның өзінен уақыт белгісін пайдаланудан гөрі сенімдірек, әсіресе ол шақырылатын адамда қолжетімсіз болғандықтан.
Шығару функциясы барлық жинақталған сыйақыларды пайдаланушының есептік жазбасына қайтарады. Тіркеу мақсаттары үшін жазбаларды жасайды:

# withdraw log: withdraw_user_txid=amount:timestamp

Қолданба

Қолданбаның негізгі бөлігі серіктестік деректер үлгілері мен WAVES NODE REST API арасындағы көпір болып табылатын affiliate.js кітапханасы болып табылады. Фреймворкке тәуелсіз абстракция қабатын жүзеге асырады (кез келгенін пайдалануға болады). Белсенді функциялар (тіркеу, алып тастау) жүйеде Waves Keeper орнатылғанын болжайды, кітапхананың өзі мұны тексермейді.

Әдістерді жүзеге асырады:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Әдістердің функционалдығы атаулардан айқын көрінеді, параметрлер мен қайтару деректері кодта сипатталған. Тіркеу функциясы қосымша түсініктемелерді қажет етеді - транзакция идентификаторын таңдау циклін 123-тен басталатындай бастайды - бұл жоғарыда сипатталған PoW captcha, ол жаппай тіркеуден қорғайды. Функция қажетті идентификаторы бар транзакцияны табады, содан кейін оған Waves Keeper арқылы қол қояды.

DEX серіктестік бағдарламасы мына мекенжайда қол жетімді GitHub.com.

Ақпарат көзі: www.habr.com

пікір қалдыру