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まであるので
やっと半分です。
次回もコツコツやっていきましょう!
この記事が気に入ったらサポートをしてみませんか?