Program gabungan terdesentralisasi sumber terbuka pada rangkaian blok Waves

Program gabungan terdesentralisasi berdasarkan blok blok Waves, dilaksanakan sebagai sebahagian daripada geran Waves Labs oleh pasukan Bettex.

Siaran tidak ditaja! Program ini adalah sumber terbuka, penggunaan dan pengedarannya adalah percuma. Penggunaan program ini merangsang pembangunan aplikasi dApp dan, secara amnya, menggalakkan desentralisasi, yang bermanfaat untuk setiap pengguna Rangkaian.

Program gabungan terdesentralisasi sumber terbuka pada rangkaian blok Waves

DApp untuk program ahli gabungan yang dibentangkan ialah templat untuk projek yang menyertakan ahli gabungan sebagai sebahagian daripada fungsinya. Kod ini boleh digunakan sebagai templat untuk menyalin, sebagai perpustakaan, atau sebagai satu set idea untuk pelaksanaan teknikal.

Dari segi fungsi, ini adalah sistem gabungan biasa yang melaksanakan pendaftaran dengan perujuk, akruan pelbagai peringkat imbuhan untuk rujukan dan motivasi untuk mendaftar dalam sistem (cashback). Sistem ini adalah dApp "tulen", iaitu, aplikasi web berinteraksi secara langsung dengan blockchain tanpa bahagian belakang, pangkalan data, dsb.

Teknik digunakan yang juga boleh berguna dalam banyak projek lain:

  • Memanggil akaun pintar secara kredit dengan pembayaran balik segera (semasa panggilan, tiada token pada akaun untuk membayar panggilan, tetapi token tersebut muncul di sana akibat panggilan tersebut).
  • PoW-captcha - perlindungan terhadap panggilan automatik frekuensi tinggi fungsi akaun pintar - serupa dengan captcha, tetapi melalui bukti penggunaan sumber pengkomputeran.
  • Minta kunci data mengikut templat.

Permohonan terdiri daripada:

  • kod akaun pintar dalam bahasa ride4dapps (yang, seperti yang dirancang, digabungkan ke dalam akaun pintar utama, yang mana anda perlu melaksanakan fungsi ahli gabungan);
  • pembungkus js yang melaksanakan lapisan abstraksi di atas API WAVES NODE REST;
  • kod pada rangka kerja vuejs, yang merupakan contoh penggunaan perpustakaan dan kod RIDE.

Mari kita terangkan semua ciri yang disenaraikan.

Memanggil akaun pintar ke dalam hutang dengan pembayaran balik segera

Memanggil InvokeScript memerlukan pembayaran yuran daripada akaun yang memulakan transaksi. Ini tidak menjadi masalah jika anda melakukan projek untuk geeks blockchain yang mempunyai sejumlah token WAVES pada akaun mereka, tetapi jika produk itu ditujukan kepada orang ramai, ini menjadi masalah yang serius. Lagipun, pengguna mesti menghadiri pembelian token WAVES (atau aset lain yang sesuai yang boleh digunakan untuk membayar transaksi), yang meningkatkan ambang yang sudah cukup besar untuk memasuki projek. Kami boleh mengagihkan aset kepada pengguna yang akan dibenarkan membayar untuk transaksi dan menghadapi risiko penyalahgunaan mereka apabila sistem automatik dicipta untuk mengepam aset cair daripada sistem kami.

Ia akan menjadi sangat mudah jika mungkin untuk memanggil InvokeScript "atas perbelanjaan penerima" (akaun pintar di mana skrip dipasang), dan kemungkinan ini wujud, walaupun tidak dengan cara yang jelas.

Jika, di dalam InvokeScript, ScriptTransfer dibuat ke alamat pemanggil, yang mengimbangi token yang dibelanjakan untuk yuran, maka panggilan sedemikian akan berjaya, walaupun tiada aset pada akaun panggilan pada masa panggilan itu. Ini adalah mungkin kerana semakan untuk token yang mencukupi dibuat selepas urus niaga dipanggil, dan bukan sebelum itu, supaya ada kemungkinan untuk membuat urus niaga secara kredit, dengan syarat ia ditebus segera.

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

Kod di bawah membayar balik yuran yang dibelanjakan menggunakan dana akaun pintar. Untuk melindungi daripada penyalahgunaan ciri ini, anda mesti menggunakan cek bahawa pemanggil membelanjakan yuran dalam aset yang betul dan dalam had yang munasabah:

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
}

Selain itu, untuk melindungi daripada pembaziran dana yang berniat jahat dan tidak masuk akal, perlindungan terhadap panggilan automatik (PoW-captcha) diperlukan.

PoW-captcha

Idea captcha bukti kerja bukanlah baru dan telah pun dilaksanakan dalam pelbagai projek, termasuk yang berasaskan WAVES. Maksud idea ialah untuk melakukan tindakan yang membazirkan sumber projek kami, pemanggil juga mesti membelanjakan sumber mereka sendiri, yang menjadikan serangan pengurangan sumber agak mahal. Untuk pengesahan yang sangat mudah dan kos rendah bahawa pengirim transaksi telah menyelesaikan masalah PoW, terdapat semakan id transaksi:

jika take(toBase58String(i.transactionId), 3) != β€œ123” kemudian buang(β€œbukti kerja gagal”) lain

Untuk menjalankan transaksi, pemanggil mesti memilih parameter sedemikian supaya kod (id) base58nya bermula dengan nombor 123, yang sepadan dengan purata beberapa puluh saat masa pemproses dan secara amnya munasabah untuk tugas kita. Jika PoW yang lebih mudah atau lebih kompleks diperlukan, maka tugas itu boleh diubah suai dengan mudah dengan cara yang jelas.

Pertanyaan kunci data mengikut templat

Untuk menggunakan blockchain sebagai pangkalan data, adalah penting untuk mempunyai alat API untuk menyoal pangkalan data sebagai kunci-val menggunakan templat. Kit alat sedemikian muncul pada awal Julai 2019 sebagai parameter ?perlawanan atas permintaan REST API /addresses/data?matches=regexp. Sekarang, jika kita perlu mendapatkan lebih daripada satu kunci dan bukan semua kunci sekali gus daripada aplikasi web, tetapi hanya beberapa kumpulan, maka kita boleh membuat pilihan mengikut nama kunci. Sebagai contoh, dalam projek ini, transaksi pengeluaran dikodkan sebagai

withdraw_${userAddress}_${txid}

yang membolehkan anda mendapatkan senarai transaksi untuk pengeluaran dana untuk mana-mana alamat yang diberikan menggunakan templat:

?matches=withdraw_${userAddress}_.*

Sekarang mari kita analisis komponen penyelesaian siap.

kod vuejs

Kod ini ialah demo yang berfungsi, hampir dengan projek sebenar. Ia melaksanakan log masuk melalui Waves Keeper dan bekerja dengan pustaka affiliate.js, dengan bantuannya ia mendaftarkan pengguna dalam sistem, menanyakan data transaksi, dan juga membolehkan anda mengeluarkan dana yang diperoleh ke akaun pengguna.

Program gabungan terdesentralisasi sumber terbuka pada rangkaian blok Waves

Kod pada RIDE

Terdiri daripada fungsi daftar, dana dan pengeluaran.

Fungsi daftar mendaftar pengguna dalam sistem. Ia mempunyai dua parameter: perujuk (alamat perujuk) dan parameter garam yang tidak digunakan dalam kod fungsi, yang diperlukan untuk memilih id transaksi (tugas PoW-captcha).

Fungsi (seperti fungsi lain dalam projek ini) menggunakan teknik peminjaman, hasil daripada fungsi tersebut membiayai pembayaran yuran untuk memanggil fungsi ini. Terima kasih kepada penyelesaian ini, pengguna yang baru mencipta dompet boleh segera bekerja dengan sistem dan tidak perlu bingung dengan isu memperoleh atau menerima aset yang membolehkannya membayar yuran transaksi.

Hasil daripada fungsi pendaftaran ialah dua rekod:

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

Ini membenarkan carian ke hadapan dan ke belakang (perujuk pengguna ini dan semua rujukan pengguna ini).

Fungsi dana lebih kepada templat untuk membangunkan fungsi sebenar. Dalam borang yang dibentangkan, ia mengambil semua dana yang dipindahkan oleh urus niaga dan mengagihkannya ke akaun perujuk peringkat 1, 2, 3, ke akaun "pulangan tunai" dan akaun "tukar" (semua yang tinggal semasa pengedaran ke akaun sebelumnya boleh didapati di sini).

Pulangan tunai adalah cara untuk memberi insentif kepada pengguna akhir untuk mengambil bahagian dalam sistem rujukan. Bahagian komisen yang dibayar oleh sistem dalam bentuk "cashback" boleh dikeluarkan oleh pengguna dengan cara yang sama seperti ganjaran untuk rujukan.

Apabila menggunakan sistem rujukan, fungsi dana harus diubah suai, dibina ke dalam logik utama akaun pintar di mana sistem akan berfungsi. Sebagai contoh, jika ganjaran rujukan dibayar untuk pertaruhan yang dibuat, maka fungsi dana harus dibina ke dalam logik di mana pertaruhan dibuat (atau tindakan sasaran lain dilakukan yang ganjarannya dibayar). Terdapat tiga tahap ganjaran rujukan yang dikodkan ke dalam ciri ini. Jika anda ingin membuat lebih atau kurang tahap, maka ini juga diperbetulkan dalam kod. Peratusan ganjaran ditetapkan oleh pemalar level1-level3, dalam kod ia dikira sebagai jumlah * tahap / 1000, iaitu, nilai 1 sepadan dengan 0,1% (ini juga boleh ditukar dalam kod).

Panggilan fungsi menukar baki akaun dan juga mencipta rekod untuk tujuan mengelog borang:

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

Iaitu, masa transaksi adalah masa blok di mana ia berada. Ini lebih dipercayai daripada menggunakan cap masa daripada urus niaga itu sendiri, terutamanya kerana ia tidak tersedia daripada yang boleh dipanggil.
Fungsi withdraw mengeluarkan semua ganjaran terkumpul ke akaun pengguna. Mencipta entri untuk tujuan pengelogan:

# withdraw log: withdraw_user_txid=amount:timestamp

Permohonan

Bahagian utama aplikasi ialah perpustakaan affiliate.js, yang merupakan jambatan antara model data ahli gabungan dan API WAVES NODE REST. Melaksanakan lapisan abstraksi bebas rangka kerja (mana-mana boleh digunakan). Fungsi aktif (mendaftar, menarik diri) menganggap bahawa Waves Keeper dipasang dalam sistem, perpustakaan itu sendiri tidak menyemak ini.

Melaksanakan kaedah:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Kefungsian kaedah adalah jelas dari nama, parameter dan data pulangan diterangkan dalam kod. Fungsi daftar memerlukan ulasan tambahan - ia memulakan kitaran pemilihan id transaksi supaya ia bermula pada 123 - ini ialah captcha PoW yang diterangkan di atas, yang melindungi daripada pendaftaran besar-besaran. Fungsi ini mencari transaksi dengan id yang diperlukan, dan kemudian menandatanganinya melalui Waves Keeper.

Program gabungan DEX boleh didapati di GitHub.com.

Sumber: www.habr.com

Tambah komen