Cadence – How to build dApps on Flow – EDY SUSANTO

Cadence – How to build dApps on Flow

Blockchain

Di level ini, kita akan belajar tentang Cadence, bahasa pemrograman smart contract yang dibuat dan digunakan oleh Flow. Seperti yang telah kami sebutkan, Cadence adalah bahasa pemrograman yang berorientasi pada sumber daya, jadi ada sedikit kurva pembelajaran. Sintaksnya seperti campuran antara Golang dan Javascript.

Sebelum kita membahasnya, mari kita pahami sedikit tentang cara kerja Flow.

Transactions and Scripts

Transaksi di Flow tidak jauh berbeda dengan transaksi di blockchain mana pun. Mereka adalah pemanggilan fungsi yang memerlukan biaya, dan merupakan satu-satunya cara untuk ‘menulis’ data pada blockchain.

Skrip, di sisi lain, adalah panggilan fungsi yang tidak memerlukan biaya. Mereka seperti fungsi view dalam Solidity.

Hal utama yang perlu diingat dalam Flow adalah bahwa baik Transaksi maupun Skrip ditulis dalam Cadence, dan kemudian dieksekusi melalui Wallet. Kode Cadence-lah yang menentukan apa yang akan dilakukan oleh sebuah transaksi/skrip, kontrak apa yang akan berinteraksi dengannya, nilai apa yang akan dikembalikannya, dll.

Untuk memulai pengujian, Flow menawarkan sebuah taman bermain online di mana Anda dapat menguji kode Anda. Cara kerjanya agak mirip dengan Remix dengan Javascript VM pada rantai EVM.

Untuk saat ini, kami akan melakukan semua pengembangan di Flow Playground. Bukalah dengan mengklik di sini.

Anda akan melihat tampilan seperti ini.

Di sebelah kiri, Anda dapat melihat 5 akun (0x01 hingga 0x05). Akun-akun ini jelas merupakan akun palsu, tetapi diberikan untuk digunakan oleh taman bermain Flow untuk menguji smart contract dengan banyak pihak yang terlibat. Selain itu, karena smart contract disebarkan ke alamat, dalam kasus taman bermain Flow, kita bisa menyebarkannya ke salah satu dari lima alamat yang diberikan – yang membuat pengujian lebih mudah.

Tepat di bawahnya, kita juga memiliki opsi untuk membuat Transaksi baru dan Skrip baru, yaitu menulis kode Irama untuk mereka. Kita akan kembali ke hal ini.

Dan tepat di tengah-tengah kita melihat bahwa kita mendapatkan opsi untuk menyesuaikan detail proyek kita. Kita akan melewatkan ini untuk saat ini.

Cadence Code

Klik pada akun 0x01 di bilah sisi untuk menulis kode untuk akun tersebut. Anda akan melihat bahwa sudah ada beberapa kode dasar hello world di sana, sebuah smart contract sederhana yang sudah ada.

Mari kita analisis apa yang dilakukan kode ini, dan pelajari sintaks Cadence.

-access(all) contract HelloWorld {

// Declare a public field of type String.
// All fields must be initialized in the init() function.

access(all) let greeting: String

// The init() function is required if the contract contains any fields.
init() {
self.greeting = "Hello, World!"
}

// Public function that returns our friendly greeting!

access(all) fun hello(): String {
return self.greeting
}

}
The Contract Block
Hal pertama yang perlu diperhatikan adalah bagaimana semua kode smart contract dibungkus di dalam blok kontrak.
access(all) contract HelloWorld {
// ...
}

Pada versi Cadence yang lebih baru, Anda dapat mengganti access(all) dengan pub yang merupakan singkatan yang memiliki arti yang sama, yaitu “akses publik” atau “akses untuk semua”. Kita akan mengikuti konvensi pub saat kita melanjutkan.

Kontrak pub ContractName akan selalu diperlukan, apa pun smart contract yang Anda tulis.

The Variable Declarations
// Declare a public field of type String.
// All fields must be initialized in the init() function.

access(all) let greeting: String

Baris ini di sini mendeklarasikan sebuah variabel publik, bernama greeting, dengan tipe String. Mirip dengan blok kontrak, kita dapat mengganti access(all) dengan pub jika kita ingin, dan kita akan melakukannya karena lebih mudah dibaca dan dimengerti.

The Initializer
// The init() function is required if the contract contains any fields.
init() {
self.greeting = "Hello, World!"
}

Setiap smart contract Cadence, jika memiliki variabel sama sekali, HARUS berisi fungsi init() karena itulah cara Anda menetapkan nilai awal untuk variabel apa pun yang Anda miliki. Tidak seperti Solidity, Anda tidak dapat menetapkan nilai awal secara langsung di sebelah deklarasi variabel.

Dalam kasus ini, kita akan mengatur nilai awal dari variabel greeting.

Ini mirip dengan konstruktor, karena hanya dijalankan sekali ketika kontrak pertama kali digunakan.

The Functions
// Public function that returns our friendly greeting!

access(all) fun hello(): String {
return self.greeting
}

Ini adalah fungsi yang sangat sederhana, sebuah fungsi publik bernama hello yang mengembalikan sebuah String. Fungsi ini hanya mengembalikan self.greeting, yang merupakan variabel greeting yang telah dideklarasikan di atas. Jika kita memanggil fungsi ini, kita akan mendapatkan “Halo, World!” karena kita tidak mengubah nilai variabel tersebut.

Deploying

Untuk menggunakan smart contract kita di taman bermain Flow, cukup klik tombol Deploy berwarna hijau mengkilap di kanan atas.

Setelah kontrak digunakan, Anda akan melihat beberapa log di konsol di bagian bawah halaman, dan juga melihat bahwa akun 0x01 sekarang memiliki nama yang dilampirkan – ini adalah nama kontrak. Dalam kasus kita, namanya adalah HelloWorld.

Scripting

Sekarang, jika kita ingin membaca nilai dari variabel salam, kita akan menulis skrip Cadence untuk melakukan hal tersebut.

Di bilah sisi kiri, klik Script di bawah Script Templates. Seharusnya ada beberapa kode yang sudah ada sebelumnya, hanya sebuah fungsi yang mengembalikan nilai 1, mari kita singkirkan.

CATATAN: Skrip bukanlah smart contract, jadi kode dalam skrip tidak perlu dilampirkan dalam blok ContractName { … } blok.

Importing the Smart Contract
Untuk mereferensikan kontrak HelloWorld yang telah digunakan, kita perlu memuat kontrak tersebut ke dalam skrip. Di Cadence, kita mengimpor kontrak dengan melakukan

import ContractName from Address

Oleh karena itu, dalam kasus kita, tambahkan baris berikut ini ke skrip:

import HelloWorld from 0x01
Writing the main script

Kode “main ” dalam skrip berada di dalam fungsi main. Anggap saja ini seperti titik masuk untuk skrip Anda.

Kita akan membuat fungsi utama publik, yang mengembalikan nilai bertipe String – karena kita ingin mengembalikan nilai dari variabel salam.

Tambahkan kode berikut ke dalam skrip Anda.

pub fun main(): String {
return HelloWorld.greeting
}

Executing our Script

Setelah ini selesai, klik tombol hijau Execute di kanan atas, dan Anda akan melihat beberapa output di konsol Anda di bagian bawah yang terlihat seperti ini:

10:38:46 Script -> Result -> {"type":"String","value":"Hello, World!"}

Luar biasa! Kita telah berhasil membaca nilai dari variabel salam

Calling Functions

Pada kode di atas, kita mengakses variabel secara langsung, dan kita dapat melakukannya karena variabel tersebut ditandai sebagai variabel pub.

Namun, kita juga bisa saja memanggil fungsi hello(), karena fungsi ini juga mengembalikan nilai variabel.

Mari kita edit skrip kita dengan cepat agar fungsi utamanya menjadi sebagai berikut:

pub fun main(): String {
return HelloWorld.hello()
}

Transactions

Sekarang, mari kita lihat bagaimana sebuah transaksi akan bekerja. Tetapi pertama-tama, kita perlu memperbarui kontrak pintar kita sehingga kita memiliki sesuatu untuk melakukan transaksi.

Adding a function that writes data
Klik pada 0x01 untuk kembali, dan tambahkan fungsi baru dalam kode smart contract.

pub fun setGreeting(newGreeting: String) {
self.greeting = newGreeting;
log("Greeting updated!")
}

Namun demikian, apabila Anda melakukan hal ini, Anda akan segera dihadapkan pada suatu kesalahan.

cannot assign to constant member: `greeting`

Ini karena kita mendeklarasikan variabel kita dengan let. Hal ini akan membingungkan bagi para pengembang Javascript, karena let dalam Javascript berarti variabel yang dapat diubah dari waktu ke waktu, dan const berarti variabel yang tidak dapat diubah.

Namun, dalam Cadence, let adalah variabel yang tidak dapat diubah, dan var adalah variabel yang dapat diubah. Ingatlah kebiasaan ini saat Anda melangkah maju.

Mari kita perbarui deklarasi variabel salam kita menjadi sebagai berikut:

– access(all) let greeting: String
+ pub var greeting: String

Kami juga mengubah akses (semua) ke pub saat kami melakukannya, tetapi itu tidak ada hubungannya dengan let atau var.

Hal keren lainnya yang perlu diperhatikan di sini adalah kita menambahkan log. Log adalah seperti console.log di Javascript. Log ini sudah ada di dalam Cadence, dan memungkinkan Anda untuk mencetak pernyataan di konsol selama eksekusi fungsi. Kita akan segera melihat hasilnya.

Setelah Anda melakukan ini, Anda akan melihat kesalahan secara ajaib hilang. Lanjutkan dan terapkan kembali kontrak yang telah dimodifikasi ke akun 0x01 lagi, lalu lanjutkan.
Understanding a Transaction

Pada sidebar sebelah kiri, klik Transaction di bawah Transaction Templates. Anda akan melihat beberapa kode boilerplate di sana yang terlihat seperti ini

import HelloWorld from 0x01

transaction {
prepare(acct: AuthAccount) {}

execute {
log(HelloWorld.hello())
}
}

Apa ini? Pernyataan impor baik-baik saja, tetapi yang lainnya adalah baru.

Ingatlah bahwa di Flow, akun dapat menyimpan datanya sendiri. Yang saya maksud dengan ini adalah Anda memiliki NFT, Anda dapat menyimpan data NFT langsung di akun. Sebaliknya, di Ethereum, data NFT disimpan di dalam smart contract NFT, bersama dengan pemetaan yang berisi alamat mana yang memiliki ID token mana. Berbeda dengan Flow, data benar-benar disimpan langsung di dalam akun, bukan di dalam kontrak. Setiap akun memiliki penyimpanannya sendiri.

Jadi, jika dalam sebuah transaksi Anda perlu mengakses data apa pun yang tersimpan di dalam akun itu sendiri, kita membutuhkan akses ke penyimpanan akun tersebut.

Untuk inilah pernyataan persiapan digunakan. Ini memberi kita akses ke variabel acct, dengan tipe AuthAccount, yang memberi kita akses ke penyimpanan penandatangan transaksi ini. Selama fase prepare, transaksi akan mengakses penyimpanan akun dan membuat referensi ke data tersebut jika diperlukan nantinya.

Pada fase execute, kita tidak secara langsung memiliki akses ke penyimpanan akun. Fase ini digunakan untuk memanggil fungsi-fungsi pada smart contract dan semacamnya.

Updating the Greeting

Kita belum sampai pada tahap mempelajari tentang penyimpanan akun di Cadence, dan kontrak HelloWorld jelas tidak menyimpan apa pun dalam akun pengguna. Jadi, fase persiapan kita dapat dibiarkan kosong.

Perbarui kode Transaksi Anda menjadi sebagai berikut:

import HelloWorld from 0x01

transaction(newGreeting: String) {

prepare(signer: AuthAccount) {}

execute {
HelloWorld.setGreeting(newGreeting: newGreeting)
}

}

Hal pertama yang harus diperhatikan adalah bahwa transaksi ini menerima sebuah argumen – newGreeting. Ini berarti penanda tangan transaksi perlu menyediakan beberapa data agar transaksi ini dapat berjalan.

Fase persiapan kita kosong karena kita tidak membutuhkan apa pun dari penyimpanan akun.

Pada fase eksekusi, kita memanggil fungsi setGreeting pada smart contract.

Anda akan melihat sesuatu seperti ini muncul di Playground

NOTE : If there are any errors, save the playground by clicking on the Green Save button on the top right and refresh your page. Alternatively, you can ask for help in our Discord server

Perhatikan bahwa untuk mengirim transaksi, Anda perlu memberikan nilai untuk newGreeting. Selain itu, Anda dapat melakukan transaksi sebagai salah satu dari lima akun yang diberikan taman bermain. Secara default, Anda pasti memilih 0x01, tetapi Anda dapat melanjutkan dan beralih ke Penandatangan yang berbeda jika Anda mau.

Karena kita tidak mengakses data apa pun dalam penyimpanan akun, tidak masalah akun mana yang kita pilih. Tentunya, jika ini berada di mainnet dan bukan di taman bermain, akun yang kita pilih harus membayar biaya transaksi – jadi gunakan akun yang memiliki token FLOW.

Saya akan memasukkan salam baru, pilih 0x03, lalu klik Kirim.

Di konsol Anda, Anda akan melihat log yang kita tambahkan di fungsi setGreeting. Seperti berikut ini

"Greeting updated!"

Reading the Greeting

Untuk memverifikasi bahwa nilainya benar-benar telah diperbarui, kembali ke skrip Anda, dan jalankan.

Jika Anda melihat sesuatu seperti ini di konsol (tentu saja, dengan sapaan yang berbeda), Anda siap untuk melanjutkan!

{"type":"String","value":"Are you learning from LearnWeb3, anon?"}

Sampai berjumpa di sesi selanjutnya masih di Flow Blockchain..

Related Posts