Web3.0検証(5)-Blockchainの基本

##### [前回] [Web3.0検証(4)-分散型アプリをRemixで作ってみる](https://qiita.com/mingchun_zhao/items/145bd2c74001c287b17f)

## はじめに

Web3.0分散型アプリ(DApp)を、Truffleフレームワークや統合開発環境Remixを使って簡単に検証できました。
バックエンドはブラックボックスになっており、どのように処理が行われているか気になります。
特に、Web3.0アーキテクチャを理解する上で、避けては通れないブロックチェーン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/52a4b08c-162e-9ba1-8493-6192e70d96b8.png)

そこで、ローカルにブロックチェーン開発環境を構築し、その内部構造を覗いてみることにします。

## ブロックチェーンとは

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)の情報をベースに、ブロックチェーンの定義と特性を確認します。

- ブロックチェーンとは、暗号技術を使ってリンクされた、ブロックと呼ばれるレコードの増大するリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/324730ac-397a-862b-96c3-e90ee84d1d0b.png)
- 各ブロックには、前のブロックの暗号化ハッシュ、タイムスタンプ、トランザクションデータ（一般的にはマークルツリーで表される）が含まれる
    - マークルツリーとは、データの要約結果を格納するツリー状のデータ構造
- ブロックチェーンはデータの改変に強い
    - 2つの当事者間の取引を効率的かつ検証可能で恒久的な方法で記録することができるオープンな分散型台帳
    - 分散型台帳として使用する場合、ブロックチェーンは通常、ピアツーピア(P2P)のネットワークによって管理される
    - ノード間通信と新しいブロックの検証のためのプロトコルに準拠
    - 一度記録されたブロックのデータは、後続のすべてのブロックを変更しない限り、遡及的に変更することはできない
    - ブロックチェーンの記録は変更不可能ではないが、ブロックチェーンは設計上安全であると考えられる

## ブロックチェーンの開発環境構築

ゴールは、スマートコントラクトのデプロイ用Ethereum環境を構築し、Solidity言語を使用しその機能を検証することです。

Geth(Go Ethereum)を使用し、ローカルにブロックチェーンプライベートネットワークを構築します。

- Gethは、Ethereumブロックチェーンのクライアントツールで、Go言語で実装されている
    - Gethを使って、メインEthereumブロックチェーンネットワーク、RinkebyやRopstenなど公式テストネットワークに接続可能
    - プライベートネットワークを作成することも可能
    - GitHubからダウンロードできる、コマンドラインツール

## 検証環境

```
CPU: Intel(R) Core(TM) 3.30GHz(4コア8スレッド)
メモリ: 16 GB
OS: Ubuntu 20.04 LTS
```

ちなみに、Ubuntuは、Windows 10で以下のように管理者権限で導入しました。

```
> wsl --install -d Ubuntu-20.04
```

## Gethのインストール

端末を開きます。

### GitHubから`Go Ethereum`プロジェクトをクローン
```
$ git clone https://github.com/ethereum/go-ethereum.git
```

### Gethビルドに必要なGO言語をインストール
- Goインストールパッケージをダウンロード
```
$ wget https://dl.google.com/go/go1.18.1.linux-amd64.tar.gz
```
- sha256sumコマンドを使用し、ダウンロードしたtarボールのSHA256 Checksumを取得
```
$ sha256sum go1.18.1.linux-amd64.tar.gz
b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334  go1.18.1.linux-amd64.tar.gz
```

- [Goダウンロードページ](https://go.dev/dl/)で、
`go1.18.1.linux-amd64.tar.gz`のSHA256 Checksumと一致するか確認
```
b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334
```

一致しました。

- Goパッケージを解凍
```
$ sudo tar -C /usr/local -xzf go1.18.1.linux-amd64.tar.gz
```

- `~/.profile`を編集し、PATH環境変数にGoのbinディレクトリを追加
```
$ sudo vi ~/.profile
export PATH=$PATH:/usr/local/go/bin
$ . ~/.profile
```

- Goのバージョンを確認
```
$ go version
go version go1.18.1 linux/amd64
```
### Go Ethereumをソースからビルド

- 作業ディレクトリを、gitプロジェクトのクローンを作成したディレクトリに変更
```
$ cd go-ethereum
```
- Gethをビルド
```
$ make geth
```
- Gethのバージョンを確認
```
~/go-ethereum$ ./build/bin/geth version
Geth
Version: 1.10.18-unstable
Git Commit: bb5633c5ee3975ce016636066ec790054ec469e4
Git Commit Date: 20220417
Architecture: amd64
Go Version: go1.18.1
Operating System: linux
GOPATH=
GOROOT=go
```

- `~/.profile`を編集し、GOPATH環境変数を追加、PATH環境変数にGethのbinディレクトリを追加
```
$ sudo vi ~/.profile
export GOPATH=~/go-ethereum/build
export PATH=$PATH:$GOPATH/bin
$ . ~/.profile
$ which go
/usr/local/go/bin/go
```

### Gethを起動してみる
```
~/go-ethereum$ geth
INFO [04-20|05:26:45.105] Starting Geth on Ethereum mainnet...
INFO [04-20|05:26:45.105] Bumping default cache on mainnet         provided=1024 updated=4096
INFO [04-20|05:26:45.107] Maximum peer count                       ETH=50 LES=0 total=50
INFO [04-20|05:26:45.107] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
WARN [04-20|05:26:45.108] Sanitizing cache to Go's GC limits       provided=4096 updated=3989
INFO [04-20|05:26:45.108] Set global gas cap                       cap=50,000,000
INFO [04-20|05:26:45.109] Allocated trie memory caches             clean=598.00MiB dirty=997.00MiB
INFO [04-20|05:26:45.109] Allocated cache and file handles         database=/home/zhao/.ethereum/geth/chaindata cache=1.95GiB handles=2048
INFO [04-20|05:26:50.845] Opened ancient database                  database=/home/zhao/.ethereum/geth/chaindata/ancient readonly=false

... ...

INFO [04-20|05:26:50.888] Starting peer-to-peer node               instance=Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1
INFO [04-20|05:26:50.935] New local node record                    seq=1,650,399,325,972 id=dc954b0fe4e7cd51 ip=127.0.0.1 udp=30303 tcp=30303
INFO [04-20|05:26:50.935] Started P2P networking                   self=enode://39f3654f87d5d47198061b1aaed1fd7c2ff3bd3306fc8fadf6485cbb8a3a3853b4c36d30dbcd360700b6da503587368e84547adb6f7b7ac362a8d7acabb53d1d@127.0.0.1:30303
INFO [04-20|05:26:50.936] IPC endpoint opened                      url=/home/zhao/.ethereum/geth.ipc
INFO [04-20|05:26:51.431] Finished upgrading chain index           type=bloombits
```

P2Pノードが開始できたようです。

### Ctrl+Cで、Gethを停止
```
... ...

INFO [04-20|05:21:42.670] Writing clean trie cache to disk         path=/home/zhao/.ethereum/geth/triecache threads=8
INFO [04-20|05:21:42.675] Persisted the clean trie cache           path=/home/zhao/.ethereum/geth/triecache elapsed=5.130ms
INFO [04-20|05:21:42.675] Blockchain stopped
```

## おわりに

Geth導入まで終わりました。
次回は、Gethを使用し、ブロックチェーンプライベートネットワーク環境を構築します。
何ができるかわくわくしてきました、お楽しみに。

##### [次回] [Web3.0検証(6)-Blockchainのプライベートネットワーク](https://qiita.com/mingchun_zhao/items/74ccdbc3ddeea2ab6e9a)