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.

Комментарии

Популярные сообщения из этого блога

Varoluşun Hışmı, Yalnızlığın Dev Aynası

Ansızın Gel

Kayıp Masumiyetin Senfonisi ve Zamanın Gölgesindeki Aşkın Metafizik Sorgusu