Pengembang Christophe Verdot membagikan pengalamannya baru-baru ini mengikuti kursus online
'Mastering Web 3.0 with Waves' .
Apa latar belakangmu? Apa yang memotivasi Anda untuk mengambil kursus?Saya telah menjadi pengembang web selama sekitar 15 tahun, sebagian besar bekerja sebagai freelancer.
Bekerja pada pengembangan aplikasi web registri berkelanjutan untuk negara-negara berkembang, dibiayai oleh kelompok bank, saya pernah ditanya tentang kemungkinan menerapkan sertifikasi blockchain ke dalam registri. Pada saat itu, saya tidak tahu banyak tentang sertifikasi blockchain meskipun saya telah menjadi crypto untuk sementara waktu, sebagian besar di sisi investor.
Kami tidak mendorong dengan penerapan fitur itu pada aplikasi spesifik itu tetapi gagasan bahwa institusi dan bank bertanya tentang penerapan teknologi seperti itu dalam aplikasi mereka membuat saya melakukan banyak studi dan penelitian ke dalam topik dan kemudian memulai
Signature Chain proyek.
Saya mengembangkan versi beta yang sudah tayang di Mainnet. Pada saat itu [bahasa pemrograman Waves] Ride belum siap, jadi saya mengembangkannya dengan cara paling sederhana, menggunakan transaksi transfer dengan JSON terlampir. Tetapi tujuan utamanya adalah untuk selalu menghadirkan fitur-fitur yang lebih canggih begitu Ride tersedia. Dan ini adalah alasan utama bagi saya untuk mengambil kursus, karena langkah selanjutnya yang direncanakan untuk proyek ini mengubahnya menjadi aplikasi yang terdesentralisasi (dApp).
Aspek apa saja yang menurut Anda paling mudah dan paling sulit?Aspek yang paling mudah adalah kami memiliki banyak waktu untuk melakukannya, yaitu hanya belajar dan bukannya bersaing untuk menjadi yang terbaik. Itu juga dijelaskan dengan baik, dengan ilustrasi sederhana tetapi eksplisit yang banyak membantu untuk memvisualisasikan dan memahami berbagai topik.
Dalam tantangan, kami terdorong untuk berpikir sendiri dan kadang-kadang melakukan riset, yang merupakan cara terbaik untuk belajar dan mendapatkan pemahaman konsep yang lebih kuat dari sebuah pelajaran.
Beberapa kali, saya tidak memiliki pemahaman yang jelas dari bagian ceramah sampai saya masuk ke kode dan melewati tantangan. Tidak ada 'salin / tempel' yang diizinkan, yang memaksa kami untuk menulis semua kode tantangan, dan itu adalah poin penting lainnya dalam memperkuat pemahaman.
Bagian yang paling sulit adalah bahwa kadang-kadang pertanyaan pilihan ganda di bagian tantangan tidak begitu jelas. Maksud saya, bahasa Inggris saya tidak bagus, dan pertanyaan-pertanyaannya ditulis oleh penutur bahasa Inggris yang bukan penutur asli, sehingga terkadang ada kesenjangan dalam pemahaman.
Mungkin, saya ingin belajar lebih banyak dari bagian oracle dan NFT. Tetapi, bagaimanapun juga, kursus ini terutama bertujuan untuk menghubungkan pengembang, dan Anda pasti perlu menghabiskan waktu bermain-main dengannya dan berlatih nanti untuk benar-benar mendapatkan pemahaman penuh dari setiap aspek dan detail.
Bisakah Anda mendiskusikan secara terperinci solusi yang Anda kerjakan selama kursus - 'Kupon Bazaar'? Bisakah Anda juga memberikan contoh kode?Kami mengerjakan 'Kupon Bazaar', yang pada dasarnya adalah pasar tempat orang membeli dan menjual kupon diskon untuk barang dan jasa dengan harga murah. Setiap kupon diwakili oleh aset digital, yang juga mewakili diskon khusus yang ditawarkan oleh pemasok.

Pekerjaan diperlukan pada beberapa komponen aplikasi. Pertama, itu harus memungkinkan pemasok untuk mendaftar dan mengelola barang-barang mereka (kupon). Kemudian, fitur konfirmasi pembelian perlu dibuat, serta fitur yang memungkinkan pelanggan mencari dan membeli kupon.

Beberapa fitur tambahan juga ditambahkan selama kursus, termasuk sistem pemungutan suara dan fitur untuk verifikasi dan daftar hitam pemasok.
Kami pertama-tama membahas perbedaan antara Aset Cerdas, Akun Cerdas, dan akun dApp, dan dasar-dasar bekerja dengan fungsi verifikasi. Fungsi verifikasi memungkinkan perubahan perilaku default suatu akun. Secara default, mereka memeriksa tanda tangan transaksi, tetapi fungsi verifikasi memungkinkan Anda untuk menetapkan 'aturan' lainnya.
{-# STDLIB_VERSION 3 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M' @Verifier(tx) funcverify() = { matchtx { cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey) cased: DataTransaction=>true case_ =>false } }
Lalu kami mulai menambahkan item. Kami menggunakan salah satu fitur paling penting untuk pengembangan dApp yang memungkinkan semua jenis data direkam ke blockchain sebagai pasangan kunci-nilai, transaksi data. Kami menggabungkannya dengan transaksi baru, invokeScript, yang digunakan untuk memanggil fungsi yang bisa dipanggil ke dApp dari luar.
Salah satu jenis transaksi data yang kami gunakan dalam kursus adalah agar pemasok menambahkan item ke pasar:
letdatajson = { "title": "t-shirt with , vote 1", "coupon_price": 10000000, "old_price": 1000000000, "new_price": 100000000, "address": "Universe", "description": "I want you to make love, not war, i know you've heard it before", "image": "https://bit.ly/2EXTghg" } it('add item', asyncfunction(){ letts = invokeScript({ dApp: dappAddress, call:{ function:"addItem", args:[ { type:"string", value: datajson.title }, { type:"integer", value: datajson.coupon_price }, { type:"string", value: JSON.stringify(datajson) } ]}, payment: [] }, accountSupplierSeed) lettx = awaitbroadcast(ts) awaitwaitForTx(tx.id) })
Untuk memproses transaksi data tersebut melalui fungsi addItem dan kemudian mengembangkan pembelian dan opsi lain, kami melakukan fungsi callable, yang dapat dipanggil oleh pengguna dari luar. Sebagai hasilnya, ia dapat melakukan berbagai tugas, seperti memulai transfer dana, menulis atau memperbarui data dalam penyimpanan data dApp, dll.
Berikut adalah contoh fungsi yang bisa dipanggil. Ini digunakan untuk fungsi addItem:
@Callable(i) funcaddItem(title: String, price: Int, data: String) = { letsupplierAddress = toBase58String(i.caller.bytes) letitem = getKeyItem(supplierAddress, title) if( price <= 0) thenthrow("purchase amount cannot be less than item price") elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist") else{ WriteSet([ DataEntry(getKeyItemSupplier(item), supplierAddress), DataEntry(getKeyItemPrice(item), price), DataEntry(getKeyItemData(item), data) ]) } }
Kami kemudian bekerja pada sistem pemungutan suara untuk memungkinkan pengguna memberikan suara untuk promosi atau penghapusan produk tertentu. Itu menggunakan skema 'Komit-Mengungkapkan' untuk menghindari pengaruh luar selama proses pemungutan suara.
Langkah komit digunakan untuk mengumpulkan suara terenkripsi dengan fungsi hash dan garam.
Langkah mengungkapkan adalah untuk mengumpulkan suara yang didekripsi dan membandingkan hash mereka.
Berikut adalah contoh fungsi yang bisa dipanggil yang digunakan untuk fitur ini:
@Callable(i) funcvoteCommit(item: String, hash: String) = { letuser = toBase58String(i.caller.bytes) letcommits = getValueCommitsCount(item) letstatus = getValueItemStatus(item) if( commits >=VOTERS) thenthrow("reached max num of voters") elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated") elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist") elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible") else{ WriteSet([ DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), commits +1), DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING) ]) } }
Apa lagi yang Anda pelajari dari kursus?Kursus ini juga menyentuh tokenation dan non-fungible token (NFTs) - token yang mewakili sesuatu yang unik dan karenanya tidak dapat dipertukarkan.
Kelas terakhir berfokus pada penggunaan nubuat. Karena blockchain tidak dapat mengakses data dari dunia luar, kita perlu menggunakan ramalan yang mengirim data dunia nyata ke blockchain.
Dalam lingkup pasar kami, kami menggunakan oracle untuk memverifikasi dan, jika perlu, daftar hitam pemasok yang, misalnya, tidak menerima kupon yang sebelumnya dijual.
Berikut ini contoh kode:
funcgetExtValueItemWhiteListStatus(item:String) = { item +"_verifier_status" } letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv" letVERIFIED = "verified" letBLACKLISTED = "blacklist" @Callable(i) funcsetstatus(supplier: String, status: String) = { letaccount = toBase58String(i.caller.bytes) if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist") elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status") else{ WriteSet([ DataEntry(getExtValueItemWhiteListStatus(supplier), status) ]) } }
Bagian mana dari kursus yang menurut Anda paling berguna?Bagian yang paling berguna adalah tantangan. Mereka membuat kuliah menjadi lebih jelas dan memperkuat pengetahuan saya yang baru diperoleh melalui coba-coba. Berlatih dengan
IDE ,
penjelajah dan
oracle sangat berguna.
Bagaimana Anda berencana untuk menggunakan apa yang Anda pelajari dari kursus?Sejak awal, kursus ini seharusnya membantu membawa proyek saya ke tingkat selanjutnya. Jadi, idenya adalah sekarang untuk menulis ulang
sign-web.app di Ride. Versi saat ini sudah menawarkan fitur yang berfungsi untuk sertifikasi dokumen, tetapi pasti akan ditingkatkan dengan versi Ride di masa depan. Ini akan memungkinkan lebih banyak fleksibilitas dan kejelasan dan lebih banyak fitur, termasuk sertifikasi email, perjanjian multi-pihak, dll.
Kursus ini juga sangat membuka pikiran, dan banyak ide mulai muncul di kepala saya. Saya yakin akan ada lebih banyak lagi di masa depan.