Windows10上でGolem動かしてみた

# 概要
ブロックチェーン技術を用いて、余っているCPUリソースを提供することで報酬を受け取るGolemというサービスがある。

そのサービスのセットアップにあたって、[公式ドキュメント](https://handbook.golem.network/provider-tutorials/provider-tutorial)ではUbuntu（またはその他のLinuxディストリビューション）でのやり方しか書かれていなかったので、普段使うOSであるWindows10上で何とかやれないかと試行錯誤した結果を備忘録として記載する。

# はじめに
「どうせ世界の誰かが既にWindows上で動かしてるでしょ」と思ってGoogleさんに色々聞いてみたところ、Redditの以下の記事がヒットした。

`https://www.reddit.com/r/GolemProject/comments/mh2j9b/how_to_setup_a_golem_provider_node_on/`

タイトルを直訳すると「Windowsでゴーレム プロバイダー[^1] ノードをセットアップする方法」。

[^1]: プロバイダー（Provider）とは、CPUリソースを提供し報酬を受け取る側のこと。逆にCPUの提供を依頼し報酬を出す側はリクエスター（Requestor）

「まさしく探していたのはこれだ」と思って記事に従い、VMware上にUbuntuをインストールし、「Virtualize Intel VT-x/EPT or AMD-V/RVI」にチェックを入れ起動しようとするも以下の画面が表示されて起動できない。
![VMware.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467685/3d9c902d-205e-7cc0-cc22-3728df868e01.png)

「Virtualize Intel VT-x/EPT or AMD-V/RVI」にチェックを入れたからUbuntuが起動できない模様。解せぬ。

元々Windows10上でDockerを動かしたりしてたので、仮想化は使えるはずなんだが。。。
調べてもこの問題の解消法が分からなかったので、もともとDockerを動かしていたこともあり、Redditに書いてあるVMwareでの起動ではなくWindowsのHyper-V上にUbuntuをインストールしGolemのセットアップを行うことにした。

# 前提条件
OS（ホスト）: Windows10 Pro
OS（ゲスト）: Ubuntu 20.04
CPU：Intel Core i5-9600K 
その他：Windows10でHyper-vが有効化されていること。
※この記事自体はWindowsで仮想化をやった事がある人向けに書いているので、仮想化のやり方等の詳しい説明は省いています。

# セットアップ手順
## Hyper-VにUbuntu仮想マシンを作成

1. [Ubuntuのダウンロードサイト](https://jp.ubuntu.com/download)より、Ubuntu20.04のisoファイルをダウンロードする。
1. Windowsのスタートメニュー -> Windows管理メニュー -> Hyper-Vマネージャー を選択し、マネージャーを起動する。
1. ローカルの仮想化サーバーを右クリックし、新規 -> 仮想マシン を選択。
1. 基本的にはデフォルトの設定で仮想マシンを作成していく。
    * 途中、「世代の指定」では第2世代を選択。
    * 「インストールオプション」では先ほどダウンロードしたUbuntuの.isoファイルを選択しておく。
1. Hyper-Vマネージャーの一覧から、作成した仮想マシンを右クリックし起動を選択後、もう一度右クリックして接続を選択する。
1. 仮想マシンに接続後、画面に従いUbuntuのセットアップを行う。

## Ubuntu仮想マシン上で更に仮想化を行えるように、Windowsで設定を行う

Golemはどうやらサービス内で別の仮想マシンを作成し、その上でプロバイダー用のプログラムを実行させるようなので、Windows上でUbuntuを動かす場合は、Ubuntu上で仮想化が行えるようにWindowsの設定を行う必要がある模様。
ということで以下その手順。

1. 作成したUbuntu仮想マシンはシャットダウンしておく。
1. WindowsでPowershellを管理者権限で起動。
1. Powershellで下記コマンドを実行。
    * ```
Set-VMProcessor -VMName <vmname> -ExposeVirtualizationExtensions $true
```
    <br>※ \<vmname>は作成した仮想マシンの名前に置き換える

## Ubuntu仮想マシンでGolemをセットアップ

基本的には[公式ドキュメント](https://handbook.golem.network/provider-tutorials/provider-tutorial)に従い、Ubuntu上でコマンドを実行するのみ。

1. Ubuntu仮想マシンを起動し、接続。Ubuntu上でコンソールを開く。
1. 下記コマンドを実行し、Golemプログラムのインストールとセットアップを行う。
    * ``` curl -sSf https://join.golem.network/as-provider | bash - ```
    * コマンド実行後、必要なライブラリのインストールが終わった段階で対話的に入力を求められる。基本的には空白を入力しデフォルトの設定を行うことで問題ないが、イーサリアムウォレットのアドレスの入力を求められた際、自分が既にもつイーサリアムウォレットを指定したい場合はそのアドレスを入力すること。
1. セットアップが完了したら、下記コマンドを実行することでGolemのプロバイダープログラムが起動する。
    * ``` golemsp run ```
1. Ubuntu上で別のコンソールを開き、下記コマンドを実行することでプログラムの状態を確認できる。
    * ``` golemsp status ```
1. [公式ドキュメント](https://handbook.golem.network/provider-tutorials/provider-tutorial#checking-node-status)にあるように、ステータスがis runningとなっており、ウォレットの状態が表示されていればプロバイダープログラムは正常に動作している。この状態でしばらく放置しておくと、そのうちTasksの欄の数字が増えWalletの欄のGLMトークンの量も増えていく。<br>※2021年5月現在、1日中起動して処理するタスクは1件あるかないかなので気長に待つべし。

### ちなみに

GLMトークンの支払いは主にzk-syncというネットワーク上で行われるらしい。
で、このzk-sync上でやり取りされたトークンは通常のイーサリアムウォレットには即座に反映されず、zk-sync用のウォレットを通じてトークンの移動を行う必要がある模様。
詳細は[zk-syncの公式サイト](https://zksync.io/)を参照いただきたい。

# おわりに

というわけで、Redditで紹介されているようにVMwareを使うのではなく、Hyper-Vを用いてWindows10上でGolemを動かしてみたというお話でした。
そもそもVMwareで仮想化を有効にしてUbuntuを起動できれば問題なかったんですが、私の環境では何故か起動できなかったので代替案としてHyper-Vを使用しました。「VMware上でも仮想化できたよー」という方は情報提供していただければ幸いです。