Waves блокчэйн дээрх нээлттэй эхийн төвлөрсөн бус түншлэлийн хөтөлбөр

Bettex багийн Waves Labs буцалтгүй тусламжийн нэг хэсэг болгон хэрэгжүүлсэн Waves блокчейн дээр суурилсан төвлөрсөн бус түншлэлийн хөтөлбөр.

Нийтлэлийг ивээн тэтгэдэггүй! Хөтөлбөр нь нээлттэй эх сурвалж бөгөөд ашиглах, түгээх үнэ төлбөргүй байдаг. Хөтөлбөрийг ашиглах нь dApp програмуудыг хөгжүүлэхэд түлхэц өгч, ерөнхийдөө төвлөрлийг сааруулахыг дэмждэг бөгөөд энэ нь сүлжээний хэрэглэгч бүрт ашигтай байдаг.

Waves блокчэйн дээрх нээлттэй эхийн төвлөрсөн бус түншлэлийн хөтөлбөр

Түншлэлийн хөтөлбөрүүдэд зориулсан танилцуулсан dApp нь түншлэлийг үйл ажиллагааныхаа нэг хэсэг болгон багтаасан төслүүдийн загвар юм. Кодыг хуулбарлах загвар, номын сан эсвэл техникийн хэрэгжүүлэх санааны багц болгон ашиглаж болно.

Үйл ажиллагааны хувьд энэ нь лавлагаатай бүртгүүлэх, лавлагааны олон түвшний урамшуулал, системд бүртгүүлэх сэдэл (cashback) зэргийг хэрэгжүүлдэг ердийн түншлэлийн систем юм. Энэ систем нь "цэвэр" dApp бөгөөд өөрөөр хэлбэл вэб програм нь өөрийн нөөц, мэдээллийн сан гэх мэт блокчэйнтэй шууд харьцдаг.

Бусад олон төслүүдэд хэрэг болохуйц техникийг ашигладаг:

  • Ухаалаг данс руу нэн даруй эргэн төлөлт хийх боломжтой кредитээр залгах (дуудлагын үед дансанд дуудлага хийх жетон байхгүй, гэхдээ дуудлагын үр дүнд тэнд гарч ирдэг).
  • PoW-captcha - ухаалаг дансны функцүүдийн өндөр давтамжийн автомат дуудлагаас хамгаалах - captcha-тай төстэй боловч тооцоолох нөөцийг ашиглах нотолгоог ашиглан.
  • Загвараар дата түлхүүрийг хүсэх.

Аппликешн нь дараахь зүйлээс бүрдэнэ.

  • ride4dapps хэл дээрх ухаалаг дансны код (энэ нь төлөвлөсний дагуу үндсэн ухаалаг дансанд нэгтгэгдсэн бөгөөд үүний тулд та түншлэлийн функцийг хэрэгжүүлэх шаардлагатай);
  • WAVES NODE REST API дээр хийсвэрлэх давхаргыг хэрэгжүүлдэг js боодол;
  • vuejs framework дээрх код нь номын сан болон RIDE кодыг ашиглах жишээ юм.

Бүх жагсаасан шинж чанаруудыг тайлбарлая.

Ухаалаг дансыг нэн даруй төлөх өрөнд оруулах

InvokeScript руу залгахад гүйлгээг эхлүүлсэн данснаас хураамж төлөх шаардлагатай. Хэрэв та дансандаа тодорхой хэмжээний WAVES жетонтой блокчэйн хөгжөөн дэмжигчдэд зориулсан төсөл хийж байгаа бол энэ нь асуудал биш, харин бүтээгдэхүүн нь масс руу чиглэсэн бол энэ нь ноцтой асуудал болно. Эцсийн эцэст хэрэглэгч WAVES жетоныг (эсвэл гүйлгээний төлбөрийг төлөхөд ашиглаж болох өөр тохиромжтой хөрөнгийг) худалдан авахад оролцох ёстой бөгөөд энэ нь төсөлд ороход нэлээд босгыг нэмэгдүүлдэг. Манай системээс хөрвөх чадвартай хөрөнгийг шахах автоматжуулсан систем бий болсон үед бид гүйлгээний төлбөрийг төлөх эрхтэй хэрэглэгчдэд хөрөнгө хуваарилах боломжтой.

Хэрэв InvokeScript-ийг "хүлээн авагчийн зардлаар" (скрипт суулгасан ухаалаг данс) гэж нэрлэх боломжтой бол энэ нь маш тохиромжтой байх болно, гэхдээ энэ нь ойлгомжтой биш ч гэсэн боломжтой юм.

Хэрэв InvokeScript дотор дуудлага хийгчийн хаяг руу ScriptTransfer хийгдсэн бөгөөд энэ нь төлбөрт зарцуулсан жетоныг нөхдөг бол дуудлага хийх үед дуудлага хийх дансанд ямар ч хөрөнгө байхгүй байсан ч ийм дуудлага амжилттай болно. Энэ нь хангалттай жетон байгаа эсэхийг шалгах нь гүйлгээ дуудагдсаны дараа хийгддэг тул түүнээс өмнө биш харин нэн даруй эргүүлэн төлсөн тохиолдолд зээлээр гүйлгээ хийх боломжтой байдаг тул боломжтой юм.

ScriptTransfer(i.дуудагч, i.төлбөр, нэгж)

Доорх код нь ухаалаг дансны мөнгө ашиглан зарцуулсан төлбөрийг буцаан олгоно. Энэ функцийг буруугаар ашиглахаас хамгаалахын тулд та дуудлага хийгч төлбөрөө зохих хөрөнгөнд, боломжийн хязгаарт зарцуулсан эсэхийг шалгах шаардлагатай.

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 асуудлыг шийдсэн эсэхийг маш хялбар бөгөөд хямд үнээр баталгаажуулахын тулд гүйлгээний id шалгах програм байдаг.

хэрэв take(toBase58String(i.transactionId), 3) != “123” бол throw(“ажлын баталгаа амжилтгүй болсон”) else

Гүйлгээ хийхийн тулд дуудлага хийгч ийм параметрүүдийг сонгох ёстой бөгөөд ингэснээр түүний үндсэн58 код (id) нь 123 тоогоор эхэлдэг бөгөөд энэ нь процессорын хэдэн арван секундын дундажтай тохирч, бидний даалгаварт ерөнхийдөө боломжийн байдаг. Хэрэв илүү энгийн эсвэл илүү төвөгтэй PoW шаардлагатай бол даалгаврыг ойлгомжтой байдлаар хялбархан өөрчилж болно.

Өгөгдлийн түлхүүрүүдийг загвараар хайх

Блокчейнийг мэдээллийн сан болгон ашиглахын тулд загвар ашиглан мэдээллийн санг түлхүүр-val болгон хайлт хийх API хэрэгслүүдтэй байх нь чухал юм. Ийм хэрэгсэл нь 2019 оны XNUMX-р сарын эхээр параметр болгон гарч ирэв ?тохирох REST API хүсэлт дээр /хаяг/өгөгдөл?матч=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-р түвшний лавлагааны данс, "бэлэн мөнгө буцаах" данс, "өөрчлөх" дансанд (өмнөхөд хуваарилах явцад үлдсэн бүх зүйлийг) хуваарилдаг. данс эндээс авна).

Бэлэн мөнгө нь эцсийн хэрэглэгчийг лавлагааны системд оролцохыг урамшуулах хэрэгсэл юм. Системээс "бэлэн мөнгө" хэлбэрээр төлсөн шимтгэлийн хэсгийг хэрэглэгч лавлагааны урамшууллын нэгэн адил буцаан авах боломжтой.

Лавлах системийг ашиглахдаа системийн ажиллах ухаалаг дансны үндсэн логикт суулгасан сангийн функцийг өөрчлөх хэрэгтэй. Жишээлбэл, хэрэв тавьсан бооцооны төлөө лавлагааны урамшуулал төлсөн бол бооцоо тавьсан (эсвэл шагналыг төлсөн өөр зорилтот үйлдэл хийгдсэн) логикт сангийн функцийг суулгасан байх ёстой. Энэ онцлогт гурван түвшний лавлагааны урамшуулал кодлогдсон байдаг. Хэрэв та илүү их эсвэл бага түвшинд хийхийг хүсч байвал кодонд үүнийг бас зассан болно. Шагналын хувийг 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

Програм

Аппликешны гол хэсэг нь 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.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх