diff --git a/src/block_template.cpp b/src/block_template.cpp index 74ec4ea..13f31b2 100644 --- a/src/block_template.cpp +++ b/src/block_template.cpp @@ -1335,27 +1335,32 @@ bool BlockTemplate::get_aux_proof(const uint32_t template_id, const hash& h, std return true; } -std::vector BlockTemplate::get_block_template_blob(uint32_t template_id, uint32_t sidechain_extra_nonce, size_t& nonce_offset, size_t& extra_nonce_offset, size_t& sidechain_id_offset, hash& sidechain_id) const +std::vector BlockTemplate::get_block_template_blob(uint32_t template_id, uint32_t sidechain_extra_nonce, size_t& nonce_offset, size_t& extra_nonce_offset, size_t& merkle_root_offset, hash& merge_mining_root) const { ReadLock lock(m_lock); if (template_id != m_templateId) { const BlockTemplate* old = m_oldTemplates[template_id % array_size(&BlockTemplate::m_oldTemplates)]; if (old && (template_id == old->m_templateId)) { - return old->get_block_template_blob(template_id, sidechain_extra_nonce, nonce_offset, extra_nonce_offset, sidechain_id_offset, sidechain_id); + return old->get_block_template_blob(template_id, sidechain_extra_nonce, nonce_offset, extra_nonce_offset, merkle_root_offset, merge_mining_root); } nonce_offset = 0; extra_nonce_offset = 0; - sidechain_id_offset = 0; - sidechain_id = {}; + merkle_root_offset = 0; + merge_mining_root = {}; return std::vector(); } nonce_offset = m_nonceOffset; extra_nonce_offset = m_extraNonceOffsetInTemplate; - sidechain_id_offset = m_extraNonceOffsetInTemplate + m_poolBlockTemplate->m_extraNonceSize + 2 + m_poolBlockTemplate->m_merkleTreeDataSize; - sidechain_id = calc_sidechain_hash(sidechain_extra_nonce); + + const hash sidechain_id = calc_sidechain_hash(sidechain_extra_nonce); + const uint32_t n_aux_chains = static_cast(m_poolBlockTemplate->m_auxChains.size() + 1); + const uint32_t aux_slot = get_aux_slot(m_sidechain->consensus_hash(), m_poolBlockTemplate->m_auxNonce, n_aux_chains); + merge_mining_root = get_root_from_proof(sidechain_id, m_poolBlockTemplate->m_merkleProof, aux_slot, n_aux_chains); + + merkle_root_offset = m_extraNonceOffsetInTemplate + m_poolBlockTemplate->m_extraNonceSize + 2 + m_poolBlockTemplate->m_merkleTreeDataSize; return m_blockTemplateBlob; } diff --git a/src/block_template.h b/src/block_template.h index 98eff14..f18da74 100644 --- a/src/block_template.h +++ b/src/block_template.h @@ -51,7 +51,7 @@ public: std::vector get_aux_chains(const uint32_t template_id) const; bool get_aux_proof(const uint32_t template_id, const hash& h, std::vector& proof) const; - std::vector get_block_template_blob(uint32_t template_id, uint32_t sidechain_extra_nonce, size_t& nonce_offset, size_t& extra_nonce_offset, size_t& sidechain_id_offset, hash& sidechain_id) const; + std::vector get_block_template_blob(uint32_t template_id, uint32_t sidechain_extra_nonce, size_t& nonce_offset, size_t& extra_nonce_offset, size_t& merkle_root_offset, hash& merge_mining_root) const; FORCEINLINE uint64_t height() const { return m_height; } FORCEINLINE difficulty_type difficulty() const { return m_difficulty; } diff --git a/src/p2pool.cpp b/src/p2pool.cpp index c8995cd..43f5020 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -631,10 +631,10 @@ void p2pool::submit_aux_block(const hash& chain_id, uint32_t template_id, uint32 size_t nonce_offset = 0; size_t extra_nonce_offset = 0; - size_t sidechain_id_offset = 0; - hash sidechain_id; + size_t merkle_root_offset = 0; + hash merge_mining_root; - std::vector blob = m_blockTemplate->get_block_template_blob(template_id, extra_nonce, nonce_offset, extra_nonce_offset, sidechain_id_offset, sidechain_id); + std::vector blob = m_blockTemplate->get_block_template_blob(template_id, extra_nonce, nonce_offset, extra_nonce_offset, merkle_root_offset, merge_mining_root); if (blob.empty()) { LOGWARN(3, "submit_aux_block: block template blob not found"); @@ -644,7 +644,7 @@ void p2pool::submit_aux_block(const hash& chain_id, uint32_t template_id, uint32 uint8_t* p = blob.data(); memcpy(p + nonce_offset, &nonce, NONCE_SIZE); memcpy(p + extra_nonce_offset, &extra_nonce, EXTRA_NONCE_SIZE); - memcpy(p + sidechain_id_offset, sidechain_id.h, HASH_SIZE); + memcpy(p + merkle_root_offset, merge_mining_root.h, HASH_SIZE); ReadLock lock(m_mergeMiningClientsLock); @@ -699,18 +699,18 @@ void p2pool::submit_block() const size_t nonce_offset = 0; size_t extra_nonce_offset = 0; - size_t sidechain_id_offset = 0; - hash sidechain_id; + size_t merkle_root_offset = 0; + hash merge_mining_root; bool is_external = false; 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, sidechain_id_offset, sidechain_id); + 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); LOGINFO(0, log::LightGreen() << "submit_block: height = " << height << ", template id = " << submit_data.template_id << ", nonce = " << submit_data.nonce << ", extra_nonce = " << submit_data.extra_nonce - << ", id = " << sidechain_id); + << ", 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); @@ -741,8 +741,8 @@ void p2pool::submit_block() const b = submit_data.extra_nonce & 255; submit_data.extra_nonce >>= 8; } - else if (sidechain_id_offset && sidechain_id_offset <= i && i < sidechain_id_offset + HASH_SIZE) { - b = sidechain_id.h[i - sidechain_id_offset]; + else if (merkle_root_offset && merkle_root_offset <= i && i < merkle_root_offset + HASH_SIZE) { + b = merge_mining_root.h[i - merkle_root_offset]; } else { b = submit_data.blob[i]; @@ -755,7 +755,7 @@ void p2pool::submit_block() const const Params::Host& host = current_host(); JSONRPCRequest::call(host.m_address, host.m_rpcPort, request, host.m_rpcLogin, m_params->m_socks5Proxy, - [height, diff, template_id, nonce, extra_nonce, sidechain_id, is_external](const char* data, size_t size, double) + [height, diff, template_id, nonce, extra_nonce, merge_mining_root, is_external](const char* data, size_t size, double) { rapidjson::Document doc; if (doc.Parse(data, size).HasParseError() || !doc.IsObject()) { @@ -782,7 +782,7 @@ void p2pool::submit_block() const LOGWARN(3, "submit_block (external blob): daemon returned error: " << (error_msg ? error_msg : "unknown error")); } else { - LOGERR(0, "submit_block: daemon returned error: '" << (error_msg ? error_msg : "unknown error") << "', template id = " << template_id << ", nonce = " << nonce << ", extra_nonce = " << extra_nonce << ", id = " << sidechain_id); + LOGERR(0, "submit_block: daemon returned error: '" << (error_msg ? error_msg : "unknown error") << "', template id = " << template_id << ", nonce = " << nonce << ", extra_nonce = " << extra_nonce << ", mm_root = " << merge_mining_root); } return; }