「The Ethernaut by Zeppelin Level 13. Gatekeeper One」を翻訳してみました(CryptoZombiesのように?)
原文はこちら
https://ethernaut.zeppelin.solutions
13. Gatekeeper Oneをクリック
13. Gatekeeper One
難易度 5/6
ゲートキーパー(ここではmodifier修飾子)を通過させ、参加者として登録する(enterメソッドからtrueを返す)ことが
このレベルのクリア条件だ。
回答の助けになるヒント
- 過去に「4. Telephone」と「5. Token」のレベルから学んだことを思い出せ。
- Solidityのドキュメント(こことここを参照)で特別な変数「msg.gas」及び推奨エイリアス「gasleft()」について詳しく知ることが出来るぞ。
ソースコード
pragma solidity ^0.4.18;
contract GatekeeperOne {
address public entrant;
modifier gateOne() {
require(msg.sender != tx.origin);
_;
}
modifier gateTwo() {
require(msg.gas % 8191 == 0);
_;
}
modifier gateThree(bytes8 _gateKey) {
require(uint32(_gateKey) == uint16(_gateKey));
require(uint32(_gateKey) != uint64(_gateKey));
require(uint32(_gateKey) == uint16(tx.origin));
_;
}
function enter(bytes8 _gateKey) public gateOne gateTwo gateThree(_gateKey) returns (bool) {
entrant = tx.origin;
return true;
}
}