From eda2dd687d931324d798c71d222715c4c52701bd Mon Sep 17 00:00:00 2001 From: Sosthene Date: Fri, 29 Nov 2024 09:07:48 +0100 Subject: [PATCH] Refactor ProcessState is_valid() --- src/process.rs | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/process.rs b/src/process.rs index 15bb27f..312462b 100644 --- a/src/process.rs +++ b/src/process.rs @@ -87,28 +87,13 @@ impl ProcessState { return Err(anyhow::anyhow!("State is identical to the previous state")); } - println!("modified fields: {:?}", modified_fields); - - // Compute the hash of the new state - let new_state_hash = AnkPcdHash::from_value(&self.encrypted_pcd); - let mut fields2plains = Map::new(); + let fields2commit = self.pcd_commitment.as_object().ok_or(anyhow::Error::msg("pcd_commitment is not an object"))?; + let merkle_root = Value::Object(fields2commit.clone()).create_merkle_tree()?.root().unwrap(); self.encrypted_pcd - .decrypt_fields(&self.keys, &mut fields2plains)?; + .decrypt_fields(&fields2commit, &self.keys, &mut fields2plains)?; - let mut roles2rules: HashMap = HashMap::new(); - if let Some(roles) = fields2plains.get("roles") { - if let Some(roles_map) = roles.as_object() { - for (role, conditions) in roles_map { - let role_def = serde_json::from_value::(conditions.clone())?; - roles2rules.insert(role.to_string(), role_def); - } - } else { - return Err(anyhow::anyhow!("Roles is not an object")); - } - } else { - return Err(anyhow::anyhow!("Missing roles in the encrypted pcd")); - } + let roles2rules = Value::Object(fields2plains).extract_roles()?; // Check if each modified field satisfies at least one applicable rule across all roles let all_fields_validated = modified_fields.iter().all(|field| { @@ -136,10 +121,10 @@ impl ProcessState { role_def.validation_rules.iter().any(|rule| { rule.is_satisfied( field, - new_state_hash.clone(), + merkle_root, &self.validation_tokens, &role_def.members, - ) + ).is_ok() }) }) });