[前回] Web3.0検証(4)-分散型アプリをRemixで作ってみる
はじめに
Web3.0分散型アプリ(DApp)を、Truffleフレームワークや統合開発環境Remixを使って簡単に検証できました。
バックエンドはブラックボックスになっており、どのように処理が行われているか気になります。
特に、Web3.0アーキテクチャを理解する上で、避けては通れないブロックチェーン。
そこで、ローカルにブロックチェーン開発環境を構築し、その内部構造を覗いてみることにします。
ブロックチェーンとは
Wikipediaの情報をベースに、ブロックチェーンの定義と特性を確認します。
- ブロックチェーンとは、暗号技術を使ってリンクされた、ブロックと呼ばれるレコードの増大するリスト
- 各ブロックには、前のブロックの暗号化ハッシュ、タイムスタンプ、トランザクションデータ(一般的にはマークルツリーで表される)が含まれる
- マークルツリーとは、データの要約結果を格納するツリー状のデータ構造
- ブロックチェーンはデータの改変に強い
- 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ダウンロードページで、
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を使用し、ブロックチェーンプライベートネットワーク環境を構築します。
何ができるかわくわくしてきました、お楽しみに。