Remix: Ethereum IDEの使い方

## Remix: Ethereum IDE
RemixとはブラウザでEVMのスマートコントラクトの開発言語であるSolidityを使って、スマートコントラクトが開発できるIDEです。

## Remixでできること
この記事では[Remix: Ethereum IDE](https://remix.ethereum.org/)を使って、

- スマートコントラクトの実装
- スマートコントラクトをローカル環境にデプロイ

上記を行うための情報を共有します。

他の機能についてはRemixのドキュメントをご参照ください。


## スマートコントラクトの実装

[こちらをクリックすると事前に用意したコードが実装された状態から始めることができます。](https://remix.ethereum.org/?#code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC4yOwoKaW1wb3J0ICJAb3BlbnplcHBlbGluL2NvbnRyYWN0c0A0LjQuMi90b2tlbi9FUkM3MjEvRVJDNzIxLnNvbCI7CmltcG9ydCAiQG9wZW56ZXBwZWxpbi9jb250cmFjdHNANC40LjIvYWNjZXNzL093bmFibGUuc29sIjsKaW1wb3J0ICJAb3BlbnplcHBlbGluL2NvbnRyYWN0c0A0LjQuMi91dGlscy9Db3VudGVycy5zb2wiOwoKY29udHJhY3QgTkZUIGlzIEVSQzcyMSwgT3duYWJsZSB7CiAgICB1c2luZyBDb3VudGVycyBmb3IgQ291bnRlcnMuQ291bnRlcjsKCiAgICBDb3VudGVycy5Db3VudGVyIHByaXZhdGUgX3Rva2VuSWRDb3VudGVyOwoKICAgIGNvbnN0cnVjdG9yKCkgRVJDNzIxKCJORlQiLCAiTkZUIikge30KCiAgICBmdW5jdGlvbiBfYmFzZVVSSSgpIGludGVybmFsIHB1cmUgb3ZlcnJpZGUgcmV0dXJucyAoc3RyaW5nIG1lbW9yeSkgewogICAgICAgIHJldHVybiAiaHR0cDovL2xvY2FsaG9zdDozMDAwLyI7CiAgICB9CgogICAgZnVuY3Rpb24gc2FmZU1pbnQoYWRkcmVzcyB0bykgcHVibGljIG9ubHlPd25lciB7CiAgICAgICAgdWludDI1NiB0b2tlbklkID0gX3Rva2VuSWRDb3VudGVyLmN1cnJlbnQoKTsKICAgICAgICBfdG9rZW5JZENvdW50ZXIuaW5jcmVtZW50KCk7CiAgICAgICAgX3NhZmVNaW50KHRvLCB0b2tlbklkKTsKICAgIH0KfQo&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js)

上記をクリックすると、下記のような画面に遷移します。

![Screen Shot 2022-01-31 at 22.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/43525320-704b-c8a2-e048-2a62994cd2d2.png)

実装されているコードは下記の通りです。

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "@openzeppelin/contracts@4.4.2/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@4.4.2/access/Ownable.sol";
import "@openzeppelin/contracts@4.4.2/utils/Counters.sol";

contract NFT is ERC721, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("NFT", "NFT") {}

    function _baseURI() internal pure override returns (string memory) {
        return "http://localhost:3000/";
    }

    function safeMint(address to) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }
}

```

上記は


- コントラクトの管理者がNFTを連番方式で発行し任意のアドレスに送付することができる
- NFTのデータはhttp://localhost:3000で管理されている

というコードです。

ここでは、コードの細かい意味ついての紹介は省略します。Solidityの細かい書き方については、[CryptoZombies](https://cryptozombies.io/jp/)という学習サービスがおすすめです。

Remixではブラウザ上でコードを書くことができるので、CryptoZombiesで学びながら、Remixですぐ動かして試してみると学習が捗ります。

それでは次にコントラクトをデプロイしてみましょう。

## スマートコントラクトをローカル環境にデプロイ

Solidity Compilerというタブにある、Compile Contractというボタンをクリックして、コントラクトをコンパイルします。

![Screen Shot 2022-01-31 at 22.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/07c27c04-637f-e8f2-6c20-596ae2ddcea7.png)

コンパイルが終わると、次はDeploy & Run Transactionsのタブの、ContractでNFTを選択し、Deployをクリックします。

![Screen Shot 2022-01-31 at 22.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/3a974fc2-e5e4-bf4f-aa08-621c7730fbea.png)

すると下記のようにterminalにデプロイを行なったトランザクションの情報が出力され、Deployed Contractsから、実際にトランザクションを実行することができるようになります。

![Screen Shot 2022-01-31 at 22.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/d2bbd0aa-010a-ae18-a1f7-02482c3f08b8.png)

また、Deploy & Run Transactionsのタブで、EnvironmentをInjected Web3にすると、Metamaskなどのウォレットサービスに接続することができ、テストネットやメインネットなどにデプロイすることも可能です。

![Screen Shot 2022-01-31 at 22.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/74f798ca-f318-d3f4-c620-5e01a9f14480.png)

テストネットで実行した際には下記のようにウォレットに連携でき

![Screen Shot 2022-01-31 at 22.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/31dae6d6-fe56-3e33-bdf6-9193a705679b.png)

発行したトランザクションも[EtherscanなどのExproler](https://rinkeby.etherscan.io/tx/0x30f4f0b44f90913c75a0976e03a01e7ab711a878ef81e67fc92b6ca49010762d)で確認することができます。

ぜひ、試してみてください！

## Hardhatもおすすめです
サクッとスマートコントラクトを開発したいという場合には、Remixはおすすめのツールですが、チーム開発する際は、[Hardhat](https://hardhat.org/)というスマートコントラクト開発フレームワークもおすすめです。Hardhatを使用すると、gitでのコード管理や、テストの自動化ができます。

Hardhatについては別途記事化予定です。