Malcentralizita, malfermfonta filia programo sur la Waves-blokoĉeno

Malcentralizita filia programo pri la blokĉeno Waves, efektivigita kiel parto de subvencio de Waves Labs de la teamo Bettex.

La afiŝo ne reklamas! La programo estas malferma fonto, ĝia uzo kaj distribuo estas senpagaj. La uzo de la programo stimulas la evoluon de dApp-aplikoj kaj ĝenerale antaŭenigas malcentralizon, kiu profitigas ĉiun retan uzanton.

Malcentralizita, malfermfonta filia programo sur la Waves-blokoĉeno

La prezentita dApp por filiaj programoj estas ŝablono por projektoj, kiuj inkluzivas filion kiel parton de sia funkcieco. La kodo povas esti uzata kiel ŝablono por kopiado, kiel biblioteko, aŭ kiel aro de ideoj por teknika efektivigo.

Koncerne funkciecon, ĉi tio estas regula filia sistemo, kiu efektivigas registradon kun referencisto, plurnivela akumulado de rekompencoj por referencoj kaj instigo por registriĝi en la sistemo (rekompenco). La sistemo estas "pura" dApp, tio estas, la retejo interagas rekte kun la blokĉeno, sen havi sian propran backend, datumbazo ktp.

Teknikoj uzataj, kiuj ankaŭ povas esti utilaj en multaj aliaj projektoj:

  • Voki inteligentan konton en ŝuldon kun tuja repago (en la momento de la voko ne estas ĵetonoj sur la konto por pagi la vokon, sed ili aperas tie kiel rezulto de la voko).
  • PoW-captcha — protekto kontraŭ altfrekvenca aŭtomatigita voko de inteligentaj kontaj funkcioj — analoga al captcha, sed per pruvo de la uzo de komputikaj rimedoj.
  • Demandu pri datumŝlosiloj uzante ŝablonon.

La aplikaĵo konsistas el:

  • inteligenta kontokodo en la ride4dapps-lingvo (kiu, kiel planite, estas kunfandita en la ĉefan inteligentan konton por kiu filia funkcio devas esti efektivigita);
  • js envolvaĵo kiu efektivigas abstraktan nivelon super la WAVES NODE REST API;
  • kodon sur la kadro vuejs, kiu estas ekzemplo de uzado de la biblioteko kaj RIDE-kodo.

Ni priskribu ĉiujn listigitajn funkciojn.

Voki inteligentan konton por ŝuldo kun tuja repago

Voki InvokeScript postulas pagon de kotizo de la konto iniciatanta la transakcion. Ĉi tio ne estas problemo, se vi faras projekton por blokĉenaj geeks, kiuj havas certan kvanton da WAVES-ĵetonoj en sia konto, sed se la produkto celas uzi la amasojn — ĝi fariĝas grava problemo. Post ĉio, la uzanto devas zorgi pri aĉeto de WAVES-ĵetonoj (aŭ alia taŭga valoraĵo, kiu povas esti uzata por pagi transakciojn), kio pliigas la jam konsiderindan baron por eniro en la projekton. Ni povas distribui valoraĵon al uzantoj, kiuj povos pagi por transakcioj kaj alfronti la riskon de sia misuzo kiam aŭtomatigitaj sistemoj estas kreitaj por elpumpi likvan valoraĵon el nia sistemo.

Estus tre oportune, se eblus nomi InvokeScript "koste de la ricevanto" (la inteligenta konto sur kiu la skripto estas instalita), kaj tia ebleco, kvankam ne en evidenta maniero, ekzistas.

Se ene de InvokeScript vi faras ScriptTransfer al la adreso de la alvokanto, kiu kompensas la kotizĵetonojn elspezitajn, tiam tia alvoko sukcesos, eĉ se en la momento de la voko ne estis aktivoj sur la voka konto. Ĉi tio eblas ĉar la ĉeko por sufiĉaj ĵetonoj estas farita post kiam la transakcio estas vokita, prefere ol antaŭ ĝi, tiel ke transakcioj povas esti faritaj kredite, kondiĉe de tuja repago.

ScriptTransfer (i.vokanto, i.kotizo, unuo)

La suba kodo repagas la elspezitan kotizon uzante inteligentajn kontajn financojn. Por protekti kontraŭ misuzo de ĉi tiu funkcio, necesas uzi kontrolon, ke la alvokanto elspezas la kotizon en la postulata valoraĵo kaj ene de raciaj limoj:

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
}

Ankaŭ, por protekti kontraŭ malica kaj sensenca malŝparo de financoj, necesas aŭtomata voka protekto (PoW-captcha).

PoW-kapĉa

La ideo mem de pruvo de laboro captcha ne estas nova kaj jam estis efektivigita en diversaj projektoj, inkluzive de tiuj efektivigitaj surbaze de WAVES. La ideo estas, ke por plenumi agon, kiu konsumas la rimedojn de nia projekto, la alvokanto devas ankaŭ elspezi siajn proprajn rimedojn, kio faras sufiĉe multekostan atakon de malplenigo de rimedoj. Por tre facila kaj malmultekosta konfirmo, ke la sendinto de la transakcio solvis la PoW-problemon, ekzistas transakcia id-kontrolo:

if take(toBase58String(i.transactionId), 3) != "123" tiam ĵetu ("pruvo de laboro malsukcesis") alie

Por fari transakcion, la alvokanto devas elekti tiajn parametrojn, por ke ĝia bazo58-kodo (id) komenciĝu per la numeroj 123, kiu averaĝe respondas al kelkaj dekoj da sekundoj da procesora tempo kaj ĝenerale estas racia por nia tasko. Se pli simpla aŭ pli kompleksa PoW estas postulata, tiam la tasko povas esti facile modifita en evidenta maniero.

Demandu pri datumŝlosiloj uzante ŝablonon

Por uzi blokĉenon kiel datumbazon, estas esenca havi API-iloj por pridemandi la datumbazon kiel ŝlosil-val surbaze de ŝablonoj. Tia ilaro aperis komence de julio 2019 en formo de parametro ?matĉoj laŭ la peto de REST API /addresses/data?matches=regexp. Nun, se ni bezonas akiri pli ol unu ŝlosilon de TTT-apliko kaj ne ĉiujn ŝlosilojn samtempe, sed nur iun grupon, tiam ni povas fari elekton per ŝlosilnomo. Ekzemple, en ĉi tiu projekto, retiriĝaj transakcioj estas koditaj kiel

withdraw_${userAddress}_${txid}

kiu ebligas al vi ricevi liston de transakcioj por retiro de mono por iu ajn adreso uzante la ŝablonon:

?matches=withdraw_${userAddress}_.*

Nun ni rigardu la komponantojn de la preta solvo.

Vuejs-kodo

La kodo estas funkcianta demo proksima al la reala projekto. Ĝi efektivigas ensaluton per Waves Keeper kaj funkcias kun la biblioteko affiliate.js, kun kiu ĝi registras la uzanton en la sistemo, demandas transakciajn datumojn, kaj ankaŭ ebligas al vi retiri gajnitajn financojn al la konto de la uzanto.

Malcentralizita, malfermfonta filia programo sur la Waves-blokoĉeno

Kodo por RIDE

Konsistas el la funkcioj de registro, fundo kaj retiro.

La registra funkcio registras uzanton en la sistemo. Ĝi havas du parametrojn: referencilo (referencadreso) kaj la salo-parametro, kiu ne estas uzata en la funkciokodo, kiu necesas por elekti la transakcian identigilon (PoW-captcha tasko).

La funkcio (kiel aliaj funkcioj de ĉi tiu projekto) uzas la ŝuldvokteknikon, la rezulto de la funkcio estas financi la pagon de kotizo por voki ĉi tiun funkcion. Danke al ĉi tiu solvo, uzanto, kiu ĵus kreis monujon, povas tuj labori kun la sistemo kaj ne devas zorgi pri aĉeto aŭ ricevo de valoraĵo, kiu permesas al li pagi transakcian kotizon.

La rezulto de la registra funkcio estas du registroj:

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

Ĉi tio permesas antaŭen kaj inversajn serĉojn (la referencisto de antaŭfiksita uzanto kaj ĉiuj referencoj de antaŭfiksita uzanto).

La fundfunkcio estas pli ol ŝablono por disvolvi realan funkciecon. En ĝia prezentita formo, ĝi prenas ĉiujn financojn translokigitajn de la transakcio kaj distribuas ilin al la kontoj de referencantoj de niveloj 1, 2, 3, al la konto "cashback" kaj al la "ŝanĝa" konto (ĉio, kio restas kiam distribuite al antaŭa kontoj iras ĉi tie).

Cashback estas rimedo por stimuli la finuzanton partopreni en la plusendsistemo. La uzanto povas retiri la parton de la komisiono pagita de la sistemo en la formo de "rekompenco" same kiel rekompencoj por referencoj.

Kiam vi uzas referencan sistemon, la fundo-funkcio devas esti modifita kaj integrita en la ĉefan logikon de la inteligenta konto, sur kiu la sistemo funkcios. Ekzemple, se referenco rekompenco estas pagita por veto farita, tiam la fundfunkcio devus esti konstruita en la logikon kie la veto estas metita (aŭ alia celita ago estas farita por kiu la rekompenco estas pagita). Tri niveloj de referencaj rekompencoj estas kodigitaj en ĉi tiun funkcion. Se vi bezonas fari pli aŭ malpli da niveloj, tiam ĉi tio ankaŭ estas korektita en la kodo. La rekompenca procento estas agordita de la konstantoj de nivel1-nivelo3; en la kodo ĝi estas kalkulita kiel kvanto * nivelo / 1000, tio estas, la valoro 1 respondas al 0,1% (ĉi tio ankaŭ povas esti ŝanĝita en la kodo).

Voki la funkcion ŝanĝas la kontan saldon kaj ankaŭ kreas enskribojn por registri celoj de la formo:

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

Tio estas, la transakcia tempo estas la tempo de la bloko en kiu ĝi situas. Ĉi tio estas pli fidinda ol uzado de la tempomarko de la transakcio mem, precipe ĉar ĝi ne haveblas de la alvokebla.
La retiriĝa funkcio montras ĉiujn amasigitajn rekompencojn al la konto de la uzanto. Kreas enskribojn por registradaj celoj:

# withdraw log: withdraw_user_txid=amount:timestamp

Apliko

La ĉefa parto de la aplikaĵo estas la biblioteko affiliate.js, kiu estas ponto inter la filiaj datummodeloj kaj la WAVES NODE REST API. Realigas abstraktan nivelon sendependa de la kadro (iu ajn povas esti uzata). Aktivaj funkcioj (registri, retiriĝi) supozas ke Waves Keeper estas instalita sur la sistemo; la biblioteko mem ne kontrolas tion.

Implementas metodojn:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

La funkcieco de la metodoj estas evidenta de la nomoj; la parametroj kaj resenditaj datumoj estas priskribitaj en la kodo. La registra funkcio postulas pliajn komentojn - ĝi komencas ciklon de elektado de la transakcia idaro por ke ĝi komenciĝu ĉe 123 - ĉi tiu estas la PoW-captcha priskribita supre, kiu protektas kontraŭ amasaj registradoj. La funkcio trovas transakcion kun la bezonata identigilo, kaj poste subskribas ĝin per Waves Keeper.

DEX-filia programo haveblas ĉe GitHub.com.

fonto: www.habr.com

Aldoni komenton