Remixを用いたSolidityのハンズオン

# 概要

2019年11月20日（水）に行われた「先端情報経済AI公開講座」の備忘録です。
Rinkbyネットワークへのスマートコントラクトのデプロイを行います。

# 必要な環境
- Google Chrome

# セットアップ

## ウォレットのインストール
ETHのウォレットである[メタマスク](https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=ja)をインストールする

### 1. `Chromeに追加`ボタンを押す
![MetaMask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/4a80de65-f375-4051-3dfc-f3b9c2befb4d.png)

### 2. `Get Started` ボタンを押す
当該画面が表示されていない場合は、右上のAppのボタンを押してください。

![MetaMask_install_ok.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/369923dd-0214-0b09-4f0f-413e5c71dc02.jpeg)

### 3. `Create a Wallet`ボタンを押す

![MetaMask_Create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/4ff9fa5a-d3b9-5ee8-f98d-30754d128edf.png)

### 4. `I agree`ボタンを押す

![MetaMask_Agree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/c7fbb74b-6552-cbb3-780b-9176dfcd9b8a.png)

### 5. 必要な情報を入力する
① 任意のパスワードを入力
② 欄内に①と同様の物を入力
③ 【利用規約を読み、同意します】にチェック
④ `作成`ボタンを押す
![MetaMask_PassWord.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/586a814e-22fc-61ee-3754-a6dfb5c1d743.png)

### 6. パスフレーズの確認
①の部分をクリックするとパスフレーズが表示されます。
万が一の為にどこかに保存しておいてください！
他人には教えないでください。

確認が終了したら②をクリックしてください。

![MetaMask_BackupPhrase.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/69ab35af-ec81-d5f1-8032-16285ded815f.png)

### 7. パスフレーズの確認
先ほど保存したパスフレーズを入力して、`確認`ボタンを押す

![MetaMask_BackupPhraseCheck.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/4e9c3a19-b436-1f17-4cb1-173ef5e4bbbd.png)

以上でウォレットの登録は完了です！

## RinkebyテストネットでETHを取得する
FacebookやTwitterで取得する方法があるそうです。
今回はTwitterを利用します。

### 1. ウォレットのネットワークをRinkebyテストネットワークに変更する
①の部分を選択して、メニューが表示されたら、②の`Rinkedyテストネットワーク`を押す

![Rinkeby_選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/7128e624-d640-4e75-ac81-5a10b3dc4a27.png)

### 2. [Rinkeby Authenticated Faucet](https://faucet.rinkeby.io/)にアクセスします。

### 3. Twitterの[投稿URL]((https://twitter.com/intent/tweet?text=Requesting%20faucet%20funds%20into%200x0000000000000000000000000000000000000000%20on%20the%20%23Rinkeby%20%23Ethereum%20test%20network.))へジャンプします。

![Rinkeby_Twitter.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/4800de8e-84e5-edc8-3a0e-f4798648d826.png)

### 4. Twitterへの投稿
Twitterの投稿内容のアドレスの部分を自分のウォレットのアドレスに変更して投稿します。

■ 変更箇所
![Rinkeby_Send.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/dde61d64-e2a9-9ab6-5437-631a54a2846e.png)

■ 自分のウォレットのアドレスコピー方法
　MetaMaskのアカウント情報からコピーできます。
　この際、右上のネットワークが「Rinkeby テストネットワーク」になっている事を確認してください。

![Rinkeby_アドレス.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/53390287-b512-846b-2c30-1c9464cd8b07.png)

### 5. Twitterへの投稿内容の確認
下記の`Twitterで確認→`ボタンを押す
![Rinkeby_Twitter_Check.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/1a1d3f93-665b-33a7-cb88-d64eba155a6f.png)

### 6. 投稿のURLを取得する
投稿の下部のボタンからリンクを取得する

1. 共有ボタンを押す
![Rinkeby_TwitterLink.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/fb3d078c-e7ae-fa6e-9792-a86e7412ea21.png)

2. `ツイートのリンクをコピー`ボタンを押す

![Rinkeby_TwitterLinkButton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/3c992b05-d85e-061d-e44b-79c3549366fe.png)

### 7. ETHの取得
コピーしたURLを[Rinkeby Authenticated Faucet](https://faucet.rinkeby.io/)の①「Social network URL containing your Ethereum address...」に入力する
②で取得したいETHを選択する

![Rinkeby_取得.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/17da12c4-ba32-afe4-3472-42b9d3a2fdec.png)

### 8. 確認
Chromeの右上のアプリの部分で「MetaMask」をクリックすると、ETHが取得できている事がわかる。

![Rinkeby_最後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/c1a801f1-cdb4-a202-1659-f2474cd387b4.png)

# Remixを用いてSolidityを使ってみよう
RemixはSolidityのコンパイラ兼統合開発環境です。
バージョンアップも頻繁なので、UIは良く変更される。

## 1. 開発環境の設定

### Remixへアクセスする
[Remixのサイト](https://remix.ethereum.org/)へアクセスしてIDEを起動してください。

### 開発環境を選択する
「Home」のタブで開発環境を選択します。
Environmentsの部分の`Solidity`ボタンを押します。

![１Home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/5c885291-9e2a-0ec5-428d-68c386d2145b.png)


選択すると左側にSolidityのコンパイラ等の設定が表示されます。

※ 追記
「Compiler Configuration」の「Auto compile」を有効にすると、
`プログラム書いている途中からコンパイルしてくれるので、どこが間違えているのかすぐわかります！`
と教えていただいたので追記しておきます！
![２環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/d5965271-63be-35f5-ff74-27c4dee51905.png)



今回は、0.5.11のコンパイラを利用します。

## 2. コーディングしてみる
`+`ボタンを押し、ファイル名（今回はtest.sol）を指定して、`OK`を押します。
![３ファイル名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/7f2881b2-6f34-ccf9-7ead-1a7ef225804e.png)


エディター部分に以下のコードを書きます。

```solidity:test.sol
pragma solidity ^0.5.11;

contract Test{
    uint public num = 5;
}
```

## 3. コンパイルを行う
コードを書き終わったら、左の①部分を選択し、コンパイラの画面を開く。
その後、`Compile test.sol`ボタンを押す。
![４コンパイラ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/fa917888-7ce4-9aa2-9968-695da322c9c5.png)


コンパイラのアイコンにチェックマークが付いた場合は、コンパイルが成功しています。

![５コンパイル成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/486a6c72-d3e0-ea0d-b950-886abefb5bae.png)


## 4. 自分のローカル環境にデプロイしてみる
①のボタンを押し、「DEPLOY & RUN TRANSACTIONS」を開きます。
②の「Environment」が「JavaScript VM」になっている事を確認します。
（JavaScript VMに指定する事で自分のパソコン上でデプロイすることができる）
③の`Deploy`ボタンを押すと、④の「Deployed Contracts」にコントラクトが表示される。
⑤の`num`ボタンを選択すると、プログラムで指定した変数の内容「5」が確認できる。

![６デプロイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/3e84c100-c16e-04a7-c112-591769fea1e1.png)


## 5. さらにコーディングしてみる
エディターに下記のコードを書き込む

```solidity:test.sol
pragma solidity ^0.5.11;

contract Test{
    uint private num = 5;
    
    mapping (address=>uint) public balances;
    mapping (uint=>address) public owner;
    
    function getNum() public view returns(uint) {
        return num;
    }
    
    function setNum(uint _num) public {
        num = _num;
    }
    
    function setBalances(uint _num) public {
        balances[msg.sender] = _num;
    }
}
```

先ほどと同様にコンパイルし、デプロイしてみる。

今回は、変数numをprivateに設定したため、ここでは内容を表示できなくなっている。

## setNum・getNumについての動作確認
①の欄に適当な値を書いて②の`setNum`ボタンを押すと変数numに記載した値が設定されます。
③の`getNum`ボタンを押すと先ほど設定した値が表示されると思います。
![７動作確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/245d0a93-ca5e-4509-6f7f-99e203f44297.png)


## 6. setBalances・balancesについての動作確認
①の欄に適当な値を入力し、②の`setBalances`ボタンを押すとBalancesに値が記憶されます。
（ここら辺の動作がまだしっかり理解できていません）
③の欄に上部の「Account」の値をコピペし、④の`balances`ボタンを押すと先ほどの値が表示されます。

![８動作確認2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/c079ec9f-1b5d-5528-cb84-cfb75ce971ea.png)


## 7. Rinkebyのテストネットにデプロイする
①の「Enviroment」の欄を「Injectid Web3」に変更します。
すると、②の欄に、自分のRinkebyテストネットワークのウォレットアドレスが表示されると思います。
その後、③の`Deploy`ボタンを押してください。

![９テストネットデプロイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/be8d0df1-0566-f60e-4302-10203929a15d.png)


すると、下記のようにGAS代についての確認画面が出るため、`確認`ボタンを押してください。

<img width="406" alt="１０確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/0bd8670d-59d2-6d9a-3138-dfb9d3e59eef.png">


確認後、「Deployed Contracts」に表示が追加されればデプロイ完了です。

## 8. テストネットワーク上での動作確認
先ほどと同様に動作させてみましょう。
今回は、テストネットワーク上にデプロイして動作させているため、下記の操作を行う際は、GAS代が請求されます。

- setNum
- setBalances

下記の操作を行う際は、GAS代が請求されません。

- balances
- getNum
- owner

# まとめ
とても、長くなってしまいましたが、ハンズオンは以上です。
思っていたより簡単にデプロイすることができました。
簡単なDAppsとか作ってみたいと思いました！

内容が間違っている部分や書き方がおかしい部分が有りましたら、ご指摘宜しくお願い致します。