폴백() | 에테르노트 #01:

존재하지 않는 함수를 호출하거나 send() 또는 transfer()를 통해 계약에 이더를 보내면 어떻게 됩니까?





fallback() 외부 [지급 가능] {...}



다음과 같은 경우에 실행됩니다.
  • 계약에 기능이 없습니다
  • .
  • 비어 있지 않은 통화 데이터가 포함된 에테르 전송
  • receive() 기능이 없을 때 에테르 전송

  • receive() 외부 지불금 {...}



    다음과 같은 경우에 실행됩니다.
  • 빈 호출 데이터가 있는 에테르 전송



  • 코드 예




    contract TestPayable {
        uint x;
        uint y;
    
        fallback() external payable { x = 1; y = msg.value; }
    
        receive() external payable { x = 2; y = msg.value; }
    }
    

    address(contract).transfer(AMOUNT) => x=2address(contract).call{value:1}(abi.encodePacked("SOME")) => x=1


    실제 사용: 프록시



    Proxy.sol의 코드를 보자.


  • proxy.foo(...)
  • foo(...) 프록시의 소스 코드에 존재하지 않음
  • 폴백이 트리거됨
  • 구현 시 delegatecall(...) 만들기
  • 반환 결과

  • 대체 기능 덕분에 프록시에서 임의의 기능을 호출할 수 있습니다. 그것 없이 우리는 더 복잡한 메커니즘을 만들어야 할 것입니다.


    receive()가 도입된 이유는 무엇입니까?


  • msg.data가 비어 있는지 명시적으로 확인합니다. 이것이 없으면 calldata가 비어 있는지 여부를 확인하는 것은 프로그래머의 몫입니다.
  • 일반 ETH 전송에 대한 UX가 개선되어 calldata를 넣지 않은 사용자를 독립적으로 처리할 수 있습니다. receive() 이러한 경우에 대해 생각하는 프로그래머에게 적용되는 기능입니다.



  • Ethernaut 01: 폴백



    이전에 기여하고 약간의 이더를 공급한 경우 소유권을 부여하는 폴백 방법이 있었습니다. 이렇게 하면 기여도가 소유자보다 적을 수 있지만 여전히 소유권을 얻을 수 있습니다.
  • web3.js
  • 를 사용하여 계약과 상호 작용

  • ABI와 상호 작용할 때 에테르 보내기
  • contract.contribute({value: AMOUNT_IN_WEI})


  • ABI 외부에서 에테르 보내기docs
  • contract.sendTransaction({value: AMOUNT_IN_WEI})


  • Level 완료 tx


    출처:
    forum answer

    medium blog post

    solidity docs

    stackexchange

    좋은 웹페이지 즐겨찾기