【ハードフォーク対応2018/7/11暫定版】Kotoのプールを立ててみよう

##はじめに
Zcashフォークで国産の仮想通貨「[Koto](http://ko-to.org)」のマイニングプールを構築する方法を記載します。
オープンソースのZcashマイニングプール[「z-nomp」](https://github.com/z-classic/z-nomp)をKoto用に独自にカスタマイズした[「k-nomp」](https://github.com/yoshuki43/k-nomp/)を使用します。
また、Kotoは2018/8/4にハードフォークが予定されており、今回それに対応したブランチで構築します。

##手順

###サーバーの準備

####ドメインの取得
ドメインが必要な場合は、ドメイン取得代行サイトで任意のドメインを取得してください。

####サーバーの用意
Linuxサーバーを立ち上げます。
今回[DigitalOcean](https://cloud.digitalocean.com/)で、OSは「Ubuntu Server 16.04.4 x64」、
サーバーは「4GB 2vCPUs 80GB 4TB」を選びました。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/232554/b99eb449-1a33-e10c-9d2a-770e8aa5f60c.png)

####サーバーの準備完了
1分ほどで構築が完了し、IPアドレスが自動で割り振られます。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/232554/8dd1f87d-fb1a-2c02-da41-3d8b7e722249.png)

####ファイアウォールの設定
DigitalOceanのファイアウォール機能で、SSHポート、HTTPポート、kotoポート、Stratumポートなどを開けておきます。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/232554/67ebd374-9994-c1f5-2a7f-8320d697823a.png)




###サーバーの設定

####インスタンスへの接続
Windowsの場合は「PuTTY」を使用します。
メールで送られてきたパスワードを使用し、rootでログインします。
ログイン後、新しいパスワードを設定します。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/232554/888e115f-faaa-4058-6358-fdaf1c837cdf.png)


####ユーザーの作成
ログインができたら、まずrootとは別のユーザー(今回はubuntu)を作成し、sudo権限を付与します。
`adduser ubuntu`

```
Adding user `ubuntu' ...
Adding new group `ubuntu' (1000) ...
Adding new user `ubuntu' (1000) with group `ubuntu' ...
Creating home directory `/home/ubuntu' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for ubuntu
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
```
`gpasswd -a ubuntu sudo`

```
Adding user ubuntu to group sudo
```
###ユーザーの変更
ubuntuユーザーでログインします。
`sudo su - ubuntu`

####Ubuntuのアップデート
Ubuntuをアップデートして再起動します。
`sudo apt-get update`
`sudo apt-get upgrade`
`sudo apt-get dist-upgrade`
`sudo reboot`

###kotodのビルド

####パッケージのインストール
下記コマンドを実行して必要なパッケージをインストールします。
`sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev unzip git python python-zmq zlib1g-dev wget bsdmainutils automake curl`

####kotoのインストール
下記コマンドを実行してkotoをインストールします。
`git clone https://github.com/KotoDevelopers/koto.git`
`cd koto`
`./zcutil/fetch-params.sh`
`./zcutil/build.sh -j$(nproc)` ※少し時間がかかります

`cd src`
`sudo cp kotod /usr/local/bin`
`sudo cp koto-cli /usr/local/bin`
`sudo cp koto-tx /usr/local/bin`

####kotoの設定

`cd`
`mkdir .koto`
`cd .koto`
`vi koto.conf` コンフィグファイルを作成、設定します。

```koto.conf
rpcuser=username
rpcpassword=password
rpcallowip=127.0.0.1/32
rpcport=8432
daemon=1
server=1
gen=0
```

####kotodの起動
下記コマンドでkotodを起動します。
`kotod`

```
Koto server starting
```
####プールアドレスの確認
下記コマンドで、プールアドレスを確認します。
`koto-cli getaddressesbyaccount ""`

```
[
  "k1もしくはjzから始まるkアドレス"
]
```
####kアドレスの作成
下記コマンドで、支払用kアドレスを作成します。
`koto-cli getnewaddress ""`

```
k1もしくはjzから始まるkアドレス
```
####zアドレスの作成
下記コマンドで、シールド用zアドレスを作成します。
`koto-cli z_getnewaddress`

```
zから始まるzアドレス
```


###プールの設定

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

####パッケージのインストール
下記コマンドを実行して必要パッケージをインストールします。
`sudo apt-get install build-essential libsodium-dev`

####nodejsとnpmのインストール
下記コマンドを実行してnodejsとnpmをインストールします
`sudo apt-get install -y nodejs npm`
`sudo npm cache clean`
`sudo npm install n -g`
`sudo n v9`
`sudo npm i npm -g`
`sudo apt-get purge -y nodejs npm`
`sudo ln -sf /usr/local/bin/node /usr/bin/node`
`sudo ln -sf /usr/local/bin/npm /usr/bin/npm`

####nodejsとnpmのバージョン確認

`node -v`
`npm -v`

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

###k-nompのインストール

####k-nompのビルド
下記コマンドを使用してk-nompをビルドします。
※ハードフォーク対応版ブランチからcloneします。
`git clone -b koto-hf-dev https://github.com/yoshuki43/k-nomp`
`cd k-nomp`
`npm update`　※途中で躓く場合は`npm audit fix`を一度実行から再度`npm update`して下さい。
`npm install`

####k-nompの設定

`cp config_example.json config.json`
`vi config.json`

```config.json
        <中略>       

        "port": {公開用ポート番号},
        "stratumHost": "{ドメイン名}",

　　　　 <中略>
```
`vi coins/koto.json`

```koto.json
{
    "name": "Koto",
    "symbol": "KOTO",
    "algorithm": "yescrypt",
    "requireShielding": true,
    "nSubsidySlowStartInterval": 43200,
    "nSubsidyHalvingInterval": 1051200,
    "payFoundersReward": false,
    "percentFoundersReward": 20,
    "maxFoundersRewardBlockHeight": 849999,
    "foundersRewardAddressChangeInterval": 17709.3125,
    "vFoundersRewardAddress": [],
    "kotoFoundersReward": [
        {
            "comment": "for mainnet",
            "address": "k3EEgqMM8jpaGW6XXUHpv3kDprMfm1x1VEf",
            "start": 335600,
            "last": 1072799
        }
    ],
    "txfee": 0.0004
}

```

`vi coins/koto-testnet.json`

```koto-testnet.json
        <中略>       

        "symbol": "TOKO",

　　　　 <中略>
```

`vi node_modules/stratum-pool/lib/transactions.js`

```transactions.js
        <中略>       

        var nVersionGroupId = (txVersion & 0x7fffffff) >= 3 ? util.packUInt32LE(0x2e7d970) : new Buffer([]);

　　　　 <中略>
```

`cp pool_configs/koto_example.json pool_configs/koto.json`
`vi pool_configs/koto.json`

```koto.json
{
        "enabled": true,
        <中略>
        "address": "{k1もしくはjzから始まるkアドレス}",
        <中略>
        "zAddress": "{zから始まるzアドレス}",
        <中略>
        "tAddress": "{k1もしくはjzから始まるkアドレス(上のaddressとは別のアドレス)}",
        <中略>
        "rewardRecipients": {
        "{k1もしくはjzから始まるkアドレス(手数料を受け取りたいアドレス)}": 1.0
        <中略>
}
```

####k-nompの起動

`sudo pm2 start init.js --name k-nomp`

####pm2のスタートアップ登録
`pm2 startup`

```
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu
```

`sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu`

`pm2 save`

####ログの確認

`pm2 logs`

##おわりに

今回Kotoのハードフォーク対応プールの構築方法を記載しました。
ファイアウォールの設定などは各VPSのファイアウォール機能やufw等で適宜行って下さい。
もしプールを構築された場合は、[KotoのDiscordチャンネル](https://discord.gg/HmsTDww)までご一報頂けますと幸いです。
またご不明な点があれば上記チャンネルの「ROZ - mofumofu.me#1977」までお申し付け下さい。


##参考サイト
[ubuntu ユーザを追加して sudo 権限をつける](https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)
[kotoをUbuntuにインストール](https://qiita.com/hideki8/items/3c768eff9335a9c28b53)
[kotoのプールを作成](https://qiita.com/hideki8/items/bf38bbec71fc17d64123)
[Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
[Node.jsのデーモン化ツールpm2をインストール](https://qiita.com/abgata20000/items/4720a88060c43a2cd2ee)