Просмотр исходного кода

blockchain/monero: Use the provided Merkle proof instead of self-constructing one

x 8 месяцев назад
Родитель
Сommit
1df40b7d42
2 измененных файлов с 27 добавлено и 28 удалено
  1. 26 21
      bin/darkfid/src/rpc_xmr.rs
  2. 1 7
      src/blockchain/monero/mod.rs

+ 26 - 21
bin/darkfid/src/rpc_xmr.rs

@@ -22,8 +22,8 @@ use darkfi::{
     blockchain::{
         header_store::PowData,
         monero::{
-            fixed_array::{FixedByteArray, MaxSizeVec},
-            monero_block_deserialize, MoneroPowData,
+            fixed_array::FixedByteArray, merkle_proof::MerkleProof, monero_block_deserialize,
+            MoneroPowData,
         },
         HeaderHash,
     },
@@ -352,7 +352,7 @@ impl DarkfiNode {
         let Some(path) = path.get::<f64>() else {
             return JsonError::new(InvalidParams, Some("invalid path format".to_string()), id).into()
         };
-        let _path = *path as u32;
+        let path = *path as u32;
 
         // Parse seed_hash
         let Some(seed_hash) = params.get("seed_hash") else {
@@ -377,24 +377,29 @@ impl DarkfiNode {
         );
 
         // Construct the MoneroPowData
-        let aux_chain_hashes =
-            MaxSizeVec::from_items_truncate(vec![monero::Hash::from(aux_hash.inner())]);
-        let monero_pow_data =
-            match MoneroPowData::new(block, seed_hash, aux_chain_hashes, *aux_hash.inner()) {
-                Ok(v) => v,
-                Err(e) => {
-                    error!(
-                        target: "darkfid::rpc_xmr::xmr_merge_mining_submit_solution",
-                        "[RPC-XMR] Failed constructing MoneroPowData: {e}",
-                    );
-                    return JsonError::new(
-                        InvalidParams,
-                        Some("failed constructing moneropowdata".to_string()),
-                        id,
-                    )
-                    .into()
-                }
-            };
+        let Some(merkle_proof) = MerkleProof::try_construct(merkle_proof, path) else {
+            return JsonError::new(
+                InvalidParams,
+                Some("could not construct aux chain merkle proof".to_string()),
+                id,
+            )
+            .into()
+        };
+        let monero_pow_data = match MoneroPowData::new(block, seed_hash, merkle_proof) {
+            Ok(v) => v,
+            Err(e) => {
+                error!(
+                    target: "darkfid::rpc_xmr::xmr_merge_mining_submit_solution",
+                    "[RPC-XMR] Failed constructing MoneroPowData: {e}",
+                );
+                return JsonError::new(
+                    InvalidParams,
+                    Some("failed constructing moneropowdata".to_string()),
+                    id,
+                )
+                .into()
+            }
+        };
 
         // Append MoneroPowData to the DarkFi block and sign it
         let (block, secret) = &mm_blocktemplates.get(&aux_hash).unwrap();

+ 1 - 7
src/blockchain/monero/mod.rs

@@ -83,8 +83,7 @@ impl MoneroPowData {
     pub fn new(
         block: monero::Block,
         seed: FixedByteArray,
-        ordered_aux_chain_hashes: AuxChainHashes,
-        darkfi_hash: [u8; 32],
+        aux_chain_merkle_proof: MerkleProof,
     ) -> Result<Self> {
         let hashes = create_ordered_tx_hashes_from_block(&block);
         let root = tree_hash(&hashes)?;
@@ -107,11 +106,6 @@ impl MoneroPowData {
         coinbase.prefix.outputs.consensus_encode(&mut encoder_prefix)?;
         keccak.update(&encoder_prefix);
 
-        let d_hash = monero::Hash::from_slice(darkfi_hash.as_slice());
-        let aux_chain_merkle_proof = create_merkle_proof(&ordered_aux_chain_hashes, &d_hash).ok_or_else(|| {
-		MoneroMergeMineError("create_merkle_proof returned none, could not find darkfi hash in aux chain hashes".to_string())
-		})?;
-
         Ok(Self {
             header: block.header,
             randomx_key: seed,