From 2e8652453d97b4117e841b626a6425a49a6c282d Mon Sep 17 00:00:00 2001 From: Sosthene Date: Fri, 6 Dec 2024 15:27:05 +0100 Subject: [PATCH] Add new and update_value to ProcessState --- src/process.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/process.rs b/src/process.rs index 789c91f..adf5182 100644 --- a/src/process.rs +++ b/src/process.rs @@ -26,6 +26,52 @@ pub struct ProcessState { } impl ProcessState { + pub fn new(commited_in: OutPoint, clear_state: Map) -> anyhow::Result { + let mut keys = Map::new(); + let mut encrypted = Map::new(); + + let clear_pcd = Value::Object(clear_state); + let commitments = clear_pcd.hash_all_fields(commited_in)?; + + let keys_to_encrypt: Vec = commitments.keys().map(|k| k.clone()).collect(); + clear_pcd.encrypt_fields(&keys_to_encrypt, &mut keys, &mut encrypted)?; + + let res = Self { + commited_in, + pcd_commitment: Value::Object(commitments), + encrypted_pcd: Value::Object(encrypted), + keys, + validation_tokens: vec![], + }; + + Ok(res) + } + + pub fn update_value(&mut self, key: &str, new_value: Value) -> anyhow::Result<()> { + // First decrypt values + let mut clear_pcd = self.decrypt_pcd()?; + if let Some(value) = clear_pcd.get_mut(key) { + // We can only update a value we can decrypt + if let None = self.keys.get(key) { + return Err(anyhow::Error::msg("Trying to update a value we can't access")); + } + // We replace the clear value by the new_value + *value = new_value; + } else { + return Err(anyhow::Error::msg(format!("{} doesn't exist", key))) + } + + // Update the commitment + self.pcd_commitment = Value::Object(clear_pcd.hash_all_fields(self.commited_in)?); + + // Todo for now we rehash everything, which is a bit wasteful but fine for a proto + + // Update the encrypted value + clear_pcd.encrypt_fields(&[key.to_string()], &mut self.keys, self.encrypted_pcd.as_object_mut().unwrap())?; + + Ok(()) + } + pub fn decrypt_pcd(&self) -> anyhow::Result { let mut fields2plain = Map::new(); let fields2commit = self.pcd_commitment.to_value_object()?;