Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした