티스토리 뷰

반응형

솔리디티에서 msg.sender는 가장 중요한 전역 변수(global variable) 중 하나 이다. 

 

msg.sender는 현재 스마트 계약을 호출한 계정의 주소를 나타내며, 이것을 통해 스마트 계약은 누가 트랜잭션을 실행했는지 확인할 수 있다. 예를 들어, 계약을 배포한 주소에서 트랜잭션을 호출하면 msg.sender는 배포한 계정의 주소가 된다. 또, 다른 계정에서 트랜잭션을 호출하면 msg.sender는 그 계정의 주소가 된다.

즉, msg.sender를 사용하면 스마트 컨트랙트를 실행하는 사용자 또는 다른 컨트랙트의 주소를 확인할 수 있어, 스마트 컨트랙트는 msg.sender를 기반으로 조건 분기 등의 로직을 구현할 수 있다.

 

msg.sender는 스마트 계약 보안을 유지하기 위해 매우 중요하다. 스마트 계약은 중요한 자산을 처리하고 보호하는 역할을 하기에, msg.sender를 사용하여 계약을 호출한 주체가 승인된 사용자인지 확인할 수 있다. 예를 들면, msg.sender를 사용하여 계약에 접근 권한을 부여하는 것이 일반적인 로직이다.

 


예를 들어보자.

pragma solidity ^0.8.0;

contract MyContract {
    address owner;
    
    constructor() {
        owner = msg.sender;
    }
    
    function ownerSomething() public {
        require(msg.sender == owner, "You are not the owner of this contract!");
        // owner만이 할 수 있는 기능 작성...
    }
}

이 코드에서 owner는 계약을 배포한 사용자의 주소를 저장한다. 생성자(constructor) 함수가 호출될 때, msg.sender는 계약을 배포한 사용자의 주소로 설정된다. ownerSomething 함수에서는 require 문을 사용하여 msg.sender가 owner와 일치하는지 확인한다. 여기서 함수를 호출한 사용자가 계약을 배포한 사용자인지 확인할 수 있다. 이렇게 하면, 함수를 호출하는 사용자의 권한을 제한할 수 있다. 

 

 

또 다른 예로 아래 코드를 보자.

function transfer(address _to, uint256 _value) public returns (bool) {
    require(balanceOf[msg.sender] >= _value);
    // ...
}

위 transfer 함수는 address 타입의 _to와 uint256 타입의 _value를 매개변수로 받는다. 이 함수는 balanceOf[msg.sender]가 _value보다 크거나 같은 경우, 해당하는 양만큼 토큰을 _to 주소로 전송한다. msg.sender를 사용하여 호출한 사용자의 주소를 확인하고, 해당 사용자가 충분한 토큰을 가지고 있는지 확인할 수 있다.

 

 

스마트 컨트랙트를 작성할 때 OpenZeppelin 라이브러리를 사용하거나 본적이 있을 것이다. 이 라이브러리에서 제공하는 주요 함수(transfer, mint 등등)들에서도 msg.sender가 토큰을 소유한 본인인 것을 확인한 뒤 이후의 로직을 처리하도록 되어 있다. 함수를 호출하는 사용자를 제한함으로써 토큰 탈취를 예방하고 최소한의 주요 보안들을 담당할 수 있다.

반응형
댓글
공지사항