あなたがこの記事を読んでいるということは、おそらく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の操作:
- 上記のコードをRemix IDEに貼り付けます。
- コンパイルします。
- Deployボタンを押してコントラクトをデプロイします。
- update関数を呼び出します。
- senderボタンを押してmsg.senderの値を取得します。これはupdate関数を呼び出したアカウントのアドレスになります。
上記のスマートコントラクトは非常に単純です。コントラクトがデプロイされると、msg.sender
を使用してコントラクトの所有者(owner
)を設定します。これはコントラクトをデプロイしたアドレス、つまりトランザクションの送信者です。
🔽ACCOUNTにアドレスを選択し、デプロイする。
🔽この段階ではvalueの値はまだ0
.
🔽updateを押してからsenderを押すと、さっき設定したアドレスが入っている。
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.sender
、msg.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
を使って送信者のアドレスを取得します。入札が現在の最高入札額を上回っていれば、新たな最高入札者と最高入札額が更新されます。
まとめると、msg.sender
、msg.value
、msg.data
はSolidityの重要なグローバル変数であり、それぞれがトランザクションの送信者、送信されたEtherの量、関数の引数など、重要な情報を提供します。これらの理解はSolidityでの開発に不可欠であり、慎重に扱う必要があります。
以上がSolidityのmsg
についての解説です。他にも疑問や質問があれば、ぜひお寄せください。Solidityでの開発を楽しみましょう!