Koto Mining Pool で不具合が発生していた件(解決済み)

暗号通貨
スポンサーリンク

 支払い処理でエラーになっていた
 /mpos/logs/payouts のログを確認したら

Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr
 なぜに?
 マイニングした報酬はタップリあるハズなにのー

 さらに、ログを見ていくと、
 z_sendmany で 「getrandom」とかエラーでコケてるでは無いか。。。

 掘ったコインを一旦プライベートアドレスに転送して戻すって事を KOTO 用に自前で作った部分があるのだが、そこでのエラーw
 なんと、6月の初旬に、デーモンを 2.0.4 にアップデートした時から発生していたのだ(汗)
 なんですが、このエラーは。。。ググっても分からないし。。。
 discordで見つかった
 https://discordapp.com/channels/400107631810969609/400107631810969611/561444893764091906
 この辺りが怪しいか

 前にマイクラ公式サーバを動かそうとして、glibcがどーのこーのって。。。言われて ゴニョゴニョしたけど結局動かず
 その時の悪あがきが悪さしちゃったかな(汗)

いいタイミングか、縮退しよ

 Koto Mining Pool – 大人の自由研究 はピーク時に比べてアクセスも少なく、リソースが余っていた。
 いつか縮退しようと思ってはいたが、、、アップグレードはボタンポチでできるのに、ダウングレードは出来ない(汗)Time4VPS.

 ちょうど、更新日が3,4日後にあるので、この機会に、スペックダウンしたサーバを借り、そちらに移行しようと計画した。

 OS は ubuntu18.04 です。
 (今までは、ubuntu16.04 でした)

 環境を構築して、WalletやDBをバックアップ&リストアし、新環境で動くようになった。
 ドメインも切り替えて、MPOS管理画面からも見れるようになった。
 移行についてはすんなりいったかな。

Invalid amount

 新環境で可動させるも、今度は Invalid amount ってエラーが出る。
 んー
 koto-cli で sendmany を試してもエラーにはならない(汗)
 curl経由 で も同様。

 なぞだ。。。
 これがまたエラーにならず送金できる時もあるという。。。
 ソースみると Invalid amount は 小数点以下8桁超えた時にでるようだが。。。

 /mpos/cronjobs/payouts.php の該当箇所

 $aSendMany[$aUserData[‘coin_address’]] = $aUserData[‘confirmed’] – $config[‘txfee_manual’];
 ここで、転送手数料を引いてるだけ。。。

 そして、正体を突き止めた!
 json_encode をすると、浮動小数点が(汗)

2019-06-19 01:50:05 – INFO –> {“k18CKcd3xf3ErU8Qpn8MCWspDYGBEvNqNMq”:2.5022580199999997}
2019-06-19 01:50:05 – ERROR –> E0078: RPC method sendmany did not return 200 OK: Address: k18CKcd3xf3ErU8Qpn8MCWspDYGBEvNqNMq ERROR: RPC call did not return 200: HTTP error: 500 – JSON Response: [-3] Invalid amount

 なんてこったー!!

 2.60225802 – 0.1 = 2.502258012

 を期待していたが、

 2.5022580199999997

 とエンコードされている。
 確かに、この値でリクエストすると、Invalid amount なる。

 浮動小数点数の精度問題か(泣)

/mpos/cronjobs/payouts.php を 以下のように修正してみた。

$aSendMany[$aUserData[‘coin_address’]] = $aUserData[‘confirmed’] – $config[‘txfee_auto’];
 ↓
$aSendMany[$aUserData[‘coin_address’]] = floatval( strval($aUserData[‘confirmed’] – $config[‘txfee_auto’] ));

一旦文字列にして浮動小数点に戻すと(汗)

 とりあえず、順調に可動している。
 ブロックの発見があまり無いので、まだ送金の回数は少ないが、今の所は問題なく送金できているようだ。
 ひとまず安心w

環境の違いか

 気になるのが 何で json_encode で出るようになったのか!?
 新環境は PHP7.2 にした、旧環境は PHP7.0 だった。この違いで json_encode の 浮動小数点の扱いが変わったのか。。。

 検証用にサンプルプログラムを作ってみた

#!/usr/bin/php
<?php

 $confirmed = 2.60225802;
 $txfee     = 0.1;
 $amount = $confirmed - $txfee;

 echo json_encode( $amount) ."\n";

 echo json_encode( floatval( strval( $confirmed - $txfee ) ) ) ."\n";

?>

新環境

$ php -version
PHP 7.2.19-0ubuntu0.18.04.1 (cli) (built: Jun  4 2019 14:48:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies

$ php test.php
2.5022580199999997
2.50225802

旧環境

$ php -version
PHP 7.0.33-0ubuntu0.16.04.5 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0ubuntu0.16.04.5, Copyright (c) 1999-2017, by Zend Technologies

$ php test.php
2.50225802
2.50225802

 んー確かに。違う。。。

 これは、設定とかで同じになるのでしょうか。。。

送金エラー対応

 さて、落ち着いたら、送金エラーになったものを対応しようかな。
 MPOSのtransactions テーブルを見ると、送信エラーになったものは、txid が入っていない。
 それらをピックアップして、手動で送る。
 送った時のtxidを テーブルに書き入れてあげれば、良さそうだな。

 面倒な作業だが、幸いな事に そんな件数は多くない(汗)
 件数が多ければプログラム作っても良いかもね。今後のためにw

さいごに

 今回のトラブルのお蔭で、サーバーが縮退できた。月のサーバー費用も多少ではあるが安くなるw
 が、マイナーの皆様にはご迷惑をおかけしました。。。
 m(_ _)m

コメント