Gas dan Biaya Transaksi
Untuk dieksekusi di blockchain Aptos, transaksi harus membayar biaya yang dinyatakan dalam satuan gas dan unit gas Aptos (AGU). Konsep ini mirip dengan yang ditemukan di blockchain lainnya.
Gas adalah cara untuk mengukur komputasi dan itu:
- Melindungi jaringan dari denial-of-service (DoS) dengan mewajibkan biaya untuk transaksi
- Memberi prioritas transaksi dengan memungkinkan pengguna membayar lebih untuk eksekusi yang lebih cepat
- Mengompensasi validator untuk menjalankan transaksi dan memelihara jaringan
Komponen Biaya
Section titled “Komponen Biaya”Unit Gas
Section titled “Unit Gas”Unit gas mengukur komputasi yang dikonsumsi oleh transaksi. Operasi yang berbeda mengonsumsi unit gas yang berbeda:
- Instruksi Move: Setiap instruksi dalam bytecode Move memiliki biaya gas
- Akses memori: Membaca dan menulis ke memori mengonsumsi gas
- Operasi I/O: Interaksi dengan storage mengonsumsi gas
- Verifikasi kriptografi: Verifikasi tanda tangan mengonsumsi gas
Harga Unit Gas
Section titled “Harga Unit Gas”Harga unit gas adalah biaya dalam APT (Octas) per unit gas. Ini ditentukan oleh:
- Permintaan jaringan: Harga meningkat saat jaringan sibuk
- Prioritas transaksi: Pengguna dapat membayar lebih untuk prioritas lebih tinggi
- Base fee: Biaya minimum yang ditetapkan oleh jaringan
Biaya Storage
Section titled “Biaya Storage”Selain gas komputasi, Aptos juga memiliki biaya storage untuk menyimpan data di blockchain:
- Per byte storage: Biaya untuk setiap byte data yang disimpan
- Storage refund: Pengembalian parsial saat data dihapus
- State bloat prevention: Mencegah pertumbuhan state yang tidak terkendali
Cara Kerja Gas
Section titled “Cara Kerja Gas”Estimasi Gas
Section titled “Estimasi Gas”Sebelum mengirim transaksi, Anda dapat mengestimasi konsumsi gas:
import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk";
const config = new AptosConfig({ network: Network.DEVNET });const aptos = new Aptos(config);
// Estimasi gas untuk transaksiconst transaction = await aptos.transaction.build.simple({ sender: senderAddress, data: { function: "0x1::coin::transfer", typeArguments: ["0x1::aptos_coin::AptosCoin"], functionArguments: [receiverAddress, amount] }});
// Simulasi untuk mendapatkan estimasi gasconst simulation = await aptos.transaction.simulate.simple({ signerPublicKey: signer.publicKey, transaction});
console.log("Gas used:", simulation[0].gas_used);console.log("Gas unit price:", simulation[0].gas_unit_price);
Setting Gas Parameters
Section titled “Setting Gas Parameters”Saat membangun transaksi, Anda dapat mengatur parameter gas:
const transaction = await aptos.transaction.build.simple({ sender: senderAddress, data: { function: "0x1::coin::transfer", typeArguments: ["0x1::aptos_coin::AptosCoin"], functionArguments: [receiverAddress, amount] }, options: { gasUnitPrice: 100, // Harga per unit gas dalam Octas maxGasAmount: 2000 // Maksimum gas yang bersedia dibayar }});
Gas Limit dan Prioritas
Section titled “Gas Limit dan Prioritas”- Gas Limit: Maksimum gas yang bersedia Anda bayar
- Gas Price: Harga per unit gas untuk memprioritaskan transaksi
- Estimasi yang akurat: Penting untuk menghindari transaksi yang gagal
Optimisasi Gas
Section titled “Optimisasi Gas”Teknik Optimisasi
Section titled “Teknik Optimisasi”- Batch operations: Gabungkan beberapa operasi dalam satu transaksi
- Efficient storage: Minimalisir penggunaan storage on-chain
- Smart contract optimization: Tulis kode Move yang efisien
- Resource management: Kelola resource dengan efisien
Contoh Optimisasi
Section titled “Contoh Optimisasi”// Tidak efisien: Multiple storage operationspublic fun inefficient_update(account: &signer, values: vector<u64>) { let i = 0; while (i < vector::length(&values)) { // Setiap loop melakukan storage operation terpisah update_single_value(account, i, *vector::borrow(&values, i)); i = i + 1; }}
// Efisien: Batch storage operationpublic fun efficient_update(account: &signer, values: vector<u64>) { // Satu storage operation untuk semua values move_to(account, BatchValues { values });}
Storage Fee Management
Section titled “Storage Fee Management”module my_addr::storage_efficient { // Struktur yang mengoptimalkan storage struct OptimizedData has key, store { // Gunakan vector untuk data yang serupa values: vector<u64>, // Pack boolean values ke dalam u8 flags: u8, // Gunakan Option untuk field opsional optional_data: Option<String> }
public fun store_efficiently(account: &signer, data: OptimizedData) { move_to(account, data); }}
Gas di Berbagai Operasi
Section titled “Gas di Berbagai Operasi”Transfer Coin
Section titled “Transfer Coin”// Transfer APT - konsumsi gas rendahconst transferTx = await aptos.transaction.build.simple({ sender: sender.accountAddress, data: { function: "0x1::coin::transfer", typeArguments: ["0x1::aptos_coin::AptosCoin"], functionArguments: [receiver, amount] }});// Biasanya ~500-800 gas units
Smart Contract Deployment
Section titled “Smart Contract Deployment”// Deploy module - konsumsi gas tinggiconst deployTx = await aptos.transaction.build.simple({ sender: sender.accountAddress, data: { bytecode: compiledModule, abi: moduleAbi }});// Biasanya 10,000+ gas units tergantung ukuran module
Complex Operations
Section titled “Complex Operations”// Operasi kompleks yang mengonsumsi lebih banyak gaspublic fun complex_operation(account: &signer) { // Multiple storage reads/writes let data1 = borrow_global<Data1>(@user); let data2 = borrow_global<Data2>(@user);
// Complex computation let result = expensive_computation(data1, data2);
// Multiple storage updates move_to(account, Result { value: result });}
Monitoring dan Debugging
Section titled “Monitoring dan Debugging”Gas Profiling
Section titled “Gas Profiling”// Profiling gas usageconst simulation = await aptos.transaction.simulate.simple({ signerPublicKey: signer.publicKey, transaction});
console.log("Transaction result:", simulation[0]);console.log("Gas used:", simulation[0].gas_used);console.log("Success:", simulation[0].success);
if (!simulation[0].success) { console.log("Error:", simulation[0].vm_status);}
Gas Analytics
Section titled “Gas Analytics”// Analisis penggunaan gas dari transaksi yang sudah dieksekusiconst txnResult = await aptos.getTransactionByHash({ transactionHash: "0x..."});
if ('gas_used' in txnResult) { console.log("Gas used:", txnResult.gas_used); console.log("Gas unit price:", txnResult.gas_unit_price); console.log("Total cost:", BigInt(txnResult.gas_used) * BigInt(txnResult.gas_unit_price) );}
Best Practices
Section titled “Best Practices”Untuk Developers
Section titled “Untuk Developers”- Selalu simulasikan transaksi sebelum submit
- Set gas limit yang wajar - tidak terlalu rendah atau tinggi
- Monitor gas consumption dalam testing
- Optimisasi smart contract untuk efisiensi gas
- Gunakan batch operations untuk operasi multiple
Untuk Users
Section titled “Untuk Users”- Gunakan estimasi gas yang disediakan wallet
- Adjust gas price berdasarkan urgency
- Monitor network congestion untuk timing optimal
- Understand tradeoffs antara speed dan cost
Troubleshooting
Section titled “Troubleshooting”Common Issues
Section titled “Common Issues”- Insufficient gas: Tingkatkan gas limit
- Gas price too low: Tingkatkan gas unit price
- Out of gas: Optimisasi kode atau tingkatkan limit
- Transaction failed: Periksa error message dan logic
Gas dan biaya transaksi adalah komponen penting dari ekonomi Aptos yang memastikan keamanan jaringan, efisiensi operasi, dan insentif yang tepat untuk semua partisipan.