仮想通貨のマイニングのうちPoW(Proof of Works)はPCへの負担が大きく、報酬もよく変わります。
難易度が低い時だけ掘りたかったので、Node.js で Child process を使って自動で切り替えるようにしました。
確認用のログ出力
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* 色付きログ */ function mylog(str,color='\u001b[32m'){ console.log(color+str+'\u001b[0m'); } /* TEST */ mylog("black", '\u001b[30m'); mylog("red", '\u001b[31m'); mylog("green", '\u001b[32m'); mylog("yelleo", '\u001b[33m'); mylog("blue", '\u001b[34m'); mylog("magenta",'\u001b[35m'); mylog("cyan", '\u001b[36m'); mylog("white", '\u001b[37m'); |
green, cyanあたりが見やすい。
PoW難易度の監視
APIなど(無ければWebページでもなんでも)でPoW難易度やハッシュレートを取ってきて、必要に応じて処理を追加します。以下はサンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function getDiff(){ https.get("https://xxxxx/api/getdifficulty", function(res) { mylog(new Date(),'\u001b[36m'); var x=""; res.setEncoding('utf8'); res.on("data", function(chunk) {x+=chunk;}).on("end",function(){ let o = parseFloat(JSON.parse(x)["proof-of-work"]); mylog(o,'\u001b[35m'); /* 条件に応じてバッチファイルを起動する */ }); }); } getDiff(); setInterval(function(){ getDiff(); }, 20*1000);//20秒ごとに取得 |
複数の難易度をみて判断するなら Promise.all を使えば楽です。
バッチの起動と終了(Windows)
child processのkillなどが効かないのでそこはタスクキルを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function cmdRun(batname) { cp = child_process.spawn('cmd.exe', ['/c', batname]); //必要な出力をとってくる cp.stdin.on('data', (data) => { console.log(data.toString()); }); cp.stdout.on('data', (data) => { console.log(data.toString()); }); cp.stderr.on('data', (data) => { console.log(data.toString()); }); cp.on('close', (code) => { mylog(`child close : code ${code}`); }); } function cmdKill() { let kp = child_process.exec('taskkill /pid ' + cp.pid + ' /T /F'); kp.stdout.on('data', (data) => { console.log(data.toString()); }); kp.on('close', (code) => { console.log(`kill close : code ${code}`); }); } |
/T
は子プロセスを含めた終了、/F
は強制終了のオプションです。
所感
普段使わないからやらなかったけど、単純なものならbatだけでかける気がする。
色々と処理や判定を付け足したりするときに慣れた node.js が使えるのは利点だけど、Windowsだと色々とドキュメント通りに動かないのがつらい。