NEETCOINに名前を刻んだ

以前ビットコインで、Ghash.I.O.というマイナーがハッシュレートの50%以上を占めて「これはヤバイ」と話題になったことがある。

ビットコインが「終了」の危機に瀕している ひとりの山師のハッシュレートが51%を超えたため - Market Hack

ただ、この記事は間違いで、検証作業は参加者全員が行っている。Ghash.I.Oが悪意を持ったときにできるのは、コインを捏造することではなく、過去の支払いを無かったことにすること。

ハッシュレートの現在の分布は↓のサイトなどで確認ができる。

https://blockchain.info/ja/pools

f:id:kusano_k:20180123054816p:plain:w480

このハッシュレートは、実際には過去の一定期間にブロックを採掘したマイニングプールの割合から計算しているのだと思う。 あるブロックがどこのマイニングプールから採掘されたのかが、なぜ分かるかというと、ブロックにマイニングプールの名前を刻んでいるから(なので、マイニングプールが強力なハッシュレートを使って悪さをしようとするならば、そもそもブロックに自分の名前を書かず、ハッシュレートをごまかすと思う)。

マイニングプールの名前は各ブロックに格納される一番最初の「取引」に書く。 この取引はマイニングの報酬が与えられる取引。

「取引」は入力と出力から構成される。 入力には、過去の取引のIDとScriptSig(基本的には過去にその取引でコインを受け取ったのが自分であることを示す電子署名)が並んでいる。 出力には、支払先のScriptPubkey(基本的には公開鍵)と金額が並んでいる。 マイニング報酬の取引の入力には「過去の取引」が存在しないので、IDには000…0を書き、ScriptSigの部分には好きなデータが書ける(はずだったけど、途中で最初にブロックの高さを書かないといけなくなった)。 ここにマイニングプールの名前が書かれている。例えば、505582番目のブロック最初の取引を見ると、/BTC.COM/ という文字列が含まれている。

暗号通貨のマイニングというとマイニングプールに繋いで採掘するのが普通だが、これでは最初の取引に自分の名前が刻めない。

NEETCOINという暗号通貨があるのを知った。 今からビットコインのブロックを採掘するのは無理だけど、新しい暗号通貨ならば採掘している人が少ないから何とかなりそう。

NEETCOINのハッシュアルゴリズムは、Litecoinや昔のMonacoinと同じScrypt。 ScryptはASICが出回っているので、CPUやGPUで太刀打ちするのが難しい。 以前に同僚からScryptに対応したASICを買い取っていた。

他で見ない形をしているけれど、Gridseed miniが2個。 元から付いているヒートシンクを外して、基盤を表と裏に貼り付け、別途ファンを付けたらしい。 1個で毎秒約250kハッシュ(khash/s)、2個で500 khash/s。 CPUだと4年前に3万5千円で買ったCore i7 4790 3.60GHzで80 khash/sくらい。 ただ、これでも最新の高いASICよりはだいぶ能力が劣るらしく、数日動かしても1個もブロックが掘れなかった。 26万円くらいのAntminer L3+は504 Mhash/sらしい。

こういう機械を持っている人の計算量(ハッシュレート)を買うことにした。 NiceHashが有名。 入金までしてみたものの、なかなか使い勝手が悪い。 NiceHashではハッシュレートを取りまとめて送ってくるので強力すぎる。 上限は設定できるけれど、最低でも0.01 Thash/s。 これは採掘をしていたときのネットワーク全体のハッシュレートよりも強い。 採掘できるコインが一定になるように難易度が調節されるので、難易度が上がって効率が悪くなる。 あと、他の購入者の設定金額との兼ね合いで、ハッシュレートが回ってきたり来なかったりする。 まあ、すでにネットワーク全体のハッシュレート高い暗号通貨を、後述のような試行錯誤をしたりすることなく採掘する分にはこれで困らないのだろう。

Mining Rig Rentalsならば、1人の相手からハッシュレートを買えるので、強力すぎないしハッシュレートも一定。

この手のハッシュレート購入サイトは、Stratumというプロトコルの接続先を指定してハッシュレートを買う。 手元で動かしている暗号通貨のウォレットとのプロトコル(Getwork)とは異なるので、変換する必要がある。

プロキシしてくれるプログラムがあるだろうとググってみると、stratum-mining-proxyというのが出てきたが、これはGetworkのマイニングツールをStratumのサーバーに接続するためのもので逆方向。 マイニングプールはまさにStratumをGetworkに変換しているので、大仰する気もするが、自分でマイニングプールを動かさないといけないらしい。 これがなかなか面倒だった。

https://github.com/Crypto-Expert/stratum-mining

このソフトを使う。 フォークが色々とあるけれど、結局本家のこれが一番新しいのではないかと思う。 ただし、ちょこちょこ修正が必要。

Wikiにセットアップ方法が書かれている。

まず、依存ソフトのstratumが、distribute_setupのエラーでビルドに失敗するので、別途pipでインストールしてsetup.pyを書き換える。 参考

stratum-mingも修正する

別にマイニングプールで人を集めるわけでも無いのでSQLiteで充分だけど、実装されていないところがあるので、MySQLをセットアップして使う。 DBの初期設定にはこのSQLを流し込む。 結局試していないが、もしかしたらDB無しでも動くかも。

設定ファイルに追加したり、変更したりした項目は下記の通り。

CONFIG_VERSION = None
CENTRAL_WALLET = '自分のNEETCOINのアドレス'
COINDAEMON_TRUSTED_HOST = '自分のウォレットのIPアドレス'
COINDAEMON_TRUSTED_PORT = 21010
COINDAEMON_TRUSTED_USER = 'user name'
COINDAEMON_TRUSTED_PASSWORD = 'password'
ALGO_NAME = 'ltc_scrypt'
CUSTOM_HEADER =  "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
CUSTOM_DIFF1 = 0x0000ffff00000000000000000000000000000000000000000000000000000000
COINDAEMON_REWARD = 'POS'
DB_MYSQL_PASS = 'pooldb'
USERS_AUTOADD = True
COINBASE_EXTRAS = 'この値がブロックに書かれる'
POOL_TARGET = 76294
VDIFF_MAX_TARGET = 76294
BOT_ENABLED = False

POOL_TARGETVDIFF_MAX_TARGETの値を大きくしてプールの難易度を上げておかないとMining Rig Rentalsでエラーになる。

0.5 LTC(1万円分くらい)で、約500 NEETCOINを採掘できた。 採掘している途中でNEETCOINを取り扱う取引所が出てきたからか、採掘する人が増えたので今はもっと効率が悪い。

残念ながら、NEETCOINのブロックエクスプローラにはマイニングプールの名前やScriptSigは出てこない。 例えば87190番目のブロックは私が採掘したので、ウォレットのデバッグウィンドウでgetblockbynumber 87190 trueと打ち込むと私のIDがcoinbaseに書かれているのが分かる。

"vin" : [
{
"coinbase" : "0396540104dea8635a08f8000001010000000b2f406b7573616e6f5f6b2f",
"sequence" : 0
}