Program afiliasi sumber terbuka dan terdesentralisasi di blockchain Waves

Program afiliasi terdesentralisasi pada blockchain Waves, diimplementasikan sebagai bagian dari hibah Waves Labs oleh tim Bettex.

Postingan tersebut bukan iklan! Program ini open source, penggunaan dan distribusinya gratis. Penggunaan program ini merangsang pengembangan aplikasi dApp dan secara umum mendorong desentralisasi, yang menguntungkan setiap pengguna Internet.

Program afiliasi sumber terbuka dan terdesentralisasi di blockchain Waves

DApp untuk program afiliasi yang disajikan adalah templat untuk proyek yang menyertakan afiliasi sebagai bagian dari fungsinya. Kode tersebut dapat digunakan sebagai templat untuk disalin, sebagai perpustakaan, atau sebagai kumpulan ide untuk implementasi teknis.

Dari segi fungsionalitas, ini adalah sistem afiliasi reguler yang menerapkan pendaftaran dengan perujuk, akrual imbalan multi-level untuk rujukan dan motivasi untuk mendaftar di sistem (cashback). Sistemnya adalah dApp “murni”, yaitu aplikasi web berinteraksi langsung dengan blockchain, tanpa memiliki backend, database, dll.

Teknik yang digunakan yang juga berguna dalam banyak proyek lainnya:

  • Memanggil akun pintar menjadi hutang dengan pembayaran segera (pada saat panggilan, tidak ada token di akun untuk membayar panggilan tersebut, tetapi mereka muncul di sana sebagai hasil dari panggilan tersebut).
  • PoW-captcha - perlindungan terhadap panggilan otomatis frekuensi tinggi ke fungsi akun pintar - analog dengan captcha, tetapi melalui bukti penggunaan sumber daya komputasi.
  • Kueri kunci data menggunakan templat.

Aplikasi ini terdiri dari:

  • kode akun pintar dalam bahasa ride4dapps (yang, sesuai rencana, digabungkan ke dalam akun pintar utama yang fungsi afiliasinya perlu diterapkan);
  • js wrapper yang mengimplementasikan level abstraksi melalui WAVES NODE REST API;
  • kode pada framework vuejs yang merupakan contoh penggunaan library dan kode RIDE.

Mari kita jelaskan semua fitur yang terdaftar.

Memanggil akun pintar untuk hutang dengan pembayaran segera

Memanggil InvokeScript memerlukan pembayaran biaya dari akun yang memulai transaksi. Ini bukan masalah jika Anda membuat proyek untuk para ahli blockchain yang memiliki sejumlah token WAVES di akunnya, tetapi jika produk tersebut ditujukan untuk digunakan oleh masyarakat umum, ini menjadi masalah yang serius. Bagaimanapun, pengguna harus berhati-hati dalam membeli token WAVES (atau aset lain yang sesuai yang dapat digunakan untuk membayar transaksi), yang meningkatkan hambatan yang sudah cukup besar untuk masuk ke dalam proyek. Kami dapat mendistribusikan aset kepada pengguna yang mampu membayar transaksi dan menghadapi risiko penyalahgunaan ketika sistem otomatis dibuat untuk mengeluarkan aset likuid dari sistem kami.

Akan sangat mudah jika memungkinkan untuk memanggil InvokeScript “dengan mengorbankan penerima” (akun pintar tempat skrip diinstal), dan kemungkinan seperti itu, meskipun tidak secara jelas, ada.

Jika di dalam InvokeScript Anda melakukan ScriptTransfer ke alamat penelepon, yang mengkompensasi token biaya yang dikeluarkan, maka panggilan tersebut akan berhasil, meskipun pada saat panggilan tidak ada aset di akun panggilan. Hal ini dimungkinkan karena pemeriksaan terhadap kecukupan token dilakukan setelah transaksi dilakukan, bukan sebelumnya, sehingga transaksi dapat dilakukan secara kredit, dengan syarat pelunasan segera.

ScriptTransfer(i.penelepon, i.biaya, unit)

Kode di bawah ini mengganti biaya yang dikeluarkan menggunakan dana akun pintar. Untuk melindungi dari penyalahgunaan fitur ini, perlu menggunakan cek bahwa penelepon membelanjakan biaya dalam aset yang diperlukan dan dalam batas yang wajar:

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 dari pemborosan dana yang berbahaya dan tidak masuk akal, diperlukan perlindungan panggilan otomatis (PoW-captcha).

PoW-captcha

Ide captcha proof-of-work bukanlah hal baru dan telah diterapkan di berbagai proyek, termasuk yang diimplementasikan berdasarkan WAVES. Idenya adalah untuk melakukan tindakan yang menghabiskan sumber daya proyek kita, pemanggil juga harus mengeluarkan sumber dayanya sendiri, yang membuat serangan penipisan sumber daya menjadi cukup mahal. Untuk validasi yang sangat mudah dan murah bahwa pengirim transaksi telah menyelesaikan masalah PoW, ada pemeriksaan id transaksi:

jika take(toBase58String(i.transactionId), 3) != “123” lalu throw(“bukti pekerjaan gagal”) else

Untuk melakukan transaksi, penelepon harus memilih parameter sedemikian rupa sehingga kode base58 (id) dimulai dengan angka 123, yang rata-rata sesuai dengan beberapa puluh detik waktu prosesor dan umumnya masuk akal untuk tugas kita. Jika diperlukan PoW yang lebih sederhana atau lebih kompleks, maka tugas tersebut dapat dengan mudah dimodifikasi dengan cara yang jelas.

Kueri kunci data menggunakan templat

Untuk menggunakan blockchain sebagai database, sangat penting untuk memiliki alat API untuk menanyakan database sebagai key-val berdasarkan template. Toolkit tersebut muncul pada awal Juli 2019 dalam bentuk parameter cocok atas permintaan REST API /alamat/data?matches=regexp. Sekarang, jika kita perlu mendapatkan lebih dari satu kunci dari aplikasi web dan tidak semua kunci sekaligus, tetapi hanya beberapa grup, maka kita dapat memilih berdasarkan nama kunci. Misalnya, dalam proyek ini, transaksi penarikan dikodekan sebagai

withdraw_${userAddress}_${txid}

yang memungkinkan Anda mendapatkan daftar transaksi penarikan dana untuk alamat tertentu menggunakan templat:

?matches=withdraw_${userAddress}_.*

Sekarang mari kita lihat komponen dari solusi yang sudah jadi.

kode Vuejs

Kode ini adalah demo yang berfungsi dekat dengan proyek sebenarnya. Ini mengimplementasikan login melalui Waves Keeper dan bekerja dengan perpustakaan afiliasi.js, yang dengannya ia mendaftarkan pengguna dalam sistem, menanyakan data transaksi, dan juga memungkinkan Anda untuk menarik dana yang diperoleh ke akun pengguna.

Program afiliasi sumber terbuka dan terdesentralisasi di blockchain Waves

Kode untuk RIDE

Terdiri dari fungsi daftar, dana dan penarikan.

Fungsi register mendaftarkan pengguna pada sistem. Ini memiliki dua parameter: referensi (alamat rujukan) dan parameter garam, yang tidak digunakan dalam kode fungsi, yang diperlukan untuk memilih id transaksi (tugas PoW-captcha).

Fungsi tersebut (seperti fungsi lain dari proyek ini) menggunakan teknik panggilan utang, hasil dari fungsi tersebut adalah membiayai pembayaran biaya pemanggilan fungsi ini. Berkat solusi ini, pengguna yang baru saja membuat dompet dapat langsung bekerja dengan sistem dan tidak perlu khawatir untuk membeli atau menerima aset yang memungkinkannya membayar biaya transaksi.

Hasil dari fungsi registrasi adalah dua record:

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

Hal ini memungkinkan pencarian maju dan mundur (perujuk dari pengguna tertentu dan semua rujukan dari pengguna tertentu).

Fungsi dana lebih merupakan template untuk mengembangkan fungsionalitas nyata. Dalam bentuknya yang disajikan, ia mengambil semua dana yang ditransfer oleh transaksi dan mendistribusikannya ke rekening perujuk level 1, 2, 3, ke rekening “cashback” dan rekening “perubahan” (semua yang tersisa ketika didistribusikan ke sebelumnya akun masuk ke sini).

Cashback adalah sarana memotivasi pengguna akhir untuk berpartisipasi dalam sistem rujukan. Pengguna dapat menarik sebagian komisi yang dibayarkan oleh sistem dalam bentuk “cashback” dengan cara yang sama seperti hadiah untuk referensi.

Saat menggunakan sistem rujukan, fungsi dana harus dimodifikasi dan diintegrasikan ke dalam logika utama akun pintar tempat sistem akan bekerja. Misalnya, jika hadiah rujukan dibayarkan untuk taruhan yang dibuat, maka fungsi dana harus dimasukkan ke dalam logika di mana taruhan dipasang (atau tindakan bertarget lainnya dilakukan untuk membayar hadiah tersebut). Tiga tingkat imbalan rujukan dikodekan ke dalam fungsi ini. Jika Anda perlu membuat lebih banyak atau lebih sedikit level, maka ini juga diperbaiki dalam kode. Persentase hadiah ditentukan oleh konstanta level1-level3; dalam kode dihitung sebagai jumlah * tingkat / 1000, yaitu nilai 1 sama dengan 0,1% (ini juga dapat diubah dalam kode).

Memanggil fungsi ini akan mengubah saldo akun dan juga membuat entri untuk keperluan pencatatan dalam bentuk:

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

Artinya, waktu transaksi adalah waktu blok tempatnya berada. Ini lebih dapat diandalkan daripada menggunakan stempel waktu dari transaksi itu sendiri, terutama karena stempel waktu tersebut tidak tersedia dari callable.
Fungsi penarikan menampilkan semua akumulasi hadiah ke akun pengguna. Membuat entri untuk tujuan logging:

# withdraw log: withdraw_user_txid=amount:timestamp

Web

Bagian utama dari aplikasi ini adalah perpustakaan afiliasi.js, yang merupakan jembatan antara model data afiliasi dan WAVES NODE REST API. Menerapkan tingkat abstraksi yang tidak bergantung pada kerangka kerja (apa pun dapat digunakan). Fungsi aktif (mendaftar, menarik) mengasumsikan bahwa Waves Keeper diinstal pada sistem; perpustakaan itu sendiri tidak memeriksanya.

Menerapkan metode:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Fungsionalitas metode ini jelas dari namanya; parameter dan data yang dikembalikan dijelaskan dalam kode. Fungsi register memerlukan komentar tambahan - ini memulai siklus pemilihan id transaksi sehingga dimulai pada 123 - ini adalah captcha PoW yang dijelaskan di atas, yang melindungi dari registrasi massal. Fungsi ini menemukan transaksi dengan id yang diperlukan, dan kemudian menandatanganinya melalui Waves Keeper.

Program afiliasi DEX tersedia di GitHub.com.

Sumber: www.habr.com

Tambah komentar