블록체인 학습
0 XP

msg.sender

msg.sender 는 현재 함수를 호출한 주소를 담은 전역 변수입니다. 접근 제어의 핵심으로, "누가 이 함수를 부르고 있는가"를 판단하는 기준이 됩니다. 별도의 로그인 절차 없이도, 트랜잭션 서명으로 이미 검증된 호출자를 msg.sender 하나로 식별합니다.

소유자(owner) 패턴

가장 흔한 사용처는 컨트랙트 배포자를 owner로 저장해두고, 이후 중요한 함수를 owner만 호출하도록 막는 것입니다. constructor 는 배포 트랜잭션에서 단 한 번 실행되므로, 그때의 msg.sender 가 곧 배포자입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Owned {
    address public owner;
 
    constructor() {
        // 배포 시점의 호출자가 owner가 됩니다
        owner = msg.sender;
    }
 
    function changeOwner(address newOwner) public {
        require(msg.sender == owner, "only owner");
        owner = newOwner;
    }
}

msg.sender vs tx.origin

호출 체인 A → B → C 에서, C 입장에서 msg.sender 는 바로 직전 호출자 B 이고, tx.origin 은 트랜잭션을 처음 시작한 외부 계정(EOA)인 A 입니다.

권한 검사는 항상 msg.sender 로 하세요. tx.origin 으로 검사하면, 악성 컨트랙트가 사용자를 속여 대신 호출하게 만드는 피싱 공격에 뚫립니다.

msg의 다른 멤버

  • msg.sender: 호출자 주소
  • msg.value: 함께 보낸 이더(wei)
  • msg.data: 호출 데이터 전체

msg.value 는 payable 함수에서 결제 금액을 검사할 때, msg.data 는 저수준 호출 분석에 쓰입니다.

결국 require(msg.sender == owner, "only owner") 한 줄이 접근 제어의 핵심입니다. 이 검사를 modifier 로 묶으면 여러 함수에 그대로 재사용할 수 있습니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.