はじめに
一生懸命最適解を探しているAIも可愛いが、せっせとブロックを積み上げているValidatorたちも愛らしい。
この箱庭の愉悦を会社の皆さんに味わってもらおうと、ハンズオンの資料を作ろうとした老技術者。
ところがだ。
開発チームの皆さんは当然のごとくMac使いなのだが、ビジネスチームは皆さんWindows使い。
一昔前だとVMwareだのVirtual PCというそれこそ箱庭の中でごにょごにょするわけだったのだが、現代はWSLなる便利なものをMSさんが用意してくれている。
そして最近それがWSL2になったそうだから気にはなっていたのである。
というわけで久々に火を入れたWindowsマシンでWSL2投入し、ここを乗り切ることにしたのだった。
1. Windows10でUbuntuを使う
参考: https://qiita.com/whim0321/items/ed76b490daaec152dc69
1-1 スタートボタンを右クリックWindows Powershell(管理者)を立ち上げる
1-2 デフォルトでWSL2を使うように設定
Powershellで
wsl --install
でまずはWSLをインストールし,システム再起動。
再度Powershellで
wsl --set-default-version 2
と打ち込みリターン。
1-3 Microsoft StoreからUbuntu 20.04 LTSをインストールし起動
1-4 Ubuntu用ユーザIDとパスワードを設定
1-5 現在のwslのバージョンを確認
Powershellで
wsl -l -v
と打ち込みリターン。
Ubuntu-20.04の行のVERSIONが2となっていればOK。
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
Tips. Windows-Linux間のファイル共有
LinuxからのWindows上のファイルへのアクセス
WindowsのCドライブがLinuxの/mnt/cにマウントされている。/mnt/cにアクセスすることで、Windows上のファイルにアクセス可能。
WindowsからLinux上のファイルへのアクセス
\\wsl.localhost\[ディストリビューション名]
でLinux上のファイルにアクセス可能。
Ubuntuを使っている場合は、
\\wsl.localhost\Ubuntu-20.04\
でアクセスする。
2. WSL2上で Docker Desktopを使う
2-1 Docker Desktop stable 2.3.0.2 以上のリリースをダウンロード
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
からインストーラをダウンロードしインストール。
通常の Docker Desktop のインストール手順に従い、インストールを行いWindows スタート・メニューから Docker Desktop をスタート。
2-2 WSL2 対応エンジンを使う
Docker メニューから、 Settings > General を選択。
Use WSL 2 based engine (WSL2 対応エンジンを使う) のチェックボックスを選択。
Apply & Restart (適用と再起動)をクリック。
(WSL 2 をサポートしているシステム上に Docker Desktop をインストールした場合は、デフォルトでこのオプションが有効化されているので確認後Cancelをクリック)。
3. node.jsのインストール
3-1 nvmのインストール
まず、ubuntuをスタートメニューから立ち上げ、
ubuntuで下記のコマンドでインストールスクリプトを実行する。
(参考:https://github.com/nvm-sh/nvm#install--update-script)
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
実行後、ubuntu再起動。
3-2 node.jsのインストール
$ nvm list-remote
で利用可能なNodeのバージョンを調べる。
このリストからLatest LTSであるv18.12.1をubuntu下記コマンドでインストール
$ nvm install v18.12.1
ちゃんとインストールできたか確認するには
$ nvm list
を実行して
こんなのが出ていればOK。
4. Truffleのインストール
これ一発でOK。
$ npm install truffle -g
結構時間かかるが、
$ truffle version
でこういうのが出ればOK。
5. cURLのインストール
これ一発でOK
$ sudo apt install curl
確認は
$ curl -V
Vは大文字にしないとエラーになる。
みたいなのが出ればOK。
6. MetaMaskのインストール
Windows10側のChromeに拡張機能MetaMaskを追加。
これで、後で作るBesuに外から操作ができるようになる。
https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=ja
から「Chromeに追加」でOK。
こんなのが出るので開始をクリック。
7. Hyperledger Besuで遊ぼう
(1) Hyperledger Besuネットワークを生成する
Ubuntuから
$ npx quorum-dev-quickstart
を実行すると、どんどんやってくれる。
はじめに質問が出るので、
Hyperledger Besuを選ぶ
Codefi Orchestrate、Quorum Key Managerとprivate transactionsはnと答える。
logging with ELKを選ぶ
BlockscoutはNと答える
Where should we create the config files for this network?
という問いにはEnterでdefault設定にする。
Installation complete.が出ればOK!
$ cd quorum-test-network
で移動して、Dockerを起動しているのを確認してから,
$ ./run.sh
こんなのが出たら成功。
*************************************
Quorum Dev Quickstart
*************************************
Setting up the index patterns in kibana ...
----------------------------------
List endpoints and services
----------------------------------
JSON-RPC HTTP service endpoint : http://localhost:8545
JSON-RPC WebSocket service endpoint : ws://localhost:8546
Web block explorer address : http://localhost:25000/explorer/nodes
Prometheus address : http://localhost:9090/graph
Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All
Collated logs using Grafana and Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=
Collated logs using Kibana endpoint : http://localhost:5601/app/kibana#/discover
For more information on the endpoints and services, refer to README.md in the installation directory.
****************************************************************
もし,「docker endpoint for "default" not found」で止まったら
以下ディレクトリにある「meta.json」を削除します。
C:\Users\<ユーザ名>.docker\contexts\meta\XXXXXX\meta.json
この「XXXXXX」部分は任意の長い文字列です。.dockerディレクトリにcontextsしかない場合は.dockerディレクトリから全削除しても問題ありません。
2回目からはWindows上でスタートボタンメニューで出てきたUbuntuをつついて起動し、
Docker Desktop起動後に
$ cd quorum-test-network
で移動して、
$ ./resume.sh
でこんなのが出ればOK。
Resuming network...
----------------------------------
[+] Running 15/15
⠿ Container quorum-test-network-grafana-1 Started 6.3s
⠿ Container quorum-test-network-elasticsearch-1 Started 5.4s
⠿ Container quorum-test-network-redis-1 Started 5.8s
⠿ Container quorum-test-network-prometheus-1 Started 5.7s
⠿ Container quorum-test-network-validator1-1 Started 8.5s
⠿ Container quorum-test-network-kibana-1 Started 3.9s
⠿ Container quorum-test-network-metricbeat-1 Started 3.1s
⠿ Container quorum-test-network-filebeat-1 Started 4.0s
⠿ Container quorum-test-network-logstash-1 Started 3.8s
⠿ Container quorum-test-network-validator3-1 Started 6.8s
⠿ Container quorum-test-network-validator4-1 Started 5.9s
⠿ Container quorum-test-network-validator2-1 Started 7.3s
⠿ Container rpcnode Started 6.3s
⠿ Container quorum-test-network-explorer-1 Started 3.6s
⠿ Container quorum-test-network-ethsignerProxy-1 Started
(2) Block explorerでネットワークの概要を見る
Windows10側のブラウザで
http://localhost:25000
を見るとこんなのが見える.ノードの一覧。
Explorerというメニューを選ぶと
ブロックを横断していろいろ検索できる。
NFTのコントラクトをデプロイしてmintしたところ、Transactionの情報も出てきた。
(3) Grafanaでノードたちの様子を見る
次にやはりWindows10側のブラウザで
http://localhost:3000/
を見ると、こういうのが出るので、
という感じでノードの状況がグラフィカルに確認できる。
8. JSON-RPC requests
(1) Besuのバージョン
ubuntuから
$ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://localhost:8545
を実行するとこんなのが返ってくる。
{
"jsonrpc" : "2.0",
"id" : 1,
"result" : "besu/v21.7.1/linux-x86_64/adoptopenjdk-java-11"
}
返ってきたJSONの意味は
"jsonrpc" : "2.0"
→ JSON-RPC 2.0 spec formatを使用
"id" : 1
→ request identifier(request と responseの突合用idでこの tutorialでは常に 1)
"result" : "besu/v21.7.1/linux-x86_64/adoptopenjdk-java-11"
→ besu/v21.7.1は走行しているBesuのバージョン
linux-x86_64はこのバージョンをビルドしたアーキテクチャ
adoptopenjdk-java-11はこのバージョンをビルドしたJVMの属性
(2) つながっているノード数
ubuntuから
$ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' http://localhost:8545
を実行するとこんなのが返ってくる。
{
"jsonrpc" : "2.0",
"id" : 1,
"result" : "0x4"
}
→ JSON-RPC requestを受け取ったノードがいくつのノードとつながっているかがresultの値で、この場合は4つである。
(3) 最後に確定したブロックナンバー
ubuntuから
$ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545
を実行するとこんなのが返ってくる。
{
"jsonrpc" : "2.0",
"id" : 1,
"result" : "0x204d"
}
9. MetaMaskを使ってアカウント間でETHを送る
(1) アカウント作成
Chrome拡張機能リストのMetaMaskのアイコンをクリック。
ネットワークからLocalhost 8545を選ぶ。イーサリアムメインネットしか見えないときは上部の「表示・非表示」をクリックして「テストネットワークを表示」をオンにする。
これで先ほど立ち上げたBesuのネットワークにMetaMaskが接続した。
次にアカウントのインポート。
https://besu.hyperledger.org/en/stable/Tutorials/Examples/Private-Network-Example/#create-a-transaction-using-metamask
にあるprivate key to copyをどれか拝借してコピペしたのちインポートする。
大変なお金持ちになっている。
もう1つアカウントを作成する。
アカウント名を入れて、作成をクリック。
(2) 送金する
では90000ETH持っているAccount2から一文無しのTestAccount2に15000ETH送金する
まず送金先TestAccount2のアドレスをコピー。
送金元のAccount2に移って送金クリック。
送金先に上でコピーしたアドレスをペーストし送金額15000ETHを入力し次へをクリックする。
確認をクリック。
少しの間の後に残高が変わった。
これで送金完了である。
10. Remixでスマートコントラクトの実装とデプロイ
参考 https://ai-china.hatenablog.com/entry/2022/01/01/130000
Remixというweb上でSolidityのコードを書いてコンパイルまでできる便利なツールを使ってスマートコントラクトを作成,Besu上にデプロイしてみる。
(1) スマートコントラクトを書く
まずRemixを開いて、
https://remix.ethereum.org/
test文字を右クリックしてNew Fileを選択し,新規ファイルを作成。
作成したいスマートコントラクト名.sol,例えばtakaToken1.solとファイル名を設定する。
こうしてできた新しいタブにコードを書いていく。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts@4.4.1/token/ERC20/ERC20.sol";
contract takaCoin0 is ERC20 {
constructor() ERC20("taka Coin", "TKC") {
_mint(msg.sender, 150000 * 10 ** decimals());
}
}
これを書き終えたら左側のSOLIDITY COMPILERをクリックする。そうするとこのようなCompile takaToken1.solというボタンが表示されるので突いてみる。
Remix表示中のタブでMetamaskを立ち上げてすでに作成しておいた例えばAccount1というアカウントを表示する。
RemixでDEPLOY & RUN TRANSACTIONを左側で選択、ENVIRONMENTをInjected Web3にし、AccountをMetamaskの先ほどのアカウントAccount2のアドレスにしてDeploy。
するとガス代が見積もられるが、どうせガスフリーだから気にせず確認ボタンを押す。
Metamaskのトークンをインポートを押す。
トークンコントラクトアドレスに先ほどコピーで取得したやつをペースト、トークンシンボルにTKCと入れてカストムトークンを追加。
トークンをインポート。
入った。TKCで大富豪になった。
11. 終了する
ubuntuで
$ cd quorum-test-network
とした後、
$ ./stop.sh
でBesuは眠りにつく。