悪夢は日曜日の朝に始まった(泣)
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

ん~~~奥が深い!


コメント