Truffleで始めるスマートコントラクト開発入門 


## 概要
ブロックチェーン技術について調べていた際、
イーサリウムの取引についてはブロックチェーンの実装にスマートコントラクトを取り込むことで
取引の自動化・効率化を図っているということを知りました。
実際にブロックチェーン上で動作する取引の実装について理解を深めるため、
開発環境を構築して行きたいと思います。

## スマートコントラクトとは
スマートコントラクトという言葉に聞きなじみはあるでしょうか。
自分はあまりなかったですが、イーサリウム上で実行されるプログラムであり、
ブロックチェーンが保持するセキュリティや信頼性を活用して取引などの機能を実装できるものということのようです。
取引を自動化する事で、第3者の仲介がなく契約の履行が可能になることが利点の一つとして挙げられています。
これはブロックチェーン技術の信頼性やセキュリティがあってこその利点に見えますね。

# Truffleとは

![Truffle_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/da22d95e-1e98-0660-2a8a-176f0307b852.png)

https://trufflesuite.com/docs/truffle/

Truffleとはイーサリウムアプリケーション開発におけるフレームワークの一つのようです。
Truffleで開発したコントラクトはイーサリウムに対して実行する処理に当たるので、
Web開発で言うところのバックエンドに似た役割を持つように感じました。
他にもコントラクトにアクセスするフロントエンドを構築するためのdrizzleというフレームワークもあるようです。



# Solidityとは
![solidity_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/f6a7aa13-820a-24e0-e0ee-235231941c08.png)

https://solidity-jp.readthedocs.io/ja/latest/

Solidityはスマートコントラクトを扱えるオブジェクト指向言語で、
イーサリアム上で動作するコントラクトを記述することができます。

実際にTruffleフレームワークでコントラクトを開発する際に用いる言語になります。
SolidityはC++、Python、JavaScriptを参考に、Ethereum Virtual Machine（EVM）の操作を目的に作られています。

CryptZombiesというサイトで文法をゲーム作成を通じて勉強できるみたいなので自分も試してみたいと思っています。

https://cryptozombies.io/jp/


# 開発環境の準備
今回はEthereumアプリケーション開発におけるフレームワークであるTruffleの開発環境を整えていきたいと思います。
またローカル開発用にノードを構築できるGanascheを導入したいと考えています。

参考までに今回自分が使用したバージョンを載せておきます
* OS: Windows 10 Home
* npm: 8.11.0
* Truffle v5.5.22 (core: 5.5.22)
* Ganache v7.3.2
* Solidity v0.5.16 (solc-js)
* Node v16.16.0
* Web3.js v1.7.4

## truffleのインストール
npm installにて行います。
```truffleのインストール
npm install -g truffle
```

truffleをインストールした際、
``npx truffle version`` にてバージョンの確認が行えます！

Ganacheについてはローカル開発用のツールで、
実際に個人用のEthereumブロックチェーンを素早く起動し、テスト実行、コマンド実行、状態の検査に使用しながらチェーンの動作方法を制御できます。

## Ganache(デスクトップ)のインストール
下記のリンクより公式ページに飛びます。

https://trufflesuite.com/ganache/

下記のリポジトリよりクローンして利用するのもアリだと思います。

https://github.com/trufflesuite/ganache-ui

インストール後Ganacheを起動すると100 ETH 持つアカウントが自動的に 10個 生成されます。

![ganache2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/d34d7191-ee10-d917-c3d7-8c4aadb2f99a.png)

# Truffleプロジェクト作成
テスト用のディレクトリに移動し、initコマンドにてプロジェクトを作成します。
![truffle_init.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/4d25b411-8311-9345-ce5c-9f2ff2410493.png)


すると下記のような構成のプロジェクトが出来上がりました。
![truffle_init2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/dabadf49-8f39-1867-5d1f-4bb4f345ca09.png)


次にtruffle-configを編集してGanachaと連携できるように編集します！

    development: {
     host: "localhost",     
     port: 7545,            
     network_id: "*",       
    },


portの部分を追記する際にはganachaの画面上部を参考にするとよいと思います。
![ganacha_port.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/205d82a6-6bee-b942-0d88-408dd4530673.png)

上記を追記...
![truffle_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/f53196e4-a07d-f02f-77f0-84f5819fe442.png)


コンソールから接続できるか確認します。
![truffle_console_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/b9867607-a944-6699-0d7c-f09a4fedd4ae.png)
問題なさそう。

# ブロックチェーンの読み書きを試す
プロジェクトの作成もできたので、実際にETHの操作が行えるのかどうか
確認してみたいと思います。

## コントラクトファイルの作成
contractsフォルダにHogeContract.solを作成しました。
コントラクトをETHに対して書き込みたいだけですので、
特に処理は現在記載していません。

``` HogeContract.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract HogeContract {

}
```



## マイグレーションファイルの作成
次にmigrationsディレクトリにも2_hogeContract_migractions.jsを作成します。
記述処理としては、先ほど作成した空のコントラクトをブロックチェーンに書き込むための処理となります。

``` 2_hogeContract_migractions.js
const HogeContract = artifacts.require("HogeContract");

module.exports = function (deployer) {
  deployer.deploy(HogeContract);
};
```


## ブロックチェーンへの書き込み
実際に書き込みが行われているかを確認してみたいと思います。

``truffle migrate``コマンドで実行できます。

![truffle_migrate_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/6fe10d8c-bca3-36ef-6d45-6a8939c90670.png)

![truffle_migrate_test_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/44a40b75-1963-8fa7-1c33-a6e8ae1b2741.png)


実行結果を見ると各Migrationsがどのアカウントで実行され、
どれだけのガス代が消費されたかが確認できますね。

実際にGanachaで確認してみたいと思います。

![truffle_migrate_ganacha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/b505a26d-9dc0-ff59-0d12-b5610debb045.png)

確認すると反映されていることがわかりました！

コントラクトをブロックチェーンに書き込む(デプロイする)際にも
ガス代がかかるんですね…当然だと思いますが実際に動作して初めて気づきました。

## コンソールの動作確認
ここで、先ほどTruffleプロジェクト作成の項目で接続を確認したコンソール上にてブロックチェーンの情報を取得できるかどうか動作確認してみます。

今回は先ほど作成したHogeContractがデプロイされているかどうかを
インスタンスを取得してアドレスを確認することで動作確認したいと思います。

先ほどのようにtruffle console コマンドを使用しコンソールを立ち上げた後、

コントラクトインスタンスを作成し、アドレスを取得します。
![truffle_console_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/634ecab7-7b1f-e052-3c8b-f5135c51ad94.png)


確認できました！
ただこれはコントラクト（処理）のインスタンスアドレスなので、
Ganacha上で作成されているEthのアドレスとはまた別のものになります！
ちょっと実際に触った際に混乱しました...

# まとめ
今回の記事ではブロックチェーン技術について調べていた際に見つけた
スマートコントラクトについて体験してみるべく、
Truffleフレームワークを使用した開発環境の構築を行いました！

実際に触ってみることで、ブロックチェーンに対してネットワークを介して操作を行うことでガス代が実際に発生することや、そもそものスマートコントラクトの概念を調べる機会につながりこれから自分でいろいろ試してみたいことが増えました！

Truffleフレームワークを主に話していましたが、
今後の記事でもSolidityの公式のイントロダクションなどを読み進め、
METAMASKとの連携やdrizzle,React等のフロント上でEthの取引がシュミレーションできるアプリなど作成してみたいと思います！

ありがとうございました！