Roles in process state

This commit is contained in:
NicolasCantu 2025-02-14 16:19:03 +01:00 committed by Nicolas Cantu
parent 7a6ad926f0
commit 616dc21aa9

View File

@ -68,22 +68,11 @@ pub(crate) fn handle_commit_request(commit_msg: CommitMessage) -> Result<OutPoin
}
fn handle_new_process(commit_msg: &CommitMessage) -> Result<Process> {
// 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<Process> {
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<String, RoleDefinition>, 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<OutPoint> {
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)
}