Децентрализовани партнерски програм отвореног кода на блокчејну Вавес

Децентрализовани партнерски програм заснован на блокчејну Вавес, имплементиран као део донације Вавес Лабс од стране Беттек тима.

Пост није спонзорисан! Програм је отвореног кода, његово коришћење и дистрибуција је бесплатна. Коришћење програма стимулише развој дАпп апликација и, уопште, промовише децентрализацију, што је корисно за сваког корисника Мреже.

Децентрализовани партнерски програм отвореног кода на блокчејну Вавес

Представљена дАпп за партнерске програме је шаблон за пројекте који укључују аффилиате као део своје функционалности. Код се може користити као шаблон за копирање, као библиотека или као скуп идеја за техничку имплементацију.

Што се тиче функционалности, ово је обичан партнерски систем који имплементира регистрацију код реферера, вишестепено обрачунавање накнаде за препоруке и мотивацију за регистрацију у систему (цасхбацк). Систем је „чиста“ дАпп, то јест, веб апликација је у директној интеракцији са блоцкцхаином без сопственог позадинског дела, базе података итд.

Користе се технике које такође могу бити корисне у многим другим пројектима:

  • Позивање паметног налога на кредит са моменталном отплатом (у тренутку позива на рачуну нема токена за плаћање позива, али се тамо појављују као резултат позива).
  • ПоВ-цаптцха – заштита од високофреквентног аутоматског позивања функција паметног налога – слично цаптцха, али кроз доказ коришћења рачунарских ресурса.
  • Захтев за кључеве података по шаблону.

Апликација се састоји од:

  • код паметног налога на језику риде4даппс (који је, како је планирано, спојен са главним паметним налогом, за који је потребно да имплементирате придружену функционалност);
  • јс омотач који имплементира слој апстракције преко ВАВЕС НОДЕ РЕСТ АПИ-ја;
  • код на вуејс оквиру, што је пример коришћења библиотеке и РИДЕ кода.

Хајде да опишемо све наведене карактеристике.

Позивање паметног рачуна у дуг са тренутном отплатом

Позивање ИнвокеСцрипт-а захтева плаћање накнаде са налога који покреће трансакцију. Ово није проблем ако радите пројекат за блоцкцхаин штреберке који имају одређени број ВАВЕС токена на свом налогу, али ако је производ усмерен на масе, ово постаје озбиљан проблем. На крају крајева, корисник мора да води рачуна о куповини ВАВЕС токена (или другог одговарајућег средства које се може користити за плаћање трансакција), што повећава ионако значајан праг за улазак у пројекат. Можемо да дистрибуирамо средства корисницима којима ће бити дозвољено да плаћају трансакције и суочавају се са ризиком њихове злоупотребе када се креирају аутоматизовани системи за пумпање ликвидних средстава из нашег система.

Било би веома згодно када би било могуће позвати ИнвокеСцрипт „о трошку примаоца“ (паметни налог на коме је скрипта инсталирана), а та могућност постоји, мада не на очигледан начин.

Ако се унутар ИнвокеСцрипт-а изврши СцриптТрансфер на адресу позиваоца, који надокнађује токене потрошене на накнаду, онда ће такав позив успети, чак и ако није било средстава на налогу за позивање у време позива. Ово је могуће јер се провера за довољно токена врши након позива трансакције, а не пре ње, тако да је могуће извршити трансакције на кредит, под условом да се одмах искористе.

СцриптТрансфер(и.позивалац, и.накнада, јединица)

Код испод рефундира потрошену накнаду користећи средства паметног налога. Да бисте се заштитили од злоупотребе ове функције, морате да проверите да ли позивалац потроши накнаду у одговарајућој имовини иу разумним границама:

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
}

Такође, за заштиту од злонамерног и бесмисленог расипања средстава, потребна је заштита од аутоматског позива (ПоВ-цаптцха).

ПоВ-цаптцха

Сама идеја прооф-оф-ворк цаптцха није нова и већ је имплементирана у различите пројекте, укључујући и оне засноване на ВАВЕС-у. Поента идеје је да, да би извршио акцију која троши ресурсе нашег пројекта, позивалац мора да потроши и сопствене ресурсе, што напад исцрпљивања ресурса чини прилично скупим. За веома лаку и јефтину проверу да је пошиљалац трансакције решио проблем ПоВ, постоји провера ИД-а трансакције:

иф таке(тоБасе58Стринг(и.трансацтионИд), 3) != “123” тхен тхров(“доказ рада није успео”) елсе

Да би извршио трансакцију, позивалац мора да изабере такве параметре тако да његов басе58 код (ид) почиње бројевима 123, што одговара просечном времену од неколико десетина секунди процесорског времена и генерално је разумно за наш задатак. Ако је потребан једноставнији или сложенији ПоВ, онда се задатак може лако модификовати на очигледан начин.

Упит за кључеве података по шаблону

Да бисте користили блоцкцхаин као базу података, од виталног је значаја имати АПИ алате за испитивање базе података као кључ-вал помоћу шаблона. Такав алат се појавио почетком јула 2019. као параметар ?парнице на захтев РЕСТ АПИ-ја /аддрессес/дата?матцхес=регекп. Сада, ако треба да добијемо више од једног кључа и не све кључеве одједном из веб апликације, већ само неку групу, онда можемо направити избор по имену кључа. На пример, у овом пројекту трансакције повлачења су кодиране као

withdraw_${userAddress}_${txid}

који вам омогућава да добијете листу трансакција за повлачење средстава за било коју адресу користећи шаблон:

?matches=withdraw_${userAddress}_.*

Сада анализирајмо компоненте готовог решења.

вуејс цоде

Код је радни демо, близак стварном пројекту. Имплементира пријаву преко Вавес Кеепер-а и рад са библиотеком аффилиате.јс, уз помоћ које региструје корисника у систему, испитује податке о трансакцијама, а такође вам омогућава да повучете зарађена средства на налог корисника.

Децентрализовани партнерски програм отвореног кода на блокчејну Вавес

Код на РИДЕ

Састоји се од функција регистра, фонда и повлачења.

Функција регистра региструје корисника у систему. Има два параметра: реферер (адреса упућивача) и параметар соли који се не користи у коду функције, а који је потребан за одабир ИД-а трансакције (поВ-цаптцха задатак).

Функција (као и остале функције у овом пројекту) користи технику позајмљивања, резултат функције је финансирање плаћања накнаде за позивање ове функције. Захваљујући овом решењу, корисник који је управо направио новчаник може одмах да ради са системом и не мора да буде збуњен питањем стицања или примања средства које му омогућава да плати накнаду за трансакцију.

Резултат функције регистрације су два записа:

${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

апликација

Главни део апликације је библиотека аффилиате.јс, која је мост између придружених модела података и ВАВЕС НОДЕ РЕСТ АПИ-ја. Имплементира слој апстракције независан од оквира (било који се може користити). Активне функције (регистровање, повлачење) претпостављају да је Вавес Кеепер инсталиран у систему, сама библиотека то не проверава.

Примењује методе:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Функционалност метода је очигледна из имена, параметри и повратни подаци су описани у коду. Функција регистра захтева додатне коментаре – покреће циклус одабира ИД-а трансакције тако да почиње на 123 – ово је горе описана ПоВ цаптцха, која штити од масовних регистрација. Функција проналази трансакцију са потребним ИД-ом, а затим је потписује преко Вавес Кеепер-а.

ДЕКС партнерски програм доступан на ГитХуб.цом.

Извор: ввв.хабр.цом

Додај коментар