# Remix IDE&Metamaskの使い方 Remix IDEとはブラウザ上で実行できるスマートコントラクトのIDE環境です。 Metamaskはブラウザの拡張機能として使用できるEthereumネットワークのウォレットです。 今回はこの2つを利用するだけで、スマートコントラクトをコーディングし、Ethereumブロックチェーンにデプロイできます。 ## 手順1 MetamaskのネットワークをGoerliになっているか確認&Goerliで通貨を所有しているか確認 以下の画像のように、Goerliテストネットワークに接続されているか&通貨を所有しているか確認します。 Goerliテストネットワークへの接続方法は事前に共有した資料を参照してください。 また、「Goerli Faucet」とかでググると、Goerliテストネットワークの通貨をお布施してくれるサイトが何個か出てくるので、それらのサイトを使って通貨をもらうようにしてください。 (もし上手くいかない人は事務局に連絡してください。限りがありますが、対応できます。) <img src="https://i.imgur.com/7WqbP01.png" width="50%"><br><br> ## 手順2 RemixIDEにアクセスする。 Remix IDE(https://remix.ethereum.org/)にアクセスしてください。 以下の図のように、Injected Web3を選択すると、Metamaskの画面が開かれるか、ブラウザの右上にあるMetamaskのアイコンを見ていると青で①と表示されています。<br> <img src="https://i.imgur.com/U85zPZi.png" width="50%"><br> ここで接続するアカウント(ウォレット)を選択して、RemixIDEとアカウントを接続します。 ※スマートコントラクトをコーディングしてテストしたいときは、Remix IDE上で仮想的にブロックチェーンが実行される「Javascript VM」でテストすることを強く推奨します。もし、テストが成功したら、上記のようにテストネットに接続して、実際にコントラクトをデプロイしてチャレンジしてみてください。 ## 手順3 スマートコントラクトのコーディングとデプロイ ここで実際にスマートコントラクトをコーディング&デプロイしてみましょう。 EthereumのスマートコントラクトはSolidityという独自言語でプログラムされます。(別の言語もあるといえばあるのですが、ほとんど使用されないので今回は無視してください) Remix IDEの左のメニューバーの一番上(File Explorer)を選択し、ファイルを新規作成します。 (このとき、ファイル名に.solをつけるようにしてください) <img src="https://i.imgur.com/msktGAO.png" width="50%"><br> また、デフォルトで色々なファイルが生成されてますが、無視して大丈夫です。 今回のReentracyという問題では、攻撃対象のコントラクトは http://crypto.katagaitai-ctf.com:3000/level/0xC61d459A1535465af9aE21C59bcC4fae64f8c879 にあるものです。 なお、攻撃対象のコントラクトを悪用するコントラクトは配布している`attack.sol`です。 ここでは、http://crypto.katagaitai-ctf.com:3000/level/0xC61d459A1535465af9aE21C59bcC4fae64f8c879 にある攻撃対象のコントラクトをデプロイしてみます。 デプロイする際は「Deploy」というボタンを押します。 なお、`attack.sol`をデプロイする際は、「CONTRACT」欄の`attacker - contracts/attack.sol`でデプロイしてください。 ![](https://i.imgur.com/ZVTraqt.png) すると、以下のようにMetamaskが起動するか、ブラウザの右上にあるMetamaskのアイコンを見ていると青で①と表示されています。 <img src="https://i.imgur.com/HhdYK6S.png" width="50%"><br> ※実際の問題では、Remix IDE上で攻撃対象のコントラクトをGoerliネットワークにデプロイする必要はなく、「インスタンスの生成」という青いボタンを押してトランザクションを実行させれば大丈夫です。 ※もしRemix IDE上で仮想的にブロックチェーンが実行される「Javascript VM」でテストしてみたければ、「Javascript VM」で攻撃対象のコントラクトをデプロイしてみてください。 もし、デプロイに成功すると、以下のように左下の「Deploy Contracts」にデプロイしたコントラクトが表示されます。 <img src="https://i.imgur.com/47g7jfF.png" width="100%"><br> ここまでがデプロイの流れです。 ## スマートコントラクトの実行 ここで、attack.solをデプロイしたとして、どういうふうにコントラクトの関数を呼び出してトランザクションを発行すればいいかを説明します。 attack.solをデプロイすると以下のように表示されると思います。 <img src="https://i.imgur.com/9pCUzVL.png" width="50%"><br><br><br> なお、ここでattackを実行する際に入力するアドレスは、問題上 http://crypto.katagaitai-ctf.com:3000/level/0x29241DaEE46cC3363096762788275F7b1C5Bfd39 でインスタンスを生成した際にコンソールに表示されるインスタンスのアドレスを入力します。 <img src="https://i.imgur.com/BwPCVf7.png" width="70%"><br><br><br> 今回、インスタンスを生成した際に”0.01 Ether”がインスタンス(コントラクト)に送金されています。 このインスタンス(コントラクト)は被害者のコントラクトなので、この残高が0になれば問題クリアです。 攻撃用コントラクトからattack関数を呼び出す際、以下のように入力・確認します。 ・getTotalを押下しattack.solの残高が0であることを確認 →情報を読み込むだけなので手数料(トランザクション)は発生しません <br> ・VALUEを5000000Gwei(=0.005) Ether ※画像では1000000Gwei(=0.001) Etherになっていますが、5000000Gwei(=0.005) Etherにしておくのをおすすめします。 ・「attack」関数にインスタンスのアドレスを入力し、attackを押下 <img src="https://i.imgur.com/2eL477m.png" width="50%"><br><br><br> トランザクションが正しく発行され、getTotalを押下したときに、以下のように表示されれば成功です。 あとは、インスタンスの提出をしてフラグをゲットし、スコアサーバでフラグを送信するだけです。 <img src="https://i.imgur.com/iBptx4V.png" width="70%"><br>