Solidity とは何か？ 開発環境を構築する！

## はじめに
最近、「 Web3（Web3.0）」という言葉を耳にすることが増えたという人も多いと思います。
Web3.0の基盤は、ブロックチェーン技術をベースに構築され、既存のWebの問題点が解決できると期待されています。
この記事では、現在トレンドの Web3（Web3.0）を実現する為に、ブロックチェーン上で動作する仕組みである **Solidity** を理解し、開発環境を構築していきます。

### 参考にした本
* [マスタリング・イーサリアム ―スマートコントラクトとDAppの構築](https://amzn.to/3xRzfF8)
* [SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで](https://amzn.to/3xRWFu5)
* [詳解 ビットコイン ―ゼロから設計する過程で学ぶデジタル通貨システム](https://amzn.to/3xqrGnC)
* [ブロックチェーン dapp＆ゲーム開発入門 Solidityによるイーサリアム分散アプリプログラミング](https://amzn.to/39o2IgD)

## Solidity とは
Solidityとはプログラミング言語の名前で、Ethereumのブロックチェーン上で動作するプログラム（コントラクト）を記述することができるプログラミング言語です。

SolidityはC++、Python、JavaScriptを参考に、Ethereum Virtual Machine（EVM）の操作を目的に作られています。Solidityは静的言語で継承やライブラリ、ユーザーが定義した複雑な型をサポートします。
Solidityで投票やクラウドファンディング、匿名のオークションやマルチシグウォレットなどを作成することができます。

コントラクトをデプロイする際には最新バージョンのSolidityを使うことが推奨されています。

## Solidityの開発環境
:::note warn
こちらの記事ではmac OS で環境構築をおこなっています。
:::

### 必要なツール
* [node.js](https://nodejs.org/ja/)
* [Ganache](https://trufflesuite.com/ganache/)
ローカル開発時に Ethereum プライベートブロックチェーンを可視化するツールです。
* Truffle
Ethereum アプリケーション開発におけるフレームワークです。
* [MetaMask](https://metamask.io/)
イーサリアムブロックチェーンに対応した仮想通貨ウォレットです。

### Solidityのテストとコンパイル手順
#### 1. 必要なツールをインストールする
node.jsをインストールしたら、Truffleをインストールします。
ターミナルを立ち上げて以下のコマンドを実行します。
```
$ npm install -g truffle
```
必要なツールのインストールが完了したら、以下のコマンドを実行します。
```
$ truffle version
```
正しくインストールされている場合、TruffleとSolidityなどのバージョンが表示されます。
エラーが表示される場合は、npmが追加されていることを確認します。

#### 2. プロジェクト作成
新しいアプリケーションを構築するために、greeterというディレクトリを作成し、このディレクトリに移動します。
```
$ mkdir greeter
$ cd greeter
```
空のTruffleプロジェクトを以下のコマンドを実行して作成します。
```
$ truffle init
```
いくつかファイルが作成され、下記の構造になります。
```
.
├── build
│   └── contracts
│       └── Migrations.json
├── contracts
│   └── Migrations.sol
├── migrations
│   └── 1_initial_migration.js
├── test
└── truffle-config.js

5 directories, 4 files
```
##### ディレクトリ構造について
デフォルトのTruffleディレクトリ構造は下記の構成になっています。

`contracts/`：contractsディレクトリには、スマートコントラクトのSolidityソースファイルを置きます。

`migrations/`：ファイルをデプロイする手順をこのmigrationsディレクトリにあるファイルで管理します。migrationsディレクトリに置くファイルには名前の頭に数字を入れるという決まりがあり、その順番に沿ってデプロイが実行されます。
“1_initial_migration.js”という名前のファイルが既に存在しており、これはデフォルトで実行しなければならないので、次の手順を2から始まる名前のファイルに書き込むことになります。

`test/`：スマートコントラクトのJavaScriptテストとSolidityテストのテストファイルが格納されます。

`truffle-config.js`：Truffleプロジェクトの構成ファイル

#### 3. テスト
testディレクトリにgreeter_test.jsを作成します。
```
$ touch test/greeter_test.js
```

```test/greeter_test.js
const GreeterContract = artifacts.require("Greeter");

contract("Greeter", (accounts) => {
  describe("deployment", () => {
    it("has been deployed successfully", async () => {
      const greeter = await GreeterContract.deployed();
      assert(greeter, "contract failed to deploy");
    });
  });
});
```
デプロイ出来るか確認のテストコードです。

#### 4. コントラクト
ここで漸く Solidity を使用したコーディングを行います。
ちなみに、Solidity でスマートコントラクトの構築を学習するのに、[CryptoZombies](https://cryptozombies.io/jp/)がオススメです。

**CryptoZombies**
暗号からゾンビを生み出すゲームの開発を通じて、Solidityでスマートコントラクトの構築を学習できる、インタラクティブなオンラインレッスンです。

https://cryptozombies.io/jp/

**スマートコントラクトのチェックリスト**

https://jeffrey-scholz.medium.com/the-ultimate-100-point-checklist-before-sending-your-smart-contract-for-audit-af9a5b5d95d0

ここからは別の記事で詳しくまとめていく予定です。
追記：2022年07月19日に 「[Truffle のチュートリアル ETHEREUM PET SHOP をやってみた](https://qiita.com/nekoharuyuki/items/d9dd7bf5b5154d259944)」でまとめました。

https://qiita.com/nekoharuyuki/items/d9dd7bf5b5154d259944

#### 5. コンパイル
```
$ truffle compile
```

## まとめ
**Solidity** の基礎を理解し、開発環境を構築していきました。
この記事では、`truffle init` を使って新しいスマートコントラクトプロジェクトを作成する事が出来るようになりました。

今後は以下の内容をまとめる予定です。
* `truffle unbox pet-shop` で作成される、Truffleのチュートリアルで ETHEREUM PET SHOP の流れにそって、実際にウェブ上に分散型アプリケーションを作成する。
* 公開されているテストネットワーク [Görli testnet](https://mudit.blog/getting-started-goerli-testnet/) にデプロイする。