21.07.27 이더리움 송금

jongho_lee·2021년 7월 27일
1

Blockchain

목록 보기
2/3
post-thumbnail

오늘은 주로 컨트랙트에서 이더리움을 전송하는 법과 solidity 언어에서 함수를 만들어 이더리움 송금에 대한 내용을 학습했습니다.

오늘은 간단하게 코드가 어떠한 구조를 가지고 있으며, 어떠한 방식으로 진행되는지 가볍게 본 시간이였습니다.

컨트랙트에서 이더 송금하기

pragma solidity 0.8.6;

contract Test {
    
    uint nonce;
    
    constructor(uint _nonce) payable {
        nonce = _nonce;   
    }
    
    function getNonce() public view returns (uint) {
        return nonce;
    }
    
    function withdraw(uint _nonce) public {
        require(nonce == _nonce);
        payable(msg.sender).transfer(address(this).balance);
    }
    
}

위 코드를 실행하면 getNonce로 컨트랙트의 잔액을 확인하고, withdraw 함수를 통해서 잔액을 호출한 사람의 주소로 인출하는 코드입니다.

uint? 부호가 없는 정수형 데이터 타입을 의미합니다.

uint nonce;
nonce를 변수로 선언했습니다.

constructor () Payable {}

constructor는 생성자를 가지고 있는데, 객체의 초기화 코드가 필요하면 이 생성자 안에 선언해주면 됩니다.

constructor의 가장 큰 특징은 계약서가 배포될 때 호출됩니다.

Payable 이란??

Payable이 붙은 함수는 이더리움을 전송 받을 수 있게 해줍니다.
다른 코드를 해석한다면

  function getNonce() public view returns (uint) {
        return nonce;
    }

function getNonce() public view returns () {}

컨트랙트에 있는 nonce 값을 조회하는 함수입니다. view가 조회 기능을 가지고 있다고 생각하면 됩니다.

function withdraw(uint _nonce) public {
        require(nonce == _nonce);
        payable(msg.sender).transfer(address(this).balance);
    }

컨트랙트 계좌에 있는 잔액을 인출합니다.
msg.sender(함수를 호출한 사람)에게 this(컨트랙트)의 이더리움을 송금해줍니다.

Msg.sender

메세지 발신자(현재 호출)을 뜻합니다.

fallback()

fallback() 함수는 이름이 없습니다. 어떤 계약이든 하나의 fallback 함수를 가집니다. 매칭되는 함수가 없거나, data없이 호출된다면 fallback함수가 호출됩니다.

pragma solidity 0.8.6;

contract Test {
    
    uint balance;
    
    constructor() payable {
        balance = msg.value;
    }
    
    fallback() external payable {
        require(msg.value >= balance);
        payable(msg.sender).transfer(address(this).balance);   
    }
    
}

msg.value
메세지와 함께 전송된 wei 수를 뜻합니다.

msg.sender와 msg.value를 포함한 모든 msg의 멤버 값은 외부 함수 호출에 의해 바뀔 수 있다는 점!

생성자에 balance에는 msg.value 값이 담깁니다.
함수를 호출했을 때, 컨트랙트에 함수가 없으므로 fallback함수가 실행이 됩니다.

즉, msg.value가 balance 보다 크다는 조건을 걸어준 require, 컨트랙트의 이더 잔액이 호출한 사람의 주소로 전송됩니다.

selfdestruct()

파괴하는 특성을 가진 함수입니다. 실행이 되면 이전의 기록들은 확인이 가능하지만 실행된 시점 이후의 컨트랙트 함수들은 실행되지 않게 합니다. 컨트랙트가 배포된 상태로 존재하기 때문에 안전장치의 역할을 수행합니다.

pragma solidity 0.8.6;

contract Test {
    
    constructor() payable {
        
    }
    
    function destroy() public {
        selfdestruct(payable(msg.sender));
    }
    
}

이 코드의 실행 결과는 파괴가 되었을 때, msg.sender로 컨트랙트의 잔액이 이동하게 됩니다.

이번 시간에는 이더리움을 전송하는 방법에 대하여 학습하였습니다. 컨트랙트에서 전송하는 방법, fallback함수를 이용하는 방법과 selfdestruct 함수를 이용하는 방법 등 이더리움을 전송하는 방법은 다양했습니다.

참고
링크텍스트 : solidity document

profile
Developer

0개의 댓글