Բաց կոդով ապակենտրոնացված մասնաճյուղային ծրագիր Waves բլոկչեյնում

Ապակենտրոնացված փոխկապակցված ծրագիր, որը հիմնված է Waves բլոկչեյնի վրա, որն իրականացվել է որպես Waves Labs դրամաշնորհի մաս Bettex թիմի կողմից:

Գրառումը չի հովանավորվում! Ծրագիրը բաց կոդով է, դրա օգտագործումն ու տարածումն անվճար է։ Ծրագրի օգտագործումը խթանում է dApp հավելվածների զարգացումը և, ընդհանուր առմամբ, նպաստում է ապակենտրոնացմանը, ինչը շահավետ է Ցանցի յուրաքանչյուր օգտագործողի համար:

Բաց կոդով ապակենտրոնացված մասնաճյուղային ծրագիր Waves բլոկչեյնում

Ներկայացված dApp-ը փոխկապակցված ծրագրերի համար ձևանմուշ է այն նախագծերի համար, որոնք ներառում են մասնաճյուղը որպես իրենց ֆունկցիոնալության մաս: Կոդը կարող է օգտագործվել որպես պատճենահանման ձևանմուշ, որպես գրադարան կամ որպես տեխնիկական իրագործման գաղափարների հավաքածու:

Ֆունկցիոնալ առումով սա սովորական փոխկապակցված համակարգ է, որն իրականացնում է գրանցում ուղղորդողի մոտ, ուղեգրերի համար վարձատրության բազմաստիճան կուտակում և համակարգում գրանցվելու մոտիվացիա (cashback): Համակարգը «մաքուր» dApp է, այսինքն՝ վեբ հավելվածը ուղղակիորեն փոխազդում է բլոկչեյնի հետ՝ առանց իր սեփական հետնամասի, տվյալների բազայի և այլնի։

Օգտագործվում են տեխնիկա, որոնք կարող են օգտակար լինել նաև բազմաթիվ այլ նախագծերում.

  • Ապառիկ խելացի հաշիվ զանգահարելը` անհապաղ մարումով (զանգի պահին հաշվում չկան ժետոններ` զանգի համար վճարելու համար, բայց դրանք հայտնվում են այնտեղ զանգի արդյունքում):
  • PoW-captcha - պաշտպանություն խելացի հաշվի գործառույթների բարձր հաճախականությամբ ավտոմատացված զանգերից, որը նման է captcha-ին, բայց հաշվողական ռեսուրսների օգտագործման ապացույցի միջոցով:
  • Տվյալների ստեղների հարցում կաղապարով:

Դիմումը բաղկացած է.

  • խելացի հաշվի կոդը ride4dapps լեզվով (որը, ինչպես նախատեսվում է, միաձուլվում է հիմնական խելացի հաշվին, որի համար անհրաժեշտ է իրականացնել փոխկապակցված գործառույթը);
  • js փաթաթան, որն իրականացնում է աբստրակցիոն շերտ WAVES NODE REST API-ի վրա;
  • կոդը vuejs շրջանակի վրա, որը գրադարանի և RIDE կոդը օգտագործելու օրինակ է:

Եկեք նկարագրենք թվարկված բոլոր հատկանիշները:

Խելացի հաշիվը պարտքի մեջ կանչելը անհապաղ մարումով

InvokeScript-ին զանգահարելը պահանջում է վճարի վճարում գործարքը նախաձեռնող հաշվից: Սա խնդիր չէ, եթե դուք նախագիծ եք անում բլոկչեյն գիքերի համար, ովքեր ունեն որոշակի թվով WAVES նշաններ իրենց հաշվում, բայց եթե ապրանքը ուղղված է զանգվածներին, դա լուրջ խնդիր է դառնում: Ի վերջո, օգտվողը պետք է մասնակցի WAVES նշանների (կամ մեկ այլ հարմար ակտիվի, որը կարող է օգտագործվել գործարքների համար վճարելու համար) գնելու համար, ինչը մեծացնում է նախագիծ մտնելու արդեն իսկ զգալի շեմը: Մենք կարող ենք ակտիվներ բաշխել այն օգտատերերին, որոնց կթույլատրվի վճարել գործարքների համար և կկանգնեն դրանց չարաշահման վտանգի առաջ, երբ ստեղծվեն ավտոմատ համակարգեր՝ հեղուկ ակտիվները մեր համակարգից մղելու համար:

Շատ հարմար կլինի, եթե հնարավոր լինի զանգահարել InvokeScript-ը «ստացողի հաշվին» (խելացի հաշիվը, որի վրա տեղադրված է սկրիպտը), և այդ հնարավորությունը կա, թեև ոչ ակնհայտ ձևով։

Եթե ​​InvokeScript-ի ներսում կատարվի ScriptTransfer զանգահարողի հասցեին, որը փոխհատուցում է վճարի վրա ծախսված նշանները, ապա նման զանգը կհաջողվի, նույնիսկ եթե զանգի պահին զանգի հաշվին ակտիվներ չկային: Դա հնարավոր է, քանի որ բավարար ժետոնների ստուգումը կատարվում է գործարքը կանչելուց հետո, այլ ոչ թե դրանից առաջ, որպեսզի հնարավոր լինի գործարքներ կատարել ապառիկով՝ պայմանով, որ դրանք անմիջապես մարվեն:

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

Ստորև բերված կոդը վերադարձնում է ծախսված վճարը՝ օգտագործելով խելացի հաշվի միջոցները: Այս հատկանիշի չարաշահումից պաշտպանվելու համար դուք պետք է ստուգեք, որ զանգահարողը ծախսում է վճարը ճիշտ ակտիվում և ողջամիտ սահմաններում.

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 խնդիրը, կա գործարքի նույնականացման ստուգում.

եթե take(toBase58String(i.transactionId), 3) != «123», ապա նետել («աշխատանքի ապացույցը ձախողվեց») ուրիշ

Գործարքն իրականացնելու համար զանգահարողը պետք է ընտրի այնպիսի պարամետրեր, որպեսզի նրա բազային58 կոդը (id) սկսվի 123 թվերով, որը համապատասխանում է միջինը մի քանի տասնյակ վայրկյան պրոցեսորի ժամանակին և ընդհանուր առմամբ ողջամիտ է մեր առաջադրանքի համար: Եթե ​​պահանջվում է ավելի պարզ կամ ավելի բարդ PoW, ապա առաջադրանքը կարող է հեշտությամբ փոփոխվել ակնհայտ ձևով:

Հարցման տվյալների բանալիները ըստ ձևանմուշի

Բլոկչեյնը որպես տվյալների բազա օգտագործելու համար շատ կարևոր է ունենալ API գործիքներ՝ տվյալների բազան որպես key-val կաղապարների միջոցով հարցումներ կատարելու համար: Նման գործիքակազմը հայտնվել է 2019 թվականի հուլիսի սկզբին՝ որպես պարամետր ?լուցկի REST API-ի խնդրանքով /հասցեներ/տվյալներ?matches=regexp. Այժմ, եթե մենք պետք է վեբ հավելվածից ստանանք մեկից ավելի բանալի և ոչ բոլոր ստեղները միանգամից, այլ միայն մի խումբ, ապա մենք կարող ենք ընտրություն կատարել բանալու անունով: Օրինակ, այս նախագծում դուրսբերման գործարքները կոդավորված են այսպես

withdraw_${userAddress}_${txid}

որը թույլ է տալիս ստանալ ցանկացած տվյալ հասցեի համար դրամական միջոցների դուրսբերման գործարքների ցանկ՝ օգտագործելով ձևանմուշը.

?matches=withdraw_${userAddress}_.*

Հիմա եկեք վերլուծենք պատրաստի լուծույթի բաղադրիչները։

vuejs կոդը

Կոդն աշխատանքային ցուցադրություն է՝ մոտ իրական նախագծին։ Այն իրականացնում է մուտք Waves Keeper-ի միջոցով և աշխատում է affiliate.js գրադարանի հետ, որի օգնությամբ գրանցում է օգտատեր համակարգում, հարցումներ է անում գործարքների տվյալների վրա, ինչպես նաև թույլ է տալիս վաստակած միջոցները հանել օգտատիրոջ հաշվին։

Բաց կոդով ապակենտրոնացված մասնաճյուղային ծրագիր Waves բլոկչեյնում

Կոդ RIDE-ում

Բաղկացած է գրանցման, ֆինանսավորման և դուրսբերման գործառույթներից:

Գրանցվել գործառույթը գրանցում է օգտվողին համակարգում: Այն ունի երկու պարամետր՝ ռեֆերեր (ուղղորդի հասցեն) և ֆունկցիայի կոդում չօգտագործված աղի պարամետր, որն անհրաժեշտ է գործարքի id-ն ընտրելու համար (PoW-captcha առաջադրանք)։

Ֆունկցիան (ինչպես այս նախագծում մնացած գործառույթները) օգտագործում է փոխառության տեխնիկան, ֆունկցիայի արդյունքը ֆինանսավորում է այս ֆունկցիան կանչելու համար վճարի վճարումը: Այս լուծման շնորհիվ օգտատերը, ով նոր է ստեղծել դրամապանակ, կարող է անմիջապես աշխատել համակարգի հետ և կարիք չունի տարակուսելու այն ակտիվի ձեռքբերման կամ ստացման հարցում, որը թույլ է տալիս նրան վճարել գործարքի վճար:

Գրանցման գործառույթի արդյունքը երկու գրառում է.

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

Սա թույլ է տալիս առաջ և հետադարձ որոնումներ (տվյալ օգտվողի ուղղորդող և տվյալ օգտվողի բոլոր ուղղորդումները):

Ֆոնդի ֆունկցիան ավելի շատ կաղապար է իրական ֆունկցիոնալությունը զարգացնելու համար: Ներկայացված ձևով այն վերցնում է գործարքով փոխանցված բոլոր միջոցները և դրանք բաշխում 1-ին, 2-րդ, 3-րդ մակարդակների ուղղորդող հաշիվներին, «cashback» և «փոփոխություն» հաշվին (այն ամենը, ինչ մնում է նախորդ հաշիվներին բաշխելիս, ստանում է այստեղ):

Cashback-ը վերջնական օգտագործողին ուղղորդման համակարգին մասնակցելու խրախուսման միջոց է: Համակարգի կողմից վճարվող միջնորդավճարի այն մասը, որը վճարվում է «քեշբեք»-ի տեսքով, օգտատերը կարող է հանել նույն կերպ, ինչպես պարգևատրումները ուղղորդումների համար:

Ուղղորդման համակարգից օգտվելիս ֆոնդի ֆունկցիան պետք է փոփոխվի՝ ներկառուցված խելացի հաշվի հիմնական տրամաբանության մեջ, որի վրա կաշխատի համակարգը: Օրինակ, եթե ուղղորդման պարգևը վճարվում է կատարված խաղադրույքի համար, ապա ֆոնդի գործառույթը պետք է ներկառուցվի այն տրամաբանության մեջ, որտեղ կատարվել է խաղադրույքը (կամ կատարվել է մեկ այլ նպատակային գործողություն, որի համար վճարվում է պարգևը): Այս հատկության մեջ կոդավորված ուղեգրման պարգևների երեք մակարդակ կա: Եթե ​​ցանկանում եք քիչ թե շատ մակարդակներ կատարել, ապա սա նույնպես ուղղվում է կոդում։ Պարգևատրման տոկոսը սահմանվում է level1-level3 հաստատուններով, կոդում այն ​​հաշվարկվում է որպես գումարը * մակարդակ / 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

App

Հավելվածի հիմնական մասը affiliate.js գրադարանն է, որը կամուրջ է փոխկապակցված տվյալների մոդելների և WAVES NODE REST API-ի միջև: Իրականացնում է շրջանակից անկախ աբստրակցիոն շերտ (ցանկացած մեկը կարող է օգտագործվել): Ակտիվ գործառույթները (գրանցում, հանում) ենթադրում են, որ Waves Keeper-ը տեղադրված է համակարգում, գրադարանն ինքը դա չի ստուգում:

Իրականացնում է մեթոդներ.

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Մեթոդների ֆունկցիոնալությունը ակնհայտ է անուններից, պարամետրերը և վերադարձի տվյալները նկարագրված են ծածկագրում: Գրանցման գործառույթը պահանջում է լրացուցիչ մեկնաբանություններ. այն սկսում է գործարքի id-ի ընտրության ցիկլը, որպեսզի այն սկսվի 123-ից. սա վերը նկարագրված PoW captcha-ն է, որը պաշտպանում է զանգվածային գրանցումներից: Ֆունկցիան գտնում է գործարքը պահանջվող ID-ով, այնուհետև ստորագրում է այն Waves Keeper-ի միջոցով:

DEX մասնաճյուղային ծրագիրը հասանելի է GitHub.com- ը.

Source: www.habr.com

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