Blog

2018.09.05

Zcashプールサーバを建ててマイニングする

はじめに

こんにちは。エンジニアの池上です。今回はZcashのプールサーバを建ててマイニングする手順を公開します。

プールサーバとは?

仮想通貨におけるプールサーバというのは、個人が結集して計算能力を貢献し合うことでマイニングを成功させ、全体で得た利益を貢献度合いに応じて各参加者に分配するという、いわば寄合所です。

RPGゲームで例えたときの、レイドやギルドを想像していただくのが分かりやすいかと思います。
巨大な計算設備を有した企業が参入してくる中、一個人ではそれら大規模グループとの計算合戦で勝利することは非常に困難で安定しません。そこで、寄合所に集まった人々でレイドを結成することで確実な利益を得ようというわけですね。

今回はその”個”が結集してくる寄合所を構築していくことになります。

“Zcash”の特徴

Zcashは、取引追跡ができない完璧なプライバシー保護を謳う仮想通貨として開発され、以前はZerocashとも呼ばれていたようです。Zcashの比較的優れた匿名性は「ゼロ知識証明」の手法によって実現されており、仮想通貨の量を外部に秘匿した状態で決済できる点が特徴です。
2018年8月30日現在:1コイン=約¥16,000(全仮想通貨の時価総額ランキング20位)


使用した環境

社内サーバ上に建てた仮想環境(Ubuntu16.04)に構築していきました。
用意するマシンには、Zcashのブロックチェーンを形成できるだけのHDD容量が必要になってきます。
また、今回はハッシュレート向上を目的とするマイニングの試験環境として運用することを想定しているため、スペックは比較的低く割り振っていますが、プールサーバ利用者の膨れ上がりによるスワップが危惧されるような運用の際には、CPUやメモリリソースの割当を適宜引き上げる必要があります。

以下に使用した環境の情報を載せておきます。

CPU: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz から 2コア
メモリ: 2GB
DD: 125GB
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
OME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

使用したソフトウェア

  • Zcashd Zcash RPC client version v1.1.0

  • Redis server Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=5d95fb22b14c137d

  • Z-nomp 5.6.0


zcashdの準備

Zcash本家がリリースしているツールで、ネットワーク上からブロックチェーンを取得してくるデーモンプロセスとして動作します。

zcashd - インストール

  1. 依存パッケージをaptからインストールしてくる。

     $ sudo apt install \
           build-essential pkg-config libc6-dev m4 g++-multilib \
           autoconf libtool ncurses-dev unzip git python python-zmq \
           build-essential libsodium-dev libboost-all-dev \
           npm zlib1g-dev wget curl bsdmainutils automake
    
  2. gitからZcashのパッケージをクローンしてきてビルドする。結構時間が掛かります。

     $ git clone https://github.com/zcash/zcash.git
     $ cd zcash/
     $ git checkout v1.1.0
     $ ./zcutil/fetch-params.sh
     $ ./zcutil/build.sh
    
  3. テストネット向けのコンフィグを作成。

     $ mkdir -p ~/.zcash
     $ echo "addnode=testnet.z.cash" >~/.zcash/zcash.conf
    

    (メインネットで構成する場合は addnode=mainnet.z.cash)

  4. zcashdを起動。

     $ ./src/zcashd
    
  • このとき–daemonのオプション指定でバックグラウンドで動作させられます。
  • 起動すると同時にブロックチェーンの構築が始まりますが、現在の最新ブロックまで追いつくのにはかなり時間が掛かると思います。

zcashd - セットアップ

基本的には$ ./zcash/src/zcash-cliから操作していくことができます。

  1. まずはgetinfoして設定の概要を表示してみましょう。下記のように出れば正常に起動しています。

     $ ./zcash/src/zcash-cli getinfo
     {
       "version": 1010050,
       "protocolversion": 170005,
       "walletversion": 60000,
       "balance": 0.00000000,
       "blocks": 16918,
       "timeoffset": 0,
       "connections": 4,
       "proxy": "",
       "difficulty": 872360.7492827582,
       "testnet": false,
       "keypoololdest": 1524712816,
       "keypoolsize": 101,
       "paytxfee": 0.00000000,
       "relayfee": 0.00000100,
       "errors": ""
     }
    
  2. 続いて、zcashのブロックチェーンに参加するのに必要なアドレスを生成していきます。

    zcashで使用するアドレスには2種類あります。
    一つは従来どおり送受金の為に利用する固有の宛先を示すアドレス(t-address)ですが、二つ目のz-addressは、ゼロ知識証明を利用した匿名化取引の際に使用するもので、t-addressと違って外部から参照することはできません。

    ここで作成した2つのアドレスは後にz-nompの設定ファイルに書き込みますので、メモっておくとスムーズかも知れません。

    • t-address

      $ ./zcash/src/zcash-cli getnewaddress  # t-addresの作り方
      $ ./zcash/src/zcash-cli getaddressesbyaccount ""  # t-addressの確認
      
    • z-address

      $ ./zcash/src/zcash-cli z_getnewaddress  # z-addressの作り方
      $ ./zcash/src/zcash-cli z_listaddresses  # z-addressの確認
      
  3. 最後に、zcashdのRPCを設定していきます。

    • ~/.zcash/zcash.conf に追記することで設定していきます。
    • rpcuserrpcpasswordは適宜読み替えて書き込んで下さい。
       testnet=1
       addnode=testnet.z.cash
       daemon=1
       rpcuser=rpcuser
       rpcpassword=rpcpassword
       rpcport=8232
      

      (mainnetで構築している場合、1行目のtestnet=1は必要ありません。)

Redis severの準備

Redisはこの後入れるZ-nompが動作するために必要なデータベースツールで、メインメモリ上にKVS(KeyValueStore)を構築することができます。

Redis server - インストール

  • Redisはaptパッケージにもありますが、今回はソースからビルドしました。
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ cd redis-stable
$ make

Redis server - セットアップ

  • 今後Redisサーバの状態を確認しやすいようにscreenを建てて起動することにします。
    • screenから抜けるには “ctrl+A + D”です。
    • 建てているscreenの一覧は$ screen -lsから確認できます。
$ screen -S redis
$ ./redis-stable/src/redis-server
$ (ctrl+A + D)

z-nompの準備

Z-nompはzcash系のいくつかの仮想通貨に対応したマイニングプール用のサーバーツールです。
8080番ポートにブラウザでアクセスすることでハッシュレートの様子などを確認することもできます。

z-nomp - インストール

  1. npmのパッケージnでnodeのバージョンを9.10にして進めていきます。

     $ sudo npm install n -g
     $ sudo n 9.10
    
  2. gitからz-nompを落としてきてインストールします。

     $ git clone https://github.com/joshuayabut/node-open-mining-portal.git z-nomp
     $ cd z-nomp
     $ npm update
     $ npm instal
    

z-nomp - セットアップ

  1. z-nompの設定を行います。~/z-nomp/以下にある設定ファイル”config_example.json”からコピーして”config.json”を作ってください。

     $ cp config_example.json config.json
    
  2. 続いて、zcashdへの紐付けをします。こちらも ~/z-nomp/pool_configs/ 以下の設定例を使っていきますので、”zcash_example.json”からコピーして”zcash.json”を作ってください。

  3. 手順2でコピーしてきた”zcash.json”から以下の箇所を編集します。

    • “enabled” : true
    • “address” : zcash-cliで作った t-address を設定
    • “zAddress” : zcash-cliで作った z-address を設定
    • “rewardRecipients”: { }
  4. こちらもz-nompの状態を確認しつつ設定ファイル等も見に行けるようにしたいのでscreenを建てて起動することにします。

     $ screen -S znomp
     $ npm start
    
  5. ブラウザから http://(サーバのIPアドレス):8080 へ行くとz-nompの画面を見ることができます。


マイニング実践

さて、長らく導入手順を追って参りましたが、これでプールサーバの準備が整いましたので、実際にマイナーからアクセスすることで、マイニングができるのか試していきましょう。
今回はnheqminerを使いますが、引数の指定を適切なものにすることで他のマイナーでマイニングすることも勿論可能です。

$ ./nheqminer mine -u tmxxxxxxxxxxxxxxxxxxxxx -l (サーバのアドレス):3032

発展:プールサーバの調整

  • 基本的にz-nompでは ~/z-nomp/config.json~/z-nomp/pool-config/zcash.jsonのパラメータを調整することでプールサーバの状態を変更することができます。以下は頻繁に調整したいくつかの項目です。

    • ~/z-nomp/config.json内のwebsiteリストの各パラメータを調整することで、ブラウザでアクセスして表示されるページを調整することができます。
        "website": {
            "enabled": true,
            "host": "0.0.0.0",
            "port": 8080,
            "stratumHost": "cryppit.com",
            "stats": {
                "updateInterval": 30,
                "historicalRetention": 432000,
                "hashrateWindow": 90
            },
            "adminCenter": {
                "enabled": false,
                "password": "password"
            },
            "tlsOptions" : {
                "enabled": false,
                "cert": "",
                "key": ""
            }
        },
    
    • ~/z-nomp/pool-config/zcash.json内のvarDiff等を調整することで、マイニングで解を得られる計算難度の変更ができます。
        "ports": {
            "3032": {
                "diff": 0.05,
                "tls": false,
                "varDiff": {
                    "minDiff": 0.04,
                    "maxDiff": 16,
                    "targetTime": 0.5,
                    "retargetTime": 60,
                    "variancePercent": 30
                }
            }
        },
      

参考