폴백() | 에테르노트 #01:
4424 단어 blockchainethereumevmweb3
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가 비어 있는지 여부를 확인하는 것은 프로그래머의 몫입니다. receive()
이러한 경우에 대해 생각하는 프로그래머에게 적용되는 기능입니다. Ethernaut 01: 폴백
이전에 기여하고 약간의 이더를 공급한 경우 소유권을 부여하는 폴백 방법이 있었습니다. 이렇게 하면 기여도가 소유자보다 적을 수 있지만 여전히 소유권을 얻을 수 있습니다.
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
Reference
이 문제에 관하여(폴백() | 에테르노트 #01:), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/antooni/fallback-ethernaut-1-2jg2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)