見出し画像

MOVE言語 チュートリアルStep_4 モジュールの実行

どうもTABEです!
今回もMOVE言語のチュートリアルをやっていきます

前回の記事はこちら

公式のチュートリアルリンク


cd <moveをcloneしたディレクトリ>/move/language/documentation/tutorial/step_4/BasicCoin

このディレクトリで以下を実行

move build

実行結果が以下であれば、問題ない

では、ソースコード中身を確認していきます。

/// This module defines a minimal Coin and Balance.
module NamedAddr::BasicCoin {
    use std::signer;

    /// モジュール所有者のアドレス
    const MODULE_OWNER: address = @NamedAddr;

    /// エラーコード
    const ENOT_MODULE_OWNER: u64 = 0;
    const EINSUFFICIENT_BALANCE: u64 = 1;
    const EALREADY_HAS_BALANCE: u64 = 2;

    struct Coin has store {
        value: u64
    }

    /// 各アドレスの残高を表す構造体。
    struct Balance has key {
        coin: Coin
    }

    /// mintやtransfarの時に必ず呼び出しを行う関数
    public fun publish_balance(account: &signer) {
        // 変数に値が0のCoinを代入
        let empty_coin = Coin { value: 0 };
        // アカウントのコインが存在していることを確認? assertはテストだけでなく、solidityのrequire的に使えるっぽい
        assert!(!exists<Balance>(signer::address_of(account)), EALREADY_HAS_BALANCE);
        // アカウントに0のCoinを渡す?初期化している?
        move_to(account, Balance { coin: empty_coin });
    }

    /// 対象のアドレスへコインをMintする関数
    public fun mint(module_owner: &signer, mint_addr: address, amount: u64) acquires Balance {
        // module_ownerがあっているか確認
        assert!(signer::address_of(module_owner) == MODULE_OWNER, ENOT_MODULE_OWNER);
        // 下の方に定義しているdeposit関数を呼び出す。対象のアドレスにamout分のコインをMintする
        deposit(mint_addr, Coin { value: amount });
    }

    /// 引数で渡されえたアドレスの残高を表示する
    public fun balance_of(owner: address): u64 acquires Balance {
        // borrow_globalはグローバルストレージ - オペレーターというものらしい(構文のリンクを貼っておく)※1
        // アドレスの持っている値を参照できる。
        borrow_global<Balance>(owner).coin.value
    }

    /// FromからToへamountの値を渡す関数
    public fun transfer(from: &signer, to: address, amount: u64) acquires Balance {
        /// checkの変数へFromからamountの分だけCoinを抽出
        let check = withdraw(signer::address_of(from), amount);
        /// toのアドレスへCoinを送信する
        deposit(to, check);
    }

    /// アドレスからamountの値を引き出す
    fun withdraw(addr: address, amount: u64) : Coin acquires Balance {
        // addrの残高をbalanceに代入する
        let balance = balance_of(addr);
        // 残高が出金額より大きいことを確認
        assert!(balance >= amount, EINSUFFICIENT_BALANCE);
        // balance_ref グローバルストレージへの参照 borrow_global_mutは構文のリンクを最後に最後に貼り付けておく※1
        let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;
        // ここでbalance_refに残高からamountを引いた値を入力
        *balance_ref = balance - amount;
        // amountを設定する。
        Coin { value: amount }
    }

    /// addr` の下にある残高に `amount` 個のトークンを預ける。
    fun deposit(addr: address, check: Coin) acquires Balance{
        // addrの持っている値をbalanceに格納
        let balance = balance_of(addr);
        // グローバルストレージへの参照
        let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;
        // Coinに対して引数で渡されたcheckを代入する
        let Coin { value } = check;
        // 残高にvalueをプラスした値をbalance_ref(グローバルストレージ)へ格納する
        *balance_ref = balance + value;
    }
}


VS CODEの色付きの画面の方が見やすいと思うので、貼り付けておきます。

※1borrow_global borrow_global_mut の説明について


以上になります。
チュートリアルは8まであるので
やっと半分です。

次回もコツコツやっていきましょう!

この記事が気に入ったらサポートをしてみませんか?