Rhaglen gysylltiedig ffynhonnell agored datganoledig ar y blockchain Waves

Rhaglen gyswllt ddatganoledig yn seiliedig ar blockchain Waves, a weithredwyd fel rhan o grant Waves Labs gan dîm Bettex.

Nid yw post yn cael ei noddi! Mae'r rhaglen yn ffynhonnell agored, ac mae ei defnyddio a'i dosbarthu am ddim. Mae defnyddio'r rhaglen yn ysgogi datblygiad cymwysiadau dApp ac, yn gyffredinol, yn hyrwyddo datganoli, sy'n fuddiol i bob defnyddiwr o'r Rhwydwaith.

Rhaglen gysylltiedig ffynhonnell agored datganoledig ar y blockchain Waves

Mae'r dApp a gyflwynir ar gyfer rhaglenni cysylltiedig yn dempled ar gyfer prosiectau sy'n cynnwys cyswllt fel rhan o'u swyddogaeth. Gellir defnyddio'r cod fel templed ar gyfer copïo, fel llyfrgell, neu fel set o syniadau ar gyfer gweithredu technegol.

O ran ymarferoldeb, mae hon yn system gysylltiedig gyffredin sy'n gweithredu cofrestru gyda chyfeiriwr, cronni tâl aml-lefel ar gyfer atgyfeiriadau a chymhelliant ar gyfer cofrestru yn y system (arian yn ôl). Mae'r system yn dApp “pur”, hynny yw, mae'r cymhwysiad gwe yn rhyngweithio'n uniongyrchol â'r blockchain heb ei ôl-ben ei hun, cronfa ddata, ac ati.

Defnyddir technegau a all hefyd fod yn ddefnyddiol mewn llawer o brosiectau eraill:

  • Galw cyfrif smart ar gredyd gydag ad-daliad ar unwaith (ar adeg yr alwad, nid oes unrhyw docynnau ar y cyfrif i dalu am yr alwad, ond maent yn ymddangos yno o ganlyniad i'r alwad).
  • PoW-captcha - amddiffyniad yn erbyn galw awtomataidd amledd uchel o swyddogaethau cyfrif smart - tebyg i captcha, ond trwy brawf o'r defnydd o adnoddau cyfrifiadurol.
  • Cais i allweddi data yn ôl templed.

Mae'r cais yn cynnwys:

  • cod cyfrif smart yn yr iaith ride4dapps (sydd, fel y cynlluniwyd, wedi'i gyfuno â'r prif gyfrif craff, y mae angen i chi weithredu'r swyddogaeth gysylltiedig ar ei gyfer);
  • papur lapio js sy'n gweithredu haen tynnu dros yr API WAVES NODE REST;
  • cod ar y fframwaith vuejs, sy'n enghraifft o ddefnyddio'r llyfrgell a chod RIDE.

Gadewch i ni ddisgrifio'r holl nodweddion a restrir.

Galw cyfrif clyfar i ddyled gydag ad-daliad ar unwaith

Mae galw InvokeScript yn gofyn am dalu ffi o'r cyfrif sy'n cychwyn y trafodiad. Nid yw hyn yn broblem os ydych chi'n gwneud prosiect ar gyfer geeks blockchain sydd â nifer benodol o docynnau WAVES ar eu cyfrif, ond os yw'r cynnyrch wedi'i anelu at y llu, mae hyn yn dod yn broblem ddifrifol. Wedi'r cyfan, rhaid i'r defnyddiwr roi sylw i brynu tocynnau WAVES (neu ased addas arall y gellir ei ddefnyddio i dalu am drafodion), sy'n cynyddu'r trothwy sydd eisoes yn sylweddol ar gyfer ymuno â'r prosiect. Gallwn ddosbarthu asedau i ddefnyddwyr a fydd yn cael talu am drafodion ac sy’n wynebu’r risg o’u camddefnyddio pan fydd systemau awtomataidd yn cael eu creu i bwmpio asedau hylifol o’n system.

Byddai'n gyfleus iawn pe bai'n bosibl galw InvokeScript “ar draul y derbynnydd” (y cyfrif smart y mae'r sgript wedi'i osod arno), ac mae'r posibilrwydd hwn yn bodoli, er nad mewn ffordd amlwg.

Os, y tu mewn i InvokeScript, y gwneir Trosglwyddiad Sgript i gyfeiriad y galwr, sy'n gwneud iawn am y tocynnau a wariwyd ar y ffi, yna bydd galwad o'r fath yn llwyddo, hyd yn oed os nad oedd unrhyw asedau ar y cyfrif galw ar adeg yr alwad. Mae hyn yn bosibl oherwydd bod y siec am docynnau digonol yn cael ei wneud ar ôl i'r trafodiad gael ei alw, ac nid cyn hynny, fel ei bod yn bosibl gwneud trafodion ar gredyd, ar yr amod eu bod yn cael eu hadbrynu ar unwaith.

ScriptTransfer (i.galer, i.fee, uned)

Mae'r cod isod yn ad-dalu'r ffi a wariwyd gan ddefnyddio cronfeydd cyfrif clyfar. Er mwyn amddiffyn rhag camddefnydd o'r nodwedd hon, rhaid i chi wirio bod y galwr yn gwario'r ffi yn yr ased cywir ac o fewn terfynau rhesymol:

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
}

Hefyd, i amddiffyn rhag gwastraffu arian maleisus a disynnwyr, mae angen amddiffyniad rhag galwadau awtomatig (PoW-captcha).

PoW-captcha

Nid yw'r union syniad o captcha prawf-o-waith yn newydd ac mae eisoes wedi'i weithredu mewn amrywiol brosiectau, gan gynnwys y rhai sy'n seiliedig ar WAVES. Pwynt y syniad yw, er mwyn cyflawni gweithred sy'n gwastraffu adnoddau ein prosiect, bod yn rhaid i'r galwr hefyd wario eu hadnoddau eu hunain, sy'n gwneud ymosodiad disbyddu adnoddau yn eithaf costus. I gael dilysiad hawdd iawn a chost isel bod anfonwr y trafodiad wedi datrys y broblem PoW, mae gwiriad id trafodiad:

os cymryd(toBase58String(i.transactionId), 3) != “123” yna taflu (“prawf o waith wedi methu”) arall

Er mwyn cynnal trafodiad, rhaid i'r galwr ddewis paramedrau o'r fath fel bod ei god base58 (id) yn dechrau gyda'r rhifau 123, sy'n cyfateb i gyfartaledd cwpl o ddegau o eiliadau o amser prosesydd ac yn gyffredinol yn rhesymol ar gyfer ein tasg. Os oes angen carcharorion rhyfel symlach neu fwy cymhleth, yna gellir addasu'r dasg yn hawdd mewn ffordd amlwg.

Holi bysellau data yn ôl templed

Er mwyn defnyddio'r blockchain fel cronfa ddata, mae'n hanfodol cael offer API ar gyfer cwestiynu'r gronfa ddata fel allwedd gan ddefnyddio templedi. Ymddangosodd pecyn cymorth o'r fath ddechrau mis Gorffennaf 2019 fel paramedr ?gemau ar gais REST API /addresses/data?matches=regexp. Nawr, os oes angen i ni gael mwy nag un allwedd ac nid pob allwedd ar unwaith o'r rhaglen we, ond dim ond rhyw grŵp, yna gallwn wneud detholiad yn ôl enw'r allwedd. Er enghraifft, yn y prosiect hwn, mae trafodion tynnu'n ôl yn cael eu hamgodio fel

withdraw_${userAddress}_${txid}

sy'n eich galluogi i gael rhestr o drafodion ar gyfer tynnu arian yn ôl ar gyfer unrhyw gyfeiriad penodol gan ddefnyddio'r templed:

?matches=withdraw_${userAddress}_.*

Nawr, gadewch i ni ddadansoddi cydrannau'r datrysiad gorffenedig.

cod vuejs

Mae'r cod yn demo sy'n gweithio, yn agos at brosiect go iawn. Mae'n gweithredu mewngofnodi trwy Waves Keeper ac yn gweithio gyda'r llyfrgell affiliate.js, gyda chymorth y mae'n cofrestru defnyddiwr yn y system, yn holi data trafodion, ac mae hefyd yn caniatáu ichi dynnu arian a enillwyd i gyfrif y defnyddiwr.

Rhaglen gysylltiedig ffynhonnell agored datganoledig ar y blockchain Waves

Cod ar RIDE

Mae'n cynnwys swyddogaethau cofrestru, ariannu a thynnu'n ôl.

Mae swyddogaeth y gofrestr yn cofrestru defnyddiwr yn y system. Mae ganddo ddau baramedr: cyfeiriwr (cyfeiriad cyfeiriwr) a'r paramedr halen na ddefnyddir yn y cod swyddogaeth, sydd ei angen i ddewis yr id trafodiad (tasg PoW-captcha).

Mae'r swyddogaeth (fel gweddill y swyddogaethau yn y prosiect hwn) yn defnyddio'r dechneg benthyca, canlyniad y swyddogaeth yw ariannu talu ffi am alw'r swyddogaeth hon. Diolch i'r datrysiad hwn, gall defnyddiwr sydd newydd greu waled weithio gyda'r system ar unwaith ac nid oes angen iddo gael ei ddrysu gan y mater o gaffael neu dderbyn ased sy'n caniatáu iddo dalu ffi trafodiad.

Canlyniad y swyddogaeth gofrestru yw dau gofnod:

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

Mae hyn yn caniatáu edrych ymlaen ac yn ôl (cyfeiriwr y defnyddiwr hwn a phob atgyfeiriad gan y defnyddiwr hwn).

Mae swyddogaeth y gronfa yn fwy o dempled ar gyfer datblygu ymarferoldeb gwirioneddol. Yn y ffurf a gyflwynir, mae'n cymryd yr holl arian a drosglwyddir gan y trafodiad ac yn eu dosbarthu i gyfrifon cyfeirio'r lefelau 1af, 2il, 3ydd, i'r cyfrif “arian yn ôl” a'r cyfrif “newid” (popeth sy'n weddill wrth ddosbarthu i'r blaenorol cyfrifon yn cyrraedd yma).

Mae arian yn ôl yn fodd o gymell y defnyddiwr terfynol i gymryd rhan yn y system atgyfeirio. Gall y rhan o'r comisiwn a delir gan y system ar ffurf “arian yn ôl” gael ei dynnu'n ôl gan y defnyddiwr yn yr un modd â gwobrau am atgyfeiriadau.

Wrth ddefnyddio'r system atgyfeirio, dylid addasu swyddogaeth y gronfa, wedi'i ymgorffori ym mhrif resymeg y cyfrif smart y bydd y system yn gweithio arno. Er enghraifft, os telir gwobr atgyfeirio am bet a wneir, yna dylai swyddogaeth y gronfa gael ei chynnwys yn y rhesymeg lle gwneir y bet (neu gyflawnir gweithred darged arall y telir y wobr amdani). Mae tair lefel o wobrau atgyfeirio wedi'u codio yn y nodwedd hon. Os ydych chi am wneud mwy neu lai o lefelau, yna mae hyn hefyd yn cael ei gywiro yn y cod. Mae'r canran gwobr yn cael ei osod gan y cysonion lefel 1-level3, yn y cod mae'n cael ei gyfrifo fel swm * lefel / 1000, hynny yw, mae'r gwerth 1 yn cyfateb i 0,1% (gellir newid hyn hefyd yn y cod).

Mae'r alwad ffwythiant yn newid balans y cyfrif a hefyd yn creu cofnodion at ddiben logio'r ffurflen:

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

Hynny yw, amser y trafodiad yw amser y bloc y mae wedi'i leoli ynddo. Mae hyn yn fwy dibynadwy na defnyddio'r stamp amser o'r trafodiad ei hun, yn enwedig gan nad yw ar gael o'r un y gellir ei alw.
Mae'r swyddogaeth tynnu'n ôl yn tynnu'r holl wobrau cronedig i gyfrif y defnyddiwr. Yn creu cofnodion at ddibenion logio:

# withdraw log: withdraw_user_txid=amount:timestamp

Cais

Prif ran y cymhwysiad yw'r llyfrgell affiliate.js, sy'n bont rhwng y modelau data cysylltiedig a'r WAVES NODE REST API. Yn gweithredu haen echdynnu annibynnol ar fframwaith (gellir defnyddio unrhyw un). Mae swyddogaethau gweithredol (cofrestru, tynnu'n ôl) yn tybio bod Waves Keeper wedi'i osod yn y system, nid yw'r llyfrgell ei hun yn gwirio hyn.

Yn gweithredu dulliau:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Mae ymarferoldeb y dulliau yn amlwg o'r enwau, disgrifir y paramedrau a'r data dychwelyd yn y cod. Mae angen sylwadau ychwanegol ar swyddogaeth y gofrestr - mae'n cychwyn y cylch dewis id trafodiad fel ei fod yn dechrau ar 123 - dyma'r captcha PoW a ddisgrifir uchod, sy'n amddiffyn rhag cofrestriadau màs. Mae'r swyddogaeth yn dod o hyd i drafodiad gyda'r id gofynnol, ac yna'n ei lofnodi trwy Waves Keeper.

Rhaglen gysylltiedig DEX ar gael yn GitHub.com.

Ffynhonnell: hab.com

Ychwanegu sylw