悪夢は日曜日の朝に始まった(泣)
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
ん~~~奥が深い!
コメント