Open source decentralized affiliate program sa Waves blockchain

Isang desentralisadong affiliate program batay sa Waves blockchain, na ipinatupad bilang bahagi ng isang Waves Labs grant ng Bettex team.

Hindi naka-sponsor ang post! Ang programa ay open source, ang paggamit at pamamahagi nito ay libre. Ang paggamit ng programa ay nagpapasigla sa pagbuo ng mga aplikasyon ng dApp at, sa pangkalahatan, nagtataguyod ng desentralisasyon, na kapaki-pakinabang para sa bawat gumagamit ng Network.

Open source decentralized affiliate program sa Waves blockchain

Ang ipinakita na dApp para sa mga programang kaakibat ay isang template para sa mga proyekto na kinabibilangan ng kaakibat bilang bahagi ng kanilang paggana. Ang code ay maaaring gamitin bilang isang template para sa pagkopya, bilang isang library, o bilang isang hanay ng mga ideya para sa teknikal na pagpapatupad.

Sa mga tuntunin ng functionality, ito ay isang ordinaryong affiliate system na nagpapatupad ng pagpaparehistro na may referrer, multi-level na accrual ng remuneration para sa mga referral at motivation para sa pagpaparehistro sa system (cashback). Ang sistema ay isang "purong" dApp, ibig sabihin, direktang nakikipag-ugnayan ang web application sa blockchain nang walang sariling backend, database, atbp.

Ginagamit ang mga diskarte na maaari ding maging kapaki-pakinabang sa maraming iba pang mga proyekto:

  • Ang pagtawag sa isang matalinong account sa credit na may agarang pagbabayad (sa oras ng tawag, walang mga token sa account na babayaran para sa tawag, ngunit lumilitaw ang mga ito doon bilang resulta ng tawag).
  • PoW-captcha - proteksyon laban sa high-frequency na automated na pagtawag ng mga function ng smart account - katulad ng captcha, ngunit sa pamamagitan ng patunay ng paggamit ng mga mapagkukunan ng computing.
  • Humiling sa mga data key ayon sa template.

Ang application ay binubuo ng:

  • smart account code sa wikang ride4dapps (na, gaya ng pinlano, ay pinagsama sa pangunahing smart account, kung saan kailangan mong ipatupad ang affiliate na functionality);
  • js wrapper na nagpapatupad ng abstraction layer sa WAVES NODE REST API;
  • code sa vuejs framework, na isang halimbawa ng paggamit ng library at RIDE code.

Ilarawan natin ang lahat ng nakalistang feature.

Pagtawag sa isang matalinong account sa utang na may agarang pagbabayad

Ang pagtawag sa InvokeScript ay nangangailangan ng pagbabayad ng bayad mula sa account na nagpapasimula ng transaksyon. Hindi ito problema kung gumagawa ka ng proyekto para sa mga blockchain geeks na mayroong tiyak na halaga ng mga WAVES token sa kanilang account, ngunit kung ang produkto ay nakatutok sa masa, ito ay nagiging isang seryosong problema. Pagkatapos ng lahat, ang gumagamit ay dapat dumalo sa pagbili ng mga WAVES token (o isa pang naaangkop na asset na maaaring magamit upang magbayad para sa mga transaksyon), na nagpapataas ng malaki nang threshold para sa pagpasok sa proyekto. Maaari naming ipamahagi ang mga asset sa mga user na papayagang magbayad para sa mga transaksyon at harapin ang panganib ng kanilang maling paggamit kapag ginawa ang mga automated na system para mag-pump ng mga liquid asset mula sa aming system.

Magiging napakaginhawa kung posible na tawagan ang InvokeScript "sa gastos ng tatanggap" (ang matalinong account kung saan naka-install ang script), at umiiral ang posibilidad na ito, bagama't hindi sa isang malinaw na paraan.

Kung, sa loob ng InvokeScript, isang ScriptTransfer ang ginawa sa address ng tumatawag, na nagbabayad para sa mga token na ginastos sa bayad, kung gayon ang naturang tawag ay magtatagumpay, kahit na walang mga asset sa calling account sa oras ng tawag. Posible ito dahil ang tseke para sa sapat na mga token ay ginawa pagkatapos tawagan ang transaksyon, at hindi bago ito, upang posible na gumawa ng mga transaksyon sa kredito, sa kondisyon na ang mga ito ay agad na matubos.

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

Ibinabalik ng code sa ibaba ang ginastos na bayarin gamit ang mga pondo ng smart account. Upang maprotektahan laban sa maling paggamit ng feature na ito, dapat kang gumamit ng tseke na ginagastos ng tumatawag ang bayad sa tamang asset at sa loob ng mga makatwirang limitasyon:

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
}

Gayundin, upang maprotektahan laban sa malisyoso at walang katuturang pag-aaksaya ng mga pondo, kinakailangan ang proteksyon laban sa awtomatikong tawag (PoW-captcha).

PoW-captcha

Ang mismong ideya ng proof-of-work captcha ay hindi na bago at naipatupad na sa iba't ibang mga proyekto, kabilang ang mga batay sa WAVES. Ang punto ng ideya ay upang maisagawa ang isang aksyon na nag-aaksaya sa mga mapagkukunan ng aming proyekto, ang tumatawag ay dapat ding gumastos ng kanilang sariling mga mapagkukunan, na ginagawang medyo magastos ang pag-atake sa pagkaubos ng mapagkukunan. Para sa napakadali at murang pagpapatunay na nalutas na ng nagpadala ng transaksyon ang problema sa PoW, mayroong isang transaction id check:

kung take(toBase58String(i.transactionId), 3) != β€œ123” then throw(β€œproof of work failed”) else

Upang makapagsagawa ng isang transaksyon, ang tumatawag ay dapat pumili ng mga naturang parameter upang ang base58 code (id) nito ay magsimula sa mga numerong 123, na tumutugma sa isang average ng ilang sampu-sampung segundo ng oras ng processor at sa pangkalahatan ay makatwiran para sa aming gawain. Kung kinakailangan ang isang mas simple o mas kumplikadong PoW, kung gayon ang gawain ay madaling mabago sa isang malinaw na paraan.

Query data key ayon sa template

Upang magamit ang blockchain bilang database, mahalagang magkaroon ng mga tool sa API para sa pag-query sa database bilang key-val gamit ang mga template. Ang nasabing toolkit ay lumitaw noong unang bahagi ng Hulyo 2019 bilang isang parameter ?matches sa kahilingan ng REST API /addresses/data?matches=regexp. Ngayon, kung kailangan nating makakuha ng higit sa isang key at hindi lahat ng key nang sabay-sabay mula sa web application, ngunit ilang grupo lamang, maaari tayong pumili sa pamamagitan ng pangalan ng key. Halimbawa, sa proyektong ito, ang mga transaksyon sa pag-withdraw ay naka-encode bilang

withdraw_${userAddress}_${txid}

na nagpapahintulot sa iyo na makakuha ng isang listahan ng mga transaksyon para sa pag-withdraw ng mga pondo para sa anumang ibinigay na address gamit ang template:

?matches=withdraw_${userAddress}_.*

Ngayon suriin natin ang mga bahagi ng tapos na solusyon.

vuejs code

Ang code ay isang gumaganang demo, malapit sa isang tunay na proyekto. Nagpapatupad ito ng pag-login sa pamamagitan ng Waves Keeper at nakikipagtulungan sa affiliate.js library, sa tulong kung saan ito nagrerehistro ng user sa system, nagtatanong ng data ng transaksyon, at nagbibigay-daan din sa iyong mag-withdraw ng mga kinita na pondo sa account ng user.

Open source decentralized affiliate program sa Waves blockchain

Code sa RIDE

Binubuo ng register, fund at withdraw functions.

Ang register function ay nagrerehistro ng isang user sa system. Mayroon itong dalawang parameter: referer (referer address) at ang parameter ng asin na hindi ginagamit sa function code, na kinakailangan upang piliin ang transaction id (PoW-captcha task).

Ang function (tulad ng iba pang mga function sa proyektong ito) ay gumagamit ng diskarte sa paghiram, ang resulta ng function ay pagpopondo sa pagbabayad ng bayad para sa pagtawag sa function na ito. Salamat sa solusyon na ito, ang isang user na kakagawa pa lang ng wallet ay makakapagtrabaho kaagad sa system at hindi na kailangang maguluhan sa isyu ng pagkuha o pagtanggap ng asset na nagpapahintulot sa kanya na magbayad ng bayad sa transaksyon.

Ang resulta ng pagpaparehistro ng function ay dalawang talaan:

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

Nagbibigay-daan ito sa mga pasulong at paatras na paghahanap (referrer ng user na ito at lahat ng referral ng user na ito).

Ang function ng pondo ay higit pa sa isang template para sa pagbuo ng tunay na functionality. Sa ipinakita na form, kinukuha nito ang lahat ng mga pondo na inilipat ng transaksyon at ipinamamahagi ang mga ito sa mga referrer account ng ika-1, ika-2, ika-3 antas, sa "cashback" na account at ang "baguhin" na account (lahat ng natitira sa panahon ng pamamahagi sa nakaraang ang mga account ay nakukuha dito).

Ang cashback ay isang paraan ng pagbibigay-insentibo sa end user na lumahok sa referral system. Ang bahagi ng komisyon na binayaran ng system sa anyo ng "cashback" ay maaaring bawiin ng gumagamit sa parehong paraan tulad ng mga gantimpala para sa mga referral.

Kapag ginagamit ang referral system, dapat baguhin ang function ng pondo, na binuo sa pangunahing lohika ng matalinong account kung saan gagana ang system. Halimbawa, kung ang isang referral na reward ay binayaran para sa isang taya na ginawa, ang fund function ay dapat na binuo sa logic kung saan ang taya ay ginawa (o isa pang target na aksyon ay ginanap kung saan ang reward ay binayaran). May tatlong antas ng mga reward sa referral na naka-code sa feature na ito. Kung nais mong gumawa ng higit pa o mas kaunting mga antas, ito ay naitama din sa code. Ang porsyento ng reward ay itinakda ng level1-level3 constants, sa code ito ay kinakalkula bilang halaga * antas / 1000, ibig sabihin, ang halaga 1 ay tumutugma sa 0,1% (maaari rin itong baguhin sa code).

Binabago ng function call ang balanse ng account at lumilikha din ng mga entry para sa layunin ng pag-log sa form:

fund_address_txid = address:owner:inc:level:timestamp
Для получСния timestamp (Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ такая Π²ΠΎΡ‚ связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Iyon ay, ang oras ng transaksyon ay ang oras ng bloke kung saan ito matatagpuan. Ito ay mas maaasahan kaysa sa paggamit ng timestamp mula sa mismong transaksyon, lalo na dahil hindi ito available mula sa callable.
Ang withdraw function ay nag-withdraw ng lahat ng naipon na reward sa account ng user. Lumilikha ng mga entry para sa mga layunin ng pag-log:

# withdraw log: withdraw_user_txid=amount:timestamp

App

Ang pangunahing bahagi ng application ay ang affiliate.js library, na isang tulay sa pagitan ng mga modelo ng affiliate na data at ng WAVES NODE REST API. Nagpapatupad ng framework-independent abstraction layer (maaaring gamitin ang alinman). Ang mga aktibong function (magparehistro, mag-withdraw) ay ipinapalagay na ang Waves Keeper ay naka-install sa system, hindi ito sinusuri ng library mismo.

Nagpapatupad ng mga pamamaraan:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Ang pag-andar ng mga pamamaraan ay halata mula sa mga pangalan, ang mga parameter at data ng pagbabalik ay inilarawan sa code. Ang register function ay nangangailangan ng mga karagdagang komento - sinisimulan nito ang cycle ng pagpili ng transaction id upang magsimula ito sa 123 - ito ang PoW captcha na inilarawan sa itaas, na nagpoprotekta laban sa mga mass registration. Ang function ay naghahanap ng isang transaksyon na may kinakailangang id, at pagkatapos ay nilagdaan ito sa pamamagitan ng Waves Keeper.

DEX affiliate program na makukuha sa GitHub.com.

Pinagmulan: www.habr.com

Magdagdag ng komento