切換到 step_4/BasicCoin
move build
現在實作Method如下列BasicCoin.move範例裡的結構:
此方法將Balance資源發佈到給定位址。由於需要該資源透過鑄造或轉移來接收硬幣,因此publish_balance用戶(包括模組所有者)必須調用該方法才能接收資金。
此方法使用一個move_to操作來發布資源:
let empty_coin = Coin { value: 0 };
move_to(account, Balance { coin: empty_coin });
mint方法將硬幣鑄造到給定帳戶。這裡我們要求mint必須經過模組所有者的批准。我們使用斷言語句強制執行此操作:
assert!(signer::address_of(&module_owner) == MODULE_OWNER,
ENOT_MODULE_OWNER);
然後我們將一枚價值為的amount代幣存入餘額mint_addr。
deposit(mint_addr, Coin { value: amount });
我們使用borrow_global全域儲存運算子之一來從全域儲存中讀取。
borrow_global<Balance>(owner).coin.value
| | \ /
resource type address field names
此函數從 的餘額中提取代幣from並將代幣存入tos 的餘額中。我們仔細看看withdraw輔助函數:
fun withdraw(addr: address, amount: u64) : Coin acquires Balance {
let balance = balance_of(addr);
assert!(balance >= amount, EINSUFFICIENT_BALANCE);
let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;
*balance_ref = balance - amount;
Coin { value: amount }
}
在方法開始時,我們斷言提款帳戶有足夠的餘額。然後,我們用於borrow_global_mut 取得對全域儲存的可變引用,並&mut用於建立對結構體欄位的可變引用。然後,我們透過這個可變引用修改餘額,並返回帶有提取金額的新硬幣。