Solidityのコードでよく見かけるmsg.senderについて解説します。
msg.senderとは“呼び出し元アドレス”のこと
msg.senderと書くことで、呼び出し元のアカウントアドレスを取得できます。
百聞は一見に如かず、実際に見てみましょう。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract TestContract {
function whoAmI() public view returns(address) {
return msg.sender;
}
}
上記の関数を呼び出すことでmsg.senderの値を取得できます。
出力結果を見ると、呼び出し元のアカウントアドレス(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)が表示されていることを確認できます。
msg.senderの使い方
msg.senderの使い方は様々ですが、代表的な、以下2つを紹介します。
- 実行者がオーナー自身かどうか確認
- 実行者のアドレスをキーにしてデータを保存
実行者がオーナー自身かどうか確認
以下のサンプルコードでは、コントラクトオーナーのアドレスと呼び出し元のアドレスを比較し、一致する場合のみ(呼び出し元がオーナーである場合のみ)文字を出力するようしています。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract TestContract {
address private owner;
constructor() {
owner = msg.sender;
}
function sayHiToOwner() public view returns(string memory) {
require(msg.sender == owner);
return "Hi. Welcome back.";
}
}
実行者のアドレスをキーにしてデータを保存
以下のサンプルコードでは、呼び出し元のアカウントアドレスをキーにしてデータを保存しています。
ユーザー固有のデータを保存する際によく用いられる方法です。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract TestContract {
mapping (address => string) public userNames;
function setUserName(string memory _userName) public {
userNames[msg.sender] = _userName;
}
function getUserName() public view returns(string memory) {
return userNames[msg.sender];
}
}
msg.senderなどコントラクトにまつわる処理はブロックチェーン開発言語であるSolidity独特のものですね。慣れるとどうってことないですので、取り敢えず、msg.sender = 呼び出し元のアドレス、ということだけおさえておきましょう。