UkkeyCoinがプールマイニング出来なくなった件

スポンサーリンク

悪夢は日曜日の朝に始まった(泣)

UkkeyCoin は 60秒毎に ブロックが生成されるが、突然ブロックが生成されなくなった(汗)
調べてみると、プールでブロックを発見したにもかかわらず、デーモンから、以下のエラーで弾かれているようだ。

ERROR: AcceptBlock: bad-cb-type, coinbase is not a CbTx (code 16)

エラーを出力している該当の箇所は validation.cpp 内

    if (fDIP0003Active_context) {
        if (block.vtx[0]->nType != TRANSACTION_COINBASE) {
            return state.DoS(100, false, REJECT_INVALID, "bad-cb-type", false, "coinbase is not a CbTx");
        }
    }

で、fDIP0003Active_context の決定は、

    bool fDIP0003Active_context = VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0003, versionbitscache) == THRESHOLD_ACTIVE;

なんか、感じからすると、DIP0003がACTIVEになったんかね?

https://docs.dash.org/en/stable/masternodes/dip3-upgrade.html
英語ドキュメントを読まないとだなぁ

そして プール経由だとダメみたい。
という事は、また transaction.js か!?
と思ったのは、以前 miner.cpp で、開発者報酬を埋めた場所の直前に、fDIP0003Active_context で処理分岐してる部分があったのだ。

    if (!fDIP0003Active_context) {
        coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
    } else {
        coinbaseTx.vin[0].scriptSig = CScript() << OP_RETURN;

        coinbaseTx.nVersion = 3;
        coinbaseTx.nType = TRANSACTION_COINBASE;

        CCbTx cbTx;
        cbTx.nHeight = nHeight;

        CValidationState state;
        if (!CalcCbTxMerkleRootMNList(*pblock, pindexPrev, cbTx.merkleRootMNList, state)) {
            throw std::runtime_error(strprintf("%s: CalcSMLMerkleRootForNewBlock failed: %s", __func__, FormatStateMessage(state)));
        }

        SetTxPayload(coinbaseTx, cbTx);
    }

という事は、transaction.js でも同様な処理が必要。。。気が重いのであった(泣)

とりあえず、nVersion(=3) と nType(=5) 及び coinbase_payload を設定している transaction.js を見かけたので、取り込んでみた。
transactions.js

後から調べてみたのですがこちらのソースはdashの公式にあった、p2pool のものです。
ソース下の方で、version と type それに coinbase_payload のデータも入れているようです。

        gentx = dict(
            version=1,
            type=0,
            tx_ins=[dict(
                previous_output=None,
                sequence=None,
                script=share_data['coinbase'],
            )],
            tx_outs=worker_tx + payments_tx + donation_tx + [dict(
                value=0,
                script='\x6a\x28' + cls.get_ref_hash(net, share_info, ref_merkle_link) + pack.IntType(64).pack(last_txout_nonce),
            )],
            lock_time=0,
            extra_payload=None,
        )

        if share_data['coinbase_payload'] is not None and len(share_data['coinbase_payload']) != 0:
            # DIP3/DIP4 cbtx
            gentx['version'] = 3
            gentx['type'] = 5
            gentx['extra_payload'] = share_data['coinbase_payload']

ブロックエクスプローラーでマイニングで生成したトランザクションを確認すると、大丈夫そうw

ん~~~奥が深い!

コメント