[이더넛] 레벨6 'Delegation' 풀기
[목표]
스마트컨트랙트 Delegation의 owner를
플레이어의 주소로 변경해보자.
Full Code
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Delegate {
address public owner;
constructor(address _owner) public {
owner = _owner;
}
function pwn() public {
owner = msg.sender;
}
}
contract Delegation {
address public owner;
Delegate delegate;
constructor(address _delegateAddress) public {
delegate = Delegate(_delegateAddress);
owner = msg.sender;
}
fallback() external {
(bool result,) = address(delegate).delegatecall(msg.data);
if (result) {
this;
}
}
}
// contract Delegate
function pwn() public {
owner = msg.sender;
}
owner를 변경하려면
contract Delegate의
함수 pwn()을 호출해야 합니다.
// contract Delegation
fallback() external {
(bool result,) = address(delegate).delegatecall(msg.data);
if (result) {
this;
}
contract Delegation을 살펴보면
fallback에서 contract Delegate를
delegatecall하고 있음을 확인 할 수 있습니다.
delegatecall ?
delegate는 위임한다는 뜻입니다.
delegatecall를 직역하면 call(호출)하여
무언가를 위임받는 것입니다.
contract Delegation은
contract Delegate의 기능을 위임 받았습니다.
contract Delegation에서
delegatecall을 통해
contract Delegation은
contract Delegate의 함수들을 사용할 수 있습니다.
이때, contract Delegate의 변수를 변경하지는 않고
함수 등의 기능만을 빌려서 사용합니다.
오버플로우, 언더플로우를 방지하기 위한
SafeMath 라이브러리와 유사합니다.
msg.data에
함수 pwn() method id를 입력해서
트랜잭션을 보내면
contract Delegation는
contract Delegate의
msg.data에 해당하는
함수 pwn을 contract Delegation 내에서 사용합니다.
그러면 owner가 msg.sender로 변경될 것 입니다.
- pwn() method id
https://emn178.github.io/online-tools/keccak_256.html
위 사이트에서 pwn()
를 Keccak-256를 통해
변환합니다.
변환된 값은 다음과 같습니다.
dd365b8b15d5d78ec041b851b68c8b985bee78bee0b87c4acf261024d8beabab
앞에서 4 byte 데이터 (8자리)
pwn()의 method id입니다.
실행
메타마스크에 instance 스마트컨트랙트 주소로
16진수 데이터에 method id를
입력하여 보냅니다.
성공적으로
owner가 player의 주소로 변경되었습니다.
'블록체인' 카테고리의 다른 글
[이더넛] 레벨8 'Vault' 풀기 (0) | 2021.08.12 |
---|---|
[이더넛] 레벨7 'Force' 풀기 (0) | 2021.08.12 |
[이더넛] 레벨5 'Token' 풀기 (0) | 2021.08.12 |
[이더넛] 레벨4 'Telephone' 풀기 (0) | 2021.08.11 |
[이더넛] 레벨3 'Coin Flip' 풀기 (0) | 2021.08.10 |