From e1901aa54fefe118a972ab9279649ec04034ed09 Mon Sep 17 00:00:00 2001 From: jns-ps <1234562+jns-ps@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:00:07 +0100 Subject: [PATCH] refactor: hashchain interface improvements (#156) * refactor: remove unused get_valid_keys * refactor(common): Creating Signature type * feat(common): Add method to hash multiple items * refactor(common): Operation is only a container for op-specific args * refactor(common): Hashchain provides methods to do operations * refactor(common): Tree interface uses HashchainEntry instead of Operation * test: Tree utils use HashchainEntry instead of Operation * feat: Introduce struct for id-based hashchain updates * test: OpsBuilder builds requests now * refactor(prover): Prover uses requests instead of operations * refactor(da): DA layer uses requests instead of operations * test(prover): Prover tests use requests instead of operations * refactor(prover): Webserver uses requests instead of operations * test: Integration test is adapted to Hashchain changes * refactor(bin): Adjust celestia config namespace variable names * refactor(common): No need for entries without challenge * chore: Remove debug comments and unnecessary code * refactor: More simple approach for converting REST DTOs * refactor: Replace more id/entry params with request entity * refactor: Rename request to transaction * test: Better file and method names for transaction builder * refactor: More renaming to transaction * fix: Correct basic validation for operations * chore: Incorporate changes in zkvm elf --- crates/bin/src/cfg.rs | 21 +- crates/common/src/digest.rs | 8 + crates/common/src/hashchain.rs | 367 ++++++++++------ crates/common/src/keys.rs | 36 +- crates/common/src/lib.rs | 5 +- crates/common/src/operation.rs | 407 ++---------------- crates/common/src/test_utils.rs | 176 ++++---- crates/common/src/transaction.rs | 20 + .../{test_ops.rs => transaction_builder.rs} | 164 ++++--- crates/common/src/tree.rs | 89 ++-- crates/da/src/celestia.rs | 54 +-- crates/da/src/lib.rs | 6 +- crates/da/src/memory.rs | 26 +- crates/node_types/prover/src/prover/mod.rs | 131 +++--- crates/node_types/prover/src/prover/tests.rs | 101 +++-- crates/node_types/prover/src/webserver.rs | 32 +- crates/storage/src/redis.rs | 2 +- crates/tests/src/lib.rs | 106 ++--- elf/riscv32im-succinct-zkvm-elf | Bin 1826276 -> 1779768 bytes 19 files changed, 818 insertions(+), 933 deletions(-) create mode 100644 crates/common/src/transaction.rs rename crates/common/src/{test_ops.rs => transaction_builder.rs} (64%) diff --git a/crates/bin/src/cfg.rs b/crates/bin/src/cfg.rs index ed789166..f4f283d0 100644 --- a/crates/bin/src/cfg.rs +++ b/crates/bin/src/cfg.rs @@ -41,9 +41,9 @@ pub struct CommandLineArgs { #[arg(long)] snark_namespace_id: Option, - /// Celestia Operation Namespace ID + /// Celestia Transaction Namespace ID #[arg(long)] - operation_namespace_id: Option, + transaction_namespace_id: Option, // Height to start searching the DA layer for SNARKs on #[arg(short = 's', long)] @@ -115,9 +115,8 @@ pub fn load_config(args: CommandLineArgs) -> Result { .context("Failed to build config")?; let default_config = Config::default(); - let loaded_config: Config = config_source - .try_deserialize() - .context("Failed to deserialize config file")?; + let loaded_config: Config = + config_source.try_deserialize().context("Failed to deserialize config file")?; let merged_config = merge_configs(loaded_config, default_config); let final_config = apply_command_line_args(merged_config, args); @@ -213,12 +212,12 @@ fn apply_command_line_args(config: Config, args: CommandLineArgs) -> Config { .map(|c| c.snark_namespace_id.clone()) .unwrap_or_else(|| CelestiaConfig::default().snark_namespace_id) }), - operation_namespace_id: Some(args.operation_namespace_id.unwrap_or_else(|| { + transaction_namespace_id: Some(args.transaction_namespace_id.unwrap_or_else(|| { config .celestia_config .as_ref() - .map(|c| c.operation_namespace_id.clone()) - .unwrap_or_else(|| CelestiaConfig::default().operation_namespace_id) + .map(|c| c.transaction_namespace_id.clone()) + .unwrap_or_else(|| CelestiaConfig::default().transaction_namespace_id) .unwrap() })), }), @@ -234,10 +233,8 @@ pub async fn initialize_da_layer( match da_layer { DALayerOption::Celestia => { - let celestia_conf = config - .celestia_config - .clone() - .context("Celestia configuration not found")?; + let celestia_conf = + config.celestia_config.clone().context("Celestia configuration not found")?; for attempt in 1..=DA_RETRY_COUNT { match CelestiaConnection::new(&celestia_conf, None).await { diff --git a/crates/common/src/digest.rs b/crates/common/src/digest.rs index f8014237..28dee9fb 100644 --- a/crates/common/src/digest.rs +++ b/crates/common/src/digest.rs @@ -15,6 +15,14 @@ impl Digest { Self(hasher.finalize()) } + pub fn hash_items(items: &[impl AsRef<[u8]>]) -> Self { + let mut hasher = Hasher::new(); + for item in items { + hasher.update(item.as_ref()); + } + Self(hasher.finalize()) + } + pub const fn zero() -> Self { Self([0u8; 32]) } diff --git a/crates/common/src/hashchain.rs b/crates/common/src/hashchain.rs index 8f2f7386..d9bd9adc 100644 --- a/crates/common/src/hashchain.rs +++ b/crates/common/src/hashchain.rs @@ -1,16 +1,18 @@ -use anyhow::{anyhow, bail, Result}; -use jmt::KeyHash; +use anyhow::{anyhow, bail, ensure, Result}; use serde::{Deserialize, Serialize}; -use std::{ - collections::HashSet, - ops::{Deref, DerefMut}, +use std::ops::{Deref, DerefMut}; + +use crate::{ + digest::Digest, + keys::{Signature, SigningKey, VerifyingKey}, + operation::{ + HashchainSignatureBundle, Operation, ServiceChallenge, ServiceChallengeInput, + SignatureBundle, + }, }; -use crate::{digest::Digest, hasher::Hasher, keys::VerifyingKey, operation::Operation}; - #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] pub struct Hashchain { - pub id: String, pub entries: Vec, } @@ -56,56 +58,40 @@ impl DerefMut for Hashchain { } impl Hashchain { - pub fn from_operation(operation: Operation) -> Result { - let mut hc = Hashchain::empty(operation.id()); - hc.perform_operation(operation)?; - Ok(hc) - } - - pub fn empty(id: String) -> Self { + pub fn empty() -> Self { Self { - id, entries: Vec::new(), } } + pub fn from_entry(entry: HashchainEntry) -> Result { + let mut hc = Hashchain::empty(); + hc.add_entry(entry)?; + Ok(hc) + } + pub fn get_key_at_index(&self, idx: usize) -> Result<&VerifyingKey> { self.entries .get(idx) .and_then(|entry| entry.operation.get_public_key()) - .ok_or_else(|| anyhow!("No valid public key found at index {}", idx)) + .ok_or_else(|| anyhow!("No public key found at index {}", idx)) } - pub fn get_valid_keys(&self) -> HashSet { - let mut valid_keys: HashSet = HashSet::new(); - - for entry in self.entries.clone() { - match &entry.operation { - Operation::RegisterService(_) | Operation::AddData(_) => {} - Operation::CreateAccount(args) => { - valid_keys.insert(args.value.clone()); - } - Operation::AddKey(args) => { - valid_keys.insert(args.value.clone()); - } - Operation::RevokeKey(args) => { - valid_keys.remove(&args.value.clone()); + pub fn is_key_invalid(&self, key: &VerifyingKey) -> bool { + for entry in self.iter().rev() { + if let Some(entry_key) = entry.operation.get_public_key() { + if key.eq(entry_key) { + match entry.operation { + Operation::RevokeKey { .. } => return true, + Operation::AddKey { .. } + | Operation::CreateAccount { .. } + | Operation::RegisterService { .. } => return false, + _ => {} + } } } } - valid_keys - } - - pub fn is_key_invalid(&self, key: VerifyingKey) -> bool { - self.iter() - .rev() - .find_map(|entry| match entry.operation.clone() { - Operation::RevokeKey(args) if args.value == key => Some(true), - Operation::AddKey(args) if args.value == key => Some(false), - Operation::CreateAccount(args) if args.value == key => Some(false), - _ => None, - }) - .unwrap_or(true) + true } pub fn get(&self, idx: usize) -> &HashchainEntry { @@ -116,103 +102,126 @@ impl Hashchain { self.last().map_or(Digest::zero(), |entry| entry.hash) } - fn push(&mut self, operation: Operation) -> Result { - if operation.id() != self.id { - bail!("Operation ID does not match Hashchain ID"); - } + pub fn add_entry(&mut self, entry: HashchainEntry) -> Result<()> { + self.validate_new_entry(&entry)?; + self.entries.push(entry); + Ok(()) + } - let previous_hash = self.last_hash(); + pub fn register_service( + &mut self, + id: String, + creation_gate: ServiceChallenge, + key: VerifyingKey, + signing_key: &SigningKey, + ) -> Result { + let entry = HashchainEntry::new_register_service(id, creation_gate, key, signing_key); + self.add_entry(entry.clone())?; + Ok(entry) + } - let entry = HashchainEntry::new(operation, previous_hash); - self.entries.push(entry.clone()); + pub fn create_account( + &mut self, + id: String, + service_id: String, + challenge: ServiceChallengeInput, + key: VerifyingKey, + signing_key: &SigningKey, + ) -> Result { + let entry = HashchainEntry::new_create_account(id, service_id, challenge, key, signing_key); + self.add_entry(entry.clone())?; + Ok(entry) + } + pub fn add_key( + &mut self, + key: VerifyingKey, + signing_key: &SigningKey, + key_idx: usize, + ) -> Result { + let entry = HashchainEntry::new_add_key(key, self.last_hash(), signing_key, key_idx); + self.add_entry(entry.clone())?; Ok(entry) } - pub fn perform_operation(&mut self, operation: Operation) -> Result { - self.validate_new_operation(&operation)?; - self.push(operation) + pub fn revoke_key( + &mut self, + key: VerifyingKey, + signing_key: &SigningKey, + key_idx: usize, + ) -> Result { + let entry = HashchainEntry::new_revoke_key(key, self.last_hash(), signing_key, key_idx); + self.add_entry(entry.clone())?; + Ok(entry) } - /// Verifies the structure and signature of a new operation - fn validate_new_operation(&self, operation: &Operation) -> Result<()> { - match operation { - Operation::RegisterService(args) => { - if !self.entries.is_empty() { - bail!("RegisterService operation must be the first entry"); - } + pub fn add_data( + &mut self, + data: Vec, + data_signature: Option, + signing_key: &SigningKey, + key_idx: usize, + ) -> Result { + let entry = HashchainEntry::new_add_data( + data, + data_signature, + self.last_hash(), + signing_key, + key_idx, + ); + self.add_entry(entry.clone())?; + Ok(entry) + } - if args.prev_hash != Digest::zero() { - bail!( - "Previous hash for initial operation must be zero, but was {}", - args.prev_hash - ) - } + fn validate_new_entry(&self, entry: &HashchainEntry) -> Result<()> { + entry.validate_operation()?; - Ok(()) - } - Operation::AddKey(args) | Operation::RevokeKey(args) => { - let last_hash = self.last_hash(); - if args.prev_hash != last_hash { - bail!( - "Previous hash for key operation must be the last hash - prev: {}, last: {}", - args.prev_hash, - last_hash - ) - } + let last_hash = self.last_hash(); + if entry.previous_hash != last_hash { + bail!( + "Previous hash for new entry must be the last hash - prev: {}, last: {}", + entry.previous_hash, + last_hash + ) + } - let key_idx = args.signature.key_idx; - let verifying_key = self.get_key_at_index(key_idx)?; + let verifying_key = self.verifying_key_for_entry(entry)?; - if self.is_key_invalid(verifying_key.clone()) { - bail!( - "The key at index {}, intended to verify this operation, is invalid", - key_idx - ); + match entry.operation { + Operation::CreateAccount { .. } | Operation::RegisterService { .. } => { + if !self.entries.is_empty() { + bail!("CreateAccount/RegisterService must be the first entry"); } - - operation.verify_user_signature(verifying_key) } - Operation::AddData(args) => { - let last_hash = self.last_hash(); - if args.prev_hash != last_hash { - bail!( - "Previous hash for add-data operation is not equal to the last hash - prev: {}, last: {}", - args.prev_hash, - last_hash - ) + Operation::AddData { .. } | Operation::AddKey { .. } | Operation::RevokeKey { .. } => { + if self.entries.is_empty() { + bail!("CreateAccount/RegisterService must be the first entry"); } - let key_idx = args.op_signature.key_idx; - let verifying_key = self.get_key_at_index(key_idx)?; - - if self.is_key_invalid(verifying_key.clone()) { - bail!( - "The key at index {}, intended to verify this operation, is invalid", - key_idx - ); + if self.is_key_invalid(verifying_key) { + bail!("Invalid key at index {}", &entry.signature_bundle.key_idx); } - - operation.verify_user_signature(verifying_key) } - Operation::CreateAccount(args) => { - if !self.entries.is_empty() { - bail!("CreateAccount operation must be the first entry"); - } + } - if args.prev_hash != Digest::zero() { - bail!("Previous hash for initial operation must be zero") - } + entry.validate_hash()?; + entry.validate_signature(verifying_key) + } - operation.verify_user_signature(&args.value) + fn verifying_key_for_entry<'a>( + &'a self, + entry: &'a HashchainEntry, + ) -> Result<&'a VerifyingKey> { + match &entry.operation { + Operation::CreateAccount { key, .. } | Operation::RegisterService { key, .. } => { + Ok(key) + } + Operation::AddData { .. } | Operation::AddKey { .. } | Operation::RevokeKey { .. } => { + self.get_key_at_index(entry.signature_bundle.key_idx) } } } - pub fn get_keyhash(&self) -> KeyHash { - KeyHash::with::(Digest::hash(self.id.clone())) - } - pub fn is_empty(&self) -> bool { self.entries.is_empty() } @@ -229,19 +238,133 @@ pub struct HashchainEntry { pub hash: Digest, pub previous_hash: Digest, pub operation: Operation, + pub signature_bundle: HashchainSignatureBundle, } impl HashchainEntry { - pub fn new(operation: Operation, previous_hash: Digest) -> Self { - let mut data = Vec::new(); - data.extend_from_slice(operation.to_string().as_bytes()); - data.extend_from_slice(previous_hash.as_ref()); - let hash = Digest::hash(data); + pub fn new( + operation: Operation, + previous_hash: Digest, + signing_key: &SigningKey, + key_idx: usize, + ) -> Self { + let serialized_operation = + bincode::serialize(&operation).expect("Serializing operation should work"); + let hash = + Digest::hash_items(&[serialized_operation.as_slice(), &previous_hash.to_bytes()]); + + let signature_bundle = HashchainSignatureBundle { + signature: signing_key.sign(hash.as_ref()), + key_idx, + }; Self { hash, previous_hash, operation, + signature_bundle, + } + } + + pub fn new_genesis(operation: Operation, signing_key: &SigningKey) -> Self { + Self::new(operation, Digest::zero(), signing_key, 0) + } + + pub fn new_register_service( + id: String, + creation_gate: ServiceChallenge, + key: VerifyingKey, + signing_key: &SigningKey, + ) -> Self { + let operation = Operation::RegisterService { + id, + creation_gate, + key, + }; + Self::new_genesis(operation, signing_key) + } + + pub fn new_create_account( + id: String, + service_id: String, + challenge: ServiceChallengeInput, + key: VerifyingKey, + signing_key: &SigningKey, + ) -> Self { + let operation = Operation::CreateAccount { + id, + service_id, + challenge, + key, + }; + Self::new_genesis(operation, signing_key) + } + + pub fn new_add_key( + key: VerifyingKey, + prev_hash: Digest, + signing_key: &SigningKey, + key_idx: usize, + ) -> Self { + let operation = Operation::AddKey { key }; + Self::new(operation, prev_hash, signing_key, key_idx) + } + + pub fn new_revoke_key( + key: VerifyingKey, + prev_hash: Digest, + signing_key: &SigningKey, + key_idx: usize, + ) -> Self { + let operation = Operation::RevokeKey { key }; + Self::new(operation, prev_hash, signing_key, key_idx) + } + + pub fn new_add_data( + data: Vec, + data_signature: Option, + prev_hash: Digest, + signing_key: &SigningKey, + key_idx: usize, + ) -> Self { + let operation = Operation::AddData { + data, + data_signature, + }; + Self::new(operation, prev_hash, signing_key, key_idx) + } + + pub fn validate_hash(&self) -> Result<()> { + let pristine_entry = self.without_signature(); + + let serialized_operation = bincode::serialize(&pristine_entry.operation)?; + let pristine_entry_hash = Digest::hash_items(&[ + serialized_operation.as_slice(), + &pristine_entry.previous_hash.to_bytes(), + ]); + + ensure!( + self.hash == pristine_entry_hash, + "Hashchain entry has incorrect hash" + ); + Ok(()) + } + + pub fn validate_signature(&self, verifying_key: &VerifyingKey) -> Result<()> { + verifying_key.verify_signature(self.hash.as_ref(), &self.signature_bundle.signature) + } + + pub fn validate_operation(&self) -> Result<()> { + self.operation.validate_basic() + } + + pub fn without_signature(&self) -> Self { + Self { + signature_bundle: HashchainSignatureBundle { + key_idx: self.signature_bundle.key_idx, + signature: Signature::Placeholder, + }, + ..self.clone() } } } diff --git a/crates/common/src/keys.rs b/crates/common/src/keys.rs index 460935da..f281d112 100644 --- a/crates/common/src/keys.rs +++ b/crates/common/src/keys.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use base64::{engine::general_purpose::STANDARD as engine, Engine as _}; use ed25519_consensus::{ Signature as Ed25519Signature, SigningKey as Ed25519SigningKey, @@ -13,6 +13,14 @@ use std::{self}; use crate::digest::Digest; +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, Default)] +pub enum Signature { + Secp256k1(Secp256k1Signature), + Ed25519(Ed25519Signature), + #[default] + Placeholder, +} + #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, Hash)] /// Represents a public key supported by the system. pub enum VerifyingKey { @@ -31,21 +39,23 @@ impl VerifyingKey { } } - pub fn verify_signature(&self, message: &[u8], signature: &[u8]) -> Result<()> { - if signature.len() != 64 { - return Err(anyhow!("Invalid signature length")); - } + pub fn verify_signature(&self, message: &[u8], signature: &Signature) -> Result<()> { match self { VerifyingKey::Ed25519(vk) => { - let signature = Ed25519Signature::try_from(signature).map_err(|e| anyhow!(e))?; - vk.verify(&signature, message).map_err(|e| anyhow!(e)) + let Signature::Ed25519(signature) = signature else { + bail!("Invalid signature type"); + }; + + vk.verify(signature, message) + .map_err(|e| anyhow!("Failed to verify signature: {}", e)) } VerifyingKey::Secp256k1(vk) => { + let Signature::Secp256k1(signature) = signature else { + bail!("Invalid signature type"); + }; let hashed_message = Digest::hash(message).to_bytes(); let message = Secp256k1Message::from_digest(hashed_message); - let signature = Secp256k1Signature::from_compact(signature)?; - - vk.verify(SECP256K1, &message, &signature) + vk.verify(SECP256K1, &message, signature) .map_err(|e| anyhow!("Failed to verify signature: {}", e)) } } @@ -121,14 +131,14 @@ pub enum SigningKey { } impl SigningKey { - pub fn sign(&self, message: &[u8]) -> Vec { + pub fn sign(&self, message: &[u8]) -> Signature { match self { - SigningKey::Ed25519(sk) => sk.sign(message).to_bytes().to_vec(), + SigningKey::Ed25519(sk) => Signature::Ed25519(sk.sign(message)), SigningKey::Secp256k1(sk) => { let hashed_message = Digest::hash(message).to_bytes(); let message = Secp256k1Message::from_digest(hashed_message); let signature = SECP256K1.sign_ecdsa(&message, sk); - signature.serialize_compact().to_vec() + Signature::Secp256k1(signature) } } } diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 18b0a2be..97835a93 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -3,12 +3,13 @@ pub mod hashchain; pub mod hasher; pub mod keys; pub mod operation; +pub mod transaction; pub mod tree; #[macro_use] extern crate log; -#[cfg(feature = "test_utils")] -pub mod test_ops; #[cfg(feature = "test_utils")] pub mod test_utils; +#[cfg(feature = "test_utils")] +pub mod transaction_builder; diff --git a/crates/common/src/operation.rs b/crates/common/src/operation.rs index 7279cbd8..1ed4f870 100644 --- a/crates/common/src/operation.rs +++ b/crates/common/src/operation.rs @@ -1,29 +1,36 @@ -use anyhow::{Context, Result}; -use bincode; -use celestia_types::Blob; -use prism_errors::GeneralError; +use anyhow::{bail, ensure, Result}; + use serde::{Deserialize, Serialize}; use std::{self, fmt::Display}; -use crate::{ - digest::Digest, - keys::{SigningKey, VerifyingKey}, -}; +use crate::keys::{Signature, SigningKey, VerifyingKey}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] /// An [`Operation`] represents a state transition in the system. /// In a blockchain analogy, this would be the full set of our transaction types. pub enum Operation { - /// Creates a new account with the given id and value. - CreateAccount(CreateAccountArgs), - /// Adds a key to an existing account. - AddKey(KeyOperationArgs), + /// Creates a new account with the given id and key. + CreateAccount { + id: String, + service_id: String, + challenge: ServiceChallengeInput, + key: VerifyingKey, + }, + /// Registers a new service with the given id. + RegisterService { + id: String, + creation_gate: ServiceChallenge, + key: VerifyingKey, + }, /// Adds arbitrary signed data to an existing account. - AddData(AddDataArgs), + AddData { + data: Vec, + data_signature: Option, + }, + /// Adds a key to an existing account. + AddKey { key: VerifyingKey }, /// Revokes a key from an existing account. - RevokeKey(KeyOperationArgs), - /// Registers a new service with the given id. - RegisterService(RegisterServiceArgs), + RevokeKey { key: VerifyingKey }, } #[derive(Clone, Serialize, Deserialize, Default, Debug, PartialEq)] @@ -33,14 +40,14 @@ pub struct HashchainSignatureBundle { /// Index of the key in the hashchain pub key_idx: usize, /// The actual signature - pub signature: Vec, + pub signature: Signature, } impl HashchainSignatureBundle { pub fn empty_with_idx(idx: usize) -> Self { HashchainSignatureBundle { key_idx: idx, - signature: vec![], + signature: Signature::Placeholder, } } } @@ -51,42 +58,14 @@ pub struct SignatureBundle { /// The key that can be used to verify the signature pub verifying_key: VerifyingKey, /// The actual signature - pub signature: Vec, + pub signature: Signature, } #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] /// Input required to complete a challenge for account creation. pub enum ServiceChallengeInput { /// Signature bytes - Signed(Vec), -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -/// Arguments for creating an account with a service. -pub struct CreateAccountArgs { - /// Account ID - pub id: String, - /// Public key being added - pub value: VerifyingKey, - /// Associated service ID - pub service_id: String, - /// Challenge input for verification - pub challenge: ServiceChallengeInput, - /// The hash of the previous operation - pub prev_hash: Digest, - /// The signature that signed the operation - pub signature: Vec, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -/// Arguments for registering a new service. -pub struct RegisterServiceArgs { - /// Service ID - pub id: String, - /// Challenge gate for access control - pub creation_gate: ServiceChallenge, - /// The hash of the previous operation - pub prev_hash: Digest, + Signed(Signature), } #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] @@ -100,329 +79,44 @@ impl From for ServiceChallenge { } } -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -/// Structure for adding data. -pub struct AddDataArgs { - /// Account ID - pub id: String, - /// Data to be added - pub value: Vec, - /// Optional external signature used to sign the data to be added - pub value_signature: Option, - /// The hash of the previous operation - pub prev_hash: Digest, - /// Signature to authorize the action - pub op_signature: HashchainSignatureBundle, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -/// Common structure for operations involving keys (adding or revoking). -pub struct KeyOperationArgs { - /// Account ID - pub id: String, - /// Public key being added or revoked - pub value: VerifyingKey, - /// The hash of the previous operation - pub prev_hash: Digest, - /// Signature to authorize the action - pub signature: HashchainSignatureBundle, -} - impl Operation { - pub fn new_create_account( - id: String, - signing_key: &SigningKey, - service_id: String, - service_signer: &SigningKey, - ) -> Result { - let mut op = Operation::CreateAccount(CreateAccountArgs { - id: id.to_string(), - value: signing_key.clone().verifying_key(), - service_id, - challenge: ServiceChallengeInput::Signed(Vec::new()), - prev_hash: Digest::zero(), - signature: Vec::new(), - }); - - op.insert_signature(signing_key) - .expect("Inserting signature into operation should succeed"); - - let msg = bincode::serialize(&op).unwrap(); - let service_challenge = service_signer.sign(&msg); - - match op { - Operation::CreateAccount(ref mut args) => { - args.challenge = ServiceChallengeInput::Signed(service_challenge); - } - _ => panic!("Operation should be CreateAccount"), - }; - Ok(op) - } - - pub fn new_register_service(id: String, creation_gate: ServiceChallenge) -> Self { - Operation::RegisterService(RegisterServiceArgs { - id, - creation_gate, - prev_hash: Digest::zero(), - }) - } - - pub fn new_add_key( - id: String, - value: VerifyingKey, - prev_hash: Digest, - signing_key: &SigningKey, - key_idx: usize, - ) -> Result { - let op_to_sign = Operation::AddKey(KeyOperationArgs { - id: id.clone(), - value: value.clone(), - prev_hash, - signature: HashchainSignatureBundle::empty_with_idx(key_idx), - }); - - let message = bincode::serialize(&op_to_sign)?; - let signature = HashchainSignatureBundle { - key_idx, - signature: signing_key.sign(&message).to_vec(), - }; - - Ok(Operation::AddKey(KeyOperationArgs { - id, - value, - prev_hash, - signature, - })) - } - - pub fn new_revoke_key( - id: String, - value: VerifyingKey, - prev_hash: Digest, - signing_key: &SigningKey, - key_idx: usize, - ) -> Result { - let op_to_sign = Operation::RevokeKey(KeyOperationArgs { - id: id.clone(), - value: value.clone(), - prev_hash, - signature: HashchainSignatureBundle::empty_with_idx(key_idx), - }); - - let message = bincode::serialize(&op_to_sign)?; - let signature = HashchainSignatureBundle { - key_idx, - signature: signing_key.sign(&message).to_vec(), - }; - - Ok(Operation::RevokeKey(KeyOperationArgs { - id, - value, - prev_hash, - signature, - })) - } - - pub fn new_add_signed_data( - id: String, - value: Vec, - value_signature: Option, - prev_hash: Digest, - signing_key: &SigningKey, - key_idx: usize, - ) -> Result { - let op_to_sign = Operation::AddData(AddDataArgs { - id: id.clone(), - value: value.clone(), - value_signature: value_signature.clone(), - prev_hash, - op_signature: HashchainSignatureBundle::empty_with_idx(key_idx), - }); - - let message = { bincode::serialize(&op_to_sign)? }; - let op_signature = HashchainSignatureBundle { - key_idx, - signature: signing_key.sign(&message).to_vec(), - }; - - Ok(Operation::AddData(AddDataArgs { - id, - value, - value_signature, - prev_hash, - op_signature, - })) - } - - pub fn id(&self) -> String { - match self { - Operation::CreateAccount(args) => args.id.clone(), - Operation::AddKey(args) | Operation::RevokeKey(args) => args.id.clone(), - Operation::AddData(args) => args.id.clone(), - Operation::RegisterService(args) => args.id.clone(), - } - } - pub fn get_public_key(&self) -> Option<&VerifyingKey> { match self { - Operation::RevokeKey(args) | Operation::AddKey(args) => Some(&args.value), - Operation::CreateAccount(args) => Some(&args.value), - Operation::RegisterService(_) | Operation::AddData(_) => None, - } - } - - pub fn insert_signature(&mut self, signing_key: &SigningKey) -> Result<()> { - let serialized = bincode::serialize(self).context("Failed to serialize operation")?; - let signature = signing_key.sign(&serialized); - - match self { - Operation::CreateAccount(args) => args.signature = signature, - Operation::AddKey(args) | Operation::RevokeKey(args) => { - args.signature.signature = signature - } - _ => unimplemented!("RegisterService prover gating not yet implemented"), - } - Ok(()) - } - - pub fn without_challenge(&self) -> Self { - match self { - Operation::CreateAccount(args) => Operation::CreateAccount(CreateAccountArgs { - id: args.id.clone(), - value: args.value.clone(), - service_id: args.service_id.clone(), - challenge: ServiceChallengeInput::Signed(Vec::new()), - prev_hash: args.prev_hash, - signature: args.signature.clone(), - }), - _ => self.clone(), - } - } - - pub fn without_signature(&self) -> Self { - match self { - Operation::AddKey(args) => Operation::AddKey(KeyOperationArgs { - id: args.id.clone(), - value: args.value.clone(), - prev_hash: args.prev_hash, - signature: HashchainSignatureBundle { - key_idx: args.signature.key_idx, - signature: Vec::new(), - }, - }), - Operation::RevokeKey(args) => Operation::RevokeKey(KeyOperationArgs { - id: args.id.clone(), - value: args.value.clone(), - prev_hash: args.prev_hash, - signature: HashchainSignatureBundle { - key_idx: args.signature.key_idx, - signature: Vec::new(), - }, - }), - Operation::AddData(args) => Operation::AddData(AddDataArgs { - id: args.id.clone(), - value: args.value.clone(), - prev_hash: args.prev_hash, - value_signature: args.value_signature.clone(), - op_signature: HashchainSignatureBundle { - key_idx: args.op_signature.key_idx, - signature: Vec::new(), - }, - }), - Operation::CreateAccount(args) => Operation::CreateAccount(CreateAccountArgs { - id: args.id.clone(), - value: args.value.clone(), - service_id: args.service_id.clone(), - challenge: args.challenge.clone(), - prev_hash: args.prev_hash, - signature: Vec::new(), - }), - Operation::RegisterService(args) => Operation::RegisterService(RegisterServiceArgs { - id: args.id.clone(), - creation_gate: args.creation_gate.clone(), - prev_hash: args.prev_hash, - }), - } - } - - pub fn verify_user_signature(&self, pubkey: &VerifyingKey) -> Result<()> { - match self { - Operation::RegisterService(_) => Ok(()), - Operation::CreateAccount(args) => { - let message = bincode::serialize(&self.without_signature().without_challenge()) - .context("User signature failed")?; - args.value.verify_signature(&message, &args.signature) - } - Operation::AddKey(args) | Operation::RevokeKey(args) => { - let message = bincode::serialize(&self.without_signature()) - .context("User signature failed")?; - pubkey.verify_signature(&message, &args.signature.signature) - } - Operation::AddData(args) => { - let message = bincode::serialize(&self.without_signature()) - .context("Serializing operation failed")?; - pubkey - .verify_signature(&message, &args.op_signature.signature) - .context("Verifying operation signature failed")?; - - let Some(value_signature) = &args.value_signature else { - return Ok(()); - }; - - // If data to be added is signed, also validate its signature - value_signature - .verifying_key - .verify_signature(&args.value, &value_signature.signature) - .context("Verifying value signature failed") - } + Operation::RevokeKey { key } + | Operation::AddKey { key } + | Operation::CreateAccount { key, .. } + | Operation::RegisterService { key, .. } => Some(key), + Operation::AddData { .. } => None, } } - pub fn validate(&self) -> Result<()> { + pub fn validate_basic(&self) -> Result<()> { match &self { - Operation::AddKey(KeyOperationArgs { id, signature, .. }) - | Operation::RevokeKey(KeyOperationArgs { id, signature, .. }) - | Operation::AddData(AddDataArgs { - id, - op_signature: signature, - .. - }) => { + Operation::RegisterService { id, .. } => { if id.is_empty() { - return Err( - GeneralError::MissingArgumentError("id is empty".to_string()).into(), - ); - } - - if signature.signature.is_empty() { - return Err(GeneralError::MissingArgumentError( - "signature is empty".to_string(), - ) - .into()); + bail!("id must not be empty when registering service"); } Ok(()) } - Operation::CreateAccount(CreateAccountArgs { id, challenge, .. }) => { + Operation::CreateAccount { id, service_id, .. } => { if id.is_empty() { - return Err( - GeneralError::MissingArgumentError("id is empty".to_string()).into(), - ); + bail!("id must not be empty when creating account service"); } - match challenge { - ServiceChallengeInput::Signed(signature) => { - if signature.is_empty() { - return Err(GeneralError::MissingArgumentError( - "challenge data is empty".to_string(), - ) - .into()); - } - } + if service_id.is_empty() { + bail!("service_id must not be empty when creating account service"); } Ok(()) } - Operation::RegisterService(_) => Ok(()), + Operation::AddKey { .. } | Operation::RevokeKey { .. } => Ok(()), + Operation::AddData { data, .. } => { + let data_len = data.len(); + // TODO determine proper max data size here + ensure!(data_len < usize::MAX, "Incoming data size is {}", data_len); + Ok(()) + } } } } @@ -433,12 +127,3 @@ impl Display for Operation { write!(f, "{:?}", self) } } - -impl TryFrom<&Blob> for Operation { - type Error = anyhow::Error; - - fn try_from(value: &Blob) -> Result { - bincode::deserialize(&value.data) - .context(format!("Failed to decode blob into Operation: {value:?}")) - } -} diff --git a/crates/common/src/test_utils.rs b/crates/common/src/test_utils.rs index aa279b82..61a916ab 100644 --- a/crates/common/src/test_utils.rs +++ b/crates/common/src/test_utils.rs @@ -3,7 +3,8 @@ use crate::{ hashchain::Hashchain, hasher::Hasher, keys::{SigningKey, VerifyingKey}, - operation::{Operation, ServiceChallenge, SignatureBundle}, + operation::{ServiceChallenge, ServiceChallengeInput, SignatureBundle}, + transaction::Transaction, tree::{ HashchainResponse::*, InsertProof, KeyDirectoryTree, Proof, SnarkableTree, UpdateProof, }, @@ -26,12 +27,13 @@ use std::{ pub struct TestTreeState { pub tree: KeyDirectoryTree, pub signing_keys: HashMap, - inserted_keys: HashSet, + inserted_keys: HashSet, pub services: HashMap, } #[derive(Clone)] pub struct TestAccount { + pub id: String, pub key_hash: KeyHash, pub hashchain: Hashchain, } @@ -50,58 +52,97 @@ impl TestTreeState { } pub fn register_service(&mut self, service_id: String) -> Service { - let service_key = create_mock_signing_key(); + let service_challenge_key = create_mock_signing_key(); + let service_signing_key = create_mock_signing_key(); - let hashchain = Hashchain::from_operation(Operation::new_register_service( - service_id.clone(), - ServiceChallenge::from(service_key.clone()), - )) - .unwrap(); + let mut hashchain = Hashchain::empty(); - let key_hash = hashchain.get_keyhash(); + hashchain + .register_service( + service_id.clone(), + ServiceChallenge::from(service_challenge_key.clone()), + service_signing_key.verifying_key(), + &service_signing_key, + ) + .unwrap(); + + let hashed_id = Digest::hash(&service_id); + let key_hash = KeyHash::with::(hashed_id); Service { - id: service_id, - sk: service_key.clone(), - vk: service_key.verifying_key(), + id: service_id.clone(), + sk: service_challenge_key.clone(), + vk: service_challenge_key.verifying_key(), registration: TestAccount { + id: service_id, key_hash, hashchain, }, } } - pub fn create_account(&mut self, key: String, service: Service) -> TestAccount { + pub fn create_account(&mut self, id: String, service: Service) -> TestAccount { let signing_key = create_mock_signing_key(); - self.signing_keys.insert(key.clone(), signing_key.clone()); - let hashchain = create_new_hashchain(key.as_str(), &signing_key, service); - let key_hash = hashchain.get_keyhash(); + self.signing_keys.insert(id.clone(), signing_key.clone()); + + // Simulate some external service signing account creation credentials + let hash = Digest::hash_items(&[ + id.as_bytes(), + service.id.as_bytes(), + &signing_key.verifying_key().as_bytes(), + ]); + let signature = service.sk.sign(&hash.to_bytes()); + + let mut hashchain = Hashchain::empty(); + hashchain + .create_account( + id.clone(), + service.id.clone(), + ServiceChallengeInput::Signed(signature), + signing_key.verifying_key(), + &signing_key, + ) + .unwrap(); + + let hashed_id = Digest::hash(&id); + let key_hash = KeyHash::with::(hashed_id); TestAccount { + id, key_hash, hashchain, } } pub fn insert_account(&mut self, account: TestAccount) -> Result { - if self.inserted_keys.contains(&account.key_hash) { - return Err(anyhow!("{:?} already contained in tree", account.key_hash)); + if self.inserted_keys.contains(&account.id) { + return Err(anyhow!("{:?} already contained in tree", account.id)); } - let proof = self.tree.process_operation(&account.hashchain.last().unwrap().operation)?; + let transaction = Transaction { + id: account.id.clone(), + entry: account.hashchain.last().unwrap().clone(), + }; + + let proof = self.tree.process_transaction(transaction)?; if let Proof::Insert(insert_proof) = proof { - self.inserted_keys.insert(account.key_hash); + self.inserted_keys.insert(account.id); return Ok(*insert_proof); } Err(anyhow!("Insert proof not returned")) } pub fn update_account(&mut self, account: TestAccount) -> Result { - if !self.inserted_keys.contains(&account.key_hash) { - return Err(anyhow!("{:?} not found in tree", account.key_hash)); + if !self.inserted_keys.contains(&account.id) { + return Err(anyhow!("{:?} not found in tree", account.id)); } - let proof = self.tree.process_operation(&account.hashchain.last().unwrap().operation)?; + let transaction = Transaction { + id: account.id.clone(), + entry: account.hashchain.last().unwrap().clone(), + }; + + let proof = self.tree.process_transaction(transaction)?; if let Proof::Update(update_proof) = proof { return Ok(*update_proof); } @@ -111,15 +152,11 @@ impl TestTreeState { pub fn add_key_to_account(&mut self, account: &mut TestAccount) -> Result<(), anyhow::Error> { let signing_key_to_add = create_mock_signing_key(); let key_to_add = signing_key_to_add.verifying_key(); - let op = Operation::new_add_key( - account.hashchain.id.clone(), - key_to_add.clone(), - account.hashchain.last_hash(), - self.signing_keys.get(&account.hashchain.id).unwrap(), - 0, - )?; - - account.hashchain.perform_operation(op).unwrap(); + + account + .hashchain + .add_key(key_to_add, self.signing_keys.get(&account.id).unwrap(), 0) + .unwrap(); Ok(()) } @@ -151,20 +188,9 @@ impl TestTreeState { signature: sk.sign(data), }); - let op_signing_key = self.signing_keys.get(&account.hashchain.id).unwrap(); + let signing_key = self.signing_keys.get(&account.id).unwrap(); - let prev_hash = account.hashchain.last_hash(); - - let op = Operation::new_add_signed_data( - account.hashchain.id.clone(), - data.to_vec(), - signature_bundle, - prev_hash, - op_signing_key, - 0, - )?; - - account.hashchain.perform_operation(op).unwrap(); + account.hashchain.add_data(data.to_vec(), signature_bundle, signing_key, 0)?; Ok(()) } } @@ -191,20 +217,30 @@ pub fn create_random_insert(state: &mut TestTreeState, rng: &mut StdRng) -> Inse let (_, service) = state.services.iter().nth(rng.gen_range(0..state.services.len())).unwrap(); - let operation = Operation::new_create_account( - random_string.clone(), - &sk, - service.id.clone(), - &service.sk, - ) - .expect("Creating account operation should succeed"); + // Simulate some external service signing account creation credentials + let hash = Digest::hash_items(&[ + random_string.as_bytes(), + service.id.as_bytes(), + &sk.verifying_key().as_bytes(), + ]); + let signature = service.sk.sign(&hash.to_bytes()); let hashed_id = Digest::hash(&random_string); let key_hash = KeyHash::with::(hashed_id); - if !state.inserted_keys.contains(&key_hash) { - let proof = state.tree.insert(key_hash, operation).expect("Insert should succeed"); - state.inserted_keys.insert(key_hash); + let entry = Hashchain::empty() + .create_account( + random_string.clone(), + service.id.clone(), + ServiceChallengeInput::Signed(signature), + sk.verifying_key(), + &sk, + ) + .unwrap(); + + if !state.inserted_keys.contains(&random_string) { + let proof = state.tree.insert(key_hash, entry).expect("Insert should succeed"); + state.inserted_keys.insert(random_string.clone()); state.signing_keys.insert(random_string, sk); return proof; } @@ -216,9 +252,12 @@ pub fn create_random_update(state: &mut TestTreeState, rng: &mut StdRng) -> Upda panic!("No keys have been inserted yet. Cannot perform update."); } - let key = *state.inserted_keys.iter().nth(rng.gen_range(0..state.inserted_keys.len())).unwrap(); + let key = state.inserted_keys.iter().nth(rng.gen_range(0..state.inserted_keys.len())).unwrap(); - let Found(hc, _) = state.tree.get(key).unwrap() else { + let hashed_id = Digest::hash(key); + let key_hash = KeyHash::with::(hashed_id); + + let Found(mut hc, _) = state.tree.get(key_hash).unwrap() else { panic!("No response found for key. Cannot perform update."); }; @@ -227,21 +266,18 @@ pub fn create_random_update(state: &mut TestTreeState, rng: &mut StdRng) -> Upda let signer = state .signing_keys - .get(&hc.id) + .get(key) .ok_or_else(|| anyhow::anyhow!("Signing key not found for hashchain")) .unwrap(); - let operation = Operation::new_add_key( - hc.id.clone(), - verifying_key.clone(), - hc.last_hash(), - signer, - 0, - ) - .unwrap(); + let entry = hc.add_key(verifying_key, signer, 0).unwrap(); + let transaction = Transaction { + id: key.clone(), + entry, + }; let Proof::Update(update_proof) = - state.tree.process_operation(&operation).expect("Processing operation should succeed") + state.tree.process_transaction(transaction).expect("Processing transaction should succeed") else { panic!("No update proof returned."); }; @@ -258,9 +294,3 @@ pub fn create_mock_signing_key() -> SigningKey { pub fn create_mock_signing_key() -> SigningKey { SigningKey::Secp256k1(Secp256k1SigningKey::new(&mut OsRng)) } - -pub fn create_new_hashchain(id: &str, signing_key: &SigningKey, service: Service) -> Hashchain { - let op = Operation::new_create_account(id.to_string(), signing_key, service.id, &service.sk) - .unwrap(); - Hashchain::from_operation(op.clone()).unwrap() -} diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs new file mode 100644 index 00000000..1990d4e6 --- /dev/null +++ b/crates/common/src/transaction.rs @@ -0,0 +1,20 @@ +use anyhow::anyhow; +use celestia_types::Blob; +use serde::{Deserialize, Serialize}; + +use crate::hashchain::HashchainEntry; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] +pub struct Transaction { + pub id: String, + pub entry: HashchainEntry, +} + +impl TryFrom<&Blob> for Transaction { + type Error = anyhow::Error; + + fn try_from(value: &Blob) -> Result { + bincode::deserialize(&value.data) + .map_err(|e| anyhow!("Failed to decode blob into Transaction: error: {}", e)) + } +} diff --git a/crates/common/src/test_ops.rs b/crates/common/src/transaction_builder.rs similarity index 64% rename from crates/common/src/test_ops.rs rename to crates/common/src/transaction_builder.rs index 2fe94f27..7360af6d 100644 --- a/crates/common/src/test_ops.rs +++ b/crates/common/src/transaction_builder.rs @@ -4,31 +4,34 @@ use jmt::{mock::MockTreeStore, KeyHash}; use crate::{ digest::Digest, + hashchain::HashchainEntry, hasher::Hasher, keys::{SigningKey, VerifyingKey}, - operation::{Operation, SignatureBundle}, + operation::{ServiceChallenge, ServiceChallengeInput, SignatureBundle}, test_utils::create_mock_signing_key, + transaction::Transaction, tree::{HashchainResponse::*, KeyDirectoryTree, SnarkableTree}, }; - enum PostCommitAction { UpdateStorageOnly, RememberServiceKey(String, SigningKey), RememberAccountKey(String, SigningKey), } -pub struct UncommittedOperation<'a> { - operation: Operation, - builder: &'a mut OpsBuilder, +pub struct UncommittedTransaction<'a> { + transaction: Transaction, + builder: &'a mut TransactionBuilder, post_commit_action: PostCommitAction, } -impl UncommittedOperation<'_> { - pub fn ex(self) -> Operation { +impl UncommittedTransaction<'_> { + /// Commits and returns a transaction, updating the builder. Subsequent transactions + /// built with the same builder will have the correct previous hash. + pub fn commit(self) -> Transaction { self.builder .tree - .process_operation(&self.operation) - .expect("Processing operation should work"); + .process_transaction(self.transaction.clone()) + .expect("Processing transaction should work"); match self.post_commit_action { PostCommitAction::UpdateStorageOnly => (), @@ -40,16 +43,18 @@ impl UncommittedOperation<'_> { } } - self.operation + self.transaction } - pub fn op(self) -> Operation { - self.operation + /// Returns a transaction without updating the builder. + /// Can be used to create invalid transactions. + pub fn build(self) -> Transaction { + self.transaction } } -pub struct OpsBuilder { - /// Simulated hashchain storage that is mutated when operations are applied +pub struct TransactionBuilder { + /// Simulated hashchain storage that is mutated when transactions are applied tree: Box, /// Remembers private keys of services to simulate account creation via an external service service_keys: HashMap, @@ -57,7 +62,7 @@ pub struct OpsBuilder { account_keys: HashMap, } -impl Default for OpsBuilder { +impl Default for TransactionBuilder { fn default() -> Self { let store = Arc::new(MockTreeStore::default()); let tree = Box::new(KeyDirectoryTree::new(store)); @@ -72,31 +77,37 @@ impl Default for OpsBuilder { } } -impl OpsBuilder { +impl TransactionBuilder { pub fn new() -> Self { Self::default() } - pub fn register_service_with_random_key(&mut self, id: &str) -> UncommittedOperation { - let random_service_key = create_mock_signing_key(); - self.register_service(id, random_service_key) + pub fn register_service_with_random_keys(&mut self, id: &str) -> UncommittedTransaction { + let random_service_challenge_key = create_mock_signing_key(); + let random_service_signing_key = create_mock_signing_key(); + self.register_service(id, random_service_challenge_key, random_service_signing_key) } pub fn register_service( &mut self, id: &str, - service_signing_key: SigningKey, - ) -> UncommittedOperation { - let op = - Operation::new_register_service(id.to_string(), service_signing_key.clone().into()); + challenge_key: SigningKey, + signing_key: SigningKey, + ) -> UncommittedTransaction { + let entry = HashchainEntry::new_register_service( + id.to_string(), + ServiceChallenge::from(challenge_key.clone()), + signing_key.verifying_key(), + &signing_key, + ); - UncommittedOperation { - operation: op, + UncommittedTransaction { + transaction: Transaction { + id: id.to_string(), + entry, + }, builder: self, - post_commit_action: PostCommitAction::RememberServiceKey( - id.to_string(), - service_signing_key, - ), + post_commit_action: PostCommitAction::RememberServiceKey(id.to_string(), challenge_key), } } @@ -104,7 +115,7 @@ impl OpsBuilder { &mut self, id: &str, service_id: &str, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let random_signing_key = create_mock_signing_key(); self.create_account(id, service_id, random_signing_key) } @@ -114,27 +125,38 @@ impl OpsBuilder { id: &str, service_id: &str, signing_key: SigningKey, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let Some(service_signing_key) = self.service_keys.get(service_id) else { panic!("No existing service found for {}", service_id) }; - let op = Operation::new_create_account( + // Simulate some external service signing account creation credentials + let hash = Digest::hash_items(&[ + id.as_bytes(), + service_id.as_bytes(), + &signing_key.verifying_key().as_bytes(), + ]); + let signature = service_signing_key.sign(&hash.to_bytes()); + + let entry = HashchainEntry::new_create_account( id.to_string(), - &signing_key, service_id.to_string(), - service_signing_key, - ) - .expect("Creating account operation should work"); + ServiceChallengeInput::Signed(signature), + signing_key.verifying_key(), + &signing_key, + ); - UncommittedOperation { - operation: op, + UncommittedTransaction { + transaction: Transaction { + id: id.to_string(), + entry, + }, builder: self, post_commit_action: PostCommitAction::RememberAccountKey(id.to_string(), signing_key), } } - pub fn add_random_key_verified_with_root(&mut self, id: &str) -> UncommittedOperation { + pub fn add_random_key_verified_with_root(&mut self, id: &str) -> UncommittedTransaction { let Some(account_signing_key) = self.account_keys.get(id).cloned() else { panic!("No existing account key for {}", id) }; @@ -147,7 +169,7 @@ impl OpsBuilder { id: &str, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let random_key = create_mock_signing_key().verifying_key(); self.add_key(id, random_key, signing_key, key_idx) } @@ -156,7 +178,7 @@ impl OpsBuilder { &mut self, id: &str, key: VerifyingKey, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let Some(account_signing_key) = self.account_keys.get(id).cloned() else { panic!("No existing account key for {}", id) }; @@ -170,7 +192,7 @@ impl OpsBuilder { key: VerifyingKey, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let hashed_id = Digest::hash(id); let key_hash = KeyHash::with::(hashed_id); @@ -178,11 +200,13 @@ impl OpsBuilder { panic!("No existing hashchain found for {}", id) }; - let op = Operation::new_add_key(id.to_string(), key, hc.last_hash(), signing_key, key_idx) - .expect("Creating add-key operation should work"); + let entry = HashchainEntry::new_add_key(key, hc.last_hash(), signing_key, key_idx); - UncommittedOperation { - operation: op, + UncommittedTransaction { + transaction: Transaction { + id: id.to_string(), + entry, + }, builder: self, post_commit_action: PostCommitAction::UpdateStorageOnly, } @@ -192,7 +216,7 @@ impl OpsBuilder { &mut self, id: &str, key: VerifyingKey, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let Some(account_signing_key) = self.account_keys.get(id).cloned() else { panic!("No existing account key for {}", id) }; @@ -206,7 +230,7 @@ impl OpsBuilder { key: VerifyingKey, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let hashed_id = Digest::hash(id); let key_hash = KeyHash::with::(hashed_id); @@ -214,12 +238,13 @@ impl OpsBuilder { panic!("No existing hashchain found for {}", id) }; - let op = - Operation::new_revoke_key(id.to_string(), key, hc.last_hash(), signing_key, key_idx) - .expect("Creating account operation should work"); + let entry = HashchainEntry::new_revoke_key(key, hc.last_hash(), signing_key, key_idx); - UncommittedOperation { - operation: op, + UncommittedTransaction { + transaction: Transaction { + id: id.to_string(), + entry, + }, builder: self, post_commit_action: PostCommitAction::UpdateStorageOnly, } @@ -232,7 +257,7 @@ impl OpsBuilder { value_signature: SignatureBundle, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { self.add_data(id, value, Some(value_signature), signing_key, key_idx) } @@ -241,7 +266,7 @@ impl OpsBuilder { id: &str, value: Vec, value_signature: SignatureBundle, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { self.add_data_verified_with_root(id, value, Some(value_signature)) } @@ -251,7 +276,7 @@ impl OpsBuilder { value: Vec, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { self.add_data(id, value, None, signing_key, key_idx) } @@ -259,7 +284,7 @@ impl OpsBuilder { &mut self, id: &str, value: Vec, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { self.add_data_verified_with_root(id, value, None) } @@ -268,7 +293,7 @@ impl OpsBuilder { id: &str, value: Vec, value_signature: Option, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let Some(account_signing_key) = self.account_keys.get(id).cloned() else { panic!("No existing account key for {}", id) }; @@ -279,11 +304,11 @@ impl OpsBuilder { fn add_data( &mut self, id: &str, - value: Vec, - value_signature: Option, + data: Vec, + data_signature: Option, signing_key: &SigningKey, key_idx: usize, - ) -> UncommittedOperation { + ) -> UncommittedTransaction { let hashed_id = Digest::hash(id); let key_hash = KeyHash::with::(hashed_id); @@ -291,18 +316,19 @@ impl OpsBuilder { panic!("No existing hashchain found for {}", id) }; - let op = Operation::new_add_signed_data( - id.to_string(), - value, - value_signature, + let entry = HashchainEntry::new_add_data( + data, + data_signature, hc.last_hash(), signing_key, key_idx, - ) - .expect("Creating add-data operation should work"); + ); - UncommittedOperation { - operation: op, + UncommittedTransaction { + transaction: Transaction { + id: id.to_string(), + entry, + }, builder: self, post_commit_action: PostCommitAction::UpdateStorageOnly, } diff --git a/crates/common/src/tree.rs b/crates/common/src/tree.rs index 939b864d..524de06e 100644 --- a/crates/common/src/tree.rs +++ b/crates/common/src/tree.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{anyhow, bail, ensure, Context, Result}; use bincode; use jmt::{ proof::{SparseMerkleProof, UpdateMerkleProof}, @@ -11,12 +11,10 @@ use std::{convert::Into, sync::Arc}; use crate::{ digest::Digest, - hashchain::Hashchain, + hashchain::{Hashchain, HashchainEntry}, hasher::Hasher, - operation::{ - AddDataArgs, CreateAccountArgs, KeyOperationArgs, Operation, RegisterServiceArgs, - ServiceChallenge, ServiceChallengeInput, - }, + operation::{Operation, ServiceChallenge, ServiceChallengeInput}, + transaction::Transaction, }; use HashchainResponse::*; @@ -72,14 +70,14 @@ pub struct InsertProof { pub new_root: Digest, pub membership_proof: SparseMerkleProof, - pub insertion_op: Operation, + pub new_entry: HashchainEntry, } impl InsertProof { pub fn verify(&self) -> Result<()> { self.non_membership_proof.verify().context("Invalid NonMembershipProof")?; - let hashchain = Hashchain::from_operation(self.insertion_op.clone())?; + let hashchain = Hashchain::from_entry(self.new_entry.clone())?; let serialized_hashchain = bincode::serialize(&hashchain)?; self.membership_proof.clone().verify_existence( @@ -99,7 +97,7 @@ pub struct UpdateProof { pub key: KeyHash, pub old_hashchain: Hashchain, - pub update_op: Operation, + pub new_entry: HashchainEntry, /// Inclusion proof of [`old_value`] pub inclusion_proof: SparseMerkleProof, @@ -116,7 +114,7 @@ impl UpdateProof { let mut hashchain_after_update = self.old_hashchain.clone(); // Append the new entry and verify it's validity - hashchain_after_update.perform_operation(self.update_op.clone())?; + hashchain_after_update.add_entry(self.new_entry.clone())?; // Ensure the update proof corresponds to the new hashchain value let new_serialized_hashchain = bincode::serialize(&hashchain_after_update)?; @@ -140,10 +138,10 @@ pub enum HashchainResponse { NotFound(NonMembershipProof), } -pub trait SnarkableTree { - fn process_operation(&mut self, operation: &Operation) -> Result; - fn insert(&mut self, key: KeyHash, initial_op: Operation) -> Result; - fn update(&mut self, key: KeyHash, update_op: Operation) -> Result; +pub trait SnarkableTree: Send + Sync { + fn process_transaction(&mut self, transaction: Transaction) -> Result; + fn insert(&mut self, key: KeyHash, entry: HashchainEntry) -> Result; + fn update(&mut self, key: KeyHash, entry: HashchainEntry) -> Result; fn get(&self, key: KeyHash) -> Result; } @@ -224,27 +222,30 @@ where impl SnarkableTree for KeyDirectoryTree where - S: TreeReader + TreeWriter, + S: Send + Sync + TreeReader + TreeWriter, { - fn process_operation(&mut self, operation: &Operation) -> Result { - match operation { - Operation::AddKey(KeyOperationArgs { id, .. }) - | Operation::RevokeKey(KeyOperationArgs { id, .. }) - | Operation::AddData(AddDataArgs { id, .. }) => { - let hashed_id = Digest::hash(id); + fn process_transaction(&mut self, transaction: Transaction) -> Result { + match &transaction.entry.operation { + Operation::AddKey { .. } | Operation::RevokeKey { .. } | Operation::AddData { .. } => { + let hashed_id = Digest::hash(&transaction.id); let key_hash = KeyHash::with::(hashed_id); - debug!("updating hashchain for user id {}", id.clone()); - let proof = self.update(key_hash, operation.clone())?; + debug!("updating hashchain for user id {}", transaction.id); + let proof = self.update(key_hash, transaction.entry)?; Ok(Proof::Update(Box::new(proof))) } - Operation::CreateAccount(CreateAccountArgs { + Operation::CreateAccount { id, service_id, challenge, - .. - }) => { + key, + } => { + ensure!( + transaction.id == id.as_str(), + "Id of transaction needs to be equal to operation id" + ); + let hashed_id = Digest::hash(id); let account_key_hash = KeyHash::with::(hashed_id); @@ -267,38 +268,44 @@ where }; let creation_gate = match &service_last_entry.operation { - Operation::RegisterService(args) => &args.creation_gate, + Operation::RegisterService { creation_gate, .. } => creation_gate, _ => { bail!("Service hashchain's last entry was not a RegisterService operation") } }; - let ServiceChallenge::Signed(service_pubkey) = creation_gate; + // Hash and sign credentials that have been signed by the external service + let hash = + Digest::hash_items(&[id.as_bytes(), service_id.as_bytes(), &key.as_bytes()]); + let ServiceChallenge::Signed(service_pubkey) = creation_gate; let ServiceChallengeInput::Signed(challenge_signature) = &challenge; - service_pubkey.verify_signature( - &bincode::serialize(&operation.without_challenge())?, - challenge_signature, - )?; + + service_pubkey.verify_signature(&hash.to_bytes(), challenge_signature)?; debug!("creating new hashchain for user ID {}", id); - let insert_proof = self.insert(account_key_hash, operation.clone())?; + let insert_proof = self.insert(account_key_hash, transaction.entry)?; Ok(Proof::Insert(Box::new(insert_proof))) } - Operation::RegisterService(RegisterServiceArgs { id, .. }) => { + Operation::RegisterService { id, .. } => { + ensure!( + transaction.id == id.as_str(), + "Id of transaction needs to be equal to operation id" + ); + let hashed_id = Digest::hash(id); let key_hash = KeyHash::with::(hashed_id); debug!("creating new hashchain for service id {}", id); - let insert_proof = self.insert(key_hash, operation.clone())?; + let insert_proof = self.insert(key_hash, transaction.entry)?; Ok(Proof::Insert(Box::new(insert_proof))) } } } - fn insert(&mut self, key: KeyHash, insertion_op: Operation) -> Result { + fn insert(&mut self, key: KeyHash, entry: HashchainEntry) -> Result { let old_root = self.get_current_root()?; let (None, non_membership_merkle_proof) = self.jmt.get_with_proof(key, self.epoch)? else { bail!("Key already exists"); @@ -310,7 +317,7 @@ where key, }; - let hashchain = Hashchain::from_operation(insertion_op.clone())?; + let hashchain = Hashchain::from_entry(entry.clone())?; let serialized_hashchain = Self::serialize_value(&hashchain)?; // the update proof just contains another nm proof @@ -324,13 +331,13 @@ where Ok(InsertProof { new_root: new_root.into(), - insertion_op, + new_entry: entry, non_membership_proof, membership_proof, }) } - fn update(&mut self, key: KeyHash, update_op: Operation) -> Result { + fn update(&mut self, key: KeyHash, entry: HashchainEntry) -> Result { let old_root = self.get_current_root()?; let (Some(old_serialized_hashchain), inclusion_proof) = self.jmt.get_with_proof(key, self.epoch)? @@ -341,7 +348,7 @@ where let old_hashchain: Hashchain = bincode::deserialize(old_serialized_hashchain.as_slice())?; let mut new_hashchain = old_hashchain.clone(); - new_hashchain.perform_operation(update_op.clone())?; + new_hashchain.add_entry(entry.clone())?; let serialized_value = Self::serialize_value(&new_hashchain)?; @@ -359,7 +366,7 @@ where old_hashchain, key, update_proof, - update_op, + new_entry: entry, }) } diff --git a/crates/da/src/celestia.rs b/crates/da/src/celestia.rs index 3e814693..ff279880 100644 --- a/crates/da/src/celestia.rs +++ b/crates/da/src/celestia.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use celestia_rpc::{BlobClient, Client, HeaderClient}; use celestia_types::{nmt::Namespace, Blob, TxConfig}; use log::{debug, error, trace, warn}; -use prism_common::operation::Operation; +use prism_common::transaction::Transaction; use prism_errors::{DataAvailabilityError, GeneralError}; use serde::{Deserialize, Serialize}; use std::{ @@ -33,7 +33,7 @@ pub struct CelestiaConfig { pub connection_string: String, pub start_height: u64, pub snark_namespace_id: String, - pub operation_namespace_id: Option, + pub transaction_namespace_id: Option, } impl Default for CelestiaConfig { @@ -42,7 +42,7 @@ impl Default for CelestiaConfig { connection_string: "ws://localhost:26658".to_string(), start_height: 0, snark_namespace_id: "00000000000000de1008".to_string(), - operation_namespace_id: Some("00000000000000de1009".to_string()), + transaction_namespace_id: Some("00000000000000de1009".to_string()), } } } @@ -50,7 +50,7 @@ impl Default for CelestiaConfig { pub struct CelestiaConnection { pub client: celestia_rpc::Client, pub snark_namespace: Namespace, - pub operation_namespace: Namespace, + pub transaction_namespace: Namespace, height_update_tx: broadcast::Sender, sync_target: Arc, @@ -68,9 +68,9 @@ impl CelestiaConnection { &config.snark_namespace_id ))?; - let operation_namespace = match &config.operation_namespace_id { + let transaction_namespace = match &config.transaction_namespace_id { Some(id) => create_namespace(id).context(format!( - "Failed to create operation namespace from: '{}'", + "Failed to create transaction namespace from: '{}'", id ))?, None => snark_namespace, @@ -81,7 +81,7 @@ impl CelestiaConnection { Ok(CelestiaConnection { client, snark_namespace, - operation_namespace, + transaction_namespace, height_update_tx, sync_target: Arc::new(AtomicU64::new(0)), }) @@ -168,15 +168,18 @@ impl DataAvailabilityLayer for CelestiaConnection { .map_err(|e| anyhow!(DataAvailabilityError::SubmissionError(e.to_string()))) } - async fn get_operations(&self, height: u64) -> Result> { - trace!("searching for operations on da layer at height {}", height); + async fn get_transactions(&self, height: u64) -> Result> { + trace!( + "searching for transactions on da layer at height {}", + height + ); let maybe_blobs = - BlobClient::blob_get_all(&self.client, height, &[self.operation_namespace]) + BlobClient::blob_get_all(&self.client, height, &[self.transaction_namespace]) .await .map_err(|e| { anyhow!(DataAvailabilityError::DataRetrievalError( height, - format!("getting operations from da layer: {}", e) + format!("getting transactions from da layer: {}", e) )) })?; @@ -185,13 +188,13 @@ impl DataAvailabilityLayer for CelestiaConnection { None => return Ok(vec![]), }; - let operations = blobs + let transactions = blobs .iter() - .filter_map(|blob| match Operation::try_from(blob) { - Ok(operation) => Some(operation), + .filter_map(|blob| match Transaction::try_from(blob) { + Ok(transaction) => Some(transaction), Err(e) => { warn!( - "Failed to parse blob from height {} to operation: {:?}", + "Failed to parse blob from height {} to transaction: {:?}", height, e ); None @@ -199,24 +202,27 @@ impl DataAvailabilityLayer for CelestiaConnection { }) .collect(); - Ok(operations) + Ok(transactions) } - async fn submit_operations(&self, operations: Vec) -> Result { - debug!("posting {} operations to DA layer", operations.len()); - let blobs: Result, _> = operations + async fn submit_transactions(&self, transactions: Vec) -> Result { + debug!("posting {} transactions to DA layer", transactions.len()); + let blobs: Result, _> = transactions .iter() - .map(|operation| { - let data = bincode::serialize(operation) - .context(format!("Failed to serialize operation {}", operation)) + .map(|transaction| { + let data = bincode::serialize(transaction) + .context(format!("Failed to serialize transaction {:?}", transaction)) .map_err(|e| { DataAvailabilityError::GeneralError(GeneralError::ParsingError( e.to_string(), )) })?; - Blob::new(self.operation_namespace, data) - .context(format!("Failed to create blob for operation {}", operation)) + Blob::new(self.transaction_namespace, data) + .context(format!( + "Failed to create blob for transaction {:?}", + transaction + )) .map_err(|e| { DataAvailabilityError::GeneralError(GeneralError::BlobCreationError( e.to_string(), diff --git a/crates/da/src/lib.rs b/crates/da/src/lib.rs index ce0e6206..8b4ea30a 100644 --- a/crates/da/src/lib.rs +++ b/crates/da/src/lib.rs @@ -1,7 +1,7 @@ use anyhow::Result; use async_trait::async_trait; use ed25519_consensus::{Signature, SigningKey, VerificationKey as VerifyingKey}; -use prism_common::{digest::Digest, operation::Operation}; +use prism_common::{digest::Digest, transaction::Transaction}; use serde::{Deserialize, Serialize}; use sp1_sdk::SP1ProofWithPublicValues; use tokio::sync::broadcast; @@ -66,8 +66,8 @@ pub trait DataAvailabilityLayer: Send + Sync { async fn initialize_sync_target(&self) -> Result; async fn get_finalized_epoch(&self, height: u64) -> Result>; async fn submit_finalized_epoch(&self, epoch: FinalizedEpoch) -> Result; - async fn get_operations(&self, height: u64) -> Result>; - async fn submit_operations(&self, operations: Vec) -> Result; + async fn get_transactions(&self, height: u64) -> Result>; + async fn submit_transactions(&self, transactions: Vec) -> Result; async fn start(&self) -> Result<()>; fn subscribe_to_heights(&self) -> broadcast::Receiver; } diff --git a/crates/da/src/memory.rs b/crates/da/src/memory.rs index 27772ce2..cdcd52ab 100644 --- a/crates/da/src/memory.rs +++ b/crates/da/src/memory.rs @@ -2,7 +2,7 @@ use crate::{DataAvailabilityLayer, FinalizedEpoch}; use anyhow::Result; use async_trait::async_trait; use log::debug; -use prism_common::operation::Operation; +use prism_common::transaction::Transaction; use std::{collections::VecDeque, sync::Arc}; use tokio::{ sync::{broadcast, RwLock}, @@ -12,14 +12,14 @@ use tokio::{ #[derive(Clone, Debug)] pub struct Block { pub height: u64, - pub operations: Vec, + pub transactions: Vec, pub epoch: Option, } #[derive(Clone)] pub struct InMemoryDataAvailabilityLayer { blocks: Arc>>, - pending_operations: Arc>>, + pending_transactions: Arc>>, pending_epochs: Arc>>, latest_height: Arc>, height_update_tx: broadcast::Sender, @@ -34,7 +34,7 @@ impl InMemoryDataAvailabilityLayer { ( Self { blocks: Arc::new(RwLock::new(Vec::new())), - pending_operations: Arc::new(RwLock::new(Vec::new())), + pending_transactions: Arc::new(RwLock::new(Vec::new())), pending_epochs: Arc::new(RwLock::new(VecDeque::new())), latest_height: Arc::new(RwLock::new(0)), height_update_tx: height_tx, @@ -51,20 +51,20 @@ impl InMemoryDataAvailabilityLayer { loop { interval.tick().await; let mut blocks = self.blocks.write().await; - let mut pending_operations = self.pending_operations.write().await; + let mut pending_transactions = self.pending_transactions.write().await; let mut pending_epochs = self.pending_epochs.write().await; let mut latest_height = self.latest_height.write().await; *latest_height += 1; let new_block = Block { height: *latest_height, - operations: std::mem::take(&mut *pending_operations), + transactions: std::mem::take(&mut *pending_transactions), epoch: pending_epochs.pop_front(), }; debug!( - "new block produced at height {} with {} operations", + "new block produced at height {} with {} transactions", new_block.height, - new_block.operations.len(), + new_block.transactions.len(), ); blocks.push(new_block.clone()); @@ -108,18 +108,18 @@ impl DataAvailabilityLayer for InMemoryDataAvailabilityLayer { self.get_latest_height().await } - async fn get_operations(&self, height: u64) -> Result> { + async fn get_transactions(&self, height: u64) -> Result> { let blocks = self.blocks.read().await; Ok(blocks .iter() .find(|block| block.height == height) - .map(|block| block.operations.clone()) + .map(|block| block.transactions.clone()) .unwrap_or_default()) } - async fn submit_operations(&self, operations: Vec) -> Result { - let mut pending_operations = self.pending_operations.write().await; - pending_operations.extend(operations); + async fn submit_transactions(&self, transactions: Vec) -> Result { + let mut pending_transactions = self.pending_transactions.write().await; + pending_transactions.extend(transactions); self.get_latest_height().await } diff --git a/crates/node_types/prover/src/prover/mod.rs b/crates/node_types/prover/src/prover/mod.rs index a0ffcae7..64ab4d29 100644 --- a/crates/node_types/prover/src/prover/mod.rs +++ b/crates/node_types/prover/src/prover/mod.rs @@ -4,7 +4,9 @@ use jmt::KeyHash; use keystore_rs::create_signing_key; use prism_common::{ digest::Digest, + hashchain::Hashchain, hasher::Hasher, + transaction::Transaction, tree::{ Batch, HashchainResponse::{self, *}, @@ -33,8 +35,8 @@ pub struct Config { /// incoming FinalizedEpochs. pub prover: bool, - /// Enables accepting incoming operations from the webserver and posting batches to the DA layer. - /// When deactivated, the node will reject incoming operations. + /// Enables accepting incoming transactions from the webserver and posting batches to the DA layer. + /// When deactivated, the node will reject incoming transactions. pub batcher: bool, /// Configuration for the webserver. @@ -43,7 +45,7 @@ pub struct Config { /// Key used to sign new FinalizedEpochs. pub key: SigningKey, - /// DA layer height the prover should start syncing operations from. + /// DA layer height the prover should start syncing transactions from. pub start_height: u64, } @@ -66,9 +68,9 @@ pub struct Prover { pub cfg: Config, - /// [`pending_operations`] is a buffer for operations that have not yet been + /// [`pending_transactions`] is a buffer for transactions that have not yet been /// posted to the DA layer. - pub pending_operations: Arc>>, + pub pending_transactions: Arc>>, /// [`tree`] is the representation of the JMT, prism's state tree. It is accessed via the [`db`]. tree: Arc>>>, @@ -111,7 +113,7 @@ impl Prover { verifying_key: vk, prover_client: Arc::new(RwLock::new(prover_client)), tree, - pending_operations: Arc::new(RwLock::new(Vec::new())), + pending_transactions: Arc::new(RwLock::new(Vec::new())), }) } @@ -175,11 +177,11 @@ impl Prover { } // TODO: Should be persisted in database for crash recovery - let mut buffered_operations: VecDeque = VecDeque::new(); + let mut buffered_transactions: VecDeque = VecDeque::new(); let mut current_height = start_height; while current_height <= end_height { - self.process_da_height(current_height, &mut buffered_operations, false).await?; + self.process_da_height(current_height, &mut buffered_transactions, false).await?; // TODO: Race between set_epoch and set_last_synced_height self.db.set_last_synced_height(¤t_height)?; current_height += 1; @@ -199,9 +201,9 @@ impl Prover { height )); } - self.process_da_height(height, &mut buffered_operations, true).await?; + self.process_da_height(height, &mut buffered_transactions, true).await?; current_height += 1; - // TODO: Race between set_epoch and set_last_synced_height - updating these should be a single atomic operation + // TODO: Race between set_epoch and set_last_synced_height - updating these should be a single atomic transaction self.db.set_last_synced_height(¤t_height)?; } } @@ -209,12 +211,12 @@ impl Prover { async fn process_da_height( &self, height: u64, - buffered_operations: &mut VecDeque, + buffered_transactions: &mut VecDeque, is_real_time: bool, ) -> Result<()> { let current_epoch = self.db.get_epoch()?; - let operations = self.da.get_operations(height).await?; + let transactions = self.da.get_transactions(height).await?; let epoch_result = self.da.get_finalized_epoch(height).await?; debug!( @@ -225,21 +227,21 @@ impl Prover { ); if let Some(epoch) = epoch_result { - // run all buffered operations from the last celestia blocks and increment current_epoch - self.process_epoch(epoch, buffered_operations).await?; + // run all buffered transactions from the last celestia blocks and increment current_epoch + self.process_epoch(epoch, buffered_transactions).await?; } else { - debug!("No operations to process at height {}", height); + debug!("No transactions to process at height {}", height); } - if is_real_time && !buffered_operations.is_empty() && self.cfg.prover { - let all_ops: Vec = buffered_operations.drain(..).collect(); - self.finalize_new_epoch(current_epoch, all_ops).await?; + if is_real_time && !buffered_transactions.is_empty() && self.cfg.prover { + let all_transactions: Vec = buffered_transactions.drain(..).collect(); + self.finalize_new_epoch(current_epoch, all_transactions).await?; } - // If there are new operations at this height, add them to the queue to + // If there are new transactions at this height, add them to the queue to // be included in the next finalized epoch. - if !operations.is_empty() { - buffered_operations.extend(operations); + if !transactions.is_empty() { + buffered_transactions.extend(transactions); } Ok(()) @@ -248,12 +250,12 @@ impl Prover { async fn process_epoch( &self, epoch: FinalizedEpoch, - buffered_operations: &mut VecDeque, + buffered_transactions: &mut VecDeque, ) -> Result<()> { let mut current_epoch = self.db.get_epoch()?; // If prover is enabled and is actively producing new epochs, it has - // likely already ran all of the operations in the found epoch, so no + // likely already ran all of the transactions in the found epoch, so no // further processing is needed if epoch.height < current_epoch { debug!("epoch {} already processed internally", current_epoch); @@ -277,9 +279,9 @@ impl Prover { )); } - let all_ops: Vec = buffered_operations.drain(..).collect(); - if !all_ops.is_empty() { - self.execute_block(all_ops).await?; + let all_transactions: Vec = buffered_transactions.drain(..).collect(); + if !all_transactions.is_empty() { + self.execute_block(all_transactions).await?; } let new_commitment = self.get_commitment().await?; @@ -302,17 +304,20 @@ impl Prover { Ok(()) } - async fn execute_block(&self, operations: Vec) -> Result> { - debug!("executing block with {} operations", operations.len()); + async fn execute_block(&self, transactions: Vec) -> Result> { + debug!("executing block with {} transactions", transactions.len()); let mut proofs = Vec::new(); - for operation in operations { - match self.process_operation(&operation).await { + for transaction in transactions { + match self.process_transaction(transaction.clone()).await { Ok(proof) => proofs.push(proof), Err(e) => { - // Log the error and continue with the next operation - warn!("Failed to process operation: {:?}. Error: {}", operation, e); + // Log the error and continue with the next transaction + warn!( + "Failed to process transaction: {:?}. Error: {}", + transaction, e + ); } } } @@ -323,11 +328,11 @@ impl Prover { async fn finalize_new_epoch( &self, epoch_height: u64, - operations: Vec, + transactions: Vec, ) -> Result<()> { let prev_commitment = self.get_commitment().await?; - let proofs = self.execute_block(operations).await?; + let proofs = self.execute_block(transactions).await?; let new_commitment = self.get_commitment().await?; @@ -392,30 +397,30 @@ impl Prover { let height = height_rx.recv().await?; trace!("received height {}", height); - // Get pending operations - let pending_operations = { - let mut ops = self.pending_operations.write().await; + // Get pending transactions + let pending_transactions = { + let mut ops = self.pending_transactions.write().await; std::mem::take(&mut *ops) }; - let op_count = pending_operations.len(); + let tx_count = pending_transactions.len(); - // If there are pending operations, submit them - if !pending_operations.clone().is_empty() { - match self.da.submit_operations(pending_operations).await { + // If there are pending transactions, submit them + if !pending_transactions.clone().is_empty() { + match self.da.submit_transactions(pending_transactions).await { Ok(submitted_height) => { info!( - "post_batch_loop: submitted {} operations at height {}", - op_count, submitted_height + "post_batch_loop: submitted {} transactions at height {}", + tx_count, submitted_height ); } Err(e) => { - error!("post_batch_loop: Failed to submit operations: {}", e); + error!("post_batch_loop: Failed to submit transactions: {}", e); } } } else { debug!( - "post_batch_loop: No pending operations to submit at height {}", + "post_batch_loop: No pending transactions to submit at height {}", height ); } @@ -435,41 +440,39 @@ impl Prover { tree.get(key_hash) } - /// Updates the state from an already verified pending operation. - async fn process_operation(&self, operation: &Operation) -> Result { + /// Updates the state from an already verified pending transaction. + async fn process_transaction(&self, transaction: Transaction) -> Result { let mut tree = self.tree.write().await; - tree.process_operation(operation) + tree.process_transaction(transaction) } - /// Adds an operation to be posted to the DA layer and applied in the next epoch. + /// Adds an transaction to be posted to the DA layer and applied in the next epoch. pub async fn validate_and_queue_update( self: Arc, - incoming_operation: &Operation, + transaction: Transaction, ) -> Result<()> { if !self.cfg.batcher { - bail!("Batcher is disabled, cannot queue operations"); + bail!("Batcher is disabled, cannot queue transactions"); } - // basic validation, does not include signature checks - incoming_operation.validate()?; - - // validate operation against existing hashchain if necessary, including signature checks - match incoming_operation { - Operation::RegisterService(_) => (), - Operation::CreateAccount(_) => (), - Operation::AddKey(_) | Operation::RevokeKey(_) | Operation::AddData(_) => { - let hc_response = self.get_hashchain(&incoming_operation.id()).await?; + // validate against existing hashchain if necessary, including signature checks + match transaction.entry.operation { + Operation::RegisterService { .. } | Operation::CreateAccount { .. } => { + Hashchain::empty().add_entry(transaction.entry.clone())? + } + Operation::AddKey { .. } | Operation::RevokeKey { .. } | Operation::AddData { .. } => { + let hc_response = self.get_hashchain(&transaction.id).await?; let Found(mut hc, _) = hc_response else { - bail!("Hashchain not found for id: {}", incoming_operation.id()) + bail!("Hashchain not found for id: {}", transaction.id) }; - hc.perform_operation(incoming_operation.clone())?; + hc.add_entry(transaction.entry.clone())?; } }; - let mut pending = self.pending_operations.write().await; - pending.push(incoming_operation.clone()); + let mut pending = self.pending_transactions.write().await; + pending.push(transaction); Ok(()) } } diff --git a/crates/node_types/prover/src/prover/tests.rs b/crates/node_types/prover/src/prover/tests.rs index b0cc56a7..e81e8a29 100644 --- a/crates/node_types/prover/src/prover/tests.rs +++ b/crates/node_types/prover/src/prover/tests.rs @@ -1,9 +1,9 @@ use super::*; -use prism_common::{test_ops::OpsBuilder, tree::Proof}; +use prism_common::{transaction_builder::TransactionBuilder, tree::Proof}; use std::{self, sync::Arc, time::Duration}; use tokio::spawn; -use prism_common::{operation::Operation, test_utils::create_mock_signing_key}; +use prism_common::test_utils::create_mock_signing_key; use prism_da::memory::InMemoryDataAvailabilityLayer; use prism_storage::{inmemory::InMemoryDatabase, Database}; @@ -16,14 +16,18 @@ async fn create_test_prover() -> Arc { Arc::new(Prover::new(db.clone(), da_layer, &cfg).unwrap()) } -fn create_mock_operations(service_id: String) -> Vec { - let mut ops_builder = OpsBuilder::new(); +fn create_mock_transactions(service_id: String) -> Vec { + let mut transaction_builder = TransactionBuilder::new(); vec![ - ops_builder.register_service_with_random_key(&service_id).ex(), - ops_builder.create_account_with_random_key("user1@example.com", &service_id).ex(), - ops_builder.create_account_with_random_key("user2@example.com", &service_id).ex(), - ops_builder.add_random_key_verified_with_root("user1@example.com").ex(), + transaction_builder.register_service_with_random_keys(&service_id).commit(), + transaction_builder + .create_account_with_random_key("user1@example.com", &service_id) + .commit(), + transaction_builder + .create_account_with_random_key("user2@example.com", &service_id) + .commit(), + transaction_builder.add_random_key_verified_with_root("user1@example.com").commit(), ] } @@ -31,50 +35,53 @@ fn create_mock_operations(service_id: String) -> Vec { async fn test_validate_and_queue_update() { let prover = create_test_prover().await; - let mut ops_builder = OpsBuilder::new(); - let op = ops_builder.register_service_with_random_key("test_service").ex(); + let mut transaction_builder = TransactionBuilder::new(); + let transaction = + transaction_builder.register_service_with_random_keys("test_service").commit(); - prover.clone().validate_and_queue_update(&op).await.unwrap(); + prover.clone().validate_and_queue_update(transaction.clone()).await.unwrap(); - prover.clone().validate_and_queue_update(&op).await.unwrap(); + prover.clone().validate_and_queue_update(transaction.clone()).await.unwrap(); - let pending_ops = prover.pending_operations.read().await; - assert_eq!(pending_ops.len(), 2); + let pending_transactions = prover.pending_transactions.read().await; + assert_eq!(pending_transactions.len(), 2); } #[tokio::test] -async fn test_process_operation() { +async fn test_process_transactions() { let prover = create_test_prover().await; - let mut ops_builder = OpsBuilder::new(); - let register_service_op = ops_builder.register_service_with_random_key("test_service").ex(); - let create_account_op = - ops_builder.create_account_with_random_key("test_account", "test_service").ex(); + let mut transaction_builder = TransactionBuilder::new(); + let register_service_transaction = + transaction_builder.register_service_with_random_keys("test_service").commit(); + let create_account_transaction = + transaction_builder.create_account_with_random_key("test_account", "test_service").commit(); - let proof = prover.process_operation(®ister_service_op).await.unwrap(); + let proof = prover.process_transaction(register_service_transaction).await.unwrap(); assert!(matches!(proof, Proof::Insert(_))); - let proof = prover.process_operation(&create_account_op).await.unwrap(); + let proof = prover.process_transaction(create_account_transaction.clone()).await.unwrap(); assert!(matches!(proof, Proof::Insert(_))); let new_key = create_mock_signing_key(); - let add_key_op = - ops_builder.add_key_verified_with_root("test_account", new_key.verifying_key()).ex(); + let add_key_transaction = transaction_builder + .add_key_verified_with_root("test_account", new_key.verifying_key()) + .commit(); - let proof = prover.process_operation(&add_key_op).await.unwrap(); + let proof = prover.process_transaction(add_key_transaction).await.unwrap(); assert!(matches!(proof, Proof::Update(_))); // Revoke original key - let revoke_op = ops_builder + let revoke_transaction = transaction_builder .revoke_key( "test_account", - create_account_op.get_public_key().cloned().unwrap(), + create_account_transaction.entry.operation.get_public_key().cloned().unwrap(), &new_key, 1, ) - .ex(); - let proof = prover.process_operation(&revoke_op).await.unwrap(); + .commit(); + let proof = prover.process_transaction(revoke_transaction).await.unwrap(); assert!(matches!(proof, Proof::Update(_))); } @@ -82,23 +89,23 @@ async fn test_process_operation() { async fn test_execute_block_with_invalid_tx() { let prover = create_test_prover().await; - let mut ops_builder = OpsBuilder::new(); + let mut tx_builder = TransactionBuilder::new(); let new_key_1 = create_mock_signing_key(); - let operations = vec![ - ops_builder.register_service_with_random_key("service_id").ex(), - ops_builder.create_account_with_random_key("account_id", "service_id").ex(), + let transactions = vec![ + tx_builder.register_service_with_random_keys("service_id").commit(), + tx_builder.create_account_with_random_key("account_id", "service_id").commit(), // add new key, so it will be index = 1 - ops_builder.add_key_verified_with_root("account_id", new_key_1.verifying_key()).ex(), + tx_builder.add_key_verified_with_root("account_id", new_key_1.verifying_key()).commit(), // revoke new key again - ops_builder.revoke_key_verified_with_root("account_id", new_key_1.verifying_key()).ex(), + tx_builder.revoke_key_verified_with_root("account_id", new_key_1.verifying_key()).commit(), // and adding in same block. - // both of these operations are valid individually, but when processed together it will fail. - ops_builder.add_random_key("account_id", &new_key_1, 1).op(), + // both of these transactions are valid individually, but when processed together it will fail. + tx_builder.add_random_key("account_id", &new_key_1, 1).build(), ]; - let proofs = prover.execute_block(operations).await.unwrap(); + let proofs = prover.execute_block(transactions).await.unwrap(); assert_eq!(proofs.len(), 4); } @@ -106,19 +113,19 @@ async fn test_execute_block_with_invalid_tx() { async fn test_execute_block() { let prover = create_test_prover().await; - let operations = create_mock_operations("test_service".to_string()); + let transactions = create_mock_transactions("test_service".to_string()); - let proofs = prover.execute_block(operations).await.unwrap(); + let proofs = prover.execute_block(transactions).await.unwrap(); assert_eq!(proofs.len(), 4); } #[tokio::test] async fn test_finalize_new_epoch() { let prover = create_test_prover().await; - let operations = create_mock_operations("test_service".to_string()); + let transactions = create_mock_transactions("test_service".to_string()); let prev_commitment = prover.get_commitment().await.unwrap(); - prover.finalize_new_epoch(0, operations).await.unwrap(); + prover.finalize_new_epoch(0, transactions).await.unwrap(); let new_commitment = prover.get_commitment().await.unwrap(); assert_ne!(prev_commitment, new_commitment); @@ -138,10 +145,10 @@ async fn test_restart_sync_from_scratch() { runner.run().await.unwrap(); }); - let operations = create_mock_operations("test_service".to_string()); + let transactions = create_mock_transactions("test_service".to_string()); - for op in operations { - prover.clone().validate_and_queue_update(&op).await.unwrap(); + for transaction in transactions { + prover.clone().validate_and_queue_update(transaction).await.unwrap(); while let Ok(new_block) = brx.recv().await { if new_block.epoch.is_some() { break; @@ -181,10 +188,10 @@ async fn test_load_persisted_state() { runner.run().await.unwrap(); }); - let operations = create_mock_operations("test_service".to_string()); + let transactions = create_mock_transactions("test_service".to_string()); - for op in operations { - prover.clone().validate_and_queue_update(&op).await.unwrap(); + for transaction in transactions { + prover.clone().validate_and_queue_update(transaction).await.unwrap(); while let Ok(new_block) = brx.recv().await { if new_block.epoch.is_some() { break; diff --git a/crates/node_types/prover/src/webserver.rs b/crates/node_types/prover/src/webserver.rs index d51893b3..fef29a1b 100644 --- a/crates/node_types/prover/src/webserver.rs +++ b/crates/node_types/prover/src/webserver.rs @@ -13,7 +13,10 @@ use indexed_merkle_tree::{ }; use jmt::proof::SparseMerkleProof; use prism_common::{ - hashchain::Hashchain, hasher::Hasher, operation::Operation, tree::HashchainResponse, + hashchain::{Hashchain, HashchainEntry}, + hasher::Hasher, + transaction::Transaction, + tree::HashchainResponse, }; use serde::{Deserialize, Serialize}; use std::{self, sync::Arc}; @@ -52,8 +55,9 @@ pub struct EpochData { } #[derive(Deserialize, Debug, ToSchema)] -pub struct OperationInput { - pub operation: Operation, +pub struct TransactionRequest { + pub id: String, + pub entry: HashchainEntry, } #[derive(Serialize, Deserialize, ToSchema)] @@ -75,9 +79,9 @@ pub struct UserKeyResponse { #[derive(OpenApi)] #[openapi( - paths(update_entry, get_hashchain, get_commitment), + paths(post_transaction, get_hashchain, get_commitment), components(schemas( - OperationInput, + TransactionRequest, EpochData, UpdateProofResponse, Hash, @@ -99,7 +103,7 @@ impl WebServer { info!("starting webserver on {}:{}", self.cfg.host, self.cfg.port); let app = Router::new() - .route("/update-entry", post(update_entry)) + .route("/transaction", post(post_transaction)) .route("/get-hashchain", post(get_hashchain)) .route("/get-current-commitment", get(get_commitment)) .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) @@ -116,23 +120,27 @@ impl WebServer { } } -/// Updates or inserts an entry in the transparency dictionary, pending inclusion in the next epoch. +/// Updates or inserts a transaction in the transparency dictionary, pending inclusion in the next epoch. /// #[utoipa::path( post, - path = "/update-entry", - request_body = UpdateEntryJson, + path = "/transaction", + request_body = TransactionRequest, responses( (status = 200, description = "Entry update queued for insertion into next epoch"), (status = 400, description = "Bad request"), (status = 500, description = "Internal server error") ) )] -async fn update_entry( +async fn post_transaction( State(session): State>, - Json(operation_input): Json, + Json(update_input): Json, ) -> impl IntoResponse { - match session.validate_and_queue_update(&operation_input.operation).await { + let transaction = Transaction { + id: update_input.id.clone(), + entry: update_input.entry.clone(), + }; + match session.validate_and_queue_update(transaction).await { Ok(_) => ( StatusCode::OK, "Entry update queued for insertion into next epoch", diff --git a/crates/storage/src/redis.rs b/crates/storage/src/redis.rs index 23beab16..b2fd9c0b 100644 --- a/crates/storage/src/redis.rs +++ b/crates/storage/src/redis.rs @@ -208,6 +208,6 @@ impl Database for RedisConnection { let mut conn = self.lock_connection()?; redis::cmd("FLUSHALL") .query::<()>(&mut conn) - .map_err(|_| anyhow!(DatabaseError::DeleteError("all entries".to_string()))) + .map_err(|_| anyhow!(DatabaseError::DeleteError("all transactions".to_string()))) } } diff --git a/crates/tests/src/lib.rs b/crates/tests/src/lib.rs index 7cf13f76..c41d4252 100644 --- a/crates/tests/src/lib.rs +++ b/crates/tests/src/lib.rs @@ -3,16 +3,9 @@ #[macro_use] extern crate log; -use anyhow::{bail, Result}; -use jmt::KeyHash; +use anyhow::Result; use keystore_rs::create_signing_key; -use prism_common::{ - digest::Digest, - hasher::Hasher, - operation::{Operation, ServiceChallenge}, - test_utils::create_mock_signing_key, - tree::{HashchainResponse::*, SnarkableTree}, -}; +use prism_common::transaction_builder::TransactionBuilder; use prism_da::{ celestia::{CelestiaConfig, CelestiaConnection}, DataAvailabilityLayer, @@ -24,38 +17,7 @@ use rand::{rngs::StdRng, Rng, SeedableRng}; use std::sync::Arc; use tokio::{spawn, time::Duration}; -use prism_common::test_utils::{Service, TestTreeState}; - -fn create_random_user(id: &str, state: &mut TestTreeState, service: &Service) -> Operation { - let account = state.create_account(id.to_string(), service.clone()); - account.hashchain.last().unwrap().operation.clone() -} - -fn add_key(id: &str, state: &mut TestTreeState) -> Result { - let hashed_id = Digest::hash(id); - let key_hash = KeyHash::with::(hashed_id); - - let Found(hc, _) = state.tree.get(key_hash)? else { - bail!("Hashchain not found for account {}", id); - }; - - let Some(signing_key) = state.signing_keys.get(id) else { - bail!("Signing key not found for account {}", id); - }; - - let new_key = create_mock_signing_key(); - let new_public_key = new_key.verifying_key(); - - let op = Operation::new_add_key( - id.to_string(), - new_public_key, - hc.last_hash(), - signing_key, - 0, // Assuming this is the key index, you might need to adjust this - )?; - - Ok(op) -} +use prism_common::test_utils::TestTreeState; fn setup_db() -> Arc> { Arc::new(Box::new(InMemoryDatabase::new()) as Box) @@ -113,55 +75,47 @@ async fn test_light_client_prover_talking() -> Result<()> { spawn(async move { let mut rng = StdRng::from_entropy(); - let mut test_state = TestTreeState::new(); - let service = test_state.register_service("test_service".to_string()); - let op = Operation::new_register_service( - service.clone().id, - ServiceChallenge::Signed(service.clone().vk), - ); + + let mut transaction_builder = TransactionBuilder::new(); + let register_service_req = + transaction_builder.register_service_with_random_keys("test_service").commit(); + let mut i = 0; - prover.clone().validate_and_queue_update(&op).await.unwrap(); + prover.clone().validate_and_queue_update(register_service_req).await.unwrap(); + let mut added_account_ids: Vec = Vec::new(); loop { // Create 1 to 3 new accounts let num_new_accounts = rng.gen_range(1..=3); for _ in 0..num_new_accounts { - let new_acc = create_random_user( - format!("{}@gmail.com", i).as_str(), - &mut test_state, - &service, - ); - match prover.clone().validate_and_queue_update(&new_acc).await { - Ok(_) => i += 1, + let random_user_id = format!("{}@gmail.com", i); + let new_acc = transaction_builder + .create_account_with_random_key(random_user_id.as_str(), "test_service") + .commit(); + match prover.clone().validate_and_queue_update(new_acc).await { + Ok(_) => { + i += 1; + added_account_ids.push(random_user_id); + } Err(e) => eprintln!("Failed to create account: {}", e), } } // Update 5 random existing accounts (if we have at least 5) - if test_state.signing_keys.len() >= 5 { + if added_account_ids.len() >= 5 { for _ in 0..5 { - let account_id = match test_state - .signing_keys - .keys() - .nth(rng.gen_range(0..test_state.signing_keys.len())) - { - Some(id) => id.clone(), - None => { - eprintln!("Failed to get random account id"); - continue; - } + let acc_id = added_account_ids + .get(rng.gen_range(0..added_account_ids.len())) + .map_or("Could not find random account id", |id| id.as_str()); + + let update_acc = + transaction_builder.add_random_key_verified_with_root(acc_id).commit(); + + match prover.clone().validate_and_queue_update(update_acc).await { + Ok(_) => (), + Err(e) => eprintln!("Failed to validate and queue update: {}", e), }; - match add_key(&account_id, &mut test_state) { - Ok(update_op) => { - if let Err(e) = - prover.clone().validate_and_queue_update(&update_op).await - { - eprintln!("Failed to validate and queue update: {}", e); - } - } - Err(e) => eprintln!("Failed to add key: {}", e), - } } } diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf index fcef340ff3fdfaa80e37522889d6c5cb736dba9b..eb44776496b26531ab77a7c0c95552d5d8b6d5ba 100755 GIT binary patch delta 208397 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 LLjmyeX)pi)$ej0d