From 616dc21aa969600c1e6528efb23f0b9818ebff26 Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Fri, 14 Feb 2025 16:19:03 +0100 Subject: [PATCH] Roles in process state --- src/commit.rs | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/commit.rs b/src/commit.rs index 0393a4c..f05e8d9 100644 --- a/src/commit.rs +++ b/src/commit.rs @@ -68,22 +68,11 @@ pub(crate) fn handle_commit_request(commit_msg: CommitMessage) -> Result Result { - // Process roles and commitments - let roles_only_map = json!({ "roles": serde_json::to_value(commit_msg.roles.clone())? }); - - let parsed_roles = roles_only_map.extract_roles()?; - // let roles_commitment = roles_only_map.hash_fields(root_commitment)?; - - // TODO make that kind of check reliable, needs more work on json serialization - // if roles_commitment.get("roles") != commit_msg.pcd_commitment.get("roles") { - // return Err(Error::msg("Role commitment mismatch")); - // } - let pcd_commitment = &commit_msg.pcd_commitment; let merkle_root_bin = pcd_commitment.create_merkle_tree()?.root().unwrap(); - if let Ok(pairing_process_id) = handle_member_list(&parsed_roles, commit_msg.process_id) { + if let Ok(pairing_process_id) = handle_member_list(&commit_msg.roles, commit_msg.process_id) { dump_cached_members()?; // Send a handshake message to every connected client if let Some(new_member) = lock_members().unwrap().get(&pairing_process_id) { @@ -117,7 +106,7 @@ fn handle_new_process(commit_msg: &CommitMessage) -> Result { let mut new_process = Process::new(commit_msg.process_id); let init_state = ProcessState { commited_in: commit_msg.process_id, - encrypted_pcd: roles_only_map, + roles: commit_msg.roles.clone().into_iter().collect(), pcd_commitment: commit_msg.pcd_commitment.clone(), state_id: merkle_root_bin.to_lower_hex_string(), ..Default::default() @@ -142,13 +131,6 @@ fn handle_member_list(roles: &HashMap, process_id: OutPo return Err(Error::msg("Process is not a pairing process")); } - //Check if process have a pairing role - if let Some((role_name,_)) = roles.iter().next(){ - if role_name != "pairing" { - return Err(Error::msg("Process is not a pairing process")); - } - } - if let Some(pairing_role) = roles.get("pairing") { if pairing_role.members.len() == 1 { let member = pairing_role.members.get(0).unwrap(); @@ -243,12 +225,11 @@ fn register_new_state(process: &mut Process, commit_msg: &CommitMessage) -> Resu } // Add the new state - let roles_only_map = json!({ "roles": serde_json::to_value(&commit_msg.roles)? }); let new_state = ProcessState { commited_in: current_outpoint, pcd_commitment: commit_msg.pcd_commitment.clone(), - encrypted_pcd: roles_only_map, state_id: new_state_id.clone(), + roles: commit_msg.roles.clone().into_iter().collect(), ..Default::default() }; process.insert_concurrent_state(new_state)?; @@ -260,17 +241,22 @@ fn register_new_state(process: &mut Process, commit_msg: &CommitMessage) -> Resu fn process_validation(updated_process: &mut Process, commit_msg: &CommitMessage) -> Result { let new_state_id = commit_msg.pcd_commitment.create_merkle_tree()?.root().ok_or(Error::msg("Invalid merkle tree"))?; let new_state_id_hex = new_state_id.to_lower_hex_string(); - let mut state_to_validate = updated_process - .get_latest_concurrent_states()? - .into_iter() - .find(|state| state.state_id == new_state_id_hex) - .ok_or(Error::msg("Unknown state"))? - .clone(); + { + let state_to_update = updated_process + .get_state_for_id_mut(&new_state_id_hex)?; - state_to_validate.validation_tokens = commit_msg.validation_tokens.clone(); + // Complete with the received tokens + state_to_update.validation_tokens.extend(commit_msg.validation_tokens.iter()); + + state_to_update.validation_tokens.sort_unstable(); + state_to_update.validation_tokens.dedup(); + } + + let state_to_validate = updated_process + .get_state_for_id(&new_state_id_hex)?; state_to_validate.is_valid(updated_process.get_latest_commited_state())?; - let commited_in = commit_new_transaction(updated_process, state_to_validate)?; + let commited_in = commit_new_transaction(updated_process, state_to_validate.clone())?; Ok(commited_in) }