「The Ethernaut by Zeppelin Level 14. Gatekeeper Two」を翻訳してみました(CryptoZombiesのように?)
原文はこちら
https://ethernaut.zeppelin.solutions
14. Gatekeeper Twoをクリック
14. Gatekeeper Two
難易度 5/6
このゲートキーパーにはいくつかの新しい課題があるぞ。 このレベルのクリア条件は、(13. Gatekeeper Oneと同様)参加者として登録することだ。
回答の助けになるヒント
- 最初のゲートキーパー(13. Gatekeeper One)をクリアして学んだことを思い出せ。最初のゲートは「13. Gatekeeper」と同じだ。
- 第2ゲートのassemblyキーワードは、バニラsolidityであるコントラクトに対し、ネイティブでない機能にアクセスすることを可能にする。 詳細はこちら
このゲートの「extcodesize」コールは、指定されたアドレスのコントラクトコードのサイズを取得するぞ。これは、yellow paper の「7. Contract Creation」を確認すれば設定された方法と時期について詳しく知ることが出来るぞ。 - 3番目のゲートの「^」はビット演算子(XOR)で、ここでは、他の一般的なビット演算子(ここを参照)を適用するために使用されている。「3. Coin Flip」は、この問題に挑戦する際に確認するのにも適しているぞ。
ソースコード
pragma solidity ^0.4.18;
contract GatekeeperTwo {
address public entrant;
modifier gateOne() {
require(msg.sender != tx.origin);
_;
}
modifier gateTwo() {
uint x;
assembly { x := extcodesize(caller) }
require(x == 0);
_;
}
modifier gateThree(bytes8 _gateKey) {
require(uint64(keccak256(msg.sender)) ^ uint64(_gateKey) == uint64(0) - 1);
_;
}
function enter(bytes8 _gateKey) public gateOne gateTwo gateThree(_gateKey) returns (bool) {
entrant = tx.origin;
return true;
}
}