Ethernaut  「Level.0 Hello Ethernaut」解答例

# Hello Ethernaut
Level.0 Hello Ethernautでは、Ethernautのゲームの基本について説明されています。

# 1. Set up MetaMask
まだインストールしていない場合は、Metamaskをインストールしましょう。
インストール後、ネットワークセレクタを使って”Ropsten test network"を選んでください。

# 2. Open the browser's console
ブラウザのコンソールを開いてください。
コンソールを開くとゲームからのいくつかのメッセージが表示されています。
次のコマンドでプレイヤーのAddressをいつでも確認した出来ます。

```
player
```

# 3. Use the console helpers
次のコマンドで現在のEther残高を確認することができます。

```
getBalance(player)
```

コンソールで他にどのような機能があるか調べるには次のコマンドを実行します。

```
help()
```

これらはゲームプレイ中に非常に役に立つと思います。


# 4. The ethernaut contract
コンソールに次のコマンドを入力してください

```
ethernaut
```

これはゲームの主なSmartContractです。
コンソールから直接操作することはありませんが、必要になる応じて行うことがあります。

# 5. Interact with the ABI
ethernautはEthernaut.solをブロックチェーン上にデプロイしたTruffleContractのオブジェクトです
とりわけ、コントトラクトのABIは、Ethernaut.solの所有者など全て公開している。
次のコマンドを入力してください。

```
ethernaut.owner()
```

```await ethernaut.owner()```とすれば、簡単に所有者アドレスを確認できます。

# 6. Get test ether
ゲームをプレイするには、テスト用Etherが必要です。
簡単にテストネットのEtherを入手するには、[MetaMask faucet](https://faucet.metamask.io/)を利用すると良いでしょう。

# 7. Getting a level instance
各レベルをプレイするする時、Ethernautコントラクトを直接操作することはありません。
代わりに「level instance」を生成するように依頼します。
これを行うには、各レベルのページの下部にある青色の「Get New Instance」ボタンをクリックします。
押すとトランザクションが生成され、Metamaskから承認を求められますので、「Submit」ボタンを押してトランザクションを実行してください。

# 8. Inspecting the contract
ｅｔｈｅｎａｕｔコントラクトと同じく、コンソールを使ってABIを調べる事ができます。

# 9. Interact with the contract to complete the level
ここからレベル情報のメソッドを調べてください。

```
contract.info()
```

まずは、書かれているレベル情報メソッドを実行します。


```.js
await contract.info()

"You will find what you need in info1()."
```

infoメソッドを実行すると「```info1()に必要なものがみつかります```」とある為、```info1()```を実行することにする

```.js
await contract.info1()

"Try info2(), but with "hello" as a parameter."
```

「```info2()を試して。でも、”ｈｅｌｌｏ”をパラメータとして使ってください。```」とあるので、言われた通り実行する

```.js
await contract.info2("hello")

"The property infoNum holds the number of the next info method to call."
```

「```infoNumプロパティに次に呼び出す情報メソッドの番号が保持されている```」とあるので```infoNum()```を実行する。

```.js
await contract.infoNum()
▼ t {s: 1, e: 1, c: Array(1)}
  ▶︎ c: [42]
    e: 1
    s: 1
  ▶︎ __proto__:Object
```

こちらの数値は浮動小数点数の表記で次の形になるのですが桁が少ないウチはC:の仮数部の値をそのまま読めると思います。

```
c:　仮数部
s: ｓｉｇｎ　（符号部）
e: exponent（指数部）
```

この場合、メソッド番号が「４２」となるので```ｉｎｆｏ４２()```と実行します

```.js
await contract.info42()

"theMethodName is the name of the next method."
```

コントラクトの「theMethodName」プロパティに次のメソッド名があるのでそのまま実行します。

```.js
await contract.theMethodName()

"The method name is method7123949."
```
次の実行するメソッド名が出ましたのでそのまま実行します

```.js
await contract.method7123949()

"If you know the password, submit it to authenticate()."
```

「```パスワードが解っているのであれば、authenticate()に送信してください。```」とあります。
パスワードを送信するのは上にありましたパラメータを使うのと同じであるので、パスワードを調べます。

```.js
await contract

 ▶︎ n {constructor: ƒ, abi: Array(11), contract: u, password: ƒ, infoNum: ƒ, …}
```
contractの中にpasswordのメソッドがありますので実行します。

```.js
await contract.password()

"ethernaut0"
```

パスワードが判明しましたのでパラメータとして```authenticate()```に送信します。

```.js
await contract.authenticate("ethernaut0")

 ▶︎ {tx: "0xb85d8ae3ffb0f3b494badda9fcffa28ea99968868cc64b6889ac2e09f8308230", receipt: {…}, logs: Array(0)}
```

authenticate()はトランザクションを送信する為、Metamaskの承認が促されます。
「SUBMIT」して少しの間トランザクションの処理を待てば、完了となります。
パスワードが間違っている場合は、Revertされますので入力した内容を見直してください。

ここまで行えれば、Level.0 Hello Ethernautの完了です。
黄色い「Submit Instance」ボタンをクリックして完了させてください。
トランザクションが生成される度に、Metamaskの承認を要求されます。都度、忘れずにSubmitを行ってください。

![スクリーンショット 2018-07-26 19.27.55.png](https://qiita-image-store.s3.amazonaws.com/0/243376/d946f57a-a0f2-7726-a017-55a1d7fda29e.png)