상세 컨텐츠

본문 제목

솔리디티 강좌 32강 - payable,msg.value, 와 이더를 보내는 3가지 함수 (send, transfer, call)

솔리디티 깨부수기 - 기본

by D_One 2021. 10. 1. 10:41

본문

 


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

구독/좋아요 해주셔서 감사합니다 :) !!

https://youtu.be/r0qa0IVUHVI


 

안녕하세요

 

오늘은 payable, msg.value 와 코인보내는 3가지 방법 send, transfer, call 에 대해서 알아보겠습니다. 

 

Payable

Payable은 코인과 상호작용(송금)시 필요한 키워드라고 생각하시면 간단합니다. 

즉, send, trnafer, call을 이용하여, 이더를 보낼때 Payable이라는 키워드가 필요 합니다.

이 Payable은 주로 함수,주소,생성자에 붙여서 사용된답니다. 

payable은 send, trnafer, call 예제에서 같이 보도록 하겠습니다.

 

 

msg.value

msg.value는 송금보낸 코인의 값 입니다

.msg.value 역시 payable 과 함께 send, trnafer, call 예제에서 같이 보도록 하겠습니다.

 

이더를 보내는 3가지 방법 

이더를 보내는 3가지 방법은 send, transfer, call 이 있습니다.

이 세가지는 각각의 특징이 있습니다. 

    1.send : 2300 gas를 소비, 성공여부를 true 또는 false로 리턴한다
    2.transfer : 2300 gas를 소비, 실패시 에러를 발생
    3.call : 가변적인 gas 소비 (gas값 지정 가능), 성공여부를 true 또는 false로 리턴

              재진입(reentrancy) 공격 위험성 있음, 2019년 12월 이후 call 사용을 추천. 

 

예제:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0 < 0.9.0;

contract lec32 {
    
    event howMuch(uint256 _value);
    function sendNow(address payable _to) public payable{
        bool sent = _to.send(msg.value); // return true or false
        require(sent,"Failed to send either");
        emit howMuch(msg.value);
    }
    
    function transferNow(address payable _to) public payable{
        _to.transfer(msg.value);
        emit howMuch(msg.value);
    }
    
    function callNow (address payable _to) public payable{
        //0.50
        // (bool sent, ) = _to.call.gas(1000).value(msg.value)("");
        // require(sent,"Failed to send either");
        
        //0.7 ~
        (bool sent, ) = _to.call{value: msg.value , gas:1000}("");
        require(sent, "Failed to send Ether");
        emit howMuch(msg.value);
    }
}​

영상과 같이 보시기 바랍니다. 

관련글 더보기