【Solidity】VSCodeでコントラクト開発をして、Remixで動作確認する。

## はじめに

VSCodeでSolidityのコードを書いてコントラクトを開発し、Remixで動作確認をする方法を書いていきます。

## 流れ

* VSCodeに拡張機能を追加する
* コントラクトのコードを書く
* 動作確認する

## VSCodeに拡張機能を追加する

VSCodeに拡張機能を追加していきます。
以下2つを追加します。

* Ethereum Remix Project extension for Visual Studio Code
* Solidity support for Visual Studio code

|Ethereum Remix|Solidity|
|-|-|
|![スクリーンショット 2022-09-01 16.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/c153e0f3-0546-0843-ce87-a72fe2c28fc4.png)|![スクリーンショット 2022-09-01 16.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/b9575d69-e285-935d-af1f-125ca3c5f62a.png)|
|Remixの動作確認に使用。Remixの機能が使える。|Remixの動作確認には不要。シンタックスハイライト・警告表示とかコード補完とかSolidityの開発に便利な機能が色々と使える。|

## コントラクトのコードを書く

空のディレクトリを作成し、VSCodeで開きます。

```
mkdir contract-sample //contract-sampleディレクトリの作成するコマンド
code contract-sample //contract-sampleディレクトリをVSCodeで開くコマンド
```
![スクリーンショット 2022-09-01 17.07.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/052d3816-ae74-ed9f-232f-e4024def4940.png)

VSCodeで、Contract.solファイルを作成しSolidityのコードを書いていきます。
 
```Contract.sol
pragma solidity ^0.8.0;

contract SampleContract {
    uint256 private count = 0;
    string public publicData = "public data";

    function hello() public pure returns (string memory) {
        return "Hello Sample Contract";
    }

    function getCount() public view returns (uint256) {
        return count;
    }

    function countUp() public {
        count++;
    }
}
```

![スクリーンショット 2022-09-01 17.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/9ab03c9e-83a2-7509-8c1a-e1713e236968.png)

とてもシンプルなコントラクトが作成できました。

1行目の警告は、ライセンスの記述が無いために起きています。
`// SPDX-License-Identifier: MIT`みたいな記述があると警告は消えますが今回は無視して進めます。

## 動作確認する

### Remixと接続する

左のタブからETHREUM REMIXを開きます。

Run & DeployをクリックしてActivateをクリックします。

クリックするとRun & Deployが開きます。
![スクリーンショット 2022-09-01 17.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/4dd4873c-4bcb-f94b-0fab-b7d9e39c25a1.png)

Run & DeployにあるConnect to REMIX をクリックします。
出力には以下のような出力が表示されます。

```
Connecting to Remix ... please go to https://remix.ethereum.org to connect to localhost in the File Explorer.
```

書いてある通りに、https://remix.ethereum.org を開き、localhostと接続をしていきます。

1. Remixを開く
2. Workspacesでlocalhostを選択する
3. 接続の確認のアラートボックスが表示されたら「Connect」をクリックする

|Workspacesでlocalhostを選択|Connectを選択|
|-|-|
|![スクリーンショット 2022-09-01 17.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/63ba1fef-0927-cc1a-adfd-0e907c925eac.png)|![スクリーンショット 2022-09-01 17.36.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/d84aa823-c405-f820-4e0b-9884d8c7d271.png)|

Remixと接続が出来たら、VSCodeの「Run & Deploy」の表示も変わりました。

![スクリーンショット 2022-09-01 17.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/a952898c-c2d3-b8aa-9c9e-6717c1e31b0a.png)

### コンパイルしてデプロイする

#### Remix側で動作確認

Remixを開いてRemix上で動作確認していきます。

左メニュータブからFILE EXPLORERを開き、Contract.solを開きます。

![スクリーンショット 2022-09-01 17.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/632481ca-0415-3d7a-46bd-1954239537ce.png)

左メニュータブからSOLIDITY COMPILERを開き、Compile Contract.sol(青いボタン)をクリックします。

![スクリーンショット 2022-09-01 17.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/0b2677c5-ffc2-5f82-31c3-792694ce5eff.png)

左メニュータブからDEPLOY & RUN TRANSACTIONSを開き、CONTRACTがContract.solになっているのを確認したら、Deploy(オレンジのボタン)をクリックします。

![スクリーンショット 2022-09-01 17.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/638884d3-d037-a46b-78fe-6b2553ef606a.png)

デプロイが完了するとDEPLOY & RUN TRANSACTIONSの下の方にあるDeployed Contractsの中にデプロイしたコントラクトが表示されます。
ここから動作確認することが可能です。

動作確認をしていきます。

![スクリーンショット 2022-09-01 17.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/7b790cd3-0127-5040-b50f-a0b44859410c.png)

countUp、getCount、hello、publicDataの4つが表示されています。
countはprivateのしているので表示されていません。

getCountをクリックしてみます。

![スクリーンショット 2022-09-01 17.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/e53cc2c8-4a6b-7ef5-89cb-f01e2dbcb9da.png)

getCountの下に0 (0:uint256: 0)と表示することができました。
countの初期値は0なので0です。

右側にはトランザクションの情報が出力されています。
トランザクションの送信元アドレス(from)や送信先のコントラクトアドレス(to)、inputやoutputなども見ることができます。

helloをクリックしてみると、"Hello Sample Contract"の文字列が、
publicDataをクリックしてみると、"public data"の文字列が、
ボタンの下とトランザクションのdecoded outputに表示されました。

![スクリーンショット 2022-09-01 18.04.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/f09653b2-281b-1f61-6386-0bcf3cc3e9bc.png)

countUpをクリックしてからgetCountをクリックしてみると、1回目は0でしたが、1を取得することができました。無事にcountが更新されている様です。

![スクリーンショット 2022-09-01 18.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/c025a80a-a5c6-6e15-a27c-11436a814036.png)

Remix上で動作確認をすることができました 🎉

VSCodeを開き、Disconnectをクリックすると、Remixとの接続が切れて確認は出来なくなります。

|VSCode|Remix|
|-|-|
|![スクリーンショット 2022-09-01 18.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/4eb78e3e-ac6a-9f09-24f5-572b39c260f9.png)|![スクリーンショット 2022-09-01 18.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/a4e0721a-035d-aa09-0983-b9026b010be7.png)|

#### VSCode側で動作確認

Remixと接続した状態で、VSCode側で動作確認することも可能です。
Remix側で動作確認するときとやってることはほとんど一緒なので簡単に書いていきます。
VSCodeの「Run & Deploy」で操作していきます。

![スクリーンショット 2022-09-01 18.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/120b402b-5c9a-b081-3999-c54fb64caaf4.png)

|||
|-|-|
|Compileボタンをクリックする|![スクリーンショット 2022-09-01 18.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/f1903660-364e-848b-e4ba-e064d37d44e6.png)|
|Deployボタンをクリックする|![スクリーンショット 2022-09-01 18.23.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/9b7ed757-9197-aa7a-244e-2e7a365d1f12.png)|
|ボタンを押して動作確認をする|![スクリーンショット 2022-09-01 18.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/6da9af20-b326-3dd7-be9f-80aec9fe8c4c.png)|

出力の値(returnの値)は、出力タブに表示されました。
![スクリーンショット 2022-09-01 18.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/24330052-aba5-7ecf-7e51-ce73f073a02b.png)



## おわりに

簡単なサンプルを使って、VSCode上で書いたコントラクトをRemix上で動作確認する方法を解説しました。

他には、Remix環境ではなくlocal blockchain networkにデプロイすることも可能です。Ganacheなどを使い、Connect to REMIXの上にあるConnectの方のボタンを使って行うことができます。

この[動画](https://www.youtube.com/watch?v=tcnpGeOiA_M)などで解説されているのでこちらの方法も試してみるといいかもしれません。

## 参考

[How to run Solidity Smart Contract in VS Code?](https://matrixxcode.com/how-to-run-solidity-smart-contract-in-vs-code/)
[YouTube - How to use: Remix VSCode Extension](https://www.youtube.com/watch?v=tcnpGeOiA_M)