diff --git a/src/block_template.cpp b/src/block_template.cpp index ddb6c1d..1152028 100644 --- a/src/block_template.cpp +++ b/src/block_template.cpp @@ -279,13 +279,24 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const m_blockHeaderSize = m_blockHeader.size(); - m_poolBlockTemplate->m_minerWallet = in_donation_mode ? params->m_devWallet : params->m_miningWallet; + m_poolBlockTemplate->m_minerWallet = params->m_miningWallet; if (!m_sidechain->fill_sidechain_data(*m_poolBlockTemplate, m_shares)) { use_old_template(); return; } + // Whole-block donation: replace all miner shares with single dev wallet output + if (in_donation_mode && !m_shares.empty()) { + difficulty_type total_weight; + for (const auto& share : m_shares) { + total_weight += share.m_weight; + } + m_shares.clear(); + m_shares.emplace_back(total_weight, ¶ms->m_devWallet); + LOGINFO(4, "Donation mode: entire block reward goes to dev wallet"); + } + // Pre-calculate outputs to speed up miner tx generation if (!m_shares.empty()) { struct Precalc @@ -634,7 +645,7 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const m_poolBlockTemplate->m_transactions.push_back(m_mempoolTxs[m_mempoolTxsOrder[i]].id); } - m_poolBlockTemplate->m_minerWallet = in_donation_mode ? params->m_devWallet : params->m_miningWallet; + m_poolBlockTemplate->m_minerWallet = params->m_miningWallet; // Layout: [software id, version, random number, sidechain extra_nonce] uint32_t* sidechain_extra = m_poolBlockTemplate->m_sidechainExtraBuf; @@ -769,6 +780,17 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const calc_merkle_tree_main_branch(); + // DEBUG: Log block template structure + LOGINFO(0, "DEBUG P2POOL TEMPLATE (" << m_blockTemplateBlob.size() << " bytes)"); + std::string hex; + hex.reserve(400); + for (size_t i = 0; i < std::min(200, m_blockTemplateBlob.size()); ++i) { + char buf[3]; + snprintf(buf, 3, "%02x", m_blockTemplateBlob[i]); + hex += buf; + } + LOGINFO(0, "P2POOL FIRST 200 BYTES: " << hex); + LOGINFO(3, "final reward = " << log::Gray() << log::XMRAmount(final_reward) << log::NoColor() << ", weight = " << log::Gray() << final_weight << log::NoColor() << ", outputs = " << log::Gray() << m_poolBlockTemplate->m_outputAmounts.size() << log::NoColor() << @@ -931,8 +953,9 @@ int BlockTemplate::create_miner_tx(const MinerData& data, const std::vectorget_block_template_blob(submit_data.template_id, submit_data.extra_nonce, nonce_offset, extra_nonce_offset, merkle_root_offset, merge_mining_root, &block_tpl); - - LOGINFO(0, log::LightGreen() << "submit_block: height = " << height - << ", template id = " << submit_data.template_id - << ", nonce = " << submit_data.nonce - << ", extra_nonce = " << submit_data.extra_nonce - << ", mm_root = " << merge_mining_root); - - if (submit_data.blob.empty()) { - LOGERR(0, "submit_block: couldn't find block template with id " << submit_data.template_id); - return; - } - } - else { - LOGINFO(0, log::LightGreen() << "submit_block: height = " << height << ", external blob (" << submit_data.blob.size() << " bytes)"); - std::string hex; - hex.reserve(submit_data.blob.size() * 2); - for (size_t i = 0; i < std::min(submit_data.blob.size(), 400); ++i) { - char buf[3]; - snprintf(buf, sizeof(buf), "%02x", submit_data.blob[i]); - hex.append(buf); - } - LOGINFO(0, "BLOB HEX (first 400 bytes): " << hex); - is_external = true; - } + if (submit_data.blob.empty()) { + submit_data.blob = m_blockTemplate->get_block_template_blob(submit_data.template_id, submit_data.extra_nonce, nonce_offset, extra_nonce_offset, merkle_root_offset, merge_mining_root, &block_tpl); + LOGINFO(0, log::LightGreen() << "submit_block: height = " << height + << ", template id = " << submit_data.template_id + << ", nonce = " << submit_data.nonce + << ", extra_nonce = " << submit_data.extra_nonce + << ", mm_root = " << merge_mining_root); + + // DEBUG: Log what we're submitting + std::string hex; + hex.reserve(submit_data.blob.size() * 2); + for (size_t i = 0; i < submit_data.blob.size(); ++i) { + char buf[3]; + snprintf(buf, sizeof(buf), "%02x", submit_data.blob[i]); + hex.append(buf); + } + LOGINFO(0, "DEBUG BLOCK BLOB: " << hex); + + if (submit_data.blob.empty()) { + LOGERR(0, "submit_block: couldn't find block template with id " << submit_data.template_id); + return; + } + } + else { + LOGINFO(0, log::LightGreen() << "submit_block: height = " << height << ", external blob"); + is_external = true; + } std::string request; request.reserve(submit_data.blob.size() * 2 + 128);