From e986e5dc2eaac0ccce7761623b1ff259ef2e01a9 Mon Sep 17 00:00:00 2001 From: SChernykh <15806605+SChernykh@users.noreply.github.com> Date: Fri, 10 May 2024 13:56:28 +0200 Subject: [PATCH] Tari: Added `coinbase_merkle_proof` to `pow_data` --- src/block_template.h | 2 ++ src/merge_mining_client.h | 2 +- src/merge_mining_client_json_rpc.cpp | 2 +- src/merge_mining_client_json_rpc.h | 2 +- src/merge_mining_client_tari.cpp | 16 ++++++++++++++-- src/merge_mining_client_tari.h | 2 +- src/p2pool.cpp | 2 +- 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/block_template.h b/src/block_template.h index 4c6427d..ed816ed 100644 --- a/src/block_template.h +++ b/src/block_template.h @@ -61,6 +61,8 @@ public: FORCEINLINE const std::vector& shares() const { return m_shares; } FORCEINLINE uint64_t get_reward() const { return m_finalReward; } + FORCEINLINE std::vector get_coinbase_merkle_proof() const { ReadLock lock(m_lock); return m_merkleTreeMainBranch; } + #ifdef P2POOL_UNIT_TESTS FORCEINLINE const PoolBlock* pool_block_template() const { return m_poolBlockTemplate; } FORCEINLINE std::mt19937_64& rng() { return m_rng; } diff --git a/src/merge_mining_client.h b/src/merge_mining_client.h index a8277e5..9ab5f20 100644 --- a/src/merge_mining_client.h +++ b/src/merge_mining_client.h @@ -38,7 +38,7 @@ public: virtual ~IMergeMiningClient() {} [[nodiscard]] virtual bool get_params(ChainParameters& out_params) const = 0; - virtual void submit_solution(const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) = 0; + virtual void submit_solution(const BlockTemplate* block_tpl, const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) = 0; }; } // namespace p2pool diff --git a/src/merge_mining_client_json_rpc.cpp b/src/merge_mining_client_json_rpc.cpp index 85f7ad6..5986daa 100644 --- a/src/merge_mining_client_json_rpc.cpp +++ b/src/merge_mining_client_json_rpc.cpp @@ -283,7 +283,7 @@ bool MergeMiningClientJSON_RPC::parse_merge_mining_get_job(const char* data, siz return true; } -void MergeMiningClientJSON_RPC::submit_solution(const uint8_t (&/*hashing_blob*/)[128], size_t /*nonce_offset*/, const hash& /*seed_hash*/, const std::vector& blob, const std::vector& merkle_proof) +void MergeMiningClientJSON_RPC::submit_solution(const BlockTemplate* /*block_tpl*/, const uint8_t (&/*hashing_blob*/)[128], size_t /*nonce_offset*/, const hash& /*seed_hash*/, const std::vector& blob, const std::vector& merkle_proof) { ReadLock lock(m_lock); diff --git a/src/merge_mining_client_json_rpc.h b/src/merge_mining_client_json_rpc.h index 486e371..e114cf7 100644 --- a/src/merge_mining_client_json_rpc.h +++ b/src/merge_mining_client_json_rpc.h @@ -30,7 +30,7 @@ public: ~MergeMiningClientJSON_RPC() override; bool get_params(ChainParameters& out_params) const override; - void submit_solution(const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) override; + void submit_solution(const BlockTemplate* block_tpl, const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) override; private: static void loop(void* data); diff --git a/src/merge_mining_client_tari.cpp b/src/merge_mining_client_tari.cpp index ccfd0d1..15caf9c 100644 --- a/src/merge_mining_client_tari.cpp +++ b/src/merge_mining_client_tari.cpp @@ -125,7 +125,7 @@ bool MergeMiningClientTari::get_params(ChainParameters& out_params) const return true; } -void MergeMiningClientTari::submit_solution(const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& /*merkle_proof*/) +void MergeMiningClientTari::submit_solution(const BlockTemplate* block_tpl, const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& /*merkle_proof*/) { Block block; { @@ -157,7 +157,19 @@ void MergeMiningClientTari::submit_solution(const uint8_t (&hashing_blob)[128], // Tx Merkle tree root data.append(reinterpret_cast(hashing_blob + nonce_offset + sizeof(uint32_t)), HASH_SIZE); - // TODO: serialize coinbase_merkle_proof, coinbase_tx_extra, coinbase_tx_hasher, aux_chain_merkle_proof + // Coinbase transaction's Merkle proof + const std::vector coinbase_merkle_proof = block_tpl->get_coinbase_merkle_proof(); + + // Number of hashes in the proof (varint, but an O(logN) proof will never get bigger than 127) + data.append(1, static_cast(coinbase_merkle_proof.size() / HASH_SIZE)); + + // Hashes in the proof + data.append(reinterpret_cast(coinbase_merkle_proof.data()), coinbase_merkle_proof.size()); + + // Path bitmap (always 0 for the coinbase tx) + data.append(1, 0); + + // TODO: serialize coinbase_tx_hasher, coinbase_tx_extra, aux_chain_merkle_proof pow->set_pow_data(data); } diff --git a/src/merge_mining_client_tari.h b/src/merge_mining_client_tari.h index 8d2600b..bf6b4bc 100644 --- a/src/merge_mining_client_tari.h +++ b/src/merge_mining_client_tari.h @@ -31,7 +31,7 @@ public: ~MergeMiningClientTari() override; bool get_params(ChainParameters& out_params) const override; - void submit_solution(const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) override; + void submit_solution(const BlockTemplate* block_tpl, const uint8_t (&hashing_blob)[128], size_t nonce_offset, const hash& seed_hash, const std::vector& blob, const std::vector& merkle_proof) override; static constexpr char TARI_PREFIX[] = "tari://"; diff --git a/src/p2pool.cpp b/src/p2pool.cpp index 21412cb..d396acd 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -679,7 +679,7 @@ void p2pool::submit_aux_block(const hash& chain_id, uint32_t template_id, uint32 } } - c->submit_solution(hashing_blob, nonce_offset, seed_hash, blob, proof); + c->submit_solution(block_tpl, hashing_blob, nonce_offset, seed_hash, blob, proof); } else { LOGWARN(3, "submit_aux_block: failed to get merkle proof for chain_id " << chain_id);