0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Blockchain】Smart Contractが保持する仮想通貨を操作する

Posted at

修飾子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;
}

さて、実行して確認してみましょう。

次のように、Value3 ether を設定して、 setMessage に "Hello World" を入れて実行します。
これで、Smart Contractに 3 ether を送ったことになります。

IMG-20190411-01.png

そして、 getBalance もしくは getBalanceAsEther を実行すると、次のようにSmart Contractが保持している仮想通貨を確認することができます。

IMG-20190411-02.png

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

※ 特に変換計算をしていないので、 amountwei で指定しなければならない。

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?