속성 | 설명 |
---|---|
msg.sender | 현재 함수를 호출한 주소를 나타냅니다. |
msg.value | 이더리움 네트워크에서, 이 함수를 호출할 때 보낸 wei의 양을 나타냅니다. |
msg.data | 함수를 호출할 때 보낸 데이터를 나타냅니다. |
msg.gas | 함수를 호출할 때 사용할 수 있는 가스의 양을 나타냅니다. (v0.4.21 이후로는 더 이상 사용되지 않습니다.) |
msg.sig | 함수를 호출할 때 사용한 함수 서명을 나타냅니다. |
msg
는 솔리디티에서 제공하는 전역 변수로서, 현재 함수호출에 대한 정보를 담고 있습니다.
현재 함수를 호출한 주소를 나타냅니다. 주로 컨트랙트의 특정함수가 특정 사용자만 호출할 수 있게 제한할 때 사용됩니다.
처음에 많이 헷깔렸던 내용입니다.
예를 들어서
Contract A
가 있다고 보겠습니다. 그리고 Contract B
에서 msg.sender를 콘솔에 출력하는 함수, Function 1
이 있다고 쳐보겠습니다. 이 Function 1
을 Contract A
에서 호출하면, msg.sender로 Contract A의 주소
가 콘솔에 찍히게 됩니다. 저는 처음에 이 부분을 트랜잭션을 날리는 사람의 지갑주소라고 생각을 했으나, 함수 입장에서는 이 함수를 호출하는 주소는 단순히 Contract A의 주소
인 것입니다.
msg.value
는 이더리움 네트워크에서, 이 함수를 호출하면서 함께 보낸 이더의 양 (단위는 wei)을 나타냅니다. 주로 payable 함수에서 사용되어 이더를 받을 수 있게 합니다.
msg.data
는 함수를 호출하면서 보낸 데이터를 나타냅니다. 이 데이터는 함수의 매개변수와 함께 전달이 되며, 주로 low level 호출에서 사용됩니다.
msg.gas
는 함수를 호출하면서 사용할 수 있는 가스의 양을 나타냅니다. 하지만 솔리디티 버전 0.4.21 이후로는 더이상 사용되지 않는다고 합니다.
msg.sig
는 함수를 호출하면서 사용한 함수의 서명 (4바이트의 함수 선택자)을 나타냅니다. 이는 low level 호출에서 주로 사용됩니다.
low-level 호출
이란 솔리디티에서 제공하는 저수준 함수 호출방식을 의미합니다. 이것은 직접적으로 메세지를 전송하거나, 함수를 호출하는 방식으로 주로, call
, delegatecall
, staticcall
, send
, transfer
와 같은 메서드들이 해당됩니다.
예를 들어서 call
메서드를 사용하면 임의의 함수를 호출하고, 가스를 지정하며, 이더를 전송할 수 있습니다.
(bool success, bytes memory data) = address.call(abi.encodeWithSignature("functionName", param1, param2));
이처럼 low-level 호출
은 컨트랙트 간에 상호작용을 통제하는 것에 필요한 유연성을 제공하지만, 잘못 사용하면 보안 취약점을 만들 수 있다고 하기에 주의가 필요합니다.
예를 들어서 re-entrancy 공격
을 예시로 들 수 있는데, 이것은 call
의 잘못된 사용으로 인해서 발생할 수 있다고 합니다.
그래서 일반적으로 개발자들은 이러한 low-level 메서드
들 대신에 high-level 메서드
호출을 선호하는게 낫고, 진짜 꼭 필요한 경우에만 low-level 메서드
를 사용해야 합니다.