修飾子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 分だけ移動します。

