[bug] prd response doesn't trigger infinite responses loop

This commit is contained in:
NicolasCantu 2025-01-03 11:49:26 +01:00
parent de5eb1b8cd
commit 49637d9b40

View File

@ -905,38 +905,59 @@ fn handle_prd(
});
}
PrdType::Response => {
let mut to_update = relevant_process
.get_latest_concurrent_states_mut()?
.into_iter()
.find(|r| {
r.pcd_commitment == prd.pcd_commitments
})
.ok_or(anyhow::Error::msg("Original request not found"))?;
let update_state_id = prd.pcd_commitments.create_merkle_tree()?.root().ok_or(AnyhowError::msg("Invalid merkle tree"))?.to_lower_hex_string();
let mut to_update = relevant_process.get_state_for_id_mut(&update_state_id)?;
to_update
.validation_tokens
.extend(prd.validation_tokens);
let new_validations = prd.validation_tokens;
let mut to_add: Vec<&Proof> = vec![];
for token in &new_validations {
let key = token.get_key();
// Check if the token key already exists
let already_exists = to_update
.validation_tokens
.iter()
.any(|existing_token| existing_token.get_key() == key);
if !already_exists {
debug!("Adding token with key {}", key);
to_add.push(token);
} else {
debug!("Token with key {} already exists, skipping", key);
}
}
// If there's no new proofs return early
if to_add.is_empty() {
return Err(AnyhowError::msg("No new validation tokens found in prd response"));
}
// We add the new tokens and return all that was updated
to_update.validation_tokens.extend(to_add);
let updated_state = to_update.clone();
let clear_state = to_update.decrypt_pcd()?;
let roles = Value::Object(clear_state).extract_roles()?;
let modified_state = Some(to_update.state_id.clone());
let mut commit_msg = CommitMessage::new_update_commitment(
OutPoint::from_str(&prd.root_commitment)?,
updated_state.pcd_commitment,
roles
);
commit_msg.set_validation_tokens(updated_state.validation_tokens);
// We must return an update of the process
let updated_process = UpdatedProcess {
commitment_tx: OutPoint::from_str(&prd.root_commitment)?,
current_process: relevant_process.clone(),
modified_state: Some(updated_state.state_id),
modified_state,
..Default::default()
};
let commit_msg = CommitMessage::new_update_commitment(
OutPoint::from_str(&prd.root_commitment)?,
updated_state.pcd_commitment,
roles
);
return Ok(ApiReturn {
updated_process: Some(updated_process),
commit_to_send: Some(commit_msg),
@ -1359,7 +1380,7 @@ pub fn create_update_message(
let full_prd = Prd::new_update(
outpoint,
serde_json::to_string(&sender)?,
sender,
roles,
update_state.keys.clone(),
update_state.pcd_commitment.clone(),
@ -1522,7 +1543,7 @@ pub fn create_response_prd(init_commitment: String, merkle_root_hex: String) ->
let response_prd = Prd::new_response(
outpoint,
serde_json::to_string(&sender)?,
sender,
vec![*proof],
update_state.pcd_commitment.clone(),
);