【Solidity】msg.senderとは?

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の実行結果

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 = 呼び出し元のアドレス、ということだけおさえておきましょう。

タイトルとURLをコピーしました