Program afiliasi terdesentralisasi pada blockchain Waves, dilaksanakan sebagai bagian dari hibah Waves Labs oleh tim Bettex.
Posnya bukan iklan! Program ini open source, penggunaan dan distribusinya gratis. Aplikasi program merangsang pengembangan aplikasi dApp dan umumnya mempromosikan desentralisasi, yang bermanfaat bagi setiap pengguna Jaringan.

Diperkenalkan oleh dApp untuk program afiliasi adalah template untuk proyek yang menyertakan afiliasi sebagai bagian dari fungsinya. Kode dapat digunakan sebagai templat untuk menyalin, sebagai pustaka atau sebagai sekumpulan ide untuk implementasi teknis.
Dalam hal fungsi, ini adalah sistem afiliasi reguler yang menerapkan pendaftaran dengan indikasi perujuk, akrual multi-level penghargaan untuk referensi dan motivasi untuk pendaftaran dalam sistem (cashback). Sistemnya adalah "murni" dApp, yaitu, aplikasi web berinteraksi langsung dengan blockchain tanpa backend, database, dll.
Teknik yang digunakan juga dapat berguna dalam banyak proyek lain:
- Memanggil akun pintar secara kredit dengan pembayaran langsung (pada saat panggilan, tidak ada token pada akun untuk membayar panggilan, tetapi mereka muncul di sana sebagai hasil dari panggilan).
- PoW-captcha - perlindungan terhadap panggilan otomatis frekuensi tinggi dari fungsi akun pintar - analog dari captcha, tetapi melalui bukti penggunaan sumber daya komputasi.
- Permintaan kunci data berdasarkan templat.
Aplikasi terdiri dari:
- kode akun cerdas dalam bahasa ride4dapps (yang, menurut desain, digabungkan ke dalam akun pintar utama, yang Anda perlukan untuk mengimplementasikan fungsi afiliasi);
- pembungkus js yang menerapkan tingkat abstraksi atas API REST NODE WAVES;
- kode pada kerangka kerja vuejs, yang merupakan contoh menggunakan perpustakaan dan kode RIDE.
Kami menjelaskan semua fitur ini.
Panggil akun pintar secara kredit dengan pembayaran segeraPanggilan InvokeScript memerlukan biaya dari akun yang memulai transaksi. Ini bukan masalah jika Anda melakukan proyek untuk Geek blockchain yang memiliki sejumlah token WAV di akun mereka, tetapi jika produk tersebut ditujukan untuk digunakan secara luas, ini menjadi masalah serius. Lagi pula, pengguna harus berhati-hati dalam membeli token WAVES (atau aset lain yang sesuai dengan yang dapat Anda bayar untuk transaksi), yang meningkatkan ambang yang sudah cukup besar untuk memasuki proyek. Kami dapat mendistribusikan aset kepada pengguna, yang memungkinkan kami membayar untuk transaksi dan menghadapi risiko penyalahgunaannya ketika sistem otomatis dibuat untuk memompa keluar aset likuid dari sistem kami.
Akan sangat nyaman jika memungkinkan untuk membuat panggilan InvokeScript "dengan mengorbankan penerima" (akun pintar tempat skrip dipasang), dan kemungkinan seperti itu, meskipun tidak dengan cara yang jelas, ada.
Jika Anda menjalankan ScriptTransfer di dalam InvokeScript ke alamat pemanggil, yang mengkompensasi token yang dihabiskan untuk biaya, maka panggilan seperti itu akan berhasil, bahkan jika tidak ada aset pada akun panggilan pada saat panggilan. Hal ini dimungkinkan karena fakta bahwa jumlah token yang cukup diperiksa setelah transaksi dipanggil, dan bukan sebelum itu, sehingga dimungkinkan untuk melakukan transaksi dengan kredit yang harus dibayar segera.
ScriptTransfer (i.caller, i.fee, unit)Kode di bawah ini mengembalikan biaya yang dikeluarkan dengan mengorbankan akun pintar. Untuk melindungi dari penyalahgunaan fitur ini, Anda harus menggunakan cek bahwa penelepon menghabiskan biaya dalam aset yang tepat 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 }
Juga, perlindungan terhadap pemborosan dana berbahaya dan tidak masuk akal membutuhkan perlindungan terhadap panggilan otomatis (PoW-captcha)
PoW-captchaIde captcha pembuktian kerja bukanlah hal baru dan telah diterapkan di berbagai proyek, termasuk yang diimplementasikan berdasarkan WAVES. Idenya adalah bahwa untuk tindakan yang menyia-nyiakan sumber daya proyek kami, penelepon harus menghabiskan sumber dayanya sendiri, yang membuat serangan terhadap menipisnya sumber daya cukup mahal. Untuk validasi yang sangat mudah dan murah bahwa pengirim transaksi telah menyelesaikan tugas PoW, ada cek untuk id transaksi:
jika take (toBase58String (i.transactionId), 3)! = "123" lalu lempar ("bukti kerja gagal") lainUntuk melakukan transaksi, pemanggil harus memilih parameter tersebut sehingga kode base58-nya (id) dimulai pada 123, yang sesuai dengan rata-rata beberapa detik waktu prosesor dan biasanya masuk akal untuk tugas kami. Jika PoW sederhana atau lebih kompleks diperlukan, maka tugas itu mudah untuk disempurnakan dengan cara yang jelas.
Permintaan kunci data menurut templatUntuk menggunakan blockchain sebagai basis data, penting untuk memiliki alat API untuk menanyakan basis data sebagai templat key-val. Toolkit semacam itu muncul pada awal Juli 2019 sebagai parameter "
Cocok" untuk permintaan
/ alamat / data REST API
? Kecocokan = regexp . Sekarang, jika kita perlu mendapatkan tidak satu kunci dan tidak semua kunci dari aplikasi web sekaligus, tetapi hanya beberapa kelompok, maka kita dapat membuat pilihan dengan nama kunci. Misalnya, dalam proyek ini, transaksi penarikan dikodekan sebagai
withdraw_${userAddress}_${txid}
yang memungkinkan Anda untuk mendapatkan daftar transaksi untuk menarik dana untuk setiap alamat yang diberikan sesuai dengan templat:
?matches=withdraw_${userAddress}_.*
Sekarang kita akan menganalisis komponen dari solusi turnkey.
Kode VuejsKode ini adalah demo yang berfungsi dekat dengan proyek nyata. Ini mengimplementasikan login melalui Waves Keeper dan bekerja dengan perpustakaan affiliate.js, dengan bantuan yang mendaftarkan pengguna dalam sistem, polling data transaksi, dan juga memungkinkan Anda untuk menarik dana yang diperoleh ke akun pengguna.
Kode NAIKIni terdiri dari fungsi register, dana dan penarikan.
Fungsi register mendaftar dengan sistem pengguna. Ini memiliki dua parameter: pengarah (alamat pengarah) dan parameter garam, yang tidak digunakan dalam kode fungsi, yang diperlukan untuk memilih id transaksi (tugas PoW-captcha).
Fungsi (seperti fungsi lain dari proyek ini) menggunakan teknik peminjaman, hasil dari fungsi tersebut adalah membiayai biaya untuk memanggil fungsi ini. Berkat keputusan ini, pengguna yang baru saja membuat dompet dapat segera bekerja dengan sistem dan dia tidak perlu bingung dengan masalah pembelian atau penerimaan aset yang memungkinkan Anda membayar biaya transaksi.
Hasil dari fungsi pendaftaran adalah dua entri:
${owner)_referer = referer ${referer}_referral_${owner} = owner
Ini memungkinkan pencarian langsung dan terbalik (perujuk pengguna ini dan semua referensi pengguna ini).
Fungsi dana lebih merupakan templat untuk mengembangkan fungsionalitas nyata. Dalam bentuk yang disajikan, dibutuhkan semua dana yang ditransfer oleh transaksi dan mendistribusikannya ke akun rujukan 1, 2, 3, ke akun "cashback" dan akun "perubahan" (semua yang tersisa ketika mendistribusikan ke akun sebelumnya ada di sini).
Cashback adalah cara merangsang pengguna akhir untuk berpartisipasi dalam sistem rujukan. Pengguna dapat menarik bagian dari komisi yang dibayarkan oleh sistem dalam bentuk "cashback" dengan cara yang sama seperti hadiah untuk referensi.
Saat menggunakan sistem rujukan, fungsi dana harus dimodifikasi, dibangun ke dalam logika utama akun pintar tempat sistem akan bekerja. Misalnya, jika biaya rujukan dibayar untuk taruhan yang dibuat, maka fungsi dana harus dimasukkan ke dalam logika di mana taruhan dilakukan (atau tindakan bertarget lain dilakukan, untuk mana biaya dibayarkan). Fungsi ini mengkodekan tiga level penghargaan referensi. Jika Anda perlu melakukan lebih atau kurang level, maka ini juga diperbaiki dalam kode. Persentase remunerasi ditetapkan oleh konstanta level1-level3, dalam kode itu dianggap sebagai
jumlah * level / 1000 , yaitu nilai 1 sesuai dengan 0,1% (ini juga dapat diubah dalam kode).
Panggilan fungsi mengubah saldo akun dan juga membuat entri untuk tujuan masuk dalam formulir:
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 di mana ia berada. Ini lebih dapat diandalkan daripada menggunakan cap waktu dari transaksi itu sendiri, terutama karena itu tidak dapat diakses dari callable.
Fungsi penarikan menampilkan semua akumulasi hadiah pada akun pengguna. Membuat entri untuk tujuan logging:
# withdraw log: withdraw_user_txid=amount:timestamp
AplikasiBagian utama dari aplikasi adalah perpustakaan affiliate.js, yang merupakan jembatan antara model data afiliasi dan API REST NODE WAVES. Menerapkan tingkat abstraksi yang independen dari kerangka kerja (apa pun dapat digunakan). Fungsi aktif (mendaftar, menarik) menganggap bahwa Waves Keeper diinstal di sistem, perpustakaan itu sendiri tidak memeriksa ini.
Metode penerapan:
fetchReferralTransactions fetchWithdrawTransactions fetchMyBalance fetchReferrals fetchReferer withdraw register
Fungsi metode jelas dari nama, parameter dan data yang dikembalikan dijelaskan dalam kode. Fungsi register memerlukan komentar tambahan - ia memulai siklus pencocokan id transaksi sehingga dimulai pada 123 - ini adalah PoW-captcha yang dijelaskan di atas, yang melindungi terhadap registrasi massal. Fungsi menemukan transaksi dengan id yang diinginkan, dan kemudian menandatanganinya melalui Waves Keeper.
Program afiliasi DEX tersedia di
GitHub.com .