Derinlemesine Move Pratik Rehberi: Kripto Para Platformu Oluşturma, Testler, Hata Analizi ve Optimizasyon
Derinlemesine Move Pratik Rehberi
-----
Kripto Para Platformu Oluşturma, Testler,
Hata Analizi ve Optimizasyon
Bu makalede, Move programlama dili kullanarak tam işlevsel bir
kripto para platformu oluşturacağız — mimariden koda, testlerden hata
ayıklamaya ve optimizasyona kadar. İçerik profesyonellere yönelik hazırlanmış
olup, yeni başlayanların da ilgisini çekecek şekilde sade ve detaylıdır. Hazır
şablonlar, kapsamlı yorumlar ve uygulama önerileri sunulmaktadır.
Giriş:
Neden Move Kripto Para Platformları İçin İdeal?
Move,
dijital varlıkların güvenli yönetimi için tasarlanmış, kaynak odaklı
programlama modeli ile birçok kritik hatayı önleyen bir dildir. Aptos, Sui gibi
modern blokzincirlerde kullanılması, onu kripto para platformları için mükemmel
bir tercih yapmaktadır.
Makale İçeriği
1.
Proje mimarisi ve yapısı
2.
Token modülünün geliştirilmesi
3.
Gelişmiş fonksiyonlar: işlemler, olaylar,
yönetim
4.
Kapsamlı test senaryoları
5.
Yaygın hatalar ve çözümleri
6.
Optimizasyon ve iyi uygulamalar
7.
Derleme, test ve dağıtım adımları
1. Proje Mimarisi ve Yapısı
Mimari
- Token Modülü: Bakiye yönetimi, token basımı,
yakımı
- Ledger Modülü: İşlem geçmişi ve olaylar
- Governance Modülü: Platform yönetimi ve yetki
kontrolü
Dizin
Yapısı
CryptoPlatform/
├──
Move.toml
├──
sources/
│ ├── Token.move
│ ├── Ledger.move
│ └── Governance.move
└── tests/
└──
CryptoPlatformTest.move
2. Token
Modülünün Geliştirilmesi
Dosya: sources/Token.move
module
Token {
use std::signer;
use std::event;
struct TransferEvent has copy, drop, store
{
from: address,
to: address,
amount: u64,
timestamp: u64,
}
resource struct Balance has key {
value: u64,
}
struct EventHolder has key {
transfer_events:
event::EventHandle<TransferEvent>,
}
public fun initialize(account: &signer,
initial_supply: u64) {
let addr = signer::address_of(account);
assert!(!exists<Balance>(addr),
1);
move_to(account, Balance { value:
initial_supply });
let event_handle =
event::new_event_handle<TransferEvent>(account);
move_to(account, EventHolder {
transfer_events: event_handle });
}
public fun balance(account: address): u64
acquires Balance {
if (!exists<Balance>(account)) {
0
} else {
borrow_global<Balance>(account).value
}
}
fun emit_transfer_event(sender:
&signer, from: address, to: address, amount: u64) acquires EventHolder {
let holder =
borrow_global_mut<EventHolder>(signer::address_of(sender));
let timestamp =
Timestamp::now_seconds();
event::emit_event(&mut
holder.transfer_events, TransferEvent { from, to, amount, timestamp });
}
public fun transfer(sender: &signer,
recipient: address, amount: u64) acquires Balance, EventHolder {
let sender_addr =
signer::address_of(sender);
let sender_balance =
borrow_global_mut<Balance>(sender_addr);
assert!(sender_balance.value >=
amount, 2);
sender_balance.value =
sender_balance.value - amount;
if (exists<Balance>(recipient)) {
let recipient_balance =
borrow_global_mut<Balance>(recipient);
recipient_balance.value =
recipient_balance.value + amount;
} else {
move_to(&signer::borrow_address(recipient), Balance { value: amount
});
}
emit_transfer_event(sender,
sender_addr, recipient, amount);
}
public fun mint(admin: &signer,
recipient: address, amount: u64) acquires Balance {
assert!(signer::address_of(admin) ==
@0x1, 3);
if (exists<Balance>(recipient)) {
let recipient_balance =
borrow_global_mut<Balance>(recipient);
recipient_balance.value =
recipient_balance.value + amount;
} else {
move_to(&signer::borrow_address(recipient), Balance { value: amount
});
}
}
public fun burn(account: &signer,
amount: u64) acquires Balance {
let addr = signer::address_of(account);
let balance =
borrow_global_mut<Balance>(addr);
assert!(balance.value >= amount, 4);
balance.value = balance.value - amount;
}
}
3.
Gelişmiş Fonksiyonlar: Ledger Modülü
Dosya: sources/Ledger.move
module
Ledger {
use std::signer;
use std::vector;
struct TransactionRecord has copy, drop,
store {
from: address,
to: address,
amount: u64,
timestamp: u64,
}
resource struct Ledger has key {
transactions:
vector<TransactionRecord>,
}
public fun initialize(account: &signer)
{
let addr = signer::address_of(account);
assert!(!exists<Ledger>(addr),
1);
move_to(account, Ledger { transactions:
vector::empty<TransactionRecord>() });
}
public fun add_transaction(account:
&signer, from: address, to: address, amount: u64, timestamp: u64) acquires
Ledger {
let ledger =
borrow_global_mut<Ledger>(signer::address_of(account));
let record = TransactionRecord { from,
to, amount, timestamp };
vector::push_back(&mut
ledger.transactions, record);
}
public fun get_transactions(account:
address): vector<TransactionRecord> acquires Ledger {
if (!exists<Ledger>(account)) {
vector::empty<TransactionRecord>()
} else {
borrow_global<Ledger>(account).transactions
}
}
}
4.
Kapsamlı Test Senaryoları
Dosya: tests/CryptoPlatformTest.move
script {
use Token;
use Ledger;
fun test_full_flow(admin: &signer,
user1: &signer, user2: address) {
Token::initialize(admin, 10000);
Ledger::initialize(admin);
Token::initialize(user1, 5000);
Ledger::initialize(user1);
Token::transfer(user1, user2, 1000);
Ledger::add_transaction(user1,
signer::address_of(user1), user2, 1000, Timestamp::now_seconds());
let bal1 =
Token::balance(signer::address_of(user1));
let bal2 = Token::balance(user2);
assert!(bal1 == 4000, 100);
assert!(bal2 == 1000, 101);
Token::mint(admin, user2, 2000);
let bal2_new = Token::balance(user2);
assert!(bal2_new == 3000, 102);
Token::burn(user1, 500);
let bal1_after_burn =
Token::balance(signer::address_of(user1));
assert!(bal1_after_burn == 3500,
103);
}
}
5. Yaygın Hatalar ve Çözümleri
|
Hata Kodu |
Sebep |
Çözüm |
|
1 |
Kaynak zaten mevcut |
Kaynak var mı kontrolü yapmadan initialize yapmayın |
|
2 |
Yetersiz bakiye |
Transfer öncesi bakiye kontrolü yapın |
|
3 |
Yetkisiz mint işlemi |
Admin adresi kontrolü yapın |
|
4 |
Yetersiz bakiye yakma işlemi için |
Yakma öncesi bakiye kontrolü yapın |
6. Optimizasyon ve İyi Uygulamalar
- Fonksiyonlarda acquires kullanarak
kaynak erişimini açıkça belirtin.
- Kaynakları
gereksiz değiştirmekten kaçının.
- assert! ifadelerinde anlamlı
hata kodları kullanın.
- Modüler yapıyı tercih ederek
kodun bakımını kolaylaştırın.
- Tüm önemli senaryoları
testlerle kapsayın.
- Olaylar (events) ile işlemleri
şeffaf tutun.
7.
Derleme, Test ve Dağıtım
Derleme
move build
Test Çalıştırma
move test
Dağıtım
- Hedef blokzincir platformunun
dokümantasyonunu inceleyin.
- CLI veya SDK kullanarak
modülleri deploy edin.
- Öncelikle test ağında deneyin,
sonra ana ağa geçin.
Sonuç
Bu rehberde:
- Tam işlevsel kripto para
platformu örneği
- Gelişmiş
token ve ledger modülleri
- Kapsamlı
testler
- Hata
analizi ve çözümleri
- Optimizasyon
önerileri
- Derleme,
test ve dağıtım adımları
öğrendiniz.
Move, güvenlik ve ölçeklenebilirlik isteyen projeler için
güçlü bir dil olup, profesyonel gelişim için önemli bir beceridir.

Комментарии
Отправить комментарий