yoshuki43's blog

ローカルにKotoのTestnetを作成してみる

はじめに

2018年3月現在、KotoにはTestnetが存在しません。 KotoのソースにはTestnet用のdnsseedとして「dnsseed.testnet.koto.cash」が設定されていますが、DNS問い合わせしても値が返ってきません。

ということで、プライベートなTestnetを立てる方法を探ってみました。

ポイントは二つ:

  • Genesis Block(最初のブロック)に定義されている日時からある程度時間が経つとマイニングできなく(ブロックダウンロード待ちに)なってしまうので、それをどうにかする。
  • 最低2個のkotodがネットワークに参加していないとマイニングできない。

(自分で建てるのがめんどくさい人向け)

下記手順を行ったtestnetをkoto-testnet.poolof.workで公開しています。 上記ホストをaddnodeすれば接続できるので、自由に使ってください。
※ただし予告なくサービス停止するかもしれません。

使い方:

(1) -testnetオプションをつけてkotodを起動する。

kotod -testnet …

(2) koto-testnet.poolof.workをaddnodeする。

koto-cli –testnet addnode koto-testnet.poolof.work add

Kotodを改造する

日時対策

単純にOSの時間を2017/12/10 13:10:55(Genesis Blockのタイムスタンプ)付近に変えてもいいが、ここでは日時(等)のチェックをしているところをつぶしてしまうことで実現します。

チェック関数はmain.cppIsInitialBlockDownload()なので、その先頭にreturn false;を入れてあげます。

main.cpp:

1
2
3
4
5
6
7
bool IsInitialBlockDownload()
{
    return false;                               // <=この行を挿入
    const CChainParams& chainParams = Params();
    LOCK(cs_main);
    if (fImporting || fReindex)
        return true;

dnsseed設定を変更

公式にTestnetが動き出したときにプライベートTestnetが影響を与えてしまわないように、公式のdnsseed設定を消しておきます。 ついでに自サーバのホスト名(または、IPアドレス)をdnsseedとして設定しておきます。

chainparam.cpp:

1
2
3
4
5
6
7
8
9
10
11
/**
 * Testnet (v3)
 */
class CTestNetParams : public CMainParams {
public:
    CTestNetParams() {
            :
        vFixedSeeds.clear();
        vSeeds.clear();
        //vSeeds.push_back(CDNSSeedData("koto.cash", "dnsseed.testnet.koto.cash"));                // <= 消す
        vSeeds.push_back(CDNSSeedData("koto-testnet.poolof.work", "koto-testnet.poolof.work"));    // <= 追加

コンパイル

既にビルド済みの場合は、srcディレクトリでmake kotodを実行します。

cd koto
cd src
make kotod

まだビルドしていない場合は、普通にビルドします。

./zcutil/build.sh –disable-rust

ビルドし終わったら/usr/local/binへコピーします。(自分の環境では。)

sudo cp kotod /usr/local/bin

Kotodをポートを変えて2個実行する

設定

1個目はデフォルトのテストネット設定を使用。

  • ~/.koto
  • ポートは18433(p2p)と18432(rpc)

2個目のKotod:

  • ~/.kotosを使う
  • ポートは18443(p2p)と18442(rpc)
  • 2個目のKotodが1個目に接続する。

設定ファイルは以下のようにしています。

1個目:~/.koto/koto.conf

1
2
3
4
5
6
7
rpcuser=rpcuser
rpcpassword=rpcpass
rpcbind=0.0.0.0
rpcallowip=0.0.0.0/0
server=1
minetolocalwallet=1
testnet=1

2個目:~/.kotos/koto.conf

1
2
3
4
5
6
7
8
9
10
rpcuser=rpcuser
rpcpassword=rpcpass
rpcbind=0.0.0.0
rpcallowip=0.0.0.0/0
port=18443
rpcport=18442
connect=localhost
server=1
minetolocalwallet=1
datadir=/home/koto/.kotos

port, rpcport, connect, datadirをそれぞれ設定しています。

systemd設定

ユーザ「koto」で実行する前提です。上記の設定ファイルもその前提で作成しています。

/etc/systemd/system/kotod-testnet.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Bitcoin daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/kotod -testnet -daemon -conf=/home/koto/.koto/koto.conf -pid=/home/koto/.koto/koto-testnet.pid
User=koto
Group=koto
Type=forking
PIDFile=/home/koto/.koto/koto-testnet.pid
Restart=on-failure
PrivateTmp=true

[Install]
WantedBy=multi-user.target

/etc/systemd/system/kotod-testnet-slave.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Koto cash daemon (testnet/slave)
After=network.target

[Service]
ExecStart=/usr/local/bin/kotod -testnet -daemon -conf=/home/koto/.kotos/koto.conf -pid=/home/koto/.kotos/koto-testnet.pid
User=koto
Group=koto
Type=forking
PIDFile=/home/koto/.kotos/koto-testnet.pid
Restart=on-failure
PrivateTmp=true

[Install]
WantedBy=multi-user.target

実行

実行します。

sudo systemctl daemon-reload
sudo systemctl start kotod-testnet
sudo systemctl start kotod-testnet-slave

koto-cli --testnet getinfoを実行してconnectionsが1になっていれば成功しているはずです。

マイニングしてみる

cpuminer-yescryptをコンパイルしましょう。

minerd –algo=yescrypt –userpass=rpcuser:rpcpass -o 127.0.0.1:18432

これで猛烈な勢いでマイニングが進むはず。

その後の作業

日時対策を元に戻す

1度マイニングしてしまえば日時対策は不要です。

main.cppの修正の影響がどこまであるかわからないので、main.cppを元に戻したkotodを再コンパイルし、サービスを再起動します。

ToDo

  • testnet用のinsightを立てる
  • testnet用の蛇口(Fauset)を作る
  • dnsseed(DNSサーバ)を立てる

Comments