修飾子payableのサンプルで仮想通貨をSmart Contractの関数に送る説明をしましたが、その仮想通貨はどこに行ったのでしょうか?Ethereum (イーサリアム)のアカウントが仮想通貨を保持できるのと同じく、Smart Contractも仮想通貨を保持することができます。
Smart Contractが保持する仮想通貨を取得
Smart Contractが保持する仮想通貨を取得するのはとても簡単です。
まずは、下記の通り getBalance
と言う関数を実装しましょう。
この関数は、情報を取得 get
だけしたいので、手数料がかからないように修飾子 view
を追加しましょう。
function getBalance() public view returns (uint) {
return address(this).balance;
}
次のコードで address(this).balance
Smart Contractが保持する仮想通貨を取得できます。
取得する通過単位は wei
ですので、 ether
に変換して取得したい場合は、次の関数も作っておきましょう。
function getBalanceAsEther() public view returns (uint) {
return getBalance() / 1e18;
}
さて、実行して確認してみましょう。
次のように、Value
に 3 ether
を設定して、 setMessage
に "Hello World" を入れて実行します。
これで、Smart Contractに 3 ether
を送ったことになります。
そして、 getBalance
もしくは getBalanceAsEther
を実行すると、次のようにSmart Contractが保持している仮想通貨を確認することができます。
Smart Contractからオーナーに仮想通貨を移動
次は、Smart Contractが保持する仮想通貨をオーナーに移動する方法を説明します。
その前に、継承を説明した時に、オーナーのアドレスを保持する属性を private
にしていたところを internal
に変更する必要があります。そうしないと継承先で owner
を利用することができないからです。
※ ちなみに、 internal
は、他のオブジェクト思考言語では protected
として知られています。
さて、これで実際に仮想通貨を移動するための関数を次のように実装します。
function transfer(uint amount) public isOwner { // (1)
require(address(this).balance >= amount); // (2)
owner.transfer(amount); // (3)
}
(1) まずは、関数は、オーナー以外実行できてしまうと困るので、 isOwner
修飾子modifierを付けます。
(2) そして、引数 amount
が実際にSmart Contractが保持する仮想通貨を超えていないかをチェックします。
(3) 最後に、 オーナーに仮想通貨 amount
分だけ移動します。
※ 特に変換計算をしていないので、 amount
は wei
で指定しなければならない。
Smart Contractから別のアカウントに仮想通貨を移動
Smart Contractが保持する仮想通貨を別のアカウントに移動する方法を次の関数 transerTo
の実装で説明します。
function transferTo(uint amount, address to) public isOwner { // (1)
require(address(this).balance >= amount); // (2)
require(to != address(0)); // (3)
to.transfer(amount); // (4)
}
(1) 引数に仮想通貨を移動したいアカウント to
を定義します。
(2) 引数 amount
が実際にSmart Contractが保持する仮想通貨を超えていないかをチェックします。
(3) 引数 to
が無効なアカウントでないかをチェックします。
(4) 最後に、 to
に仮想通貨 amount
分だけ移動します。