본문 바로가기
aaa
블록체인

[이더넛] 레벨6 'Delegation' 풀기

 [이더넛] 레벨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;
    }
  }
}

 

owner 확인

 

// 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의 주소로 변경되었습니다.

 

 

 

레벨6 'Delegation' 클리어!

 

 

 


loading