Nekoniumのマイニングプールを立ててみよう

##はじめに
Ethereumフォークで国産の仮想通貨「[Nekonium](https://nekonium.github.io/)」のマイニングプールを構築する方法を記載します。
オープンソースのEthereumマイニングプール[「Open Ethereum Pool」](https://github.com/sammy007/open-ethereum-pool)をNekonium用に独自にカスタマイズした[「Open Nekonium Pool」](https://github.com/ROZ-MOFUMOFU-ME/open-nekonium-pool)を使用します。

##手順


###サーバーの準備

####ドメインの取得
ドメインが必要な場合は、ドメイン取得代行サイトで任意のドメインを取得してください。
以前[「Nekoniumのパブリックノードを立ててみよう その1」](https://qiita.com/ROZ-mofumofu-me/items/f9490e4bd23922b62e54)において、[バリュードメイン](https://www.value-domain.com/)で「nekonium.site」というドメインを取得しましたので、そちらを活用します。
![6f8a0b14a8ebedac1a4f06f79d869909.png](https://qiita-image-store.s3.amazonaws.com/0/232554/080c5aac-9275-c885-33aa-9b42a145f24a.png)

####サーバーの用意
Linuxサーバーを立ち上げます。
今回[AWS](https://aws.amazon.com/jp/)の「Ubuntu Server 16.04 LTS (HVM), SSD Volume Type」を選びました。
インスタンスタイプはとりあえず「t2.small」にしておきます。
![5ba27a6b8503cd2597f5405aa3f0a498.png](https://qiita-image-store.s3.amazonaws.com/0/232554/6d0fb94e-ab53-0cee-a532-b81bcb2961a4.png)
---
![2957d9967ab8f48534115b78c48f41dc.png](https://qiita-image-store.s3.amazonaws.com/0/232554/356fd64f-9821-7c59-06f7-450398b26c0c.png)

####固定IPの取得
インスタンスが立ち上がったら、「Elastic IP」でグローバル固定IPを取得します。
今回は「54.250.71.179」が割り当てられました。
![25c3837c292cd288d1cb3764e591a67e.png](https://qiita-image-store.s3.amazonaws.com/0/232554/84b3515f-bc3e-62ba-41bb-494970437a13.png)
---
![72bfaeee6a2f4d264bd7b6503a8fd729.png](https://qiita-image-store.s3.amazonaws.com/0/232554/18b2094a-5e8c-ad83-2874-366ebf4c1cfc.png)


####固定IPを関連付ける
「アクション」から、先ほど作成したインスタンスにグローバル固定IPを割り当てます。
![365c67cb583b40b5c03345c0d50eb361.png](https://qiita-image-store.s3.amazonaws.com/0/232554/3587a282-79da-511e-514d-464fa10193a1.png)
---
![7621fc71fba839a3e5d30a01e1f3f7f1.png](https://qiita-image-store.s3.amazonaws.com/0/232554/e440fab7-268e-1709-29f4-222053317db9.png)

####ファイアウォールの設定
「セキュリティグループ」のインバウンド設定から、今回マイニングプール用に公開する「80」「8080」「8008」「8888」ポートを空けておきます。
![092cfc786d31cf4e727b10de26f50abe.png](https://qiita-image-store.s3.amazonaws.com/0/232554/f70e5a5c-17a2-5690-0b1e-53017dd3db6c.png)
---
![1837275f3f88e6bad15a98b9734c04bf.png](https://qiita-image-store.s3.amazonaws.com/0/232554/f84794c1-f83a-9c3b-5613-49c821b76fa4.png)


####DNSの設定
今回割り当てられたグローバル固定IPをドメイン名に紐付けます。
バリュードメインのDNS設定からAレコードの「nuko」を「54.250.71.179」に設定します。
![13c92210f652f010850188b699672e0d.png](https://qiita-image-store.s3.amazonaws.com/0/232554/4e999f17-d94d-2aee-806e-ab2044a2a601.png)


###サーバーの設定

####インスタンスへの接続
Windowsの場合は「PuTTY」を使用します。詳しい接続方法はAWSのページを参照してください。
[Linux インスタンスへの接続 - AWS Documentation](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstances.html)
![9a8f8d2c537f559ac468f09052fe5a8f.png](https://qiita-image-store.s3.amazonaws.com/0/232554/fe2ce006-9050-09eb-8aec-80ba432f7c01.png)

---
![ab7c4cc2774f32febd5961a870c946ef.png](https://qiita-image-store.s3.amazonaws.com/0/232554/498389e9-e2fb-2e26-78c6-671917456d2f.png)

####Ubuntuのアップデート
ログインができたら、まずUbuntuをアップデートして再起動します。
`sudo apt-get update`
`sudo apt-get dist-upgrade`
`sudo reboot`

####build-essentialとmakeのインストール
下記コマンドを実行してbuild-essentialおよびmakeをインストールします。
`sudo apt-get install build-essential make`

####GoLangのインストール
下記コマンドを実行してGoをインストールします。
`wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz`
`sudo tar -xvf go1.9.2.linux-amd64.tar.gz`
`sudo mv go /usr/local`
`export GOROOT=/usr/local/go`
`export PATH=$GOPATH/bin:$GOROOT/bin:$PATH`
`export GOPATH=$HOME/go`
`go version` と入力して`go version go1.9.2 linux/amd64`と出力されればインストール成功です。

####Redisのインストール

`wget http://download.redis.io/redis-stable.tar.gz`
`tar xvzf redis-stable.tar.gz`
`cd redis-stable`
`make`
`sudo cp src/redis-server /usr/local/bin/`
`sudo cp src/redis-cli /usr/local/bin/`
`sudo mkdir /etc/redis`
`sudo mkdir /var/redis`
`sudo cp utils/redis_init_script /etc/init.d/redis_6379`
`sudo cp redis.conf /etc/redis/6379.conf`
`sudo vi /etc/redis/6379.conf` 6379.confを編集します。

```6379.conf

<中略>

daemonize no →　daemonize yes に変更

<中略>

dir ./ → dir /var/redis/6379 に変更

```

`sudo mkdir /var/redis/6379`
`sudo update-rc.d redis_6379 defaults`
`sudo /etc/init.d/redis_6379 start`

これでRedisサーバーが起動します。

`redis-cli`と入力して、`ping`と打つと`PONG`が表示されれば正常に稼働しています。

redis-cliを終了する場合は`exit`と入力します。

####nginxのインストール
下記コマンドを実行してnginxをインストールします。
`cd ~/`
`sudo apt-get install nginx`

####nodejsのインストール
下記コマンドを実行してnodejsをインストールします
`cd ~/`
`sudo apt-get install nodejs`
``sudo ln -s `which nodejs` /usr/bin/node``
`nodejs -v`と入力すると、バージョンが確認できます。

####npmのインストール
下記コマンドを実行してnpmをインストールします
`sudo apt-get install npm`

####gnekoniumのインストール
下記コマンドを実行してgnekoniumをインストールします。
`cd ~/`
`mkdir nekonium`
`cd nekonium`
`git clone https://github.com/nekonium/go-nekonium`
※もしgitがインストールされていない場合は、`sudo apt-get install git`を実行して下さい。
`cd go-nekonium`
`export GOROOT=/usr/local/go`
`export PATH=$GOPATH/bin:$GOROOT/bin:$PATH`
`export GOPATH=$HOME/go`
`make gnekonium`

####gnekoniumの初回起動
#####ブロックチェーンの同期
下記コマンドを実行してブロックチェーンの同期を行います。
`build/bin/gnekonium --fast --cache=512 console`
少し時間がかかります。(15分くらい)
#####同期終了
`Fast sync complete, auto disabling`と表示されれば同期が成功したことになります。

####プール用アドレスの作成
上記セッションを維持したまま、別セッションで下記コマンドを実行してプール用のNekoniumアドレスを作成します。
`cd nekonium/go-nekonium`
`build/bin/gnekonium account new`
パスワードを求められますので、入力して忘れないようにしてください。

`Address: {c96e68c38de383e78a48419469ead845bd4b9161}`
のように表示されれば、プール用アドレスの作成は完了です。
※この場合、実際のアドレスは頭に「0x」をつけ、「0xc96e68c38de383e78a48419469ead845bd4b9161」となります

###マイニングプールの設定

####Open Nekonium Pool のインストール
下記コマンドを実行してOpen Nekonium Poolをインストールします。
`cd ~/`
`git clone https://github.com/ROZ-MOFUMOFU-ME/open-nekonium-pool.git`
`cd open-nekonium-pool`
`export GOROOT=/usr/local/go`
`export PATH=$GOPATH/bin:$GOROOT/bin:$PATH`
`export GOPATH=$HOME/go`
`make`
`cp config.example.json config.json`
`vi config.json` 必要に応じてconfig.jsonファイルを編集します。

```config.json

<中略>

 "unlocker": {
                "enabled": true,
                "poolFee": 1.0,
                "poolFeeAddress": "0xで始まるFee(手数料)を受け取るアドレス",
                "donate": true,
                "depth": 120,
                "immatureDepth": 20,
                "keepTxFees": false,
                "interval": "10m",
                "daemon": "http://127.0.0.1:8293",
                "timeout": "10s"
        },

        "payouts": {
                "enabled": true,
                "requirePeers": 5,
                "interval": "120m",
                "daemon": "http://127.0.0.1:8293",
                "timeout": "10s",
                "address": "0xで始まるプールのアドレス",
                "gas": "21000",
                "gasPrice": "30000000000",
                "autoGas": true,
                "threshold": 500000000,
                "bgsave": false
        },

<中略>
```

`vi www/config/environment.js` environment.jsファイルを編集します。


```environment.js

<中略>

    APP: {
      // API host and port
      ApiUrl: '//nuko.nekonium.site:8080/',

      // HTTP mining endpoint
      HttpHost: 'http://nuko.nekonium.site',
      HttpPort: 8888,

      // Stratum mining endpoint
      StratumHost: 'nuko.nekonium.site',
      StratumPort: 8008,

<中略>

```
####プールの起動
#####gnekoniumパスワードファイルの作成
一度全てのセッションを閉じて、新しくセッションを開き、下記コマンドでパスワードファイルを作成しておきます。

`cd nekonium/go-nekonium/`
`vi password`

```password
<プール用アドレス作成時のパスワード>

```
#####gnekoniumの起動
仮想ターミナルなどを使用してgnekoniumを起動します。
`tmux new -s gnekonium`
`./build/bin/gnekonium --rpc --rpcaddr 0.0.0.0 --rpcport 8293 --unlock 0 --password password`

####Open Nekonium Pool の起動
仮想ターミナルなどを使用してOpen Nekonium Poolを起動します。
`cd ~/`
`cd open-nekonium-pool`
`tmux new -s open-nekonium-pool`
`./build/bin/open-nekonium-pool config.json`

####フロントエンドの構築
下記コマンドを実行して、フロントエンドの設定をします。
`cd www`
`sudo npm install -g ember-cli@2.9.1`
`sudo npm install -g bower`
`npm install`
`bower install`
`./build.sh`

####nginxの設定
#####defaultファイルの設定
下記コマンドを実行して、nginxの設定をします。
`cd ~/`
`cd /etc/nginx/sites-enabled`
`sudo vi default` defaultファイルを編集します。

```default
upstream api {
     server 127.0.0.1:8080;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /home/ubuntu/open-nekonium-pool/www/dist;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ index.html =404;
        }

        location /api {
            proxy_pass http://api;
        }
}
```

#####nginxの再起動
下記コマンドを実行してnginxを再起動します。
`sudo nginx -s reload`

http://nuko.nekonium.site/ にアクセスして、
下記のような画面になればプール構築成功です。
![10697c7a55d1639d274d0f57e097c4eb.png](https://qiita-image-store.s3.amazonaws.com/0/232554/1de28e5c-7d6b-992e-4519-a260299ef56e.png)


##おわりに

今回は1インスタンスのみでの簡易的なプール構築方法を記載しましたが、
payoutやunlocker、APIなどはモジュールとして独立して起動することができ、
負荷分散やセキュリティ等の観点から、複数インスタンスでそれぞれ起動することが望ましいです。
また、プール手数料や払い出し間隔、デザインなど、好みで自由にカスタマイズしてみて下さい。

もしプールを構築された場合は、[NekoniumのDiscordチャンネル](https://discord.gg/C8mJg44)までご一報頂けますと幸いです。


##参考サイト

[Setup Ethereum Mining Pool using open source ethereum pool](http://betbybitcoin.com/setup-ethereum-mining-pool-using-open-source-ethereum-pool/)