Solusi: Membuat Kalkulator di Sui
Saya harap kamu sudah menyelesaikan solusinya, tetapi mari kita bahas solusinya dan sekalian mendeploy-nya di Sui.
Kode lengkap
Kode lengkap untuk Kalkulator adalah:
module calculator::calculator{
public struct Output has key, store{
id: UID,
result: u64,
}
entry fun start (ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: 0,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
entry fun add (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a + b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
entry fun sub (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a - b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
entry fun mul (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a * b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
entry fun div (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a / b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
}
Penjelasan
Mari kita telusuri kodenya:
public struct Output has key, store{
id: UID,
result: u64,
}
Mendefinisikan struct:
- Kita mendefinisikan struct bernama
Outputmenggunakan kata kuncistruct. - Struct ini memiliki dua field:
id: Pengenal unik (UID) untuk setiap instance objekOutput.result: Field ini menyimpan bilangan bulat tak bertanda 64-bit (u64) yang mewakili hasil perhitungan.
entry fun start (ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: 0,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
Mendefinisikan fungsi start:
- Kita membuat fungsi entri publik bernama
startyang menerima referensi mutable keTxContextsebagai argumen. - Di dalam fungsi
start:- Kita membuat objek
Outputbaru bernamaoutputmenggunakanlet output = Output { id: object::new(ctx), result: 0 }; - Kita set field
iddari objekoutputke pengenal unik yang dihasilkan denganobject::new(ctx). - Kita inisialisasi field
resultmenjadi 0, seolah-olah kita memulai kalkulator dari nol. - Terakhir, kita menggunakan
transfer::public_transferuntuk mentransfer objekoutputkepada seseorang, dengan menentukan pengirim sebagaitx_context::sender(ctx).
- Kita membuat objek
entry fun add (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a + b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
Mendefinisikan fungsi add:
- Ini adalah fungsi entri publik bernama
add. - Fungsi ini menerima dua bilangan bulat tak bertanda 64-bit (
adanb) sebagai input dan referensi mutable keTxContext(ctx) untuk menangani konteks transaksi. - Tujuan: Fungsi ini dimaksudkan untuk menjumlahkan dua angka dan menyimpan hasilnya dalam objek
Output.
Di dalam fungsi:
let output = Output { id: object::new(ctx), result: a + b };- Kita membuat objek
Outputbaru bernamaoutput. - Kita memberikan pengenal unik (UID) ke objek
outputmenggunakanobject::new(ctx). - Kita menghitung jumlah
adanblalu menyimpannya di fieldresultdari objekoutput.
- Kita membuat objek
transfer::public_transfer(output, tx_context::sender(ctx));- Kita mentransfer objek
outputkepada seseorang, dengan menentukan pengirim sebagaitx_context::sender(ctx).
- Kita mentransfer objek
entry fun sub (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a - b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
Mendefinisikan fungsi sub:
- Ini adalah fungsi entri publik bernama
sub. - Fungsi ini menerima dua bilangan bulat tak bertanda 64-bit (
adanb) sebagai input dan referensi mutable keTxContext(ctx) untuk menangani konteks transaksi. - Tujuan: Fungsi ini dimaksudkan untuk mengurangkan dua angka dan menyimpan hasilnya dalam objek
Output.
Di dalam fungsi:
let output = Output { id: object::new(ctx), result: a + b };- Kita membuat objek
Outputbaru bernamaoutput. - Kita memberikan pengenal unik (UID) ke objek
outputmenggunakanobject::new(ctx). - Kita menghitung pengurangan dengan mengurangkan
bdariadan menyimpannya di fieldresultdari objekoutput.
- Kita membuat objek
- Terakhir, kita mentransfer objek
outputkepada seseorang, dengan menentukan pengirim menggunakantx_context::sender(ctx).
entry fun mul (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a * b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
Mendefinisikan fungsi mul:
- Ini adalah fungsi
mul, yang menangani perkalian. - Fungsi ini menerima dua bilangan bulat tak bertanda 64-bit,
adanb, serta konteks transaksictx.
Di dalam fungsi:
- Kita membuat objek
Outputbaru. - Kita menghitung hasil dengan mengalikan
adanb. - Objek
outputmenyimpan hasil ini. - Kita mentransfer objek
output, dengan menentukan pengirim menggunakantx_context::sender(ctx).
entry fun div (a:u64, b:u64, ctx: &mut TxContext){
let output = Output{
id: object::new(ctx),
result: a / b,
};
transfer::public_transfer(output, tx_context::sender(ctx));
}
Mendefinisikan fungsi div:
- Fungsi
divini menangani pembagian. - Fungsi ini menerima dua bilangan bulat tak bertanda 64-bit,
adanb, serta konteks transaksictx.
Di dalam fungsi:
- Kita membuat objek
Outputbaru. - Kita menghitung hasil dengan membagi
adenganb. - Objek
outputmenyimpan hasil ini. - Kita mentransfer objek
output, dengan menentukan pengirim menggunakantx_context::sender(ctx).
Kode ini mendefinisikan program kalkulator dengan struct Output untuk menyimpan hasil dan berbagai operasi aritmetika (penjumlahan, pengurangan, perkalian, dan pembagian) sebagai fungsi entri publik. Setiap fungsi membuat objek Output dengan hasil perhitungan dan mentransfernya menggunakan transfer.
Mendeploy kontrak
Ganti [YOUR_ADDRESS] pada perintah berikut dengan alamat akunmu lalu jalankan:
sui client switch --address [YOUR_ADDRESS]
- Pastikan kamu punya gas yang cukup. Jika belum, buka channel faucet Sui Testnet di Discord dan tempel “!faucet [YOUR_ADDRESS]” untuk menerima 1 token SUI.
Jalankan perintah berikut agar kita bisa deploy di Sui devnet:
sui client switch --env devnet
Untuk memublikasikan kontrak, salin path absolut file Hello.move-mu. Ganti [YOUR_PATH] dengan path absolut file tersebut dan jalankan perintah berikut:
sui client publish --gas-budget 10000000 [YOUR_PATH]
Kita akan mendapat keluaran yang panjang, tetapi gulir ke awal output dan salin Transaction Digest. Buka Sui Explorer. Tempel Transaction Digest di bilah pencarian untuk menemukan transaksi kamu di Sui Explorer.
Sekarang klik alamat paket dari modul kalkulator:

Kamu akan melihat semua fungsi seperti di bawah ini:
.webp?raw=true)
Sekarang silakan berinteraksi dengan fungsi-fungsinya dan selamat mencoba~
Selesai
Dalam pelajaran ini, kita belajar cara membuat kontrak Kalkulator menggunakan Move. Kita membahas struktur kode dan tujuan setiap fungsi. Kita juga memberikan instruksi untuk mendeploy kontrak di Sui Devnet. Silakan eksplor dan berinteraksi dengan fungsi-fungsi dalam kontrak. Selamat ngoding!