LoginSignup
1
0
お題は不問!Qiita Engineer Festa 2023で記事投稿!

グローバル変数msgについて知らなければならないこと全て: Solidity

Posted at

あなたがこの記事を読んでいるということは、おそらくSolidityの公式ドキュメンテーションを既に読んだり、いくつかの初級チュートリアルで遊んだりして、msg.sender、msg.value、msg.dataといった構文に遭遇したことでしょう。そして、おそらく「msg.senderって何?」と疑問に思ったことでしょう。

グローバル変数msgとは何か?

まず、Solidityには特別な変数と関数が存在します。これらはブロックチェーンに関する情報を提供したり、エラーハンドリングを支援したり、数学や暗号化関数を利用したり、そしてコントラクトアドレスやコントラクト自体に関する情報を提供するために使われます。

msgという変数は、これらの特別な変数の一つで、ブロックチェーンの特定のプロパティにアクセスするために使用されます。このmsg変数には、いくつかの特別なプロパティがあり、それぞれについて詳しく見ていきましょう。

msg.sender

msg.senderは、現在の関数呼び出しの送信者(呼び出し元)のアドレスを表します。これは通常、トランザクションの送信者のアドレスです。

以下に、msg.senderを使用した簡単なスマートコントラクトの例を示します。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleContract {
    address public owner;

    constructor() {
        owner = msg.sender;
    }
}
Remixの操作:
  1. 上記のコードをRemix IDEに貼り付けます。
  2. コンパイルします。
  3. Deployボタンを押してコントラクトをデプロイします。
  4. update関数を呼び出します。
  5. senderボタンを押してmsg.senderの値を取得します。これはupdate関数を呼び出したアカウントのアドレスになります。

上記のスマートコントラクトは非常に単純です。コントラクトがデプロイされると、msg.senderを使用してコントラクトの所有者(owner)を設定します。これはコントラクトをデプロイしたアドレス、つまりトランザクションの送信者です。

🔽ACCOUNTにアドレスを選択し、デプロイする。

スクリーンショット 2023-07-05 午後8.06.02.png

🔽この段階ではvalueの値はまだ0.
スクリーンショット 2023-07-05 午後8.11.21.png
🔽updateを押してからsenderを押すと、さっき設定したアドレスが入っている。
スクリーンショット 2023-07-05 午後8.11.35.png

msg.value

msg.valueは、トランザクションと共に送信されるEtherの量(Wei単位)を表します。これは通常、関数がpayableである場合に利用します。

以下に、msg.valueを使用した簡単なスマートコントラクトの例を示します。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleDonation {
    uint public totalDonations;

   

 function donate() public payable {
        totalDonations += msg.value;
    }
}

上記のコントラクトでは、donate関数はpayableと宣言されています。これにより、この関数はEtherを受け取ることができます。関数が呼び出されると、msg.valueを使用して送信されたEtherの量を取得し、それをtotalDonationsに追加します。

msg.data

修正中

複数のmsgプロパティを使用したコード

最後に、msg.sendermsg.valueを同時に使用したスマートコントラクトの例を示します。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Auction {
    address public highestBidder;
    uint public highestBid;

    function bid() public payable {
        require(msg.value > highestBid, "There already is a higher bid.");

        highestBidder = msg.sender;
        highestBid = msg.value;
    }
}

このコントラクトはオークションシステムを表現しています。ユーザーはbid関数を呼び出し、Etherを送信して入札します。msg.valueを使って送信されたEtherの量を取得し、msg.senderを使って送信者のアドレスを取得します。入札が現在の最高入札額を上回っていれば、新たな最高入札者と最高入札額が更新されます。

🔽Deployしてvalueに2を設定した例
スクリーンショット 2023-07-05 午後8.48.32.png

まとめると、msg.sendermsg.valuemsg.dataはSolidityの重要なグローバル変数であり、それぞれがトランザクションの送信者、送信されたEtherの量、関数の引数など、重要な情報を提供します。これらの理解はSolidityでの開発に不可欠であり、慎重に扱う必要があります。

以上がSolidityのmsgについての解説です。他にも疑問や質問があれば、ぜひお寄せください。Solidityでの開発を楽しみましょう!

1
0
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
1
0