Fallback, Receive

4e5ung·2023년 7월 20일
0

Fallback, Receive

fallback 함수는 이더를 전송할 때 사용이 되며, 다른 함수에 매치되지 않는 함수 호출를 처리하기 위해도 사용이 된다.
solidity 0.6.0 버전 이전에는 fallback 함수 하나로 처리하였지만 이후로는 receive와 fallback 으로 기능을 나누어 사용한다.

0.6.0 이후

receive() external payable

빈 호출 데이터(및 모든 값)의 경우

fallback() external payable

다른 기능이 일치하지 않는 경우(수신 기능도 아님). 선택적으로 payable.

fallback 함수가 다른 함수 호출을 처리하는 용도로 사용되고(프록시 패턴에 용이), 이더 처리는 receive 함수가 담당한다. 단, receive 함수가 생략될 경우 fallback 함수가 이더 처리 역할을 대신 한다(payable)

예제

테스트 샘플 컨트랙트

pragma solidity ^0.8.0;

contract MyContract {
    event FallbackLog(string name);
    event ReceiveLog(string name);

    // calldata 존재
    fallback() external payable {
        emit FallbackLog("fallback");
    }

    // calldata 존재하지 않음
    receive() external payable {
        emit ReceiveLog("receive");
    }
}

contract NonFunction {
    uint256 private data;

    function setData() external{
        data++;
    }
}

receive 호출

이더 전송을 통해 이벤트 로그 확인(calldata 존재 하지 않는 상태)

let tx = await accounts[0].sendTransaction({
	to: fallbackRecevieContract.address,
	value: 10,
})
let receipt = await tx.wait()

assert.equal(receipt.logs[0].topics[0], receiveEvent)

fallback 호출

이더 전송을 통해 이벤트 로그 확인(calldata 존재)

const calldata = "0x012345"
let tx = await accounts[0].sendTransaction({
	to: fallbackRecevieContract.address,
	value: 10,
    data: calldata
})
let receipt = await tx.wait()

assert.equal(receipt.logs[0].topics[0], fallbackEvent)

fallback 호출

없는 함수 호출을 통해 이벤트 로그 확인(calldata 존재(함수Sign))

let nonFunctionContract = (await ethers.getContractFactory("NonFunction")).attach(fallbackRecevieContract.address)

let tx = await nonFunctionContract.setData()
let receipt = await tx.wait()

// 콜 데이터 검증(setData함수)
assert.equal(tx.data, setDataFunc)

// 이벤트 검증
assert.equal(receipt.events[0].topics[0], fallbackEvent)

Ref

https://docs.soliditylang.org/en/v0.8.17/contracts.html#receive-ether-function
https://betterprogramming.pub/solidity-0-6-x-features-fallback-and-receive-functions-69895e3ffe

git repository

https://github.com/4e5ung/solidity-study/tree/main/fallback_receive

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

글이 잘 정리되어 있네요. 감사합니다.

답글 달기