[Solidity] msg

냐옹·2023년 7월 31일
0

Solidity

목록 보기
5/13
post-thumbnail
속성설명
msg.sender현재 함수를 호출한 주소를 나타냅니다.
msg.value이더리움 네트워크에서, 이 함수를 호출할 때 보낸 wei의 양을 나타냅니다.
msg.data함수를 호출할 때 보낸 데이터를 나타냅니다.
msg.gas함수를 호출할 때 사용할 수 있는 가스의 양을 나타냅니다. (v0.4.21 이후로는 더 이상 사용되지 않습니다.)
msg.sig함수를 호출할 때 사용한 함수 서명을 나타냅니다.

msg

msg는 솔리디티에서 제공하는 전역 변수로서, 현재 함수호출에 대한 정보를 담고 있습니다.

msg.sender

현재 함수를 호출한 주소를 나타냅니다. 주로 컨트랙트의 특정함수가 특정 사용자만 호출할 수 있게 제한할 때 사용됩니다.

처음에 많이 헷깔렸던 내용입니다.
예를 들어서
Contract A 가 있다고 보겠습니다. 그리고 Contract B에서 msg.sender를 콘솔에 출력하는 함수, Function 1이 있다고 쳐보겠습니다. 이 Function 1Contract A에서 호출하면, msg.sender로 Contract A의 주소가 콘솔에 찍히게 됩니다. 저는 처음에 이 부분을 트랜잭션을 날리는 사람의 지갑주소라고 생각을 했으나, 함수 입장에서는 이 함수를 호출하는 주소는 단순히 Contract A의 주소인 것입니다.

msg.value

msg.value 는 이더리움 네트워크에서, 이 함수를 호출하면서 함께 보낸 이더의 양 (단위는 wei)을 나타냅니다. 주로 payable 함수에서 사용되어 이더를 받을 수 있게 합니다.

msg.data

msg.data 는 함수를 호출하면서 보낸 데이터를 나타냅니다. 이 데이터는 함수의 매개변수와 함께 전달이 되며, 주로 low level 호출에서 사용됩니다.

msg.gas

msg.gas 는 함수를 호출하면서 사용할 수 있는 가스의 양을 나타냅니다. 하지만 솔리디티 버전 0.4.21 이후로는 더이상 사용되지 않는다고 합니다.

msg.sig

msg.sig 는 함수를 호출하면서 사용한 함수의 서명 (4바이트의 함수 선택자)을 나타냅니다. 이는 low level 호출에서 주로 사용됩니다.

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 메서드 를 사용해야 합니다.

0개의 댓글