1. 문제

잠금 해제하셈 ㄱㄱ
pragma solidity ^0.8.0;

contract Privacy {
    bool public locked = true;
    uint256 public ID = block.timestamp;
    uint8 private flattening = 10;
    uint8 private denomination = 255;
    uint16 private awkwardness = uint16(block.timestamp);
    bytes32[3] private data;

    constructor(bytes32[3] memory _data) {
        data = _data;
    }

    function unlock(bytes16 _key) public {
        require(_key == bytes16(data[2]));
        locked = false;
    }

    /*
    A bunch of super advanced solidity algorithms...

      ,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`
      .,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,
      *.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^         ,---/V\\
      `*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.    ~|__(o.o)
      ^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'  UU  UU
    */
}

2. Storage

image.png

스토리지에 저장되는 값들은 슬롯에 순서대로 저장이 되며, 스토리지의 각 슬롯에는 최대 32바이트 크기의 데이터가 저장될 수 있다

image.png

이런식으로 storage를 배치하게 되면 31바이트(엄밀히 따지면 255비트) + 31바이트 + 31바이트 + 30바이트해서 총 123바이트가 낭비됨으로 인해 불필요한 비용이 발생하게 된다. (일반적인 값 타입의 경우 빈 자리는 00으로 채워짐)

image.png

그래서 위와 같이 32바이트를 넘지 않는 선에서 야무지게 storage를 저장한다. → 따라서 data[2]에 접근해야하는 우리는 5번째 storage를 접근하면 된다

3. storage 값 추출

cast storage [문제 address] 5 --rpc-url [rpc-url]

cast storage 사용하여 5번째 storage 접근 ㄱㄱ