From a3fe3e3bc1471d603c85e27028d50bb72a847b4d Mon Sep 17 00:00:00 2001 From: ryardley Date: Wed, 2 Oct 2024 13:17:39 +1000 Subject: [PATCH 01/26] Prepare for modularization --- .../ciphernode_selector.rs} | 14 ++--- .../core/src/ciphernode_selector/mod.rs | 2 + .../ciphernode/core/src/{ => data}/data.rs | 1 - packages/ciphernode/core/src/data/mod.rs | 2 + .../core/src/{ => e3}/committee_meta.rs | 6 +- .../core/src/{ => e3}/e3_request.rs | 8 +-- packages/ciphernode/core/src/e3/mod.rs | 4 ++ .../core/src/{ => enclave_core}/eventbus.rs | 3 +- .../core/src/{ => enclave_core}/events.rs | 5 +- .../ciphernode/core/src/enclave_core/mod.rs | 8 +++ .../src/{ => enclave_core}/ordered_set.rs | 0 .../src/{ => enclave_node}/main_aggregator.rs | 9 +-- .../src/{ => enclave_node}/main_ciphernode.rs | 7 +-- .../ciphernode/core/src/enclave_node/mod.rs | 5 ++ .../core/src/{evm_caller.rs => evm/caller.rs} | 18 +++--- .../ciphernode_registry.rs} | 23 ++++---- .../{evm_contracts.rs => evm/contracts.rs} | 4 +- .../src/{evm_enclave.rs => evm/enclave.rs} | 32 +++++------ .../src/{evm_listener.rs => evm/listener.rs} | 3 +- .../src/{evm_manager.rs => evm/manager.rs} | 8 +-- packages/ciphernode/core/src/evm/mod.rs | 14 +++++ packages/ciphernode/core/src/{ => fhe}/fhe.rs | 5 +- packages/ciphernode/core/src/fhe/mod.rs | 6 ++ .../ciphernode/core/src/{ => fhe}/utils.rs | 3 +- .../core/src/{ => keyshare}/keyshare.rs | 5 +- packages/ciphernode/core/src/keyshare/mod.rs | 2 + packages/ciphernode/core/src/lib.rs | 57 ++++--------------- .../core/src/{ => logger}/logger.rs | 3 +- packages/ciphernode/core/src/logger/mod.rs | 2 + packages/ciphernode/core/src/p2p/mod.rs | 2 + packages/ciphernode/core/src/{ => p2p}/p2p.rs | 6 +- .../core/src/plaintext_aggregator/mod.rs | 2 + .../plaintext_aggregator.rs | 12 ++-- .../core/src/plaintext_writer/mod.rs | 2 + .../plaintext_writer.rs | 3 +- .../core/src/public_key_writer/mod.rs | 2 + .../public_key_writer.rs | 5 +- .../core/src/publickey_aggregator/mod.rs | 2 + .../publickey_aggregator.rs | 12 ++-- packages/ciphernode/core/src/sortition/mod.rs | 2 + .../core/src/{ => sortition}/sortition.rs | 3 +- 41 files changed, 162 insertions(+), 150 deletions(-) rename packages/ciphernode/core/src/{cipernode_selector.rs => ciphernode_selector/ciphernode_selector.rs} (85%) create mode 100644 packages/ciphernode/core/src/ciphernode_selector/mod.rs rename packages/ciphernode/core/src/{ => data}/data.rs (99%) create mode 100644 packages/ciphernode/core/src/data/mod.rs rename packages/ciphernode/core/src/{ => e3}/committee_meta.rs (75%) rename packages/ciphernode/core/src/{ => e3}/e3_request.rs (93%) create mode 100644 packages/ciphernode/core/src/e3/mod.rs rename packages/ciphernode/core/src/{ => enclave_core}/eventbus.rs (98%) rename packages/ciphernode/core/src/{ => enclave_core}/events.rs (99%) create mode 100644 packages/ciphernode/core/src/enclave_core/mod.rs rename packages/ciphernode/core/src/{ => enclave_core}/ordered_set.rs (100%) rename packages/ciphernode/core/src/{ => enclave_node}/main_aggregator.rs (86%) rename packages/ciphernode/core/src/{ => enclave_node}/main_ciphernode.rs (89%) create mode 100644 packages/ciphernode/core/src/enclave_node/mod.rs rename packages/ciphernode/core/src/{evm_caller.rs => evm/caller.rs} (95%) rename packages/ciphernode/core/src/{evm_ciphernode_registry.rs => evm/ciphernode_registry.rs} (78%) rename packages/ciphernode/core/src/{evm_contracts.rs => evm/contracts.rs} (98%) rename packages/ciphernode/core/src/{evm_enclave.rs => evm/enclave.rs} (79%) rename packages/ciphernode/core/src/{evm_listener.rs => evm/listener.rs} (97%) rename packages/ciphernode/core/src/{evm_manager.rs => evm/manager.rs} (96%) create mode 100644 packages/ciphernode/core/src/evm/mod.rs rename packages/ciphernode/core/src/{ => fhe}/fhe.rs (97%) create mode 100644 packages/ciphernode/core/src/fhe/mod.rs rename packages/ciphernode/core/src/{ => fhe}/utils.rs (98%) rename packages/ciphernode/core/src/{ => keyshare}/keyshare.rs (94%) create mode 100644 packages/ciphernode/core/src/keyshare/mod.rs rename packages/ciphernode/core/src/{ => logger}/logger.rs (96%) create mode 100644 packages/ciphernode/core/src/logger/mod.rs create mode 100644 packages/ciphernode/core/src/p2p/mod.rs rename packages/ciphernode/core/src/{ => p2p}/p2p.rs (97%) create mode 100644 packages/ciphernode/core/src/plaintext_aggregator/mod.rs rename packages/ciphernode/core/src/{ => plaintext_aggregator}/plaintext_aggregator.rs (95%) create mode 100644 packages/ciphernode/core/src/plaintext_writer/mod.rs rename packages/ciphernode/core/src/{ => plaintext_writer}/plaintext_writer.rs (93%) create mode 100644 packages/ciphernode/core/src/public_key_writer/mod.rs rename packages/ciphernode/core/src/{ => public_key_writer}/public_key_writer.rs (89%) create mode 100644 packages/ciphernode/core/src/publickey_aggregator/mod.rs rename packages/ciphernode/core/src/{ => publickey_aggregator}/publickey_aggregator.rs (97%) create mode 100644 packages/ciphernode/core/src/sortition/mod.rs rename packages/ciphernode/core/src/{ => sortition}/sortition.rs (96%) diff --git a/packages/ciphernode/core/src/cipernode_selector.rs b/packages/ciphernode/core/src/ciphernode_selector/ciphernode_selector.rs similarity index 85% rename from packages/ciphernode/core/src/cipernode_selector.rs rename to packages/ciphernode/core/src/ciphernode_selector/ciphernode_selector.rs index 3c31667d..ffef8f57 100644 --- a/packages/ciphernode/core/src/cipernode_selector.rs +++ b/packages/ciphernode/core/src/ciphernode_selector/ciphernode_selector.rs @@ -1,13 +1,10 @@ use actix::prelude::*; - -use crate::{ - CiphernodeSelected, EnclaveEvent, EventBus, GetHasNode, Sortition, Subscribe, -}; +use crate::{enclave_core::{CiphernodeSelected, EnclaveEvent, EventBus, Subscribe}, sortition::{GetHasNode, Sortition}}; pub struct CiphernodeSelector { bus: Addr, sortition: Addr, - address: String, + address: String, } impl Actor for CiphernodeSelector { @@ -19,17 +16,14 @@ impl CiphernodeSelector { Self { bus, sortition, - address:address.to_owned(), + address: address.to_owned(), } } pub fn attach(bus: Addr, sortition: Addr, address: &str) -> Addr { let addr = CiphernodeSelector::new(bus.clone(), sortition, address).start(); - bus.do_send(Subscribe::new( - "E3Requested", - addr.clone().recipient(), - )); + bus.do_send(Subscribe::new("E3Requested", addr.clone().recipient())); addr } diff --git a/packages/ciphernode/core/src/ciphernode_selector/mod.rs b/packages/ciphernode/core/src/ciphernode_selector/mod.rs new file mode 100644 index 00000000..0b915474 --- /dev/null +++ b/packages/ciphernode/core/src/ciphernode_selector/mod.rs @@ -0,0 +1,2 @@ +mod ciphernode_selector; +pub use ciphernode_selector::*; diff --git a/packages/ciphernode/core/src/data.rs b/packages/ciphernode/core/src/data/data.rs similarity index 99% rename from packages/ciphernode/core/src/data.rs rename to packages/ciphernode/core/src/data/data.rs index 7da55390..3201e0ca 100644 --- a/packages/ciphernode/core/src/data.rs +++ b/packages/ciphernode/core/src/data/data.rs @@ -1,5 +1,4 @@ use std::collections::BTreeMap; - use actix::{Actor, Context, Handler, Message}; // TODO: replace with sled version diff --git a/packages/ciphernode/core/src/data/mod.rs b/packages/ciphernode/core/src/data/mod.rs new file mode 100644 index 00000000..3ad1dc3a --- /dev/null +++ b/packages/ciphernode/core/src/data/mod.rs @@ -0,0 +1,2 @@ +mod data; +pub use data::*; diff --git a/packages/ciphernode/core/src/committee_meta.rs b/packages/ciphernode/core/src/e3/committee_meta.rs similarity index 75% rename from packages/ciphernode/core/src/committee_meta.rs rename to packages/ciphernode/core/src/e3/committee_meta.rs index 603c6baa..ef91d8c9 100644 --- a/packages/ciphernode/core/src/committee_meta.rs +++ b/packages/ciphernode/core/src/e3/committee_meta.rs @@ -1,4 +1,6 @@ -use crate::{ActorFactory, E3Requested, EnclaveEvent, Seed}; +use crate::enclave_core::{E3Requested, EnclaveEvent, Seed}; + +use super::e3_request::ActorFactory; #[derive(Clone, Debug, PartialEq, Eq)] pub struct CommitteeMeta { @@ -11,7 +13,7 @@ pub struct CommitteeMetaFactory; impl CommitteeMetaFactory { pub fn create() -> ActorFactory { Box::new(move |ctx, evt| { - let EnclaveEvent::E3Requested { data, .. }: crate::EnclaveEvent = evt else { + let EnclaveEvent::E3Requested { data, .. } = evt else { return; }; let E3Requested { diff --git a/packages/ciphernode/core/src/e3_request.rs b/packages/ciphernode/core/src/e3/e3_request.rs similarity index 93% rename from packages/ciphernode/core/src/e3_request.rs rename to packages/ciphernode/core/src/e3/e3_request.rs index 0df4c472..aa462862 100644 --- a/packages/ciphernode/core/src/e3_request.rs +++ b/packages/ciphernode/core/src/e3/e3_request.rs @@ -1,11 +1,9 @@ use std::{collections::HashMap, sync::Arc}; - use actix::{Actor, Addr, Context, Handler, Recipient}; +use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; + +use super::committee_meta::CommitteeMeta; -use crate::{ - Keyshare, CommitteeMeta, E3id, EnclaveEvent, EventBus, Fhe, PlaintextAggregator, - PublicKeyAggregator, Subscribe, -}; #[derive(Default)] // TODO: Set this up with a Typestate pattern diff --git a/packages/ciphernode/core/src/e3/mod.rs b/packages/ciphernode/core/src/e3/mod.rs new file mode 100644 index 00000000..8f696f7e --- /dev/null +++ b/packages/ciphernode/core/src/e3/mod.rs @@ -0,0 +1,4 @@ +mod e3_request; +mod committee_meta; +pub use e3_request::*; +pub use committee_meta::*; diff --git a/packages/ciphernode/core/src/eventbus.rs b/packages/ciphernode/core/src/enclave_core/eventbus.rs similarity index 98% rename from packages/ciphernode/core/src/eventbus.rs rename to packages/ciphernode/core/src/enclave_core/eventbus.rs index 6171fa07..6ee89ad5 100644 --- a/packages/ciphernode/core/src/eventbus.rs +++ b/packages/ciphernode/core/src/enclave_core/eventbus.rs @@ -1,7 +1,8 @@ -use crate::events::{EnclaveEvent, EventId}; use actix::prelude::*; use std::collections::{HashMap, HashSet}; +use super::events::{EnclaveEvent, EventId}; + #[derive(Message, Debug)] #[rtype(result = "()")] pub struct Subscribe { diff --git a/packages/ciphernode/core/src/events.rs b/packages/ciphernode/core/src/enclave_core/events.rs similarity index 99% rename from packages/ciphernode/core/src/events.rs rename to packages/ciphernode/core/src/enclave_core/events.rs index 6bb33b9d..d7aab3a2 100644 --- a/packages/ciphernode/core/src/events.rs +++ b/packages/ciphernode/core/src/enclave_core/events.rs @@ -430,8 +430,9 @@ impl EnclaveEvent { #[cfg(test)] mod tests { - use super::EnclaveEvent; - use crate::{events::extract_enclave_event_name, E3id, KeyshareCreated}; + use crate::enclave_core::events::extract_enclave_event_name; + + use super::{E3id, EnclaveEvent, KeyshareCreated}; use alloy_primitives::address; use fhe::{ bfv::{BfvParametersBuilder, SecretKey}, diff --git a/packages/ciphernode/core/src/enclave_core/mod.rs b/packages/ciphernode/core/src/enclave_core/mod.rs new file mode 100644 index 00000000..36cce7df --- /dev/null +++ b/packages/ciphernode/core/src/enclave_core/mod.rs @@ -0,0 +1,8 @@ +mod events; +mod eventbus; +mod ordered_set; + +pub use events::*; +pub use eventbus::*; +pub use ordered_set::*; + diff --git a/packages/ciphernode/core/src/ordered_set.rs b/packages/ciphernode/core/src/enclave_core/ordered_set.rs similarity index 100% rename from packages/ciphernode/core/src/ordered_set.rs rename to packages/ciphernode/core/src/enclave_core/ordered_set.rs diff --git a/packages/ciphernode/core/src/main_aggregator.rs b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs similarity index 86% rename from packages/ciphernode/core/src/main_aggregator.rs rename to packages/ciphernode/core/src/enclave_node/main_aggregator.rs index 743414f5..20ae75ac 100644 --- a/packages/ciphernode/core/src/main_aggregator.rs +++ b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs @@ -1,10 +1,3 @@ -use crate::{ - committee_meta::CommitteeMetaFactory, evm_ciphernode_registry::connect_evm_ciphernode_registry, - evm_enclave::connect_evm_enclave, public_key_writer::PublicKeyWriter, E3RequestManager, - EventBus, FheFactory, P2p, PlaintextAggregatorFactory, PlaintextWriter, - PublicKeyAggregatorFactory, SimpleLogger, Sortition, - evm_caller::connect_evm_caller, -}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; use rand::SeedableRng; @@ -12,6 +5,8 @@ use rand_chacha::rand_core::OsRng; use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; +use crate::{e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, plaintext_writer::PlaintextWriter, public_key_writer::PublicKeyWriter, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition}; + /// Main Ciphernode Actor /// Suprvises all children // TODO: add supervision logic diff --git a/packages/ciphernode/core/src/main_ciphernode.rs b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs similarity index 89% rename from packages/ciphernode/core/src/main_ciphernode.rs rename to packages/ciphernode/core/src/enclave_node/main_ciphernode.rs index ceb399c6..9cb018f4 100644 --- a/packages/ciphernode/core/src/main_ciphernode.rs +++ b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs @@ -1,16 +1,13 @@ use std::sync::{Arc, Mutex}; -use crate::{ - evm_ciphernode_registry::connect_evm_ciphernode_registry, - evm_enclave::connect_evm_enclave, CiphernodeSelector, CommitteeMetaFactory, Data, - E3RequestManager, EventBus, FheFactory, KeyshareFactory, P2p, SimpleLogger, Sortition, -}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; use tokio::task::JoinHandle; +use crate::{ciphernode_selector::CiphernodeSelector, data::Data, e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, sortition::Sortition}; + /// Main Ciphernode Actor /// Suprvises all children // TODO: add supervision logic diff --git a/packages/ciphernode/core/src/enclave_node/mod.rs b/packages/ciphernode/core/src/enclave_node/mod.rs new file mode 100644 index 00000000..947f59b0 --- /dev/null +++ b/packages/ciphernode/core/src/enclave_node/mod.rs @@ -0,0 +1,5 @@ +mod main_aggregator; +mod main_ciphernode; + +pub use main_ciphernode::*; +pub use main_aggregator::*; diff --git a/packages/ciphernode/core/src/evm_caller.rs b/packages/ciphernode/core/src/evm/caller.rs similarity index 95% rename from packages/ciphernode/core/src/evm_caller.rs rename to packages/ciphernode/core/src/evm/caller.rs index 1a3d7149..c19da82d 100644 --- a/packages/ciphernode/core/src/evm_caller.rs +++ b/packages/ciphernode/core/src/evm/caller.rs @@ -3,12 +3,12 @@ use alloy::primitives::{Address, Bytes, U256}; use std::collections::HashMap; use std::sync::Arc; -use crate::{ - events::EnclaveEvent, - evm_contracts::EVMContract, - sortition::{GetNodes, Sortition}, - EventBus, -}; +use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use crate::sortition::{GetNodes, Sortition}; + +use super::EVMContract; + + pub struct EvmCaller { contracts: HashMap>, bus: Addr, @@ -41,12 +41,12 @@ impl EvmCaller { ) -> Addr { let addr = Self::new(bus.clone(), sortition).start(); - bus.do_send(crate::Subscribe::new( + bus.do_send(Subscribe::new( "PublicKeyAggregated", addr.clone().recipient(), )); - bus.do_send(crate::Subscribe::new( + bus.do_send(Subscribe::new( "PlaintextAggregated", addr.clone().recipient(), )); @@ -150,4 +150,4 @@ pub async fn connect_evm_caller( }).await?; Ok(evm_caller) -} \ No newline at end of file +} diff --git a/packages/ciphernode/core/src/evm_ciphernode_registry.rs b/packages/ciphernode/core/src/evm/ciphernode_registry.rs similarity index 78% rename from packages/ciphernode/core/src/evm_ciphernode_registry.rs rename to packages/ciphernode/core/src/evm/ciphernode_registry.rs index b6f9f209..1187aaea 100644 --- a/packages/ciphernode/core/src/evm_ciphernode_registry.rs +++ b/packages/ciphernode/core/src/evm/ciphernode_registry.rs @@ -1,8 +1,7 @@ +use super::ContractEvent; use crate::{ - events, - evm_listener::{AddEventHandler, ContractEvent, StartListening}, - evm_manager::{AddListener, EvmContractManager}, - EnclaveEvent, EventBus, + enclave_core::{self, EnclaveEvent, EventBus}, + evm::{AddEventHandler, AddListener, EvmContractManager, StartListening}, }; use actix::Addr; use alloy::{primitives::Address, sol}; @@ -26,9 +25,9 @@ sol! { ); } -impl From for events::CiphernodeAdded { +impl From for enclave_core::CiphernodeAdded { fn from(value: CiphernodeAdded) -> Self { - events::CiphernodeAdded { + enclave_core::CiphernodeAdded { address: value.node.to_string(), // TODO: limit index and numNodes to uint32 at the solidity level index: value @@ -43,9 +42,9 @@ impl From for events::CiphernodeAdded { } } -impl From for events::CiphernodeRemoved { +impl From for enclave_core::CiphernodeRemoved { fn from(value: CiphernodeRemoved) -> Self { - events::CiphernodeRemoved { + enclave_core::CiphernodeRemoved { address: value.node.to_string(), index: value .index @@ -61,7 +60,7 @@ impl From for events::CiphernodeRemoved { impl ContractEvent for CiphernodeAdded { fn process(&self, bus: Addr) -> Result<()> { - let data: events::CiphernodeAdded = self.clone().into(); + let data: enclave_core::CiphernodeAdded = self.clone().into(); bus.do_send(EnclaveEvent::from(data)); Ok(()) } @@ -69,7 +68,7 @@ impl ContractEvent for CiphernodeAdded { impl ContractEvent for CiphernodeRemoved { fn process(&self, bus: Addr) -> Result<()> { - let data: events::CiphernodeRemoved = self.clone().into(); + let data: enclave_core::CiphernodeRemoved = self.clone().into(); bus.do_send(EnclaveEvent::from(data)); Ok(()) } @@ -81,9 +80,7 @@ pub async fn connect_evm_ciphernode_registry( contract_address: Address, ) -> Result<()> { let evm_manager = EvmContractManager::attach(bus.clone(), rpc_url).await; - let evm_listener = evm_manager - .send(AddListener { contract_address }) - .await?; + let evm_listener = evm_manager.send(AddListener { contract_address }).await?; evm_listener .send(AddEventHandler::::new()) diff --git a/packages/ciphernode/core/src/evm_contracts.rs b/packages/ciphernode/core/src/evm/contracts.rs similarity index 98% rename from packages/ciphernode/core/src/evm_contracts.rs rename to packages/ciphernode/core/src/evm/contracts.rs index d38ea758..557dac21 100644 --- a/packages/ciphernode/core/src/evm_contracts.rs +++ b/packages/ciphernode/core/src/evm/contracts.rs @@ -55,7 +55,7 @@ impl EVMContract { Ok(Self { provider: Arc::new(provider), - contract_address: contract_address, + contract_address, }) } @@ -82,4 +82,4 @@ impl EVMContract { let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } -} \ No newline at end of file +} diff --git a/packages/ciphernode/core/src/evm_enclave.rs b/packages/ciphernode/core/src/evm/enclave.rs similarity index 79% rename from packages/ciphernode/core/src/evm_enclave.rs rename to packages/ciphernode/core/src/evm/enclave.rs index 42e10d91..74c19444 100644 --- a/packages/ciphernode/core/src/evm_enclave.rs +++ b/packages/ciphernode/core/src/evm/enclave.rs @@ -1,16 +1,13 @@ -use crate::{ - events, - evm_listener::{AddEventHandler, ContractEvent, StartListening}, - evm_manager::{AddListener, EvmContractManager}, - EnclaveEvent, EventBus, -}; use actix::Addr; -use alloy::{ - primitives::{Address}, - sol, - sol_types::SolValue, +use alloy::{primitives::Address, sol}; +use anyhow::Result; + +use crate::{ + enclave_core::{self, EnclaveEvent, EventBus}, + evm::{AddEventHandler, AddListener, EvmContractManager, StartListening}, }; -use anyhow::{Context, Result}; + +use super::listener::ContractEvent; sol! { #[derive(Debug)] @@ -45,11 +42,11 @@ sol! { ); } -impl TryFrom<&E3Requested> for events::E3Requested { +impl TryFrom<&E3Requested> for enclave_core::E3Requested { type Error = anyhow::Error; fn try_from(value: &E3Requested) -> Result { let program_params = value.e3.e3ProgramParams.to_vec(); - Ok(events::E3Requested { + Ok(enclave_core::E3Requested { params: program_params.into(), threshold_m: value.e3.threshold[0] as usize, seed: value.e3.seed.into(), @@ -58,9 +55,9 @@ impl TryFrom<&E3Requested> for events::E3Requested { } } -impl From for events::CiphertextOutputPublished { +impl From for enclave_core::CiphertextOutputPublished { fn from(value: CiphertextOutputPublished) -> Self { - events::CiphertextOutputPublished { + enclave_core::CiphertextOutputPublished { e3_id: value.e3Id.to_string().into(), ciphertext_output: value.ciphertextOutput.to_vec(), } @@ -69,7 +66,7 @@ impl From for events::CiphertextOutputPublished { impl ContractEvent for E3Requested { fn process(&self, bus: Addr) -> Result<()> { - let data: events::E3Requested = self.try_into()?; + let data: enclave_core::E3Requested = self.try_into()?; bus.do_send(EnclaveEvent::from(data)); Ok(()) @@ -78,7 +75,7 @@ impl ContractEvent for E3Requested { impl ContractEvent for CiphertextOutputPublished { fn process(&self, bus: Addr) -> Result<()> { - let data: events::CiphertextOutputPublished = self.clone().into(); + let data: enclave_core::CiphertextOutputPublished = self.clone().into(); bus.do_send(EnclaveEvent::from(data)); Ok(()) } @@ -104,4 +101,3 @@ pub async fn connect_evm_enclave(bus: Addr, rpc_url: &str, contract_ad println!("Evm is listening to {}", contract_address); } - diff --git a/packages/ciphernode/core/src/evm_listener.rs b/packages/ciphernode/core/src/evm/listener.rs similarity index 97% rename from packages/ciphernode/core/src/evm_listener.rs rename to packages/ciphernode/core/src/evm/listener.rs index f12a09e7..4b0b0228 100644 --- a/packages/ciphernode/core/src/evm_listener.rs +++ b/packages/ciphernode/core/src/evm/listener.rs @@ -11,8 +11,7 @@ use futures_util::stream::StreamExt; use std::collections::HashMap; use std::marker::PhantomData; use std::sync::Arc; - -use crate::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; +use crate::enclave_core::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; pub trait ContractEvent: Send + Sync + 'static { fn process(&self, bus: Addr) -> Result<()>; diff --git a/packages/ciphernode/core/src/evm_manager.rs b/packages/ciphernode/core/src/evm/manager.rs similarity index 96% rename from packages/ciphernode/core/src/evm_manager.rs rename to packages/ciphernode/core/src/evm/manager.rs index e00d659a..7868ba7d 100644 --- a/packages/ciphernode/core/src/evm_manager.rs +++ b/packages/ciphernode/core/src/evm/manager.rs @@ -1,7 +1,3 @@ -use crate::{ - evm_listener::{EvmEventListener, StartListening}, - EventBus, -}; use actix::{Actor, Addr, Context, Handler, Message}; use alloy::{ primitives::Address, @@ -12,6 +8,10 @@ use alloy::{ use anyhow::Result; use std::sync::Arc; +use crate::enclave_core::EventBus; + +use super::{EvmEventListener, StartListening}; + pub struct EvmContractManager { bus: Addr, provider: Arc>, diff --git a/packages/ciphernode/core/src/evm/mod.rs b/packages/ciphernode/core/src/evm/mod.rs new file mode 100644 index 00000000..2a15ccdb --- /dev/null +++ b/packages/ciphernode/core/src/evm/mod.rs @@ -0,0 +1,14 @@ +mod caller; +mod ciphernode_registry; +mod contracts; +mod enclave; +mod listener; +mod manager; + +pub use caller::*; +pub use ciphernode_registry::*; +pub use contracts::*; +pub use enclave::*; +pub use listener::*; +pub use manager::*; + diff --git a/packages/ciphernode/core/src/fhe.rs b/packages/ciphernode/core/src/fhe/fhe.rs similarity index 97% rename from packages/ciphernode/core/src/fhe.rs rename to packages/ciphernode/core/src/fhe/fhe.rs index 2dee23d0..c210c94a 100644 --- a/packages/ciphernode/core/src/fhe.rs +++ b/packages/ciphernode/core/src/fhe/fhe.rs @@ -1,4 +1,3 @@ -use crate::{ordered_set::OrderedSet, set_up_crp, ActorFactory, E3Requested, EnclaveEvent, Seed}; use anyhow::*; use fhe::{ bfv::{ @@ -11,6 +10,10 @@ use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use std::sync::{Arc, Mutex}; +use crate::{e3::ActorFactory, enclave_core::{E3Requested, EnclaveEvent, OrderedSet, Seed}}; + +use super::set_up_crp; + pub struct GetAggregatePublicKey { pub keyshares: OrderedSet>, } diff --git a/packages/ciphernode/core/src/fhe/mod.rs b/packages/ciphernode/core/src/fhe/mod.rs new file mode 100644 index 00000000..ad7c0b8b --- /dev/null +++ b/packages/ciphernode/core/src/fhe/mod.rs @@ -0,0 +1,6 @@ +mod fhe; +mod utils; + +pub use fhe::*; +pub use utils::*; + diff --git a/packages/ciphernode/core/src/utils.rs b/packages/ciphernode/core/src/fhe/utils.rs similarity index 98% rename from packages/ciphernode/core/src/utils.rs rename to packages/ciphernode/core/src/fhe/utils.rs index 73b37191..6f5fce9a 100644 --- a/packages/ciphernode/core/src/utils.rs +++ b/packages/ciphernode/core/src/fhe/utils.rs @@ -1,4 +1,3 @@ -use crate::SharedRng; use anyhow::{Context, Result}; use fhe::{ bfv::{BfvParameters, BfvParametersBuilder}, @@ -7,6 +6,8 @@ use fhe::{ use fhe_traits::{Deserialize, Serialize}; use std::{fs, io::Write, path::Path, sync::Arc}; +use super::SharedRng; + pub struct ParamsWithCrp { pub moduli: Vec, pub degree: usize, diff --git a/packages/ciphernode/core/src/keyshare.rs b/packages/ciphernode/core/src/keyshare/keyshare.rs similarity index 94% rename from packages/ciphernode/core/src/keyshare.rs rename to packages/ciphernode/core/src/keyshare/keyshare.rs index 5d87bfc1..a16aca1b 100644 --- a/packages/ciphernode/core/src/keyshare.rs +++ b/packages/ciphernode/core/src/keyshare/keyshare.rs @@ -1,11 +1,10 @@ use std::sync::Arc; -use crate::{ - data::{Data, Insert}, eventbus::EventBus, events::{EnclaveEvent, KeyshareCreated}, fhe::Fhe, ActorFactory, CiphernodeSelected, CiphertextOutputPublished, DecryptCiphertext, DecryptionshareCreated, EnclaveErrorType, FromError, Get -}; use actix::prelude::*; use anyhow::{anyhow, Context, Result}; +use crate::{data::{Data, Get, Insert}, e3::ActorFactory, enclave_core::{CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, EnclaveEvent, EventBus, FromError, KeyshareCreated}, fhe::{DecryptCiphertext, Fhe}}; + pub struct Keyshare { fhe: Arc, data: Addr, diff --git a/packages/ciphernode/core/src/keyshare/mod.rs b/packages/ciphernode/core/src/keyshare/mod.rs new file mode 100644 index 00000000..46e4b5c9 --- /dev/null +++ b/packages/ciphernode/core/src/keyshare/mod.rs @@ -0,0 +1,2 @@ +mod keyshare; +pub use keyshare::*; diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 89feb3d8..4798058b 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -2,67 +2,32 @@ #![crate_type = "lib"] // #![warn(missing_docs, unused_imports)] -mod cipernode_selector; -mod committee_meta; +mod ciphernode_selector; mod data; -mod e3_request; -mod eventbus; -pub mod events; -mod evm_ciphernode_registry; -mod evm_enclave; -mod evm_listener; -mod evm_manager; -mod evm_caller; -mod evm_contracts; +mod e3; +mod enclave_core; +mod enclave_node; +mod evm; mod fhe; mod keyshare; mod logger; -mod main_aggregator; -mod main_ciphernode; -mod ordered_set; mod p2p; mod plaintext_aggregator; mod plaintext_writer; mod public_key_writer; mod publickey_aggregator; mod sortition; -mod utils; - -// TODO: this is too permissive -pub use actix::prelude::*; -pub use cipernode_selector::*; -pub use committee_meta::*; -pub use data::*; -pub use e3_request::*; -pub use eventbus::*; -pub use events::*; -pub use fhe::*; -pub use keyshare::*; -pub use logger::*; -pub use main_aggregator::*; -pub use main_ciphernode::*; -pub use p2p::*; -pub use plaintext_aggregator::*; -pub use plaintext_writer::*; -pub use public_key_writer::*; -pub use publickey_aggregator::*; -pub use sortition::*; -pub use utils::*; + +pub use fhe::encode_bfv_params; +pub use fhe::setup_bfv_params; +pub use enclave_node::MainAggregator; +pub use enclave_node::MainCiphernode; // TODO: move these out to a test folder #[cfg(test)] mod tests { use crate::{ - cipernode_selector::CiphernodeSelector, - data::Data, - eventbus::{EventBus, GetHistory}, - events::{E3Requested, E3id, EnclaveEvent, KeyshareCreated, PublicKeyAggregated}, - p2p::P2p, - utils::{setup_crp_params, ParamsWithCrp}, - CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, CommitteeMetaFactory, - DecryptionshareCreated, E3RequestManager, FheFactory, KeyshareFactory, PlaintextAggregated, - PlaintextAggregatorFactory, PublicKeyAggregatorFactory, ResetHistory, Seed, SharedRng, - SimpleLogger, Sortition, + ciphernode_selector::CiphernodeSelector, data::Data, e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::{CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed}, fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition }; use actix::prelude::*; use alloy::primitives::Address; diff --git a/packages/ciphernode/core/src/logger.rs b/packages/ciphernode/core/src/logger/logger.rs similarity index 96% rename from packages/ciphernode/core/src/logger.rs rename to packages/ciphernode/core/src/logger/logger.rs index c2e736a6..87e4cf0f 100644 --- a/packages/ciphernode/core/src/logger.rs +++ b/packages/ciphernode/core/src/logger/logger.rs @@ -1,7 +1,8 @@ -use crate::{EnclaveEvent, EventBus, Subscribe}; use actix::{Actor, Addr, Context, Handler}; use base64::prelude::*; +use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; + pub struct SimpleLogger { name: String, } diff --git a/packages/ciphernode/core/src/logger/mod.rs b/packages/ciphernode/core/src/logger/mod.rs new file mode 100644 index 00000000..8a86b49f --- /dev/null +++ b/packages/ciphernode/core/src/logger/mod.rs @@ -0,0 +1,2 @@ +mod logger; +pub use logger::*; diff --git a/packages/ciphernode/core/src/p2p/mod.rs b/packages/ciphernode/core/src/p2p/mod.rs new file mode 100644 index 00000000..3cfc9ff8 --- /dev/null +++ b/packages/ciphernode/core/src/p2p/mod.rs @@ -0,0 +1,2 @@ +mod p2p; +pub use p2p::*; diff --git a/packages/ciphernode/core/src/p2p.rs b/packages/ciphernode/core/src/p2p/p2p.rs similarity index 97% rename from packages/ciphernode/core/src/p2p.rs rename to packages/ciphernode/core/src/p2p/p2p.rs index 7c8cb9a8..50d63b54 100644 --- a/packages/ciphernode/core/src/p2p.rs +++ b/packages/ciphernode/core/src/p2p/p2p.rs @@ -6,10 +6,8 @@ use actix::prelude::*; use p2p::EnclaveRouter; use tokio::sync::mpsc::{Receiver, Sender}; -use crate::{ - eventbus::{EventBus, Subscribe}, - events::{EnclaveEvent, EventId}, -}; +use crate::enclave_core::{EnclaveEvent, EventBus, EventId, Subscribe}; + pub struct P2p { bus: Addr, diff --git a/packages/ciphernode/core/src/plaintext_aggregator/mod.rs b/packages/ciphernode/core/src/plaintext_aggregator/mod.rs new file mode 100644 index 00000000..dfd7414c --- /dev/null +++ b/packages/ciphernode/core/src/plaintext_aggregator/mod.rs @@ -0,0 +1,2 @@ +mod plaintext_aggregator; +pub use plaintext_aggregator::*; diff --git a/packages/ciphernode/core/src/plaintext_aggregator.rs b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs similarity index 95% rename from packages/ciphernode/core/src/plaintext_aggregator.rs rename to packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs index 3d78fb0b..59f18530 100644 --- a/packages/ciphernode/core/src/plaintext_aggregator.rs +++ b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs @@ -1,10 +1,14 @@ -use std::sync::Arc; - use crate::{ - ordered_set::OrderedSet, ActorFactory, DecryptionshareCreated, E3id, EnclaveEvent, EventBus, Fhe, GetAggregatePlaintext, GetHasNode, PlaintextAggregated, Seed, Sortition + e3::ActorFactory, + enclave_core::{ + DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, + }, + fhe::{Fhe, GetAggregatePlaintext}, + sortition::{GetHasNode, Sortition}, }; use actix::prelude::*; use anyhow::Result; +use std::sync::Arc; #[derive(Debug, Clone)] pub enum PlaintextAggregatorState { @@ -172,7 +176,7 @@ impl Handler for PlaintextAggregator { fn handle(&mut self, msg: ComputeAggregate, _: &mut Self::Context) -> Self::Result { let decrypted_output = self.fhe.get_aggregate_plaintext(GetAggregatePlaintext { decryptions: msg.shares.clone(), - ciphertext_output: msg.ciphertext_output + ciphertext_output: msg.ciphertext_output, })?; // Update the local state diff --git a/packages/ciphernode/core/src/plaintext_writer/mod.rs b/packages/ciphernode/core/src/plaintext_writer/mod.rs new file mode 100644 index 00000000..fbf04d94 --- /dev/null +++ b/packages/ciphernode/core/src/plaintext_writer/mod.rs @@ -0,0 +1,2 @@ +mod plaintext_writer; +pub use plaintext_writer::*; diff --git a/packages/ciphernode/core/src/plaintext_writer.rs b/packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs similarity index 93% rename from packages/ciphernode/core/src/plaintext_writer.rs rename to packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs index 29ad330b..8793203f 100644 --- a/packages/ciphernode/core/src/plaintext_writer.rs +++ b/packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs @@ -1,6 +1,7 @@ -use crate::{write_file_with_dirs, EnclaveEvent, EventBus, Subscribe}; use actix::{Actor, Addr, Context, Handler}; +use crate::{enclave_core::{EnclaveEvent, EventBus, Subscribe}, fhe::write_file_with_dirs}; + pub struct PlaintextWriter { path: String, } diff --git a/packages/ciphernode/core/src/public_key_writer/mod.rs b/packages/ciphernode/core/src/public_key_writer/mod.rs new file mode 100644 index 00000000..a6163df2 --- /dev/null +++ b/packages/ciphernode/core/src/public_key_writer/mod.rs @@ -0,0 +1,2 @@ +mod public_key_writer; +pub use public_key_writer::*; diff --git a/packages/ciphernode/core/src/public_key_writer.rs b/packages/ciphernode/core/src/public_key_writer/public_key_writer.rs similarity index 89% rename from packages/ciphernode/core/src/public_key_writer.rs rename to packages/ciphernode/core/src/public_key_writer/public_key_writer.rs index 55a72541..cc79ba0f 100644 --- a/packages/ciphernode/core/src/public_key_writer.rs +++ b/packages/ciphernode/core/src/public_key_writer/public_key_writer.rs @@ -1,4 +1,7 @@ -use crate::{write_file_with_dirs, EnclaveEvent, EventBus, Subscribe}; +use crate::{ + enclave_core::{EnclaveEvent, EventBus, Subscribe}, + fhe::write_file_with_dirs, +}; use actix::{Actor, Addr, Context, Handler}; pub struct PublicKeyWriter { diff --git a/packages/ciphernode/core/src/publickey_aggregator/mod.rs b/packages/ciphernode/core/src/publickey_aggregator/mod.rs new file mode 100644 index 00000000..d05e1d69 --- /dev/null +++ b/packages/ciphernode/core/src/publickey_aggregator/mod.rs @@ -0,0 +1,2 @@ +mod publickey_aggregator; +pub use publickey_aggregator::*; diff --git a/packages/ciphernode/core/src/publickey_aggregator.rs b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs similarity index 97% rename from packages/ciphernode/core/src/publickey_aggregator.rs rename to packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs index ba17b34c..a8d42aad 100644 --- a/packages/ciphernode/core/src/publickey_aggregator.rs +++ b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs @@ -1,14 +1,14 @@ -use std::sync::Arc; - use crate::{ - eventbus::EventBus, - events::{E3id, EnclaveEvent, KeyshareCreated, PublicKeyAggregated}, + e3::ActorFactory, + enclave_core::{ + E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, + }, fhe::{Fhe, GetAggregatePublicKey}, - ordered_set::OrderedSet, - ActorFactory, GetHasNode, Seed, Sortition, + sortition::{GetHasNode, Sortition}, }; use actix::prelude::*; use anyhow::Result; +use std::sync::Arc; #[derive(Debug, Clone)] pub enum PublicKeyAggregatorState { diff --git a/packages/ciphernode/core/src/sortition/mod.rs b/packages/ciphernode/core/src/sortition/mod.rs new file mode 100644 index 00000000..e39cb001 --- /dev/null +++ b/packages/ciphernode/core/src/sortition/mod.rs @@ -0,0 +1,2 @@ +mod sortition; +pub use sortition::*; diff --git a/packages/ciphernode/core/src/sortition.rs b/packages/ciphernode/core/src/sortition/sortition.rs similarity index 96% rename from packages/ciphernode/core/src/sortition.rs rename to packages/ciphernode/core/src/sortition/sortition.rs index 2fbd6418..c3d1e4c9 100644 --- a/packages/ciphernode/core/src/sortition.rs +++ b/packages/ciphernode/core/src/sortition/sortition.rs @@ -3,7 +3,8 @@ use std::collections::HashSet; use actix::prelude::*; use sortition::DistanceSortition; -use crate::{CiphernodeAdded, CiphernodeRemoved, EnclaveEvent, EventBus, Seed, Subscribe}; +use crate::enclave_core::{CiphernodeAdded, CiphernodeRemoved, EnclaveEvent, EventBus, Seed, Subscribe}; + #[derive(Message, Clone, Debug, PartialEq, Eq)] #[rtype(result = "bool")] From bc6e1e08057de58459e8050605fbd522fb315af0 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 11:19:31 +1000 Subject: [PATCH 02/26] Enable test to run locally --- tests/basic_integration/test.sh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/basic_integration/test.sh b/tests/basic_integration/test.sh index 9b4c96c7..c832905f 100755 --- a/tests/basic_integration/test.sh +++ b/tests/basic_integration/test.sh @@ -12,19 +12,23 @@ if [[ "$ROOT_DIR" != "$(pwd)" ]]; then exit 1 fi + # Environment variables -export RPC_URL="ws://localhost:8545" +RPC_URL="ws://localhost:8545" + +PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + # These contracts are based on the deterministic order of hardhat deploy # We _may_ wish to get these off the hardhat environment somehow? -export ENCLAVE_CONTRACT="0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" -export REGISTRY_CONTRACT="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" -export REGISTRY_FILTER_CONTRACT="0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" -export INPUT_VALIDATOR_CONTRACT="0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" +ENCLAVE_CONTRACT="0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" +REGISTRY_CONTRACT="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +REGISTRY_FILTER_CONTRACT="0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +INPUT_VALIDATOR_CONTRACT="0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" # These are random addresses for now -export CIPHERNODE_ADDRESS_1="0x2546BcD3c84621e976D8185a91A922aE77ECEc30" -export CIPHERNODE_ADDRESS_2="0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" -export CIPHERNODE_ADDRESS_3="0xdD2FD4581271e230360230F9337D5c0430Bf44C0" -export CIPHERNODE_ADDRESS_4="0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199" +CIPHERNODE_ADDRESS_1="0x2546BcD3c84621e976D8185a91A922aE77ECEc30" +CIPHERNODE_ADDRESS_2="0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" +CIPHERNODE_ADDRESS_3="0xdD2FD4581271e230360230F9337D5c0430Bf44C0" +CIPHERNODE_ADDRESS_4="0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199" # Function to clean up background processes cleanup() { @@ -106,7 +110,7 @@ heading "Launch ciphernode $CIPHERNODE_ADDRESS_4" yarn ciphernode:launch --address $CIPHERNODE_ADDRESS_4 --rpc "$RPC_URL" --enclave-contract $ENCLAVE_CONTRACT --registry-contract $REGISTRY_CONTRACT & # NOTE: This node is configured to be an aggregator -yarn ciphernode:aggregator --rpc "$RPC_URL" --enclave-contract $ENCLAVE_CONTRACT --registry-contract $REGISTRY_CONTRACT --registry-filter-contract $REGISTRY_FILTER_CONTRACT --pubkey-write-path "$SCRIPT_DIR/output/pubkey.bin" --plaintext-write-path "$SCRIPT_DIR/output/plaintext.txt" & +PRIVATE_KEY=$PRIVATE_KEY yarn ciphernode:aggregator --rpc "$RPC_URL" --enclave-contract $ENCLAVE_CONTRACT --registry-contract $REGISTRY_CONTRACT --registry-filter-contract $REGISTRY_FILTER_CONTRACT --pubkey-write-path "$SCRIPT_DIR/output/pubkey.bin" --plaintext-write-path "$SCRIPT_DIR/output/plaintext.txt" & sleep 1 From 5aa584f8239e4c0aca10fd158ec8a7b6f011e5be Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 13:10:51 +1000 Subject: [PATCH 03/26] Add diagram of module interaction --- packages/ciphernode/README.md | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 packages/ciphernode/README.md diff --git a/packages/ciphernode/README.md b/packages/ciphernode/README.md new file mode 100644 index 00000000..1cceec28 --- /dev/null +++ b/packages/ciphernode/README.md @@ -0,0 +1,53 @@ +# E3 Requested + +```mermaid +sequenceDiagram + autonumber + participant EVM as EVM + participant CS as CiphernodeSelector + participant E3 as E3Factory + participant KS as Keyshare + participant PKA as PublicKeyAggregator + participant S as Sortition + + EVM--)CS: E3Requested + CS->>+S: has node? + S--)-CS: yes + CS--)E3: CiphernodeSelected + E3->>PKA: Create new PublicKeyAggreator for this e3_id + E3->>KS: Create new Keyshare for this e3_id + loop + KS--)PKA: KeyshareCreated + PKA->>+S: has node? + S--)-PKA: yes + end + PKA--)EVM: PublicKeyAggregated + PKA--)+KS: PublicKeyAggregated + PKA--)PKA: Stop + KS--)-KS: Stop +``` + +# Ciphertext output published + +```mermaid +sequenceDiagram + autonumber + participant EVM as EVM + participant E3 as E3Factory + participant KS as Keyshare + participant PTA as PlaintextAggregator + participant S as Sortition + + EVM--)E3: CiphertextOutputPublished + E3->>PTA: Create new PlaintextAggreator for this e3_id + loop + KS--)PTA: DecryptionShareCreated + PTA->>+S: has node? + S--)-PTA: yes + end + PTA--)EVM: PlaintextAggregated + PTA--)KS: PlaintextAggregated + PTA--)PTA: Stop + KS--)KS: Stop +``` + From 67fc95d7733cc7647e0e58380c19758e7748bec1 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 13:12:36 +1000 Subject: [PATCH 04/26] Public key aggregated does not stop keyshare --- packages/ciphernode/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ciphernode/README.md b/packages/ciphernode/README.md index 1cceec28..64115991 100644 --- a/packages/ciphernode/README.md +++ b/packages/ciphernode/README.md @@ -22,9 +22,7 @@ sequenceDiagram S--)-PKA: yes end PKA--)EVM: PublicKeyAggregated - PKA--)+KS: PublicKeyAggregated PKA--)PKA: Stop - KS--)-KS: Stop ``` # Ciphertext output published From 6b6d1450c440da1ff21ef851ed4dae78039f3e02 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 13:15:42 +1000 Subject: [PATCH 05/26] Rename E3RequestManager --- packages/ciphernode/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ciphernode/README.md b/packages/ciphernode/README.md index 64115991..1b47b91b 100644 --- a/packages/ciphernode/README.md +++ b/packages/ciphernode/README.md @@ -5,7 +5,7 @@ sequenceDiagram autonumber participant EVM as EVM participant CS as CiphernodeSelector - participant E3 as E3Factory + participant E3 as E3RequestManager participant KS as Keyshare participant PKA as PublicKeyAggregator participant S as Sortition @@ -31,7 +31,7 @@ sequenceDiagram sequenceDiagram autonumber participant EVM as EVM - participant E3 as E3Factory + participant E3 as E3RequestManager participant KS as Keyshare participant PTA as PlaintextAggregator participant S as Sortition From 43cfcc78f0aeeeabc69fa94d4f9cc9282930d76a Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 13:17:15 +1000 Subject: [PATCH 06/26] Close keyshare activity --- packages/ciphernode/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ciphernode/README.md b/packages/ciphernode/README.md index 1b47b91b..7e062a04 100644 --- a/packages/ciphernode/README.md +++ b/packages/ciphernode/README.md @@ -44,8 +44,8 @@ sequenceDiagram S--)-PTA: yes end PTA--)EVM: PlaintextAggregated - PTA--)KS: PlaintextAggregated + PTA--)+KS: PlaintextAggregated PTA--)PTA: Stop - KS--)KS: Stop + KS--)-KS: Stop ``` From 9a63a727b8b76909fbae1fe2f3ac39111bc05aba Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 13:54:57 +1000 Subject: [PATCH 07/26] Move ciphernode selector to e3 --- .../core/src/ciphernode_selector/mod.rs | 2 -- .../ciphernode_selector.rs | 0 packages/ciphernode/core/src/e3/e3_request.rs | 24 ++++++++++--------- packages/ciphernode/core/src/e3/mod.rs | 3 +++ .../core/src/enclave_node/main_ciphernode.rs | 2 +- packages/ciphernode/core/src/lib.rs | 3 +-- 6 files changed, 18 insertions(+), 16 deletions(-) delete mode 100644 packages/ciphernode/core/src/ciphernode_selector/mod.rs rename packages/ciphernode/core/src/{ciphernode_selector => e3}/ciphernode_selector.rs (100%) diff --git a/packages/ciphernode/core/src/ciphernode_selector/mod.rs b/packages/ciphernode/core/src/ciphernode_selector/mod.rs deleted file mode 100644 index 0b915474..00000000 --- a/packages/ciphernode/core/src/ciphernode_selector/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod ciphernode_selector; -pub use ciphernode_selector::*; diff --git a/packages/ciphernode/core/src/ciphernode_selector/ciphernode_selector.rs b/packages/ciphernode/core/src/e3/ciphernode_selector.rs similarity index 100% rename from packages/ciphernode/core/src/ciphernode_selector/ciphernode_selector.rs rename to packages/ciphernode/core/src/e3/ciphernode_selector.rs diff --git a/packages/ciphernode/core/src/e3/e3_request.rs b/packages/ciphernode/core/src/e3/e3_request.rs index aa462862..9cf33b8c 100644 --- a/packages/ciphernode/core/src/e3/e3_request.rs +++ b/packages/ciphernode/core/src/e3/e3_request.rs @@ -1,19 +1,11 @@ use std::{collections::HashMap, sync::Arc}; + use actix::{Actor, Addr, Context, Handler, Recipient}; -use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; -use super::committee_meta::CommitteeMeta; +use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; +use super::CommitteeMeta; -#[derive(Default)] -// TODO: Set this up with a Typestate pattern -pub struct E3RequestContext { - pub keyshare: Option>, - pub fhe: Option>, - pub plaintext: Option>, - pub publickey: Option>, - pub meta: Option, -} #[derive(Default)] struct EventBuffer { buffer: HashMap>, @@ -32,6 +24,16 @@ impl EventBuffer { } } +#[derive(Default)] +pub struct E3RequestContext { + pub keyshare: Option>, + pub fhe: Option>, + pub plaintext: Option>, + pub publickey: Option>, + pub meta: Option, +} + + impl E3RequestContext { fn recipients(&self) -> Vec<(String, Option>)> { vec![ diff --git a/packages/ciphernode/core/src/e3/mod.rs b/packages/ciphernode/core/src/e3/mod.rs index 8f696f7e..71cf3dcf 100644 --- a/packages/ciphernode/core/src/e3/mod.rs +++ b/packages/ciphernode/core/src/e3/mod.rs @@ -1,4 +1,7 @@ +mod ciphernode_selector; mod e3_request; mod committee_meta; + pub use e3_request::*; +pub use ciphernode_selector::*; pub use committee_meta::*; diff --git a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs index 9cb018f4..fe1aff6b 100644 --- a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs +++ b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs @@ -6,7 +6,7 @@ use rand::SeedableRng; use rand_chacha::rand_core::OsRng; use tokio::task::JoinHandle; -use crate::{ciphernode_selector::CiphernodeSelector, data::Data, e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, sortition::Sortition}; +use crate::{data::Data, e3::{CiphernodeSelector, CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, sortition::Sortition}; /// Main Ciphernode Actor /// Suprvises all children diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 4798058b..50f0fc58 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -2,7 +2,6 @@ #![crate_type = "lib"] // #![warn(missing_docs, unused_imports)] -mod ciphernode_selector; mod data; mod e3; mod enclave_core; @@ -27,7 +26,7 @@ pub use enclave_node::MainCiphernode; #[cfg(test)] mod tests { use crate::{ - ciphernode_selector::CiphernodeSelector, data::Data, e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::{CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed}, fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition + data::Data, e3::{CommitteeMetaFactory, CiphernodeSelector, E3RequestManager}, enclave_core::{CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed}, fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition }; use actix::prelude::*; use alloy::primitives::Address; From 2cc9345aacce94e03a83219274d2c820bb4c195e Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 14:08:05 +1000 Subject: [PATCH 08/26] Remove helper modules --- .../core/src/enclave_node/main_aggregator.rs | 24 ++++++++++++++++--- .../core/src/enclave_node/main_ciphernode.rs | 16 +++++++++---- packages/ciphernode/core/src/fhe/utils.rs | 19 --------------- packages/ciphernode/core/src/lib.rs | 1 + .../core/src/plaintext_writer/mod.rs | 2 -- .../core/src/public_key_writer/mod.rs | 2 -- packages/ciphernode/core/src/utils/mod.rs | 7 ++++++ .../plaintext_writer.rs | 7 +++--- .../public_key_writer.rs | 6 ++--- packages/ciphernode/core/src/utils/utils.rs | 21 ++++++++++++++++ 10 files changed, 67 insertions(+), 38 deletions(-) delete mode 100644 packages/ciphernode/core/src/plaintext_writer/mod.rs delete mode 100644 packages/ciphernode/core/src/public_key_writer/mod.rs create mode 100644 packages/ciphernode/core/src/utils/mod.rs rename packages/ciphernode/core/src/{plaintext_writer => utils}/plaintext_writer.rs (89%) rename packages/ciphernode/core/src/{public_key_writer => utils}/public_key_writer.rs (89%) create mode 100644 packages/ciphernode/core/src/utils/utils.rs diff --git a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs index 20ae75ac..d824f91e 100644 --- a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs +++ b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs @@ -1,3 +1,16 @@ +use crate::{ + e3::{CommitteeMetaFactory, E3RequestManager}, + enclave_core::EventBus, + evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, + fhe::FheFactory, + logger::SimpleLogger, + p2p::P2p, + plaintext_aggregator::PlaintextAggregatorFactory, + publickey_aggregator::PublicKeyAggregatorFactory, + sortition::Sortition, + utils::PlaintextWriter, + utils::PublicKeyWriter, +}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; use rand::SeedableRng; @@ -5,8 +18,6 @@ use rand_chacha::rand_core::OsRng; use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; -use crate::{e3::{CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, plaintext_writer::PlaintextWriter, public_key_writer::PublicKeyWriter, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition}; - /// Main Ciphernode Actor /// Suprvises all children // TODO: add supervision logic @@ -49,7 +60,14 @@ impl MainAggregator { connect_evm_enclave(bus.clone(), rpc_url, enclave_contract).await; let _ = connect_evm_ciphernode_registry(bus.clone(), rpc_url, registry_contract).await; - let _ = connect_evm_caller(bus.clone(), sortition.clone(), rpc_url, enclave_contract, registry_filter_contract).await; + let _ = connect_evm_caller( + bus.clone(), + sortition.clone(), + rpc_url, + enclave_contract, + registry_filter_contract, + ) + .await; let e3_manager = E3RequestManager::builder(bus.clone()) .add_hook(CommitteeMetaFactory::create()) diff --git a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs index fe1aff6b..5ac464e4 100644 --- a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs +++ b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs @@ -1,13 +1,21 @@ -use std::sync::{Arc, Mutex}; - +use crate::{ + data::Data, + e3::{CiphernodeSelector, CommitteeMetaFactory, E3RequestManager}, + enclave_core::EventBus, + evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, + fhe::FheFactory, + keyshare::KeyshareFactory, + logger::SimpleLogger, + p2p::P2p, + sortition::Sortition, +}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; +use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; -use crate::{data::Data, e3::{CiphernodeSelector, CommitteeMetaFactory, E3RequestManager}, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, sortition::Sortition}; - /// Main Ciphernode Actor /// Suprvises all children // TODO: add supervision logic diff --git a/packages/ciphernode/core/src/fhe/utils.rs b/packages/ciphernode/core/src/fhe/utils.rs index 6f5fce9a..4f32e989 100644 --- a/packages/ciphernode/core/src/fhe/utils.rs +++ b/packages/ciphernode/core/src/fhe/utils.rs @@ -60,23 +60,4 @@ pub fn set_up_crp(params: Arc, rng: SharedRng) -> CommonRandomPol CommonRandomPoly::new(¶ms, &mut *rng.lock().unwrap()).unwrap() } -pub fn write_file_with_dirs(path: &str, content: &[u8]) -> std::io::Result<()> { - let abs_path = if Path::new(path).is_absolute() { - Path::new(path).to_path_buf() - } else { - let cwd = std::env::current_dir()?; - cwd.join(path) - }; - // Ensure the directory structure exists - if let Some(parent) = abs_path.parent() { - fs::create_dir_all(parent)?; - } - - // Open the file (creates it if it doesn't exist) and write the content - let mut file = fs::File::create(&abs_path)?; - file.write_all(content)?; - - println!("File written successfully: {:?}", abs_path); - Ok(()) -} diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 50f0fc58..a3a79174 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -16,6 +16,7 @@ mod plaintext_writer; mod public_key_writer; mod publickey_aggregator; mod sortition; +mod utils; pub use fhe::encode_bfv_params; pub use fhe::setup_bfv_params; diff --git a/packages/ciphernode/core/src/plaintext_writer/mod.rs b/packages/ciphernode/core/src/plaintext_writer/mod.rs deleted file mode 100644 index fbf04d94..00000000 --- a/packages/ciphernode/core/src/plaintext_writer/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod plaintext_writer; -pub use plaintext_writer::*; diff --git a/packages/ciphernode/core/src/public_key_writer/mod.rs b/packages/ciphernode/core/src/public_key_writer/mod.rs deleted file mode 100644 index a6163df2..00000000 --- a/packages/ciphernode/core/src/public_key_writer/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod public_key_writer; -pub use public_key_writer::*; diff --git a/packages/ciphernode/core/src/utils/mod.rs b/packages/ciphernode/core/src/utils/mod.rs new file mode 100644 index 00000000..fe3792c5 --- /dev/null +++ b/packages/ciphernode/core/src/utils/mod.rs @@ -0,0 +1,7 @@ +mod plaintext_writer; +mod public_key_writer; +mod utils; + +pub use plaintext_writer::*; +pub use public_key_writer::*; +pub use utils::*; diff --git a/packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs b/packages/ciphernode/core/src/utils/plaintext_writer.rs similarity index 89% rename from packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs rename to packages/ciphernode/core/src/utils/plaintext_writer.rs index 8793203f..7e18fd17 100644 --- a/packages/ciphernode/core/src/plaintext_writer/plaintext_writer.rs +++ b/packages/ciphernode/core/src/utils/plaintext_writer.rs @@ -1,6 +1,6 @@ use actix::{Actor, Addr, Context, Handler}; - -use crate::{enclave_core::{EnclaveEvent, EventBus, Subscribe}, fhe::write_file_with_dirs}; +use super::write_file_with_dirs; +use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; pub struct PlaintextWriter { path: String, @@ -35,8 +35,7 @@ impl Handler for PlaintextWriter { // NOTE: panicking is kind of what we want here for now as we don't really need to handle the // error yet not knowing if this feature will be in production - write_file_with_dirs(&self.path, format!("{}", contents.join(",")).as_bytes()) - .unwrap(); + write_file_with_dirs(&self.path, format!("{}", contents.join(",")).as_bytes()).unwrap(); } } } diff --git a/packages/ciphernode/core/src/public_key_writer/public_key_writer.rs b/packages/ciphernode/core/src/utils/public_key_writer.rs similarity index 89% rename from packages/ciphernode/core/src/public_key_writer/public_key_writer.rs rename to packages/ciphernode/core/src/utils/public_key_writer.rs index cc79ba0f..997abe78 100644 --- a/packages/ciphernode/core/src/public_key_writer/public_key_writer.rs +++ b/packages/ciphernode/core/src/utils/public_key_writer.rs @@ -1,7 +1,5 @@ -use crate::{ - enclave_core::{EnclaveEvent, EventBus, Subscribe}, - fhe::write_file_with_dirs, -}; +use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use super::write_file_with_dirs; use actix::{Actor, Addr, Context, Handler}; pub struct PublicKeyWriter { diff --git a/packages/ciphernode/core/src/utils/utils.rs b/packages/ciphernode/core/src/utils/utils.rs new file mode 100644 index 00000000..a4cf269a --- /dev/null +++ b/packages/ciphernode/core/src/utils/utils.rs @@ -0,0 +1,21 @@ +use std::{fs,io::Write, path::Path}; +pub fn write_file_with_dirs(path: &str, content: &[u8]) -> std::io::Result<()> { + let abs_path = if Path::new(path).is_absolute() { + Path::new(path).to_path_buf() + } else { + let cwd = std::env::current_dir()?; + cwd.join(path) + }; + + // Ensure the directory structure exists + if let Some(parent) = abs_path.parent() { + fs::create_dir_all(parent)?; + } + + // Open the file (creates it if it doesn't exist) and write the content + let mut file = fs::File::create(&abs_path)?; + file.write_all(content)?; + + println!("File written successfully: {:?}", abs_path); + Ok(()) +} From 29c894263b33570ea249eb203fdc736f06eb2c26 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 14:16:50 +1000 Subject: [PATCH 09/26] Rename ActorFactory -> EventHook --- .../ciphernode/core/src/e3/committee_meta.rs | 4 ++-- packages/ciphernode/core/src/e3/e3_request.rs | 20 +++++++++---------- packages/ciphernode/core/src/fhe/fhe.rs | 4 ++-- .../ciphernode/core/src/keyshare/keyshare.rs | 16 ++++++++++----- .../plaintext_aggregator.rs | 4 ++-- .../publickey_aggregator.rs | 4 ++-- 6 files changed, 29 insertions(+), 23 deletions(-) diff --git a/packages/ciphernode/core/src/e3/committee_meta.rs b/packages/ciphernode/core/src/e3/committee_meta.rs index ef91d8c9..0310c22b 100644 --- a/packages/ciphernode/core/src/e3/committee_meta.rs +++ b/packages/ciphernode/core/src/e3/committee_meta.rs @@ -1,6 +1,6 @@ use crate::enclave_core::{E3Requested, EnclaveEvent, Seed}; -use super::e3_request::ActorFactory; +use super::e3_request::EventHook; #[derive(Clone, Debug, PartialEq, Eq)] pub struct CommitteeMeta { @@ -11,7 +11,7 @@ pub struct CommitteeMeta { pub struct CommitteeMetaFactory; impl CommitteeMetaFactory { - pub fn create() -> ActorFactory { + pub fn create() -> EventHook { Box::new(move |ctx, evt| { let EnclaveEvent::E3Requested { data, .. } = evt else { return; diff --git a/packages/ciphernode/core/src/e3/e3_request.rs b/packages/ciphernode/core/src/e3/e3_request.rs index 9cf33b8c..88c24620 100644 --- a/packages/ciphernode/core/src/e3/e3_request.rs +++ b/packages/ciphernode/core/src/e3/e3_request.rs @@ -66,13 +66,13 @@ impl E3RequestContext { } } -pub type ActorFactory = Box; +pub type EventHook = Box; -// TODO: setup typestate pattern so that we have to place factories within correct order of +// TODO: setup typestate pattern so that we have to place hooks within correct order of // dependencies pub struct E3RequestManager { contexts: HashMap, - factories: Vec, + hooks: Vec, buffer: EventBuffer, } @@ -80,25 +80,25 @@ impl E3RequestManager { pub fn builder(bus: Addr) -> E3RequestManagerBuilder { E3RequestManagerBuilder { bus, - factories: vec![], + hooks: vec![], } } } pub struct E3RequestManagerBuilder { pub bus: Addr, - pub factories: Vec, + pub hooks: Vec, } impl E3RequestManagerBuilder { - pub fn add_hook(mut self, listener: ActorFactory) -> Self { - self.factories.push(listener); + pub fn add_hook(mut self, listener: EventHook) -> Self { + self.hooks.push(listener); self } pub fn build(self) -> Addr { let e3r = E3RequestManager { contexts: HashMap::new(), - factories: self.factories, + hooks: self.hooks, buffer: EventBuffer::default(), }; @@ -122,8 +122,8 @@ impl Handler for E3RequestManager { let context = self.contexts.entry(e3_id).or_default(); - for factory in &mut self.factories { - factory(context, msg.clone()); + for hook in &mut self.hooks { + hook(context, msg.clone()); } context.forward_message(&msg, &mut self.buffer); diff --git a/packages/ciphernode/core/src/fhe/fhe.rs b/packages/ciphernode/core/src/fhe/fhe.rs index c210c94a..2e3f3490 100644 --- a/packages/ciphernode/core/src/fhe/fhe.rs +++ b/packages/ciphernode/core/src/fhe/fhe.rs @@ -10,7 +10,7 @@ use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use std::sync::{Arc, Mutex}; -use crate::{e3::ActorFactory, enclave_core::{E3Requested, EnclaveEvent, OrderedSet, Seed}}; +use crate::{e3::EventHook, enclave_core::{E3Requested, EnclaveEvent, OrderedSet, Seed}}; use super::set_up_crp; @@ -128,7 +128,7 @@ impl Fhe { pub struct FheFactory; impl FheFactory { - pub fn create(rng: SharedRng) -> ActorFactory { + pub fn create(rng: SharedRng) -> EventHook { Box::new(move |ctx, evt| { // Saving the fhe on Committee Requested let EnclaveEvent::E3Requested { data, .. } = evt else { diff --git a/packages/ciphernode/core/src/keyshare/keyshare.rs b/packages/ciphernode/core/src/keyshare/keyshare.rs index a16aca1b..eb142bfb 100644 --- a/packages/ciphernode/core/src/keyshare/keyshare.rs +++ b/packages/ciphernode/core/src/keyshare/keyshare.rs @@ -1,9 +1,15 @@ -use std::sync::Arc; - +use crate::{ + data::{Data, Get, Insert}, + e3::EventHook, + enclave_core::{ + CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, + EnclaveEvent, EventBus, FromError, KeyshareCreated, + }, + fhe::{DecryptCiphertext, Fhe}, +}; use actix::prelude::*; use anyhow::{anyhow, Context, Result}; - -use crate::{data::{Data, Get, Insert}, e3::ActorFactory, enclave_core::{CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, EnclaveEvent, EventBus, FromError, KeyshareCreated}, fhe::{DecryptCiphertext, Fhe}}; +use std::sync::Arc; pub struct Keyshare { fhe: Arc, @@ -135,7 +141,7 @@ async fn on_decryption_requested( pub struct KeyshareFactory; impl KeyshareFactory { - pub fn create(bus: Addr, data: Addr, address: &str) -> ActorFactory { + pub fn create(bus: Addr, data: Addr, address: &str) -> EventHook { let address = address.to_string(); Box::new(move |ctx, evt| { // Save Ciphernode on CiphernodeSelected diff --git a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs index 59f18530..d8a17159 100644 --- a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs +++ b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs @@ -1,5 +1,5 @@ use crate::{ - e3::ActorFactory, + e3::EventHook, enclave_core::{ DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, }, @@ -196,7 +196,7 @@ impl Handler for PlaintextAggregator { pub struct PlaintextAggregatorFactory; impl PlaintextAggregatorFactory { - pub fn create(bus: Addr, sortition: Addr) -> ActorFactory { + pub fn create(bus: Addr, sortition: Addr) -> EventHook { Box::new(move |ctx, evt| { // Save plaintext aggregator let EnclaveEvent::CiphertextOutputPublished { data, .. } = evt else { diff --git a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs index a8d42aad..56ad3f87 100644 --- a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs +++ b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs @@ -1,5 +1,5 @@ use crate::{ - e3::ActorFactory, + e3::EventHook, enclave_core::{ E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, }, @@ -196,7 +196,7 @@ impl Handler for PublicKeyAggregator { pub struct PublicKeyAggregatorFactory; impl PublicKeyAggregatorFactory { - pub fn create(bus: Addr, sortition: Addr) -> ActorFactory { + pub fn create(bus: Addr, sortition: Addr) -> EventHook { Box::new(move |ctx, evt| { // Saving the publickey aggregator with deps on E3Requested let EnclaveEvent::E3Requested { data, .. } = evt else { From a5056274b832a4470069b0627699fed5db42bb66 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 16:44:42 +1000 Subject: [PATCH 10/26] Remove old mods --- packages/ciphernode/core/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index a3a79174..f5049b28 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -12,8 +12,6 @@ mod keyshare; mod logger; mod p2p; mod plaintext_aggregator; -mod plaintext_writer; -mod public_key_writer; mod publickey_aggregator; mod sortition; mod utils; From 7b8ed9c411c1531b6da716e228301c3bcaecf08e Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 17:27:31 +1000 Subject: [PATCH 11/26] Tidy up request router --- packages/ciphernode/README.md | 4 +- packages/ciphernode/core/src/e3/mod.rs | 7 -- .../ciphernode_selector.rs | 1 + .../{e3 => enclave_core}/committee_meta.rs | 3 +- .../e3_request_router.rs} | 68 ++++++++++--------- .../ciphernode/core/src/enclave_core/mod.rs | 6 ++ .../core/src/enclave_node/main_aggregator.rs | 9 ++- .../core/src/enclave_node/main_ciphernode.rs | 9 ++- packages/ciphernode/core/src/fhe/fhe.rs | 6 +- .../ciphernode/core/src/keyshare/keyshare.rs | 4 +- packages/ciphernode/core/src/lib.rs | 22 ++++-- .../plaintext_aggregator.rs | 4 +- .../publickey_aggregator.rs | 4 +- 13 files changed, 79 insertions(+), 68 deletions(-) delete mode 100644 packages/ciphernode/core/src/e3/mod.rs rename packages/ciphernode/core/src/{e3 => enclave_core}/ciphernode_selector.rs (96%) rename packages/ciphernode/core/src/{e3 => enclave_core}/committee_meta.rs (94%) rename packages/ciphernode/core/src/{e3/e3_request.rs => enclave_core/e3_request_router.rs} (81%) diff --git a/packages/ciphernode/README.md b/packages/ciphernode/README.md index 7e062a04..29e2007b 100644 --- a/packages/ciphernode/README.md +++ b/packages/ciphernode/README.md @@ -5,7 +5,7 @@ sequenceDiagram autonumber participant EVM as EVM participant CS as CiphernodeSelector - participant E3 as E3RequestManager + participant E3 as E3RequestRouter participant KS as Keyshare participant PKA as PublicKeyAggregator participant S as Sortition @@ -31,7 +31,7 @@ sequenceDiagram sequenceDiagram autonumber participant EVM as EVM - participant E3 as E3RequestManager + participant E3 as E3RequestRouter participant KS as Keyshare participant PTA as PlaintextAggregator participant S as Sortition diff --git a/packages/ciphernode/core/src/e3/mod.rs b/packages/ciphernode/core/src/e3/mod.rs deleted file mode 100644 index 71cf3dcf..00000000 --- a/packages/ciphernode/core/src/e3/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod ciphernode_selector; -mod e3_request; -mod committee_meta; - -pub use e3_request::*; -pub use ciphernode_selector::*; -pub use committee_meta::*; diff --git a/packages/ciphernode/core/src/e3/ciphernode_selector.rs b/packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs similarity index 96% rename from packages/ciphernode/core/src/e3/ciphernode_selector.rs rename to packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs index ffef8f57..b3a195d7 100644 --- a/packages/ciphernode/core/src/e3/ciphernode_selector.rs +++ b/packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs @@ -1,3 +1,4 @@ +/// CiphernodeSelector is an actor that determines if a ciphernode use actix::prelude::*; use crate::{enclave_core::{CiphernodeSelected, EnclaveEvent, EventBus, Subscribe}, sortition::{GetHasNode, Sortition}}; diff --git a/packages/ciphernode/core/src/e3/committee_meta.rs b/packages/ciphernode/core/src/enclave_core/committee_meta.rs similarity index 94% rename from packages/ciphernode/core/src/e3/committee_meta.rs rename to packages/ciphernode/core/src/enclave_core/committee_meta.rs index 0310c22b..b9332d75 100644 --- a/packages/ciphernode/core/src/e3/committee_meta.rs +++ b/packages/ciphernode/core/src/enclave_core/committee_meta.rs @@ -1,6 +1,7 @@ use crate::enclave_core::{E3Requested, EnclaveEvent, Seed}; -use super::e3_request::EventHook; +use super::EventHook; + #[derive(Clone, Debug, PartialEq, Eq)] pub struct CommitteeMeta { diff --git a/packages/ciphernode/core/src/e3/e3_request.rs b/packages/ciphernode/core/src/enclave_core/e3_request_router.rs similarity index 81% rename from packages/ciphernode/core/src/e3/e3_request.rs rename to packages/ciphernode/core/src/enclave_core/e3_request_router.rs index 88c24620..da53047c 100644 --- a/packages/ciphernode/core/src/e3/e3_request.rs +++ b/packages/ciphernode/core/src/enclave_core/e3_request_router.rs @@ -1,9 +1,7 @@ -use std::{collections::HashMap, sync::Arc}; +use std::{collections::HashMap, sync::Arc}; use actix::{Actor, Addr, Context, Handler, Recipient}; - use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; - use super::CommitteeMeta; #[derive(Default)] @@ -66,37 +64,64 @@ impl E3RequestContext { } } +/// Format of the hook that needs to be passed to E3RequestRouter pub type EventHook = Box; +/// E3RequestRouter will register hooks that receive an E3_id specific context. After hooks +/// have run e3_id specific messages are forwarded to all instances on the context. This enables +/// hooks to lazily register instances that have the correct dependencies available per e3_id +/// request // TODO: setup typestate pattern so that we have to place hooks within correct order of // dependencies -pub struct E3RequestManager { +pub struct E3RequestRouter { contexts: HashMap, hooks: Vec, buffer: EventBuffer, } -impl E3RequestManager { - pub fn builder(bus: Addr) -> E3RequestManagerBuilder { - E3RequestManagerBuilder { +impl E3RequestRouter { + pub fn builder(bus: Addr) -> E3RequestRouterBuilder { + E3RequestRouterBuilder { bus, hooks: vec![], } } } -pub struct E3RequestManagerBuilder { +impl Actor for E3RequestRouter { + type Context = Context; +} + +impl Handler for E3RequestRouter { + type Result = (); + fn handle(&mut self, msg: EnclaveEvent, _: &mut Self::Context) -> Self::Result { + let Some(e3_id) = msg.get_e3_id() else { + return; + }; + + let context = self.contexts.entry(e3_id).or_default(); + + for hook in &mut self.hooks { + hook(context, msg.clone()); + } + + context.forward_message(&msg, &mut self.buffer); + } +} + + +pub struct E3RequestRouterBuilder { pub bus: Addr, pub hooks: Vec, } -impl E3RequestManagerBuilder { +impl E3RequestRouterBuilder { pub fn add_hook(mut self, listener: EventHook) -> Self { self.hooks.push(listener); self } - pub fn build(self) -> Addr { - let e3r = E3RequestManager { + pub fn build(self) -> Addr { + let e3r = E3RequestRouter { contexts: HashMap::new(), hooks: self.hooks, buffer: EventBuffer::default(), @@ -108,24 +133,3 @@ impl E3RequestManagerBuilder { addr } } - -impl Actor for E3RequestManager { - type Context = Context; -} - -impl Handler for E3RequestManager { - type Result = (); - fn handle(&mut self, msg: EnclaveEvent, _: &mut Self::Context) -> Self::Result { - let Some(e3_id) = msg.get_e3_id() else { - return; - }; - - let context = self.contexts.entry(e3_id).or_default(); - - for hook in &mut self.hooks { - hook(context, msg.clone()); - } - - context.forward_message(&msg, &mut self.buffer); - } -} diff --git a/packages/ciphernode/core/src/enclave_core/mod.rs b/packages/ciphernode/core/src/enclave_core/mod.rs index 36cce7df..75af7e9c 100644 --- a/packages/ciphernode/core/src/enclave_core/mod.rs +++ b/packages/ciphernode/core/src/enclave_core/mod.rs @@ -1,8 +1,14 @@ mod events; mod eventbus; mod ordered_set; +mod e3_request_router; +mod committee_meta; +mod ciphernode_selector; pub use events::*; pub use eventbus::*; pub use ordered_set::*; +pub use e3_request_router::*; +pub use committee_meta::*; +pub use ciphernode_selector::*; diff --git a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs index d824f91e..09000631 100644 --- a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs +++ b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs @@ -1,6 +1,5 @@ use crate::{ - e3::{CommitteeMetaFactory, E3RequestManager}, - enclave_core::EventBus, + enclave_core::{EventBus,CommitteeMetaFactory, E3RequestRouter}, evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, logger::SimpleLogger, @@ -22,7 +21,7 @@ use tokio::task::JoinHandle; /// Suprvises all children // TODO: add supervision logic pub struct MainAggregator { - e3_manager: Addr, + e3_manager: Addr, bus: Addr, sortition: Addr, p2p: Addr, @@ -33,7 +32,7 @@ impl MainAggregator { bus: Addr, sortition: Addr, p2p: Addr, - e3_manager: Addr, + e3_manager: Addr, ) -> Self { Self { e3_manager, @@ -69,7 +68,7 @@ impl MainAggregator { ) .await; - let e3_manager = E3RequestManager::builder(bus.clone()) + let e3_manager = E3RequestRouter::builder(bus.clone()) .add_hook(CommitteeMetaFactory::create()) .add_hook(FheFactory::create(rng)) .add_hook(PublicKeyAggregatorFactory::create( diff --git a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs index 5ac464e4..235c322a 100644 --- a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs +++ b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs @@ -1,7 +1,6 @@ use crate::{ data::Data, - e3::{CiphernodeSelector, CommitteeMetaFactory, E3RequestManager}, - enclave_core::EventBus, + enclave_core::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, EventBus}, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, @@ -25,7 +24,7 @@ pub struct MainCiphernode { data: Addr, sortition: Addr, selector: Addr, - e3_manager: Addr, + e3_manager: Addr, p2p: Addr, } @@ -37,7 +36,7 @@ impl MainCiphernode { sortition: Addr, selector: Addr, p2p: Addr, - e3_manager: Addr, + e3_manager: Addr, ) -> Self { Self { addr, @@ -68,7 +67,7 @@ impl MainCiphernode { connect_evm_enclave(bus.clone(), rpc_url, enclave_contract).await; let _ = connect_evm_ciphernode_registry(bus.clone(), rpc_url, registry_contract).await; - let e3_manager = E3RequestManager::builder(bus.clone()) + let e3_manager = E3RequestRouter::builder(bus.clone()) .add_hook(CommitteeMetaFactory::create()) .add_hook(FheFactory::create(rng)) .add_hook(KeyshareFactory::create( diff --git a/packages/ciphernode/core/src/fhe/fhe.rs b/packages/ciphernode/core/src/fhe/fhe.rs index 2e3f3490..70958157 100644 --- a/packages/ciphernode/core/src/fhe/fhe.rs +++ b/packages/ciphernode/core/src/fhe/fhe.rs @@ -1,3 +1,5 @@ +use super::set_up_crp; +use crate::enclave_core::{E3Requested, EnclaveEvent, EventHook, OrderedSet, Seed}; use anyhow::*; use fhe::{ bfv::{ @@ -10,10 +12,6 @@ use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use std::sync::{Arc, Mutex}; -use crate::{e3::EventHook, enclave_core::{E3Requested, EnclaveEvent, OrderedSet, Seed}}; - -use super::set_up_crp; - pub struct GetAggregatePublicKey { pub keyshares: OrderedSet>, } diff --git a/packages/ciphernode/core/src/keyshare/keyshare.rs b/packages/ciphernode/core/src/keyshare/keyshare.rs index eb142bfb..32cd72cf 100644 --- a/packages/ciphernode/core/src/keyshare/keyshare.rs +++ b/packages/ciphernode/core/src/keyshare/keyshare.rs @@ -1,9 +1,7 @@ use crate::{ data::{Data, Get, Insert}, - e3::EventHook, enclave_core::{ - CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, - EnclaveEvent, EventBus, FromError, KeyshareCreated, + CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, EnclaveEvent, EventBus, EventHook, FromError, KeyshareCreated }, fhe::{DecryptCiphertext, Fhe}, }; diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index f5049b28..0cff96ec 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -3,7 +3,6 @@ // #![warn(missing_docs, unused_imports)] mod data; -mod e3; mod enclave_core; mod enclave_node; mod evm; @@ -16,16 +15,29 @@ mod publickey_aggregator; mod sortition; mod utils; -pub use fhe::encode_bfv_params; -pub use fhe::setup_bfv_params; pub use enclave_node::MainAggregator; pub use enclave_node::MainCiphernode; +pub use fhe::encode_bfv_params; +pub use fhe::setup_bfv_params; // TODO: move these out to a test folder #[cfg(test)] mod tests { use crate::{ - data::Data, e3::{CommitteeMetaFactory, CiphernodeSelector, E3RequestManager}, enclave_core::{CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed}, fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, sortition::Sortition + data::Data, + enclave_core::{ + CiphernodeAdded, CiphernodeSelected, CiphernodeSelector, CiphertextOutputPublished, + CommitteeMetaFactory, DecryptionshareCreated, E3RequestRouter, E3Requested, E3id, + EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, + PublicKeyAggregated, ResetHistory, Seed, + }, + fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, + keyshare::KeyshareFactory, + logger::SimpleLogger, + p2p::P2p, + plaintext_aggregator::PlaintextAggregatorFactory, + publickey_aggregator::PublicKeyAggregatorFactory, + sortition::Sortition, }; use actix::prelude::*; use alloy::primitives::Address; @@ -56,7 +68,7 @@ mod tests { let sortition = Sortition::attach(bus.clone()); CiphernodeSelector::attach(bus.clone(), sortition.clone(), addr); - E3RequestManager::builder(bus.clone()) + E3RequestRouter::builder(bus.clone()) .add_hook(CommitteeMetaFactory::create()) .add_hook(FheFactory::create(rng)) .add_hook(PublicKeyAggregatorFactory::create( diff --git a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs index d8a17159..c695a9d9 100644 --- a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs +++ b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs @@ -1,7 +1,7 @@ use crate::{ - e3::EventHook, enclave_core::{ - DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, + DecryptionshareCreated, E3id, EnclaveEvent, EventBus, EventHook, OrderedSet, + PlaintextAggregated, Seed, }, fhe::{Fhe, GetAggregatePlaintext}, sortition::{GetHasNode, Sortition}, diff --git a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs index 56ad3f87..5ea08f74 100644 --- a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs +++ b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs @@ -1,7 +1,7 @@ use crate::{ - e3::EventHook, enclave_core::{ - E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, + E3id, EnclaveEvent, EventBus, EventHook, KeyshareCreated, OrderedSet, PublicKeyAggregated, + Seed, }, fhe::{Fhe, GetAggregatePublicKey}, sortition::{GetHasNode, Sortition}, From 57e0777441f8f585f7fa8411312743311ebd4e4d Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 17:46:19 +1000 Subject: [PATCH 12/26] Extract router --- packages/ciphernode/core/src/enclave_core/mod.rs | 6 ------ .../ciphernode/core/src/enclave_node/main_aggregator.rs | 6 +++--- .../ciphernode/core/src/enclave_node/main_ciphernode.rs | 9 +-------- packages/ciphernode/core/src/fhe/fhe.rs | 2 +- packages/ciphernode/core/src/fhe/utils.rs | 4 +--- packages/ciphernode/core/src/keyshare/keyshare.rs | 4 +++- packages/ciphernode/core/src/lib.rs | 9 +++++---- .../src/plaintext_aggregator/plaintext_aggregator.rs | 4 ++-- .../src/publickey_aggregator/publickey_aggregator.rs | 4 ++-- .../src/{enclave_core => router}/ciphernode_selector.rs | 3 ++- .../core/src/{enclave_core => router}/committee_meta.rs | 0 .../src/{enclave_core => router}/e3_request_router.rs | 6 +++++- packages/ciphernode/core/src/router/mod.rs | 7 +++++++ 13 files changed, 32 insertions(+), 32 deletions(-) rename packages/ciphernode/core/src/{enclave_core => router}/ciphernode_selector.rs (95%) rename packages/ciphernode/core/src/{enclave_core => router}/committee_meta.rs (100%) rename packages/ciphernode/core/src/{enclave_core => router}/e3_request_router.rs (93%) create mode 100644 packages/ciphernode/core/src/router/mod.rs diff --git a/packages/ciphernode/core/src/enclave_core/mod.rs b/packages/ciphernode/core/src/enclave_core/mod.rs index 75af7e9c..36cce7df 100644 --- a/packages/ciphernode/core/src/enclave_core/mod.rs +++ b/packages/ciphernode/core/src/enclave_core/mod.rs @@ -1,14 +1,8 @@ mod events; mod eventbus; mod ordered_set; -mod e3_request_router; -mod committee_meta; -mod ciphernode_selector; pub use events::*; pub use eventbus::*; pub use ordered_set::*; -pub use e3_request_router::*; -pub use committee_meta::*; -pub use ciphernode_selector::*; diff --git a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs index 09000631..5e88d1c3 100644 --- a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs +++ b/packages/ciphernode/core/src/enclave_node/main_aggregator.rs @@ -1,14 +1,14 @@ use crate::{ - enclave_core::{EventBus,CommitteeMetaFactory, E3RequestRouter}, + enclave_core::EventBus, evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, logger::SimpleLogger, p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, + router::{CommitteeMetaFactory, E3RequestRouter}, sortition::Sortition, - utils::PlaintextWriter, - utils::PublicKeyWriter, + utils::{PlaintextWriter, PublicKeyWriter}, }; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; diff --git a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs index 235c322a..99832c69 100644 --- a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs +++ b/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs @@ -1,12 +1,5 @@ use crate::{ - data::Data, - enclave_core::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, EventBus}, - evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, - fhe::FheFactory, - keyshare::KeyshareFactory, - logger::SimpleLogger, - p2p::P2p, - sortition::Sortition, + data::Data, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, router::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter}, sortition::Sortition }; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; diff --git a/packages/ciphernode/core/src/fhe/fhe.rs b/packages/ciphernode/core/src/fhe/fhe.rs index 70958157..3431e100 100644 --- a/packages/ciphernode/core/src/fhe/fhe.rs +++ b/packages/ciphernode/core/src/fhe/fhe.rs @@ -1,5 +1,5 @@ use super::set_up_crp; -use crate::enclave_core::{E3Requested, EnclaveEvent, EventHook, OrderedSet, Seed}; +use crate::{enclave_core::{E3Requested, EnclaveEvent,OrderedSet, Seed}, router::EventHook}; use anyhow::*; use fhe::{ bfv::{ diff --git a/packages/ciphernode/core/src/fhe/utils.rs b/packages/ciphernode/core/src/fhe/utils.rs index 4f32e989..67ceee9e 100644 --- a/packages/ciphernode/core/src/fhe/utils.rs +++ b/packages/ciphernode/core/src/fhe/utils.rs @@ -4,7 +4,7 @@ use fhe::{ mbfv::CommonRandomPoly, }; use fhe_traits::{Deserialize, Serialize}; -use std::{fs, io::Write, path::Path, sync::Arc}; +use std::sync::Arc; use super::SharedRng; @@ -59,5 +59,3 @@ pub fn decode_params(bytes: &[u8]) -> Result> { pub fn set_up_crp(params: Arc, rng: SharedRng) -> CommonRandomPoly { CommonRandomPoly::new(¶ms, &mut *rng.lock().unwrap()).unwrap() } - - diff --git a/packages/ciphernode/core/src/keyshare/keyshare.rs b/packages/ciphernode/core/src/keyshare/keyshare.rs index 32cd72cf..df86c109 100644 --- a/packages/ciphernode/core/src/keyshare/keyshare.rs +++ b/packages/ciphernode/core/src/keyshare/keyshare.rs @@ -1,9 +1,11 @@ use crate::{ data::{Data, Get, Insert}, enclave_core::{ - CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, EnclaveEvent, EventBus, EventHook, FromError, KeyshareCreated + CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, + EnclaveEvent, EventBus, FromError, KeyshareCreated, }, fhe::{DecryptCiphertext, Fhe}, + router::EventHook, }; use actix::prelude::*; use anyhow::{anyhow, Context, Result}; diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 0cff96ec..d6a5eb9c 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -12,6 +12,7 @@ mod logger; mod p2p; mod plaintext_aggregator; mod publickey_aggregator; +mod router; mod sortition; mod utils; @@ -26,10 +27,9 @@ mod tests { use crate::{ data::Data, enclave_core::{ - CiphernodeAdded, CiphernodeSelected, CiphernodeSelector, CiphertextOutputPublished, - CommitteeMetaFactory, DecryptionshareCreated, E3RequestRouter, E3Requested, E3id, - EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, - PublicKeyAggregated, ResetHistory, Seed, + CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, + E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, + PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed, }, fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, keyshare::KeyshareFactory, @@ -37,6 +37,7 @@ mod tests { p2p::P2p, plaintext_aggregator::PlaintextAggregatorFactory, publickey_aggregator::PublicKeyAggregatorFactory, + router::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter}, sortition::Sortition, }; use actix::prelude::*; diff --git a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs index c695a9d9..8678c2ce 100644 --- a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs +++ b/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs @@ -1,9 +1,9 @@ use crate::{ enclave_core::{ - DecryptionshareCreated, E3id, EnclaveEvent, EventBus, EventHook, OrderedSet, - PlaintextAggregated, Seed, + DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, }, fhe::{Fhe, GetAggregatePlaintext}, + router::EventHook, sortition::{GetHasNode, Sortition}, }; use actix::prelude::*; diff --git a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs index 5ea08f74..d57b5342 100644 --- a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs +++ b/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs @@ -1,9 +1,9 @@ use crate::{ enclave_core::{ - E3id, EnclaveEvent, EventBus, EventHook, KeyshareCreated, OrderedSet, PublicKeyAggregated, - Seed, + E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, }, fhe::{Fhe, GetAggregatePublicKey}, + router::EventHook, sortition::{GetHasNode, Sortition}, }; use actix::prelude::*; diff --git a/packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs b/packages/ciphernode/core/src/router/ciphernode_selector.rs similarity index 95% rename from packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs rename to packages/ciphernode/core/src/router/ciphernode_selector.rs index b3a195d7..449dd3b1 100644 --- a/packages/ciphernode/core/src/enclave_core/ciphernode_selector.rs +++ b/packages/ciphernode/core/src/router/ciphernode_selector.rs @@ -1,4 +1,5 @@ -/// CiphernodeSelector is an actor that determines if a ciphernode +/// CiphernodeSelector is an actor that determines if a ciphernode is part of a committee and if so +/// forwards a CiphernodeSelected event to the event bus use actix::prelude::*; use crate::{enclave_core::{CiphernodeSelected, EnclaveEvent, EventBus, Subscribe}, sortition::{GetHasNode, Sortition}}; diff --git a/packages/ciphernode/core/src/enclave_core/committee_meta.rs b/packages/ciphernode/core/src/router/committee_meta.rs similarity index 100% rename from packages/ciphernode/core/src/enclave_core/committee_meta.rs rename to packages/ciphernode/core/src/router/committee_meta.rs diff --git a/packages/ciphernode/core/src/enclave_core/e3_request_router.rs b/packages/ciphernode/core/src/router/e3_request_router.rs similarity index 93% rename from packages/ciphernode/core/src/enclave_core/e3_request_router.rs rename to packages/ciphernode/core/src/router/e3_request_router.rs index da53047c..f824f6ca 100644 --- a/packages/ciphernode/core/src/enclave_core/e3_request_router.rs +++ b/packages/ciphernode/core/src/router/e3_request_router.rs @@ -4,6 +4,8 @@ use actix::{Actor, Addr, Context, Handler, Recipient}; use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; use super::CommitteeMeta; + +/// Helper class to buffer events for downstream instances incase events arrive in the wrong order #[derive(Default)] struct EventBuffer { buffer: HashMap>, @@ -22,6 +24,8 @@ impl EventBuffer { } } +/// Context that is set to each event hook. Hooks can use this context to gather dependencies if +/// they need to instantiate struct instances or actors. #[derive(Default)] pub struct E3RequestContext { pub keyshare: Option>, @@ -109,7 +113,7 @@ impl Handler for E3RequestRouter { } } - +/// Builder for E3RequestRouter pub struct E3RequestRouterBuilder { pub bus: Addr, pub hooks: Vec, diff --git a/packages/ciphernode/core/src/router/mod.rs b/packages/ciphernode/core/src/router/mod.rs new file mode 100644 index 00000000..fb17b234 --- /dev/null +++ b/packages/ciphernode/core/src/router/mod.rs @@ -0,0 +1,7 @@ +mod ciphernode_selector; +mod committee_meta; +mod e3_request_router; + +pub use ciphernode_selector::*; +pub use committee_meta::*; +pub use e3_request_router::*; From a11c1875b239730bbd5d81d5660951d1347f6094 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 22:39:41 +1000 Subject: [PATCH 13/26] Tests pass --- packages/ciphernode/Cargo.lock | 130 ++++-- packages/ciphernode/Cargo.toml | 2 +- packages/ciphernode/aggregator/Cargo.toml | 13 + packages/ciphernode/aggregator/src/lib.rs | 6 + .../src}/plaintext_aggregator.rs | 44 +- .../src}/publickey_aggregator.rs | 45 +-- packages/ciphernode/core/Cargo.toml | 2 - .../ciphernode/core/src/enclave_node/mod.rs | 5 - packages/ciphernode/core/src/lib.rs | 376 +----------------- packages/ciphernode/core/src/p2p/mod.rs | 2 - .../core/src/plaintext_aggregator/mod.rs | 2 - .../core/src/publickey_aggregator/mod.rs | 2 - packages/ciphernode/core/src/sortition/mod.rs | 2 - packages/ciphernode/data/Cargo.toml | 10 + .../{core/src/data => data/src}/data.rs | 0 .../{core/src/data/mod.rs => data/src/lib.rs} | 0 packages/ciphernode/enclave_node/Cargo.toml | 15 +- .../src/aggregator.rs} | 22 +- .../enclave_node/src/bin/aggregator.rs | 2 +- .../enclave_node/src/bin/fake_encrypt.rs | 4 +- .../ciphernode/enclave_node/src/bin/node.rs | 2 +- .../enclave_node/src/bin/pack_e3_params.rs | 2 +- .../src/ciphernode.rs} | 12 +- packages/ciphernode/enclave_node/src/lib.rs | 5 + .../ciphernode/enclave_node/tests/internal.rs | 346 ++++++++++++++++ packages/ciphernode/evm/Cargo.toml | 13 + .../{core/src/evm => evm/src}/caller.rs | 4 +- .../evm => evm/src}/ciphernode_registry.rs | 6 +- .../{core/src/evm => evm/src}/contracts.rs | 0 .../{core/src/evm => evm/src}/enclave.rs | 10 +- .../{core/src/evm/mod.rs => evm/src/lib.rs} | 0 .../{core/src/evm => evm/src}/listener.rs | 2 +- .../{core/src/evm => evm/src}/manager.rs | 3 +- packages/ciphernode/fhe/Cargo.toml | 16 + .../{core/src/fhe => fhe/src}/fhe.rs | 23 +- .../{core/src/fhe/mod.rs => fhe/src/lib.rs} | 0 .../{core/src/fhe => fhe/src}/utils.rs | 2 +- packages/ciphernode/keyshare/Cargo.toml | 11 + .../src/keyshare => keyshare/src}/keyshare.rs | 32 +- .../keyshare/mod.rs => keyshare/src/lib.rs} | 0 packages/ciphernode/logger/Cargo.toml | 9 + .../src/logger/mod.rs => logger/src/lib.rs} | 0 .../{core/src/logger => logger/src}/logger.rs | 2 +- packages/ciphernode/p2p/Cargo.toml | 9 +- packages/ciphernode/p2p/src/lib.rs | 179 +-------- packages/ciphernode/p2p/src/libp2p_router.rs | 176 ++++++++ .../{core/src/p2p => p2p/src}/p2p.rs | 4 +- packages/ciphernode/router/Cargo.toml | 13 + .../src}/ciphernode_selector.rs | 3 +- .../router => router/src}/committee_meta.rs | 2 +- .../src}/e3_request_router.rs | 17 +- packages/ciphernode/router/src/hooks.rs | 111 ++++++ .../src/router/mod.rs => router/src/lib.rs} | 3 + packages/ciphernode/sortition/Cargo.toml | 9 +- packages/ciphernode/sortition/src/lib.rs | 4 +- .../sortition => sortition/src}/sortition.rs | 5 +- packages/ciphernode/test_helpers/Cargo.toml | 10 + .../utils/mod.rs => test_helpers/src/lib.rs} | 0 .../src}/plaintext_writer.rs | 2 +- .../src}/public_key_writer.rs | 2 +- .../src/utils => test_helpers/src}/utils.rs | 0 61 files changed, 944 insertions(+), 789 deletions(-) create mode 100644 packages/ciphernode/aggregator/Cargo.toml create mode 100644 packages/ciphernode/aggregator/src/lib.rs rename packages/ciphernode/{core/src/plaintext_aggregator => aggregator/src}/plaintext_aggregator.rs (82%) rename packages/ciphernode/{core/src/publickey_aggregator => aggregator/src}/publickey_aggregator.rs (82%) delete mode 100644 packages/ciphernode/core/src/enclave_node/mod.rs delete mode 100644 packages/ciphernode/core/src/p2p/mod.rs delete mode 100644 packages/ciphernode/core/src/plaintext_aggregator/mod.rs delete mode 100644 packages/ciphernode/core/src/publickey_aggregator/mod.rs delete mode 100644 packages/ciphernode/core/src/sortition/mod.rs create mode 100644 packages/ciphernode/data/Cargo.toml rename packages/ciphernode/{core/src/data => data/src}/data.rs (100%) rename packages/ciphernode/{core/src/data/mod.rs => data/src/lib.rs} (100%) rename packages/ciphernode/{core/src/enclave_node/main_aggregator.rs => enclave_node/src/aggregator.rs} (86%) rename packages/ciphernode/{core/src/enclave_node/main_ciphernode.rs => enclave_node/src/ciphernode.rs} (90%) create mode 100644 packages/ciphernode/enclave_node/src/lib.rs create mode 100644 packages/ciphernode/enclave_node/tests/internal.rs create mode 100644 packages/ciphernode/evm/Cargo.toml rename packages/ciphernode/{core/src/evm => evm/src}/caller.rs (97%) rename packages/ciphernode/{core/src/evm => evm/src}/ciphernode_registry.rs (94%) rename packages/ciphernode/{core/src/evm => evm/src}/contracts.rs (100%) rename packages/ciphernode/{core/src/evm => evm/src}/enclave.rs (94%) rename packages/ciphernode/{core/src/evm/mod.rs => evm/src/lib.rs} (100%) rename packages/ciphernode/{core/src/evm => evm/src}/listener.rs (97%) rename packages/ciphernode/{core/src/evm => evm/src}/manager.rs (98%) create mode 100644 packages/ciphernode/fhe/Cargo.toml rename packages/ciphernode/{core/src/fhe => fhe/src}/fhe.rs (88%) rename packages/ciphernode/{core/src/fhe/mod.rs => fhe/src/lib.rs} (100%) rename packages/ciphernode/{core/src/fhe => fhe/src}/utils.rs (99%) create mode 100644 packages/ciphernode/keyshare/Cargo.toml rename packages/ciphernode/{core/src/keyshare => keyshare/src}/keyshare.rs (80%) rename packages/ciphernode/{core/src/keyshare/mod.rs => keyshare/src/lib.rs} (100%) create mode 100644 packages/ciphernode/logger/Cargo.toml rename packages/ciphernode/{core/src/logger/mod.rs => logger/src/lib.rs} (100%) rename packages/ciphernode/{core/src/logger => logger/src}/logger.rs (96%) create mode 100644 packages/ciphernode/p2p/src/libp2p_router.rs rename packages/ciphernode/{core/src/p2p => p2p/src}/p2p.rs (97%) create mode 100644 packages/ciphernode/router/Cargo.toml rename packages/ciphernode/{core/src/router => router/src}/ciphernode_selector.rs (94%) rename packages/ciphernode/{core/src/router => router/src}/committee_meta.rs (90%) rename packages/ciphernode/{core/src/router => router/src}/e3_request_router.rs (93%) create mode 100644 packages/ciphernode/router/src/hooks.rs rename packages/ciphernode/{core/src/router/mod.rs => router/src/lib.rs} (84%) rename packages/ciphernode/{core/src/sortition => sortition/src}/sortition.rs (95%) create mode 100644 packages/ciphernode/test_helpers/Cargo.toml rename packages/ciphernode/{core/src/utils/mod.rs => test_helpers/src/lib.rs} (100%) rename packages/ciphernode/{core/src/utils => test_helpers/src}/plaintext_writer.rs (95%) rename packages/ciphernode/{core/src/utils => test_helpers/src}/public_key_writer.rs (93%) rename packages/ciphernode/{core/src/utils => test_helpers/src}/utils.rs (100%) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 028fdc22..336ba2e0 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -109,6 +109,18 @@ dependencies = [ "subtle", ] +[[package]] +name = "aggregator" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "bincode", + "enclave-core", + "fhe 0.1.0", + "sortition", +] + [[package]] name = "ahash" version = "0.8.11" @@ -1369,7 +1381,7 @@ name = "bfv" version = "0.1.0" dependencies = [ "async-std", - "fhe", + "fhe 0.1.0-beta.7", "fhe-traits", "fhe-util", "rand", @@ -1778,6 +1790,13 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "data" +version = "0.1.0" +dependencies = [ + "actix", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -2007,7 +2026,7 @@ name = "enclave" version = "0.1.0" dependencies = [ "async-std", - "fhe", + "fhe 0.1.0-beta.7", "fhe-traits", "fhe-util", ] @@ -2027,18 +2046,16 @@ dependencies = [ "base91", "bincode", "bs58", - "fhe", + "fhe 0.1.0-beta.7", "fhe-traits", "fhe-util", "futures-util", "libp2p", - "p2p", "rand", "rand_chacha", "secp256k1", "serde", "sha2", - "sortition", "tokio", ] @@ -2046,23 +2063,33 @@ dependencies = [ name = "enclave_node" version = "0.1.0" dependencies = [ + "actix", "actix-rt", + "aggregator", "alloy", "alloy-primitives 0.6.4", + "anyhow", "async-std", "base64 0.22.1", "base91", "bfv", "bincode", "clap", + "data", "enclave-core", - "fhe", + "evm", + "fhe 0.1.0", + "fhe 0.1.0-beta.7", "fhe-traits", "fhe-util", + "keyshare", + "logger", "p2p", "rand", "rand_chacha", + "router", "sortition", + "test-helpers", "tokio", ] @@ -2139,13 +2166,16 @@ dependencies = [ ] [[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +name = "evm" +version = "0.1.0" dependencies = [ - "indenter", - "once_cell", + "actix", + "alloy", + "alloy-primitives 0.6.4", + "anyhow", + "enclave-core", + "futures-util", + "sortition", ] [[package]] @@ -2207,6 +2237,21 @@ dependencies = [ "zeroize_derive", ] +[[package]] +name = "fhe" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "enclave-core", + "fhe 0.1.0-beta.7", + "fhe-traits", + "fhe-util", + "rand", + "rand_chacha", + "serde", +] + [[package]] name = "fhe-math" version = "0.1.0-beta.7" @@ -2922,12 +2967,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "indexmap" version = "2.3.0" @@ -3072,6 +3111,17 @@ dependencies = [ "sha3-asm", ] +[[package]] +name = "keyshare" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "data", + "enclave-core", + "fhe 0.1.0", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -3696,6 +3746,15 @@ dependencies = [ "value-bag", ] +[[package]] +name = "logger" +version = "0.1.0" +dependencies = [ + "actix", + "base64 0.22.1", + "enclave-core", +] + [[package]] name = "lru" version = "0.12.4" @@ -4183,12 +4242,11 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" name = "p2p" version = "0.1.0" dependencies = [ + "actix", + "anyhow", "async-std", "async-trait", - "bfv", - "fhe", - "fhe-traits", - "fhe-util", + "enclave-core", "futures", "libp2p", "tokio", @@ -4935,6 +4993,19 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "router" +version = "0.1.0" +dependencies = [ + "actix", + "aggregator", + "data", + "enclave-core", + "fhe 0.1.0", + "keyshare", + "sortition", +] + [[package]] name = "rtnetlink" version = "0.10.1" @@ -5416,11 +5487,9 @@ dependencies = [ name = "sortition" version = "0.1.0" dependencies = [ + "actix", "alloy", - "alloy-primitives 0.6.4", - "alloy-sol-types 0.6.4", - "eyre", - "futures-util", + "enclave-core", "num", "rand", ] @@ -5599,6 +5668,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "test-helpers" +version = "0.1.0" +dependencies = [ + "actix", + "bincode", + "enclave-core", +] + [[package]] name = "thiserror" version = "1.0.63" diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 5a82643f..cfc59420 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["core", "enclave", "enclave_node", "p2p", "bfv"] +members = ["core", "enclave", "enclave_node", "p2p", "bfv", "data", "evm", "fhe", "router", "keyshare", "aggregator", "test_helpers", "logger"] diff --git a/packages/ciphernode/aggregator/Cargo.toml b/packages/ciphernode/aggregator/Cargo.toml new file mode 100644 index 00000000..e759d389 --- /dev/null +++ b/packages/ciphernode/aggregator/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aggregator" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix = "0.13.5" +anyhow = "1.0.86" +enclave-core = { path = "../core" } +fhe = { path = "../fhe" } +sortition = { path = "../sortition" } +bincode = "1.3.3" + diff --git a/packages/ciphernode/aggregator/src/lib.rs b/packages/ciphernode/aggregator/src/lib.rs new file mode 100644 index 00000000..f3637991 --- /dev/null +++ b/packages/ciphernode/aggregator/src/lib.rs @@ -0,0 +1,6 @@ +mod plaintext_aggregator; +mod publickey_aggregator; + +pub use plaintext_aggregator::*; +pub use publickey_aggregator::*; + diff --git a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs similarity index 82% rename from packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs rename to packages/ciphernode/aggregator/src/plaintext_aggregator.rs index 8678c2ce..013e6571 100644 --- a/packages/ciphernode/core/src/plaintext_aggregator/plaintext_aggregator.rs +++ b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs @@ -1,13 +1,10 @@ -use crate::{ - enclave_core::{ - DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, - }, - fhe::{Fhe, GetAggregatePlaintext}, - router::EventHook, - sortition::{GetHasNode, Sortition}, -}; use actix::prelude::*; use anyhow::Result; +use enclave_core::{ + DecryptionshareCreated, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, +}; +use fhe::{Fhe, GetAggregatePlaintext}; +use sortition::{GetHasNode, Sortition}; use std::sync::Arc; #[derive(Debug, Clone)] @@ -194,33 +191,4 @@ impl Handler for PlaintextAggregator { } } -pub struct PlaintextAggregatorFactory; -impl PlaintextAggregatorFactory { - pub fn create(bus: Addr, sortition: Addr) -> EventHook { - Box::new(move |ctx, evt| { - // Save plaintext aggregator - let EnclaveEvent::CiphertextOutputPublished { data, .. } = evt else { - return; - }; - let Some(ref fhe) = ctx.fhe else { - return; - }; - let Some(ref meta) = ctx.meta else { - return; - }; - - ctx.plaintext = Some( - PlaintextAggregator::new( - fhe.clone(), - bus.clone(), - sortition.clone(), - data.e3_id, - meta.threshold_m, - meta.seed, - data.ciphertext_output, - ) - .start(), - ); - }) - } -} + diff --git a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs b/packages/ciphernode/aggregator/src/publickey_aggregator.rs similarity index 82% rename from packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs rename to packages/ciphernode/aggregator/src/publickey_aggregator.rs index d57b5342..56bc1228 100644 --- a/packages/ciphernode/core/src/publickey_aggregator/publickey_aggregator.rs +++ b/packages/ciphernode/aggregator/src/publickey_aggregator.rs @@ -1,13 +1,10 @@ -use crate::{ - enclave_core::{ - E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, - }, - fhe::{Fhe, GetAggregatePublicKey}, - router::EventHook, - sortition::{GetHasNode, Sortition}, -}; use actix::prelude::*; use anyhow::Result; +use enclave_core::{ + E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, +}; +use fhe::{Fhe, GetAggregatePublicKey}; +use sortition::{GetHasNode, Sortition}; use std::sync::Arc; #[derive(Debug, Clone)] @@ -194,35 +191,3 @@ impl Handler for PublicKeyAggregator { } } -pub struct PublicKeyAggregatorFactory; -impl PublicKeyAggregatorFactory { - pub fn create(bus: Addr, sortition: Addr) -> EventHook { - Box::new(move |ctx, evt| { - // Saving the publickey aggregator with deps on E3Requested - let EnclaveEvent::E3Requested { data, .. } = evt else { - return; - }; - - let Some(ref fhe) = ctx.fhe else { - println!("fhe was not on ctx"); - return; - }; - let Some(ref meta) = ctx.meta else { - println!("meta was not on ctx"); - return; - }; - - ctx.publickey = Some( - PublicKeyAggregator::new( - fhe.clone(), - bus.clone(), - sortition.clone(), - data.e3_id, - meta.threshold_m, - meta.seed, - ) - .start(), - ); - }) - } -} diff --git a/packages/ciphernode/core/Cargo.toml b/packages/ciphernode/core/Cargo.toml index 8a8836f4..370f8b7a 100644 --- a/packages/ciphernode/core/Cargo.toml +++ b/packages/ciphernode/core/Cargo.toml @@ -9,8 +9,6 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -p2p = { path = "../p2p" } -sortition = { path = "../sortition" } async-std = "1.12.0" libp2p = "0.53.2" fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } diff --git a/packages/ciphernode/core/src/enclave_node/mod.rs b/packages/ciphernode/core/src/enclave_node/mod.rs deleted file mode 100644 index 947f59b0..00000000 --- a/packages/ciphernode/core/src/enclave_node/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod main_aggregator; -mod main_ciphernode; - -pub use main_ciphernode::*; -pub use main_aggregator::*; diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index d6a5eb9c..8cc813f3 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -1,378 +1,6 @@ #![crate_name = "enclave_core"] #![crate_type = "lib"] -// #![warn(missing_docs, unused_imports)] +#![warn(missing_docs, unused_imports)] -mod data; mod enclave_core; -mod enclave_node; -mod evm; -mod fhe; -mod keyshare; -mod logger; -mod p2p; -mod plaintext_aggregator; -mod publickey_aggregator; -mod router; -mod sortition; -mod utils; - -pub use enclave_node::MainAggregator; -pub use enclave_node::MainCiphernode; -pub use fhe::encode_bfv_params; -pub use fhe::setup_bfv_params; - -// TODO: move these out to a test folder -#[cfg(test)] -mod tests { - use crate::{ - data::Data, - enclave_core::{ - CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, - E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, - PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed, - }, - fhe::{setup_crp_params, FheFactory, ParamsWithCrp, SharedRng}, - keyshare::KeyshareFactory, - logger::SimpleLogger, - p2p::P2p, - plaintext_aggregator::PlaintextAggregatorFactory, - publickey_aggregator::PublicKeyAggregatorFactory, - router::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter}, - sortition::Sortition, - }; - use actix::prelude::*; - use alloy::primitives::Address; - use anyhow::*; - use fhe::{ - bfv::{BfvParameters, Encoding, Plaintext, PublicKey, SecretKey}, - mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, - }; - use fhe_traits::{FheEncoder, FheEncrypter, Serialize}; - use rand::Rng; - use rand::SeedableRng; - use rand_chacha::ChaCha20Rng; - use std::{sync::Arc, time::Duration}; - use tokio::sync::Mutex; - use tokio::{sync::mpsc::channel, time::sleep}; - - // Simulating a local node - async fn setup_local_ciphernode( - bus: Addr, - rng: SharedRng, - logging: bool, - addr: &str, - ) { - // create data actor for saving data - let data = Data::new(logging).start(); // TODO: Use a sled backed Data Actor - - // create ciphernode actor for managing ciphernode flow - let sortition = Sortition::attach(bus.clone()); - CiphernodeSelector::attach(bus.clone(), sortition.clone(), addr); - - E3RequestRouter::builder(bus.clone()) - .add_hook(CommitteeMetaFactory::create()) - .add_hook(FheFactory::create(rng)) - .add_hook(PublicKeyAggregatorFactory::create( - bus.clone(), - sortition.clone(), - )) - .add_hook(PlaintextAggregatorFactory::create( - bus.clone(), - sortition.clone(), - )) - .add_hook(KeyshareFactory::create(bus.clone(), data.clone(), addr)) - .build(); - - SimpleLogger::attach(addr, bus.clone()); - } - - fn generate_pk_share( - params: Arc, - crp: CommonRandomPoly, - rng: SharedRng, - ) -> Result<(PublicKeyShare, SecretKey)> { - let sk = SecretKey::random(¶ms, &mut *rng.lock().unwrap()); - let pk = PublicKeyShare::new(&sk, crp.clone(), &mut *rng.lock().unwrap())?; - Ok((pk, sk)) - } - - #[actix::test] - async fn test_public_key_aggregation_and_decryption() -> Result<()> { - // Setup EventBus - let bus = EventBus::new(true).start(); - let rng = Arc::new(std::sync::Mutex::new(ChaCha20Rng::seed_from_u64(42))); - let seed = Seed(ChaCha20Rng::seed_from_u64(123).get_seed()); - - let eth_addrs: Vec = (0..3) - .map(|_| Address::from_slice(&rand::thread_rng().gen::<[u8; 20]>()).to_string()) - .collect(); - - setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[0]).await; - setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[1]).await; - setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[2]).await; - - let e3_id = E3id::new("1234"); - - let ParamsWithCrp { - crp_bytes, params, .. - } = setup_crp_params( - &[0x3FFFFFFF000001], - 2048, - 1032193, - Arc::new(std::sync::Mutex::new(ChaCha20Rng::from_seed( - seed.clone().into(), - ))), - ); - - let regevt_1 = EnclaveEvent::from(CiphernodeAdded { - address: eth_addrs[0].clone(), - index: 0, - num_nodes: 1, - }); - - bus.send(regevt_1.clone()).await?; - - let regevt_2 = EnclaveEvent::from(CiphernodeAdded { - address: eth_addrs[1].clone(), - index: 1, - num_nodes: 2, - }); - - bus.send(regevt_2.clone()).await?; - - let regevt_3 = EnclaveEvent::from(CiphernodeAdded { - address: eth_addrs[2].clone(), - index: 2, - num_nodes: 3, - }); - - bus.send(regevt_3.clone()).await?; - - let event = EnclaveEvent::from(E3Requested { - e3_id: e3_id.clone(), - threshold_m: 3, - seed: seed.clone(), - params: params.to_bytes(), - }); - // Send the computation requested event - bus.send(event.clone()).await?; - - // Test that we cannot send the same event twice - bus.send(event).await?; - - let history = bus.send(GetHistory).await?; - - let rng_test = Arc::new(std::sync::Mutex::new(ChaCha20Rng::seed_from_u64(42))); - - let crpoly = CommonRandomPoly::deserialize(&crp_bytes.clone(), ¶ms)?; - - let (p1, sk1) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; - let (p2, sk2) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; - let (p3, sk3) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; - - let pubkey: PublicKey = vec![p1.clone(), p2.clone(), p3.clone()] - .into_iter() - .aggregate()?; - - assert_eq!(history.len(), 9); - assert_eq!( - history, - vec![ - regevt_1, - regevt_2, - regevt_3, - EnclaveEvent::from(E3Requested { - e3_id: e3_id.clone(), - threshold_m: 3, - seed: seed.clone(), - params: params.to_bytes() - }), - EnclaveEvent::from(CiphernodeSelected { - e3_id: e3_id.clone(), - threshold_m: 3, - }), - EnclaveEvent::from(KeyshareCreated { - pubkey: p1.to_bytes(), - e3_id: e3_id.clone(), - node: eth_addrs[0].clone() - }), - EnclaveEvent::from(KeyshareCreated { - pubkey: p2.to_bytes(), - e3_id: e3_id.clone(), - node: eth_addrs[1].clone() - }), - EnclaveEvent::from(KeyshareCreated { - pubkey: p3.to_bytes(), - e3_id: e3_id.clone(), - node: eth_addrs[2].clone() - }), - EnclaveEvent::from(PublicKeyAggregated { - pubkey: pubkey.to_bytes(), - e3_id: e3_id.clone() - }) - ] - ); - - // Aggregate decryption - bus.send(ResetHistory).await?; - fn pad_end(input: &[u64], pad: u64, total: usize) -> Vec { - let len = input.len(); - let mut cop = input.to_vec(); - cop.extend(std::iter::repeat(pad).take(total - len)); - cop - } - // TODO: - // Making these values large (especially the yes value) requires changing - // the params we use here - as we tune the FHE we need to take care - let yes = 1234u64; - let no = 873827u64; - - let raw_plaintext = vec![yes, no]; - let padded = &pad_end(&raw_plaintext, 0, 2048); - let expected_raw_plaintext = bincode::serialize(&padded)?; - let pt = Plaintext::try_encode(&raw_plaintext, Encoding::poly(), ¶ms)?; - - let ciphertext = pubkey.try_encrypt(&pt, &mut ChaCha20Rng::seed_from_u64(42))?; - - let event = EnclaveEvent::from(CiphertextOutputPublished { - ciphertext_output: ciphertext.to_bytes(), - e3_id: e3_id.clone(), - }); - - let arc_ct = Arc::new(ciphertext); - - let ds1 = DecryptionShare::new(&sk1, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); - let ds2 = DecryptionShare::new(&sk2, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); - let ds3 = DecryptionShare::new(&sk3, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); - - // let ds1 = sk1 - bus.send(event.clone()).await?; - - sleep(Duration::from_millis(1)).await; // need to push to next tick - let history = bus.send(GetHistory).await?; - - assert_eq!(history.len(), 5); - - assert_eq!( - history, - vec![ - event.clone(), - EnclaveEvent::from(DecryptionshareCreated { - decryption_share: ds1.clone(), - e3_id: e3_id.clone(), - node: eth_addrs[0].clone() - }), - EnclaveEvent::from(DecryptionshareCreated { - decryption_share: ds2.clone(), - e3_id: e3_id.clone(), - node: eth_addrs[1].clone() - }), - EnclaveEvent::from(DecryptionshareCreated { - decryption_share: ds3.clone(), - e3_id: e3_id.clone(), - node: eth_addrs[2].clone() - }), - EnclaveEvent::from(PlaintextAggregated { - e3_id: e3_id.clone(), - decrypted_output: expected_raw_plaintext.clone() - }) - ] - ); - - Ok(()) - } - - #[actix::test] - async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { - // Setup elements in test - let (tx, mut output) = channel(100); // Transmit byte events to the network - let (input, rx) = channel(100); // Receive byte events from the network - let bus = EventBus::new(true).start(); - P2p::spawn_and_listen(bus.clone(), tx.clone(), rx); - - // Capture messages from output on msgs vec - let msgs: Arc>>> = Arc::new(Mutex::new(Vec::new())); - let msgs_loop = msgs.clone(); - - tokio::spawn(async move { - while let Some(msg) = output.recv().await { - msgs_loop.lock().await.push(msg.clone()); - let _ = input.send(msg).await; - // loopback to simulate a rebroadcast message - // if this manages to broadcast an event to the - // event bus we will expect to see an extra event on - // the bus - } - }); - - let evt_1 = EnclaveEvent::from(PlaintextAggregated { - e3_id: E3id::new("1235"), - decrypted_output: vec![1, 2, 3, 4], - }); - - let evt_2 = EnclaveEvent::from(PlaintextAggregated { - e3_id: E3id::new("1236"), - decrypted_output: vec![1, 2, 3, 4], - }); - - let local_evt_3 = EnclaveEvent::from(CiphernodeSelected { - e3_id: E3id::new("1235"), - threshold_m: 3, - }); - - bus.do_send(evt_1.clone()); - bus.do_send(evt_2.clone()); - bus.do_send(local_evt_3.clone()); // This is a local event which should not be broadcast to the network - - sleep(Duration::from_millis(1)).await; // need to push to next tick - - // check the history of the event bus - let history = bus.send(GetHistory).await?; - - assert_eq!( - *msgs.lock().await, - vec![evt_1.to_bytes()?, evt_2.to_bytes()?], // notice no local events - "P2p did not transmit correct events to the network" - ); - - assert_eq!( - history, - vec![evt_1, evt_2, local_evt_3], // all local events that have been broadcast but no - // events from the loopback - "P2p must not retransmit forwarded event to event bus" - ); - - Ok(()) - } - - #[actix::test] - async fn test_p2p_actor_forwards_events_to_bus() -> Result<()> { - let seed = Seed(ChaCha20Rng::seed_from_u64(123).get_seed()); - - // Setup elements in test - let (tx, _) = channel(100); // Transmit byte events to the network - let (input, rx) = channel(100); // Receive byte events from the network - let bus = EventBus::new(true).start(); - P2p::spawn_and_listen(bus.clone(), tx.clone(), rx); - - // Capture messages from output on msgs vec - let event = EnclaveEvent::from(E3Requested { - e3_id: E3id::new("1235"), - threshold_m: 3, - seed: seed.clone(), - params: vec![1, 2, 3, 4], - }); - - // lets send an event from the network - let _ = input.send(event.to_bytes()?).await; - - sleep(Duration::from_millis(1)).await; // need to push to next tick - - // check the history of the event bus - let history = bus.send(GetHistory).await?; - - assert_eq!(history, vec![event]); - - Ok(()) - } -} +pub use enclave_core::*; diff --git a/packages/ciphernode/core/src/p2p/mod.rs b/packages/ciphernode/core/src/p2p/mod.rs deleted file mode 100644 index 3cfc9ff8..00000000 --- a/packages/ciphernode/core/src/p2p/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod p2p; -pub use p2p::*; diff --git a/packages/ciphernode/core/src/plaintext_aggregator/mod.rs b/packages/ciphernode/core/src/plaintext_aggregator/mod.rs deleted file mode 100644 index dfd7414c..00000000 --- a/packages/ciphernode/core/src/plaintext_aggregator/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod plaintext_aggregator; -pub use plaintext_aggregator::*; diff --git a/packages/ciphernode/core/src/publickey_aggregator/mod.rs b/packages/ciphernode/core/src/publickey_aggregator/mod.rs deleted file mode 100644 index d05e1d69..00000000 --- a/packages/ciphernode/core/src/publickey_aggregator/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod publickey_aggregator; -pub use publickey_aggregator::*; diff --git a/packages/ciphernode/core/src/sortition/mod.rs b/packages/ciphernode/core/src/sortition/mod.rs deleted file mode 100644 index e39cb001..00000000 --- a/packages/ciphernode/core/src/sortition/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod sortition; -pub use sortition::*; diff --git a/packages/ciphernode/data/Cargo.toml b/packages/ciphernode/data/Cargo.toml new file mode 100644 index 00000000..c3951e8f --- /dev/null +++ b/packages/ciphernode/data/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "data" +version = "0.1.0" +edition = "2021" +description = "Data persistence for enclave" +repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" + +[dependencies] +actix = "0.13.5" + diff --git a/packages/ciphernode/core/src/data/data.rs b/packages/ciphernode/data/src/data.rs similarity index 100% rename from packages/ciphernode/core/src/data/data.rs rename to packages/ciphernode/data/src/data.rs diff --git a/packages/ciphernode/core/src/data/mod.rs b/packages/ciphernode/data/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/data/mod.rs rename to packages/ciphernode/data/src/lib.rs diff --git a/packages/ciphernode/enclave_node/Cargo.toml b/packages/ciphernode/enclave_node/Cargo.toml index 4fabfe41..4f5f0d33 100644 --- a/packages/ciphernode/enclave_node/Cargo.toml +++ b/packages/ciphernode/enclave_node/Cargo.toml @@ -12,14 +12,21 @@ p2p = { path = "../p2p" } bfv = { path = "../bfv" } sortition = { path = "../sortition" } enclave-core = { path = "../core" } -async-std = "1.12.0" -fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +evm = { path = "../evm" } +logger = { path = "../logger" } +fhe = { path = "../fhe" } +data = { path = "../data" } +keyshare = { path = "../keyshare" } +aggregator = { path = "../aggregator" } +router = { path = "../router" } +test-helpers = { path = "../test_helpers" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +async-std = "1.12.0" tokio = { version = "1.38", features = ["full"] } actix-rt = "2.10.0" alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } - alloy = { version = "0.3.3", features = ["full"] } clap = { version = "4.5.17", features = ["derive"] } rand_chacha = "0.3.1" @@ -27,3 +34,5 @@ rand = "0.8.5" bincode = "1.3.3" base91 = "0.1.0" base64 = "0.22.1" +actix = "0.13.5" +anyhow = "1.0.86" diff --git a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs b/packages/ciphernode/enclave_node/src/aggregator.rs similarity index 86% rename from packages/ciphernode/core/src/enclave_node/main_aggregator.rs rename to packages/ciphernode/enclave_node/src/aggregator.rs index 5e88d1c3..8c0901c4 100644 --- a/packages/ciphernode/core/src/enclave_node/main_aggregator.rs +++ b/packages/ciphernode/enclave_node/src/aggregator.rs @@ -1,20 +1,18 @@ -use crate::{ - enclave_core::EventBus, - evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}, - fhe::FheFactory, - logger::SimpleLogger, - p2p::P2p, - plaintext_aggregator::PlaintextAggregatorFactory, - publickey_aggregator::PublicKeyAggregatorFactory, - router::{CommitteeMetaFactory, E3RequestRouter}, - sortition::Sortition, - utils::{PlaintextWriter, PublicKeyWriter}, -}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; +use enclave_core::EventBus; +use evm::{connect_evm_caller, connect_evm_ciphernode_registry, connect_evm_enclave}; +use logger::SimpleLogger; +use p2p::P2p; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; +use router::{ + CommitteeMetaFactory, E3RequestRouter, FheFactory, PlaintextAggregatorFactory, + PublicKeyAggregatorFactory, +}; +use sortition::Sortition; use std::sync::{Arc, Mutex}; +use test_helpers::{PlaintextWriter, PublicKeyWriter}; use tokio::task::JoinHandle; /// Main Ciphernode Actor diff --git a/packages/ciphernode/enclave_node/src/bin/aggregator.rs b/packages/ciphernode/enclave_node/src/bin/aggregator.rs index 54b70c61..7c03d011 100644 --- a/packages/ciphernode/enclave_node/src/bin/aggregator.rs +++ b/packages/ciphernode/enclave_node/src/bin/aggregator.rs @@ -1,6 +1,6 @@ use alloy::primitives::Address; use clap::Parser; -use enclave_core::MainAggregator; +use enclave_node::MainAggregator; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] diff --git a/packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs b/packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs index 9a1531f2..e1947b58 100644 --- a/packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs +++ b/packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs @@ -1,7 +1,7 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use enclave_core::setup_bfv_params; -use fhe::bfv::{Encoding, Plaintext, PublicKey}; +use fhe::setup_bfv_params; +use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; use rand_chacha::ChaCha20Rng; diff --git a/packages/ciphernode/enclave_node/src/bin/node.rs b/packages/ciphernode/enclave_node/src/bin/node.rs index a3432110..a961ffae 100644 --- a/packages/ciphernode/enclave_node/src/bin/node.rs +++ b/packages/ciphernode/enclave_node/src/bin/node.rs @@ -1,6 +1,6 @@ use alloy::primitives::Address; use clap::Parser; -use enclave_core::MainCiphernode; +use enclave_node::MainCiphernode; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] diff --git a/packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs b/packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs index fa0ff8ce..d35ecc1e 100644 --- a/packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs +++ b/packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs @@ -1,5 +1,5 @@ use clap::{command, Parser}; -use enclave_core::encode_bfv_params; +use fhe::encode_bfv_params; use std::{error::Error, num::ParseIntError, process}; fn parse_hex(arg: &str) -> Result { diff --git a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs b/packages/ciphernode/enclave_node/src/ciphernode.rs similarity index 90% rename from packages/ciphernode/core/src/enclave_node/main_ciphernode.rs rename to packages/ciphernode/enclave_node/src/ciphernode.rs index 99832c69..bee1a9eb 100644 --- a/packages/ciphernode/core/src/enclave_node/main_ciphernode.rs +++ b/packages/ciphernode/enclave_node/src/ciphernode.rs @@ -1,10 +1,16 @@ -use crate::{ - data::Data, enclave_core::EventBus, evm::{connect_evm_ciphernode_registry, connect_evm_enclave}, fhe::FheFactory, keyshare::KeyshareFactory, logger::SimpleLogger, p2p::P2p, router::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter}, sortition::Sortition -}; use actix::{Actor, Addr, Context}; use alloy::primitives::Address; +use data::Data; +use enclave_core::EventBus; +use evm::{connect_evm_ciphernode_registry, connect_evm_enclave}; +use logger::SimpleLogger; +use p2p::P2p; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; +use router::{ + CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, FheFactory, KeyshareFactory, +}; +use sortition::Sortition; use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; diff --git a/packages/ciphernode/enclave_node/src/lib.rs b/packages/ciphernode/enclave_node/src/lib.rs new file mode 100644 index 00000000..a0e3ff23 --- /dev/null +++ b/packages/ciphernode/enclave_node/src/lib.rs @@ -0,0 +1,5 @@ +mod aggregator; +mod ciphernode; + +pub use aggregator::*; +pub use ciphernode::*; diff --git a/packages/ciphernode/enclave_node/tests/internal.rs b/packages/ciphernode/enclave_node/tests/internal.rs new file mode 100644 index 00000000..3db3de83 --- /dev/null +++ b/packages/ciphernode/enclave_node/tests/internal.rs @@ -0,0 +1,346 @@ + +use data::Data; +use enclave_core::{ + CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, + E3Requested, E3id, EnclaveEvent, EventBus, GetHistory, KeyshareCreated, PlaintextAggregated, + PublicKeyAggregated, ResetHistory, Seed, +}; +use fhe::{setup_crp_params, ParamsWithCrp, SharedRng}; +use logger::SimpleLogger; +use p2p::P2p; +use router::{ + CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, FheFactory, KeyshareFactory, + PlaintextAggregatorFactory, PublicKeyAggregatorFactory, +}; +use sortition::Sortition; + +use actix::prelude::*; +use alloy::primitives::Address; +use anyhow::*; +use fhe_rs::{ + bfv::{BfvParameters, Encoding, Plaintext, PublicKey, SecretKey}, + mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, +}; +use fhe_traits::{FheEncoder, FheEncrypter, Serialize}; +use rand::Rng; +use rand::SeedableRng; +use rand_chacha::ChaCha20Rng; +use std::{sync::Arc, time::Duration}; +use tokio::sync::Mutex; +use tokio::{sync::mpsc::channel, time::sleep}; + +// Simulating a local node +async fn setup_local_ciphernode(bus: Addr, rng: SharedRng, logging: bool, addr: &str) { + // create data actor for saving data + let data = Data::new(logging).start(); // TODO: Use a sled backed Data Actor + + // create ciphernode actor for managing ciphernode flow + let sortition = Sortition::attach(bus.clone()); + CiphernodeSelector::attach(bus.clone(), sortition.clone(), addr); + + E3RequestRouter::builder(bus.clone()) + .add_hook(CommitteeMetaFactory::create()) + .add_hook(FheFactory::create(rng)) + .add_hook(PublicKeyAggregatorFactory::create( + bus.clone(), + sortition.clone(), + )) + .add_hook(PlaintextAggregatorFactory::create( + bus.clone(), + sortition.clone(), + )) + .add_hook(KeyshareFactory::create(bus.clone(), data.clone(), addr)) + .build(); + + SimpleLogger::attach(addr, bus.clone()); +} + +fn generate_pk_share( + params: Arc, + crp: CommonRandomPoly, + rng: SharedRng, +) -> Result<(PublicKeyShare, SecretKey)> { + let sk = SecretKey::random(¶ms, &mut *rng.lock().unwrap()); + let pk = PublicKeyShare::new(&sk, crp.clone(), &mut *rng.lock().unwrap())?; + Ok((pk, sk)) +} + +#[actix::test] +async fn test_public_key_aggregation_and_decryption() -> Result<()> { + // Setup EventBus + let bus = EventBus::new(true).start(); + let rng = Arc::new(std::sync::Mutex::new(ChaCha20Rng::seed_from_u64(42))); + let seed = Seed(ChaCha20Rng::seed_from_u64(123).get_seed()); + + let eth_addrs: Vec = (0..3) + .map(|_| Address::from_slice(&rand::thread_rng().gen::<[u8; 20]>()).to_string()) + .collect(); + + setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[0]).await; + setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[1]).await; + setup_local_ciphernode(bus.clone(), rng.clone(), true, ð_addrs[2]).await; + + let e3_id = E3id::new("1234"); + + let ParamsWithCrp { + crp_bytes, params, .. + } = setup_crp_params( + &[0x3FFFFFFF000001], + 2048, + 1032193, + Arc::new(std::sync::Mutex::new(ChaCha20Rng::from_seed( + seed.clone().into(), + ))), + ); + + let regevt_1 = EnclaveEvent::from(CiphernodeAdded { + address: eth_addrs[0].clone(), + index: 0, + num_nodes: 1, + }); + + bus.send(regevt_1.clone()).await?; + + let regevt_2 = EnclaveEvent::from(CiphernodeAdded { + address: eth_addrs[1].clone(), + index: 1, + num_nodes: 2, + }); + + bus.send(regevt_2.clone()).await?; + + let regevt_3 = EnclaveEvent::from(CiphernodeAdded { + address: eth_addrs[2].clone(), + index: 2, + num_nodes: 3, + }); + + bus.send(regevt_3.clone()).await?; + + let event = EnclaveEvent::from(E3Requested { + e3_id: e3_id.clone(), + threshold_m: 3, + seed: seed.clone(), + params: params.to_bytes(), + }); + // Send the computation requested event + bus.send(event.clone()).await?; + + // Test that we cannot send the same event twice + bus.send(event).await?; + + let history = bus.send(GetHistory).await?; + + let rng_test = Arc::new(std::sync::Mutex::new(ChaCha20Rng::seed_from_u64(42))); + + let crpoly = CommonRandomPoly::deserialize(&crp_bytes.clone(), ¶ms)?; + + let (p1, sk1) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; + let (p2, sk2) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; + let (p3, sk3) = generate_pk_share(params.clone(), crpoly.clone(), rng_test.clone())?; + + let pubkey: PublicKey = vec![p1.clone(), p2.clone(), p3.clone()] + .into_iter() + .aggregate()?; + + assert_eq!(history.len(), 9); + assert_eq!( + history, + vec![ + regevt_1, + regevt_2, + regevt_3, + EnclaveEvent::from(E3Requested { + e3_id: e3_id.clone(), + threshold_m: 3, + seed: seed.clone(), + params: params.to_bytes() + }), + EnclaveEvent::from(CiphernodeSelected { + e3_id: e3_id.clone(), + threshold_m: 3, + }), + EnclaveEvent::from(KeyshareCreated { + pubkey: p1.to_bytes(), + e3_id: e3_id.clone(), + node: eth_addrs[0].clone() + }), + EnclaveEvent::from(KeyshareCreated { + pubkey: p2.to_bytes(), + e3_id: e3_id.clone(), + node: eth_addrs[1].clone() + }), + EnclaveEvent::from(KeyshareCreated { + pubkey: p3.to_bytes(), + e3_id: e3_id.clone(), + node: eth_addrs[2].clone() + }), + EnclaveEvent::from(PublicKeyAggregated { + pubkey: pubkey.to_bytes(), + e3_id: e3_id.clone() + }) + ] + ); + + // Aggregate decryption + bus.send(ResetHistory).await?; + fn pad_end(input: &[u64], pad: u64, total: usize) -> Vec { + let len = input.len(); + let mut cop = input.to_vec(); + cop.extend(std::iter::repeat(pad).take(total - len)); + cop + } + // TODO: + // Making these values large (especially the yes value) requires changing + // the params we use here - as we tune the FHE we need to take care + let yes = 1234u64; + let no = 873827u64; + + let raw_plaintext = vec![yes, no]; + let padded = &pad_end(&raw_plaintext, 0, 2048); + let expected_raw_plaintext = bincode::serialize(&padded)?; + let pt = Plaintext::try_encode(&raw_plaintext, Encoding::poly(), ¶ms)?; + + let ciphertext = pubkey.try_encrypt(&pt, &mut ChaCha20Rng::seed_from_u64(42))?; + + let event = EnclaveEvent::from(CiphertextOutputPublished { + ciphertext_output: ciphertext.to_bytes(), + e3_id: e3_id.clone(), + }); + + let arc_ct = Arc::new(ciphertext); + + let ds1 = DecryptionShare::new(&sk1, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); + let ds2 = DecryptionShare::new(&sk2, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); + let ds3 = DecryptionShare::new(&sk3, &arc_ct, &mut *rng_test.lock().unwrap())?.to_bytes(); + + // let ds1 = sk1 + bus.send(event.clone()).await?; + + sleep(Duration::from_millis(1)).await; // need to push to next tick + let history = bus.send(GetHistory).await?; + + assert_eq!(history.len(), 5); + + assert_eq!( + history, + vec![ + event.clone(), + EnclaveEvent::from(DecryptionshareCreated { + decryption_share: ds1.clone(), + e3_id: e3_id.clone(), + node: eth_addrs[0].clone() + }), + EnclaveEvent::from(DecryptionshareCreated { + decryption_share: ds2.clone(), + e3_id: e3_id.clone(), + node: eth_addrs[1].clone() + }), + EnclaveEvent::from(DecryptionshareCreated { + decryption_share: ds3.clone(), + e3_id: e3_id.clone(), + node: eth_addrs[2].clone() + }), + EnclaveEvent::from(PlaintextAggregated { + e3_id: e3_id.clone(), + decrypted_output: expected_raw_plaintext.clone() + }) + ] + ); + + Ok(()) +} + +#[actix::test] +async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { + // Setup elements in test + let (tx, mut output) = channel(100); // Transmit byte events to the network + let (input, rx) = channel(100); // Receive byte events from the network + let bus = EventBus::new(true).start(); + P2p::spawn_and_listen(bus.clone(), tx.clone(), rx); + + // Capture messages from output on msgs vec + let msgs: Arc>>> = Arc::new(Mutex::new(Vec::new())); + let msgs_loop = msgs.clone(); + + tokio::spawn(async move { + while let Some(msg) = output.recv().await { + msgs_loop.lock().await.push(msg.clone()); + let _ = input.send(msg).await; + // loopback to simulate a rebroadcast message + // if this manages to broadcast an event to the + // event bus we will expect to see an extra event on + // the bus + } + }); + + let evt_1 = EnclaveEvent::from(PlaintextAggregated { + e3_id: E3id::new("1235"), + decrypted_output: vec![1, 2, 3, 4], + }); + + let evt_2 = EnclaveEvent::from(PlaintextAggregated { + e3_id: E3id::new("1236"), + decrypted_output: vec![1, 2, 3, 4], + }); + + let local_evt_3 = EnclaveEvent::from(CiphernodeSelected { + e3_id: E3id::new("1235"), + threshold_m: 3, + }); + + bus.do_send(evt_1.clone()); + bus.do_send(evt_2.clone()); + bus.do_send(local_evt_3.clone()); // This is a local event which should not be broadcast to the network + + sleep(Duration::from_millis(1)).await; // need to push to next tick + + // check the history of the event bus + let history = bus.send(GetHistory).await?; + + assert_eq!( + *msgs.lock().await, + vec![evt_1.to_bytes()?, evt_2.to_bytes()?], // notice no local events + "P2p did not transmit correct events to the network" + ); + + assert_eq!( + history, + vec![evt_1, evt_2, local_evt_3], // all local events that have been broadcast but no + // events from the loopback + "P2p must not retransmit forwarded event to event bus" + ); + + Ok(()) +} + +#[actix::test] +async fn test_p2p_actor_forwards_events_to_bus() -> Result<()> { + let seed = Seed(ChaCha20Rng::seed_from_u64(123).get_seed()); + + // Setup elements in test + let (tx, _) = channel(100); // Transmit byte events to the network + let (input, rx) = channel(100); // Receive byte events from the network + let bus = EventBus::new(true).start(); + P2p::spawn_and_listen(bus.clone(), tx.clone(), rx); + + // Capture messages from output on msgs vec + let event = EnclaveEvent::from(E3Requested { + e3_id: E3id::new("1235"), + threshold_m: 3, + seed: seed.clone(), + params: vec![1, 2, 3, 4], + }); + + // lets send an event from the network + let _ = input.send(event.to_bytes()?).await; + + sleep(Duration::from_millis(1)).await; // need to push to next tick + + // check the history of the event bus + let history = bus.send(GetHistory).await?; + + assert_eq!(history, vec![event]); + + Ok(()) +} diff --git a/packages/ciphernode/evm/Cargo.toml b/packages/ciphernode/evm/Cargo.toml new file mode 100644 index 00000000..07950698 --- /dev/null +++ b/packages/ciphernode/evm/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "evm" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix = "0.13.5" +alloy = { version = "0.3.3", features = ["full"] } +alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +anyhow = "1.0.86" +enclave-core = { path = "../core" } +futures-util = "0.3" +sortition = { path = "../sortition" } diff --git a/packages/ciphernode/core/src/evm/caller.rs b/packages/ciphernode/evm/src/caller.rs similarity index 97% rename from packages/ciphernode/core/src/evm/caller.rs rename to packages/ciphernode/evm/src/caller.rs index c19da82d..7961ab2c 100644 --- a/packages/ciphernode/core/src/evm/caller.rs +++ b/packages/ciphernode/evm/src/caller.rs @@ -3,8 +3,8 @@ use alloy::primitives::{Address, Bytes, U256}; use std::collections::HashMap; use std::sync::Arc; -use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; -use crate::sortition::{GetNodes, Sortition}; +use enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use sortition::{GetNodes, Sortition}; use super::EVMContract; diff --git a/packages/ciphernode/core/src/evm/ciphernode_registry.rs b/packages/ciphernode/evm/src/ciphernode_registry.rs similarity index 94% rename from packages/ciphernode/core/src/evm/ciphernode_registry.rs rename to packages/ciphernode/evm/src/ciphernode_registry.rs index 1187aaea..a1a1283b 100644 --- a/packages/ciphernode/core/src/evm/ciphernode_registry.rs +++ b/packages/ciphernode/evm/src/ciphernode_registry.rs @@ -1,11 +1,9 @@ use super::ContractEvent; -use crate::{ - enclave_core::{self, EnclaveEvent, EventBus}, - evm::{AddEventHandler, AddListener, EvmContractManager, StartListening}, -}; +use crate::{AddEventHandler, AddListener, EvmContractManager, StartListening}; use actix::Addr; use alloy::{primitives::Address, sol}; use anyhow::Result; +use enclave_core::{EnclaveEvent, EventBus}; sol! { #[derive(Debug)] diff --git a/packages/ciphernode/core/src/evm/contracts.rs b/packages/ciphernode/evm/src/contracts.rs similarity index 100% rename from packages/ciphernode/core/src/evm/contracts.rs rename to packages/ciphernode/evm/src/contracts.rs diff --git a/packages/ciphernode/core/src/evm/enclave.rs b/packages/ciphernode/evm/src/enclave.rs similarity index 94% rename from packages/ciphernode/core/src/evm/enclave.rs rename to packages/ciphernode/evm/src/enclave.rs index 74c19444..9e482cb0 100644 --- a/packages/ciphernode/core/src/evm/enclave.rs +++ b/packages/ciphernode/evm/src/enclave.rs @@ -1,13 +1,9 @@ +use super::listener::ContractEvent; +use crate::{AddEventHandler, AddListener, EvmContractManager, StartListening}; use actix::Addr; use alloy::{primitives::Address, sol}; use anyhow::Result; - -use crate::{ - enclave_core::{self, EnclaveEvent, EventBus}, - evm::{AddEventHandler, AddListener, EvmContractManager, StartListening}, -}; - -use super::listener::ContractEvent; +use enclave_core::{EnclaveEvent, EventBus}; sol! { #[derive(Debug)] diff --git a/packages/ciphernode/core/src/evm/mod.rs b/packages/ciphernode/evm/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/evm/mod.rs rename to packages/ciphernode/evm/src/lib.rs diff --git a/packages/ciphernode/core/src/evm/listener.rs b/packages/ciphernode/evm/src/listener.rs similarity index 97% rename from packages/ciphernode/core/src/evm/listener.rs rename to packages/ciphernode/evm/src/listener.rs index 4b0b0228..b501b3c9 100644 --- a/packages/ciphernode/core/src/evm/listener.rs +++ b/packages/ciphernode/evm/src/listener.rs @@ -11,7 +11,7 @@ use futures_util::stream::StreamExt; use std::collections::HashMap; use std::marker::PhantomData; use std::sync::Arc; -use crate::enclave_core::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; +use enclave_core::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; pub trait ContractEvent: Send + Sync + 'static { fn process(&self, bus: Addr) -> Result<()>; diff --git a/packages/ciphernode/core/src/evm/manager.rs b/packages/ciphernode/evm/src/manager.rs similarity index 98% rename from packages/ciphernode/core/src/evm/manager.rs rename to packages/ciphernode/evm/src/manager.rs index 7868ba7d..aee9ce2b 100644 --- a/packages/ciphernode/core/src/evm/manager.rs +++ b/packages/ciphernode/evm/src/manager.rs @@ -7,8 +7,7 @@ use alloy::{ }; use anyhow::Result; use std::sync::Arc; - -use crate::enclave_core::EventBus; +use enclave_core::EventBus; use super::{EvmEventListener, StartListening}; diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml new file mode 100644 index 00000000..0f48ab48 --- /dev/null +++ b/packages/ciphernode/fhe/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "fhe" +version = "0.1.0" +edition = "2021" + +[dependencies] +enclave-core = { path = "../core" } +anyhow = "1.0.86" +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +rand = "0.8.5" +rand_chacha = "0.3.1" +bincode = "1.3.3" +serde = { version = "1.0.208", features = ["derive"] } + diff --git a/packages/ciphernode/core/src/fhe/fhe.rs b/packages/ciphernode/fhe/src/fhe.rs similarity index 88% rename from packages/ciphernode/core/src/fhe/fhe.rs rename to packages/ciphernode/fhe/src/fhe.rs index 3431e100..3cab9650 100644 --- a/packages/ciphernode/core/src/fhe/fhe.rs +++ b/packages/ciphernode/fhe/src/fhe.rs @@ -1,7 +1,7 @@ use super::set_up_crp; -use crate::{enclave_core::{E3Requested, EnclaveEvent,OrderedSet, Seed}, router::EventHook}; use anyhow::*; -use fhe::{ +use enclave_core::{E3Requested, EnclaveEvent, OrderedSet, Seed}; +use fhe_rs::{ bfv::{ BfvParameters, BfvParametersBuilder, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey, }, @@ -122,25 +122,6 @@ impl Fhe { Ok(bincode::serialize(&decoded)?) } } - -pub struct FheFactory; - -impl FheFactory { - pub fn create(rng: SharedRng) -> EventHook { - Box::new(move |ctx, evt| { - // Saving the fhe on Committee Requested - let EnclaveEvent::E3Requested { data, .. } = evt else { - return; - }; - let E3Requested { params, seed, .. } = data; - - ctx.fhe = Some(Arc::new( - Fhe::from_encoded(¶ms, seed, rng.clone()).unwrap(), - )); - }) - } -} - struct SecretKeySerializer { pub inner: SecretKey, } diff --git a/packages/ciphernode/core/src/fhe/mod.rs b/packages/ciphernode/fhe/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/fhe/mod.rs rename to packages/ciphernode/fhe/src/lib.rs diff --git a/packages/ciphernode/core/src/fhe/utils.rs b/packages/ciphernode/fhe/src/utils.rs similarity index 99% rename from packages/ciphernode/core/src/fhe/utils.rs rename to packages/ciphernode/fhe/src/utils.rs index 67ceee9e..4708021e 100644 --- a/packages/ciphernode/core/src/fhe/utils.rs +++ b/packages/ciphernode/fhe/src/utils.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use fhe::{ +use fhe_rs::{ bfv::{BfvParameters, BfvParametersBuilder}, mbfv::CommonRandomPoly, }; diff --git a/packages/ciphernode/keyshare/Cargo.toml b/packages/ciphernode/keyshare/Cargo.toml new file mode 100644 index 00000000..4a3dc8ab --- /dev/null +++ b/packages/ciphernode/keyshare/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "keyshare" +version = "0.1.0" +edition = "2021" + +[dependencies] +data = { path = "../data" } +enclave-core = { path = "../core" } +fhe = { path = "../fhe" } +actix = "0.13.5" +anyhow = "1.0.86" diff --git a/packages/ciphernode/core/src/keyshare/keyshare.rs b/packages/ciphernode/keyshare/src/keyshare.rs similarity index 80% rename from packages/ciphernode/core/src/keyshare/keyshare.rs rename to packages/ciphernode/keyshare/src/keyshare.rs index df86c109..ffa1f29a 100644 --- a/packages/ciphernode/core/src/keyshare/keyshare.rs +++ b/packages/ciphernode/keyshare/src/keyshare.rs @@ -1,12 +1,9 @@ -use crate::{ - data::{Data, Get, Insert}, - enclave_core::{ - CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, - EnclaveEvent, EventBus, FromError, KeyshareCreated, - }, - fhe::{DecryptCiphertext, Fhe}, - router::EventHook, +use data::{Data, Get, Insert}; +use enclave_core::{ + CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, + EnclaveEvent, EventBus, FromError, KeyshareCreated, }; +use fhe::{DecryptCiphertext, Fhe}; use actix::prelude::*; use anyhow::{anyhow, Context, Result}; use std::sync::Arc; @@ -139,22 +136,3 @@ async fn on_decryption_requested( Ok(()) } -pub struct KeyshareFactory; -impl KeyshareFactory { - pub fn create(bus: Addr, data: Addr, address: &str) -> EventHook { - let address = address.to_string(); - Box::new(move |ctx, evt| { - // Save Ciphernode on CiphernodeSelected - let EnclaveEvent::CiphernodeSelected { .. } = evt else { - return; - }; - - let Some(ref fhe) = ctx.fhe else { - return; - }; - - ctx.keyshare = - Some(Keyshare::new(bus.clone(), data.clone(), fhe.clone(), &address).start()) - }) - } -} diff --git a/packages/ciphernode/core/src/keyshare/mod.rs b/packages/ciphernode/keyshare/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/keyshare/mod.rs rename to packages/ciphernode/keyshare/src/lib.rs diff --git a/packages/ciphernode/logger/Cargo.toml b/packages/ciphernode/logger/Cargo.toml new file mode 100644 index 00000000..a02153a2 --- /dev/null +++ b/packages/ciphernode/logger/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "logger" +version = "0.1.0" +edition = "2021" + +[dependencies] +enclave-core = { path = "../core" } +actix = "0.13.5" +base64 = "0.22.1" diff --git a/packages/ciphernode/core/src/logger/mod.rs b/packages/ciphernode/logger/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/logger/mod.rs rename to packages/ciphernode/logger/src/lib.rs diff --git a/packages/ciphernode/core/src/logger/logger.rs b/packages/ciphernode/logger/src/logger.rs similarity index 96% rename from packages/ciphernode/core/src/logger/logger.rs rename to packages/ciphernode/logger/src/logger.rs index 87e4cf0f..38c594f3 100644 --- a/packages/ciphernode/core/src/logger/logger.rs +++ b/packages/ciphernode/logger/src/logger.rs @@ -1,7 +1,7 @@ use actix::{Actor, Addr, Context, Handler}; use base64::prelude::*; -use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use enclave_core::{EnclaveEvent, EventBus, Subscribe}; pub struct SimpleLogger { name: String, diff --git a/packages/ciphernode/p2p/Cargo.toml b/packages/ciphernode/p2p/Cargo.toml index 487b5a53..4d778ab1 100644 --- a/packages/ciphernode/p2p/Cargo.toml +++ b/packages/ciphernode/p2p/Cargo.toml @@ -8,10 +8,6 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bfv = { path = "../bfv" } -fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } async-std = { version = "1.12", features = ["attributes"] } async-trait = "0.1" futures = "0.3.30" @@ -19,5 +15,6 @@ libp2p = { version = "0.53.2", features = [ "async-std", "identify", "macros", " tokio = { version = "1.38", features = ["full"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3", features = ["env-filter"] } - - +enclave-core = { path = "../core" } +anyhow = "1.0.86" +actix = "0.13.5" diff --git a/packages/ciphernode/p2p/src/lib.rs b/packages/ciphernode/p2p/src/lib.rs index 9cf789cf..cc7025e7 100644 --- a/packages/ciphernode/p2p/src/lib.rs +++ b/packages/ciphernode/p2p/src/lib.rs @@ -2,179 +2,8 @@ #![crate_type = "lib"] #![warn(missing_docs, unused_imports)] -use futures::stream::StreamExt; -use libp2p::{ - gossipsub, identity, mdns, noise, swarm::NetworkBehaviour, swarm::SwarmEvent, tcp, yamux, -}; -use std::collections::hash_map::DefaultHasher; -use std::error::Error; -use std::hash::{Hash, Hasher}; -use std::time::Duration; -use tokio::sync::mpsc::{channel, Receiver, Sender}; -use tokio::{io, select}; -use tracing_subscriber::EnvFilter; +mod libp2p_router; +mod p2p; -#[derive(NetworkBehaviour)] -pub struct MyBehaviour { - gossipsub: gossipsub::Behaviour, - mdns: mdns::tokio::Behaviour, -} - - -pub struct EnclaveRouter { - pub identity: Option, - pub gossipsub_config: gossipsub::Config, - pub swarm: Option>, - pub topic: Option, - evt_tx: Sender>, - cmd_rx: Receiver> -} - -impl EnclaveRouter { - pub fn new() -> Result<(Self, Sender>, Receiver>), Box> { - let (evt_tx, evt_rx) = channel(100); // TODO : tune this param - let (cmd_tx, cmd_rx) = channel(100); // TODO : tune this param - let message_id_fn = |message: &gossipsub::Message| { - let mut s = DefaultHasher::new(); - message.data.hash(&mut s); - gossipsub::MessageId::from(s.finish().to_string()) - }; - - // TODO: Allow for config inputs to new() - let gossipsub_config = gossipsub::ConfigBuilder::default() - .heartbeat_interval(Duration::from_secs(10)) - .validation_mode(gossipsub::ValidationMode::Strict) - .message_id_fn(message_id_fn) - .build() - .map_err(|msg| io::Error::new(io::ErrorKind::Other, msg))?; - - Ok(( - Self { - identity: None, - gossipsub_config, - swarm: None, - topic: None, - evt_tx, - cmd_rx - }, - cmd_tx, - evt_rx, - )) - } - - pub fn with_identiy(&mut self, keypair: identity::Keypair) { - self.identity = Some(keypair); - } - - pub fn connect_swarm(&mut self, discovery_type: String) -> Result<&Self, Box> { - match discovery_type.as_str() { - "mdns" => { - let _ = tracing_subscriber::fmt() - .with_env_filter(EnvFilter::from_default_env()) - .try_init(); - - // TODO: Use key if assigned already - let mut swarm = libp2p::SwarmBuilder::with_new_identity() - .with_tokio() - .with_tcp( - tcp::Config::default(), - noise::Config::new, - yamux::Config::default, - )? - .with_quic() - .with_behaviour(|key| { - let gossipsub = gossipsub::Behaviour::new( - gossipsub::MessageAuthenticity::Signed(key.clone()), - self.gossipsub_config.clone(), - )?; - - let mdns = mdns::tokio::Behaviour::new( - mdns::Config::default(), - key.public().to_peer_id(), - )?; - Ok(MyBehaviour { gossipsub, mdns }) - })? - .with_swarm_config(|c| c.with_idle_connection_timeout(Duration::from_secs(60))) - .build(); - self.swarm = Some(swarm); - } - _ => println!("Defaulting to MDNS discovery"), - } - Ok(self) - } - - pub fn join_topic(&mut self, topic_name: &str) -> Result<&Self, Box> { - let topic = gossipsub::IdentTopic::new(topic_name); - self.topic = Some(topic.clone()); - self.swarm - .as_mut() - .unwrap() - .behaviour_mut() - .gossipsub - .subscribe(&topic)?; - Ok(self) - } - - pub async fn start(&mut self) -> Result<(), Box> { - self.swarm - .as_mut() - .unwrap() - .listen_on("/ip4/0.0.0.0/udp/0/quic-v1".parse()?)?; - self.swarm - .as_mut() - .unwrap() - .listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?; - loop { - select! { - Some(line) = self.cmd_rx.recv() => { - if let Err(e) = self.swarm.as_mut().unwrap() - .behaviour_mut().gossipsub - .publish(self.topic.as_mut().unwrap().clone(), line) { - println!("Publish error: {e:?}"); - } - } - event = self.swarm.as_mut().unwrap().select_next_some() => match event { - SwarmEvent::Behaviour(MyBehaviourEvent::Mdns(mdns::Event::Discovered(list))) => { - for (peer_id, _multiaddr) in list { - // println!("mDNS discovered a new peer: {peer_id}"); - self.swarm.as_mut().unwrap().behaviour_mut().gossipsub.add_explicit_peer(&peer_id); - } - }, - SwarmEvent::Behaviour(MyBehaviourEvent::Mdns(mdns::Event::Expired(list))) => { - for (peer_id, _multiaddr) in list { - // println!("mDNS discover peer has expired: {peer_id}"); - self.swarm.as_mut().unwrap().behaviour_mut().gossipsub.remove_explicit_peer(&peer_id); - } - }, - SwarmEvent::Behaviour(MyBehaviourEvent::Gossipsub(gossipsub::Event::Message { - propagation_source: peer_id, - message_id: id, - message, - })) => { - // println!( - // "Got message with id: {id} from peer: {peer_id}", - // ); - // println!("{:?}", message); - self.evt_tx.send(message.data).await?; - }, - SwarmEvent::NewListenAddr { address, .. } => { - // println!("Local node is listening on {address}"); - } - _ => {} - } - } - } - } -} - -// #[tokio::main] -// async fn main() -> Result<(), Box> { - -// let mut p2p = EnclaveRouter::new()?; -// p2p.connect_swarm("mdns".to_string())?; -// p2p.join_topic("enclave-keygen-01")?; -// p2p.start().await?; - -// println!("Hello, cipher world!"); -// Ok(()) -// } +pub use libp2p_router::*; +pub use p2p::*; diff --git a/packages/ciphernode/p2p/src/libp2p_router.rs b/packages/ciphernode/p2p/src/libp2p_router.rs new file mode 100644 index 00000000..fb81cee2 --- /dev/null +++ b/packages/ciphernode/p2p/src/libp2p_router.rs @@ -0,0 +1,176 @@ +use futures::stream::StreamExt; +use libp2p::{ + gossipsub, identity, mdns, noise, swarm::NetworkBehaviour, swarm::SwarmEvent, tcp, yamux, +}; +use std::collections::hash_map::DefaultHasher; +use std::error::Error; +use std::hash::{Hash, Hasher}; +use std::time::Duration; +use tokio::sync::mpsc::{channel, Receiver, Sender}; +use tokio::{io, select}; +use tracing_subscriber::EnvFilter; + +#[derive(NetworkBehaviour)] +pub struct MyBehaviour { + gossipsub: gossipsub::Behaviour, + mdns: mdns::tokio::Behaviour, +} + + +pub struct EnclaveRouter { + pub identity: Option, + pub gossipsub_config: gossipsub::Config, + pub swarm: Option>, + pub topic: Option, + evt_tx: Sender>, + cmd_rx: Receiver> +} + +impl EnclaveRouter { + pub fn new() -> Result<(Self, Sender>, Receiver>), Box> { + let (evt_tx, evt_rx) = channel(100); // TODO : tune this param + let (cmd_tx, cmd_rx) = channel(100); // TODO : tune this param + let message_id_fn = |message: &gossipsub::Message| { + let mut s = DefaultHasher::new(); + message.data.hash(&mut s); + gossipsub::MessageId::from(s.finish().to_string()) + }; + + // TODO: Allow for config inputs to new() + let gossipsub_config = gossipsub::ConfigBuilder::default() + .heartbeat_interval(Duration::from_secs(10)) + .validation_mode(gossipsub::ValidationMode::Strict) + .message_id_fn(message_id_fn) + .build() + .map_err(|msg| io::Error::new(io::ErrorKind::Other, msg))?; + + Ok(( + Self { + identity: None, + gossipsub_config, + swarm: None, + topic: None, + evt_tx, + cmd_rx + }, + cmd_tx, + evt_rx, + )) + } + + pub fn with_identiy(&mut self, keypair: identity::Keypair) { + self.identity = Some(keypair); + } + + pub fn connect_swarm(&mut self, discovery_type: String) -> Result<&Self, Box> { + match discovery_type.as_str() { + "mdns" => { + let _ = tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .try_init(); + + // TODO: Use key if assigned already + let mut swarm = libp2p::SwarmBuilder::with_new_identity() + .with_tokio() + .with_tcp( + tcp::Config::default(), + noise::Config::new, + yamux::Config::default, + )? + .with_quic() + .with_behaviour(|key| { + let gossipsub = gossipsub::Behaviour::new( + gossipsub::MessageAuthenticity::Signed(key.clone()), + self.gossipsub_config.clone(), + )?; + + let mdns = mdns::tokio::Behaviour::new( + mdns::Config::default(), + key.public().to_peer_id(), + )?; + Ok(MyBehaviour { gossipsub, mdns }) + })? + .with_swarm_config(|c| c.with_idle_connection_timeout(Duration::from_secs(60))) + .build(); + self.swarm = Some(swarm); + } + _ => println!("Defaulting to MDNS discovery"), + } + Ok(self) + } + + pub fn join_topic(&mut self, topic_name: &str) -> Result<&Self, Box> { + let topic = gossipsub::IdentTopic::new(topic_name); + self.topic = Some(topic.clone()); + self.swarm + .as_mut() + .unwrap() + .behaviour_mut() + .gossipsub + .subscribe(&topic)?; + Ok(self) + } + + pub async fn start(&mut self) -> Result<(), Box> { + self.swarm + .as_mut() + .unwrap() + .listen_on("/ip4/0.0.0.0/udp/0/quic-v1".parse()?)?; + self.swarm + .as_mut() + .unwrap() + .listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?; + loop { + select! { + Some(line) = self.cmd_rx.recv() => { + if let Err(e) = self.swarm.as_mut().unwrap() + .behaviour_mut().gossipsub + .publish(self.topic.as_mut().unwrap().clone(), line) { + println!("Publish error: {e:?}"); + } + } + event = self.swarm.as_mut().unwrap().select_next_some() => match event { + SwarmEvent::Behaviour(MyBehaviourEvent::Mdns(mdns::Event::Discovered(list))) => { + for (peer_id, _multiaddr) in list { + // println!("mDNS discovered a new peer: {peer_id}"); + self.swarm.as_mut().unwrap().behaviour_mut().gossipsub.add_explicit_peer(&peer_id); + } + }, + SwarmEvent::Behaviour(MyBehaviourEvent::Mdns(mdns::Event::Expired(list))) => { + for (peer_id, _multiaddr) in list { + // println!("mDNS discover peer has expired: {peer_id}"); + self.swarm.as_mut().unwrap().behaviour_mut().gossipsub.remove_explicit_peer(&peer_id); + } + }, + SwarmEvent::Behaviour(MyBehaviourEvent::Gossipsub(gossipsub::Event::Message { + propagation_source: peer_id, + message_id: id, + message, + })) => { + // println!( + // "Got message with id: {id} from peer: {peer_id}", + // ); + // println!("{:?}", message); + self.evt_tx.send(message.data).await?; + }, + SwarmEvent::NewListenAddr { address, .. } => { + // println!("Local node is listening on {address}"); + } + _ => {} + } + } + } + } +} + +// #[tokio::main] +// async fn main() -> Result<(), Box> { + +// let mut p2p = EnclaveRouter::new()?; +// p2p.connect_swarm("mdns".to_string())?; +// p2p.join_topic("enclave-keygen-01")?; +// p2p.start().await?; + +// println!("Hello, cipher world!"); +// Ok(()) +// } diff --git a/packages/ciphernode/core/src/p2p/p2p.rs b/packages/ciphernode/p2p/src/p2p.rs similarity index 97% rename from packages/ciphernode/core/src/p2p/p2p.rs rename to packages/ciphernode/p2p/src/p2p.rs index 50d63b54..78d91ef0 100644 --- a/packages/ciphernode/core/src/p2p/p2p.rs +++ b/packages/ciphernode/p2p/src/p2p.rs @@ -3,10 +3,10 @@ use std::{collections::HashSet, error::Error}; /// Actor for connecting to an libp2p client via it's mpsc channel interface /// This Actor should be responsible for use actix::prelude::*; -use p2p::EnclaveRouter; +use crate::libp2p_router::EnclaveRouter; use tokio::sync::mpsc::{Receiver, Sender}; -use crate::enclave_core::{EnclaveEvent, EventBus, EventId, Subscribe}; +use enclave_core::{EnclaveEvent, EventBus, EventId, Subscribe}; pub struct P2p { diff --git a/packages/ciphernode/router/Cargo.toml b/packages/ciphernode/router/Cargo.toml new file mode 100644 index 00000000..dde6c6d3 --- /dev/null +++ b/packages/ciphernode/router/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "router" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix = "0.13.5" +enclave-core = { path = "../core" } +sortition = { path = "../sortition" } +fhe = { path = "../fhe" } +data = { path = "../data" } +keyshare = { path = "../keyshare" } +aggregator = { path = "../aggregator" } diff --git a/packages/ciphernode/core/src/router/ciphernode_selector.rs b/packages/ciphernode/router/src/ciphernode_selector.rs similarity index 94% rename from packages/ciphernode/core/src/router/ciphernode_selector.rs rename to packages/ciphernode/router/src/ciphernode_selector.rs index 449dd3b1..d3cacdb2 100644 --- a/packages/ciphernode/core/src/router/ciphernode_selector.rs +++ b/packages/ciphernode/router/src/ciphernode_selector.rs @@ -1,7 +1,8 @@ /// CiphernodeSelector is an actor that determines if a ciphernode is part of a committee and if so /// forwards a CiphernodeSelected event to the event bus use actix::prelude::*; -use crate::{enclave_core::{CiphernodeSelected, EnclaveEvent, EventBus, Subscribe}, sortition::{GetHasNode, Sortition}}; +use enclave_core::{CiphernodeSelected, EnclaveEvent, EventBus, Subscribe}; +use sortition::{GetHasNode, Sortition}; pub struct CiphernodeSelector { bus: Addr, diff --git a/packages/ciphernode/core/src/router/committee_meta.rs b/packages/ciphernode/router/src/committee_meta.rs similarity index 90% rename from packages/ciphernode/core/src/router/committee_meta.rs rename to packages/ciphernode/router/src/committee_meta.rs index b9332d75..b8de7d6c 100644 --- a/packages/ciphernode/core/src/router/committee_meta.rs +++ b/packages/ciphernode/router/src/committee_meta.rs @@ -1,4 +1,4 @@ -use crate::enclave_core::{E3Requested, EnclaveEvent, Seed}; +use enclave_core::{E3Requested, EnclaveEvent, Seed}; use super::EventHook; diff --git a/packages/ciphernode/core/src/router/e3_request_router.rs b/packages/ciphernode/router/src/e3_request_router.rs similarity index 93% rename from packages/ciphernode/core/src/router/e3_request_router.rs rename to packages/ciphernode/router/src/e3_request_router.rs index f824f6ca..355588a3 100644 --- a/packages/ciphernode/core/src/router/e3_request_router.rs +++ b/packages/ciphernode/router/src/e3_request_router.rs @@ -1,9 +1,12 @@ - -use std::{collections::HashMap, sync::Arc}; -use actix::{Actor, Addr, Context, Handler, Recipient}; -use crate::{enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}, fhe::Fhe, keyshare::Keyshare, plaintext_aggregator::PlaintextAggregator, publickey_aggregator::PublicKeyAggregator}; use super::CommitteeMeta; +use enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}; +use fhe::Fhe; +use keyshare::Keyshare; +use aggregator::PlaintextAggregator; +use aggregator::PublicKeyAggregator; +use actix::{Actor, Addr, Context, Handler, Recipient}; +use std::{collections::HashMap, sync::Arc}; /// Helper class to buffer events for downstream instances incase events arrive in the wrong order #[derive(Default)] @@ -35,7 +38,6 @@ pub struct E3RequestContext { pub meta: Option, } - impl E3RequestContext { fn recipients(&self) -> Vec<(String, Option>)> { vec![ @@ -85,10 +87,7 @@ pub struct E3RequestRouter { impl E3RequestRouter { pub fn builder(bus: Addr) -> E3RequestRouterBuilder { - E3RequestRouterBuilder { - bus, - hooks: vec![], - } + E3RequestRouterBuilder { bus, hooks: vec![] } } } diff --git a/packages/ciphernode/router/src/hooks.rs b/packages/ciphernode/router/src/hooks.rs new file mode 100644 index 00000000..da24cb56 --- /dev/null +++ b/packages/ciphernode/router/src/hooks.rs @@ -0,0 +1,111 @@ +use crate::EventHook; +use actix::{Actor, Addr}; +use aggregator::{PlaintextAggregator, PublicKeyAggregator}; +use data::Data; +use enclave_core::{E3Requested, EnclaveEvent, EventBus}; +use fhe::{Fhe, SharedRng}; +use keyshare::Keyshare; +use sortition::Sortition; +use std::sync::Arc; + +pub struct FheFactory; + +impl FheFactory { + pub fn create(rng: SharedRng) -> EventHook { + Box::new(move |ctx, evt| { + // Saving the fhe on Committee Requested + let EnclaveEvent::E3Requested { data, .. } = evt else { + return; + }; + let E3Requested { params, seed, .. } = data; + + ctx.fhe = Some(Arc::new( + Fhe::from_encoded(¶ms, seed, rng.clone()).unwrap(), + )); + }) + } +} + +pub struct KeyshareFactory; +impl KeyshareFactory { + pub fn create(bus: Addr, data: Addr, address: &str) -> EventHook { + let address = address.to_string(); + Box::new(move |ctx, evt| { + // Save Ciphernode on CiphernodeSelected + let EnclaveEvent::CiphernodeSelected { .. } = evt else { + return; + }; + + let Some(ref fhe) = ctx.fhe else { + return; + }; + + ctx.keyshare = + Some(Keyshare::new(bus.clone(), data.clone(), fhe.clone(), &address).start()) + }) + } +} + +pub struct PlaintextAggregatorFactory; +impl PlaintextAggregatorFactory { + pub fn create(bus: Addr, sortition: Addr) -> EventHook { + Box::new(move |ctx, evt| { + // Save plaintext aggregator + let EnclaveEvent::CiphertextOutputPublished { data, .. } = evt else { + return; + }; + let Some(ref fhe) = ctx.fhe else { + return; + }; + let Some(ref meta) = ctx.meta else { + return; + }; + + ctx.plaintext = Some( + PlaintextAggregator::new( + fhe.clone(), + bus.clone(), + sortition.clone(), + data.e3_id, + meta.threshold_m, + meta.seed, + data.ciphertext_output, + ) + .start(), + ); + }) + } +} + +pub struct PublicKeyAggregatorFactory; +impl PublicKeyAggregatorFactory { + pub fn create(bus: Addr, sortition: Addr) -> EventHook { + Box::new(move |ctx, evt| { + // Saving the publickey aggregator with deps on E3Requested + let EnclaveEvent::E3Requested { data, .. } = evt else { + return; + }; + + let Some(ref fhe) = ctx.fhe else { + println!("fhe was not on ctx"); + return; + }; + let Some(ref meta) = ctx.meta else { + println!("meta was not on ctx"); + return; + }; + + ctx.publickey = Some( + PublicKeyAggregator::new( + fhe.clone(), + bus.clone(), + sortition.clone(), + data.e3_id, + meta.threshold_m, + meta.seed, + ) + .start(), + ); + }) + } +} diff --git a/packages/ciphernode/core/src/router/mod.rs b/packages/ciphernode/router/src/lib.rs similarity index 84% rename from packages/ciphernode/core/src/router/mod.rs rename to packages/ciphernode/router/src/lib.rs index fb17b234..e18f8846 100644 --- a/packages/ciphernode/core/src/router/mod.rs +++ b/packages/ciphernode/router/src/lib.rs @@ -1,7 +1,10 @@ mod ciphernode_selector; mod committee_meta; mod e3_request_router; +mod hooks; pub use ciphernode_selector::*; pub use committee_meta::*; pub use e3_request_router::*; +pub use hooks::*; + diff --git a/packages/ciphernode/sortition/Cargo.toml b/packages/ciphernode/sortition/Cargo.toml index 5680e858..ec8b55c5 100644 --- a/packages/ciphernode/sortition/Cargo.toml +++ b/packages/ciphernode/sortition/Cargo.toml @@ -11,10 +11,7 @@ path = "src/lib.rs" [dependencies] num = "0.4.3" rand = "0.8.5" - -# Ethereum -futures-util = "0.3" -eyre = "0.6" alloy = { version = "0.3.3", features = ["full"] } -alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } -alloy-sol-types = { version = "0.6" } +actix = "0.13.5" +enclave-core = { path = "../core" } + diff --git a/packages/ciphernode/sortition/src/lib.rs b/packages/ciphernode/sortition/src/lib.rs index 6a99e9df..792f64fc 100644 --- a/packages/ciphernode/sortition/src/lib.rs +++ b/packages/ciphernode/sortition/src/lib.rs @@ -4,6 +4,8 @@ mod distance; mod index; +mod sortition; pub use distance::*; -pub use index::*; \ No newline at end of file +pub use index::*; +pub use sortition::*; diff --git a/packages/ciphernode/core/src/sortition/sortition.rs b/packages/ciphernode/sortition/src/sortition.rs similarity index 95% rename from packages/ciphernode/core/src/sortition/sortition.rs rename to packages/ciphernode/sortition/src/sortition.rs index c3d1e4c9..d7c61644 100644 --- a/packages/ciphernode/core/src/sortition/sortition.rs +++ b/packages/ciphernode/sortition/src/sortition.rs @@ -1,9 +1,8 @@ use std::collections::HashSet; use actix::prelude::*; -use sortition::DistanceSortition; - -use crate::enclave_core::{CiphernodeAdded, CiphernodeRemoved, EnclaveEvent, EventBus, Seed, Subscribe}; +use crate::DistanceSortition; +use enclave_core::{CiphernodeAdded, CiphernodeRemoved, EnclaveEvent, EventBus, Seed, Subscribe}; #[derive(Message, Clone, Debug, PartialEq, Eq)] diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml new file mode 100644 index 00000000..550c8630 --- /dev/null +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "test-helpers" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix = "0.13.5" +enclave-core = { path = "../core" } +bincode = "1.3.3" + diff --git a/packages/ciphernode/core/src/utils/mod.rs b/packages/ciphernode/test_helpers/src/lib.rs similarity index 100% rename from packages/ciphernode/core/src/utils/mod.rs rename to packages/ciphernode/test_helpers/src/lib.rs diff --git a/packages/ciphernode/core/src/utils/plaintext_writer.rs b/packages/ciphernode/test_helpers/src/plaintext_writer.rs similarity index 95% rename from packages/ciphernode/core/src/utils/plaintext_writer.rs rename to packages/ciphernode/test_helpers/src/plaintext_writer.rs index 7e18fd17..b3500383 100644 --- a/packages/ciphernode/core/src/utils/plaintext_writer.rs +++ b/packages/ciphernode/test_helpers/src/plaintext_writer.rs @@ -1,6 +1,6 @@ use actix::{Actor, Addr, Context, Handler}; use super::write_file_with_dirs; -use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use enclave_core::{EnclaveEvent, EventBus, Subscribe}; pub struct PlaintextWriter { path: String, diff --git a/packages/ciphernode/core/src/utils/public_key_writer.rs b/packages/ciphernode/test_helpers/src/public_key_writer.rs similarity index 93% rename from packages/ciphernode/core/src/utils/public_key_writer.rs rename to packages/ciphernode/test_helpers/src/public_key_writer.rs index 997abe78..6edcd7c0 100644 --- a/packages/ciphernode/core/src/utils/public_key_writer.rs +++ b/packages/ciphernode/test_helpers/src/public_key_writer.rs @@ -1,4 +1,4 @@ -use crate::enclave_core::{EnclaveEvent, EventBus, Subscribe}; +use enclave_core::{EnclaveEvent, EventBus, Subscribe}; use super::write_file_with_dirs; use actix::{Actor, Addr, Context, Handler}; diff --git a/packages/ciphernode/core/src/utils/utils.rs b/packages/ciphernode/test_helpers/src/utils.rs similarity index 100% rename from packages/ciphernode/core/src/utils/utils.rs rename to packages/ciphernode/test_helpers/src/utils.rs From 641aee1ebe7f642f39c5dc489c52a327ac8093b9 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 22:48:53 +1000 Subject: [PATCH 14/26] Tidy up dependencies --- packages/ciphernode/Cargo.lock | 29 ---------- packages/ciphernode/core/Cargo.toml | 14 +---- .../ciphernode/core/src/enclave_core/mod.rs | 8 --- .../core/src/{enclave_core => }/eventbus.rs | 0 .../core/src/{enclave_core => }/events.rs | 53 ------------------- packages/ciphernode/core/src/lib.rs | 12 +++-- .../src/{enclave_core => }/ordered_set.rs | 0 7 files changed, 11 insertions(+), 105 deletions(-) delete mode 100644 packages/ciphernode/core/src/enclave_core/mod.rs rename packages/ciphernode/core/src/{enclave_core => }/eventbus.rs (100%) rename packages/ciphernode/core/src/{enclave_core => }/events.rs (86%) rename packages/ciphernode/core/src/{enclave_core => }/ordered_set.rs (100%) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 336ba2e0..d30753b2 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2036,27 +2036,16 @@ name = "enclave-core" version = "0.1.0" dependencies = [ "actix", - "actix-rt", "alloy", "alloy-primitives 0.6.4", "alloy-sol-types 0.6.4", "anyhow", "async-std", - "base64 0.22.1", - "base91", "bincode", "bs58", - "fhe 0.1.0-beta.7", - "fhe-traits", - "fhe-util", "futures-util", - "libp2p", - "rand", - "rand_chacha", - "secp256k1", "serde", "sha2", - "tokio", ] [[package]] @@ -5239,24 +5228,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.11.1" diff --git a/packages/ciphernode/core/Cargo.toml b/packages/ciphernode/core/Cargo.toml index 370f8b7a..628dcdcf 100644 --- a/packages/ciphernode/core/Cargo.toml +++ b/packages/ciphernode/core/Cargo.toml @@ -10,17 +10,7 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] async-std = "1.12.0" -libp2p = "0.53.2" -fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } actix = "0.13.5" -actix-rt = "2.10.0" -anyhow = "1.0.86" -rand = "0.8.5" -rand_chacha = "0.3.1" -secp256k1 = "0.29.0" -tokio = { version = "1.39.3", features = ["full"] } sha2 = "0.10.8" bs58 = "0.5.1" serde = { version = "1.0.208", features = ["derive"] } @@ -29,5 +19,5 @@ futures-util = "0.3" alloy = { version = "0.3.3", features = ["full"] } alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = { version = "0.6" } -base64 = "0.22.1" -base91 = "0.1.0" +anyhow = "1.0.86" + diff --git a/packages/ciphernode/core/src/enclave_core/mod.rs b/packages/ciphernode/core/src/enclave_core/mod.rs deleted file mode 100644 index 36cce7df..00000000 --- a/packages/ciphernode/core/src/enclave_core/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -mod events; -mod eventbus; -mod ordered_set; - -pub use events::*; -pub use eventbus::*; -pub use ordered_set::*; - diff --git a/packages/ciphernode/core/src/enclave_core/eventbus.rs b/packages/ciphernode/core/src/eventbus.rs similarity index 100% rename from packages/ciphernode/core/src/enclave_core/eventbus.rs rename to packages/ciphernode/core/src/eventbus.rs diff --git a/packages/ciphernode/core/src/enclave_core/events.rs b/packages/ciphernode/core/src/events.rs similarity index 86% rename from packages/ciphernode/core/src/enclave_core/events.rs rename to packages/ciphernode/core/src/events.rs index d7aab3a2..e052f5a2 100644 --- a/packages/ciphernode/core/src/enclave_core/events.rs +++ b/packages/ciphernode/core/src/events.rs @@ -428,56 +428,3 @@ impl EnclaveEvent { } } -#[cfg(test)] -mod tests { - use crate::enclave_core::events::extract_enclave_event_name; - - use super::{E3id, EnclaveEvent, KeyshareCreated}; - use alloy_primitives::address; - use fhe::{ - bfv::{BfvParametersBuilder, SecretKey}, - mbfv::{CommonRandomPoly, PublicKeyShare}, - }; - use fhe_traits::Serialize; - use rand::SeedableRng; - use rand_chacha::ChaCha20Rng; - use std::error::Error; - - #[test] - fn test_extract_enum_name() { - assert_eq!( - extract_enclave_event_name("KeyshareCreated(KeyshareCreated { pubkey: [] })"), - "KeyshareCreated" - ); - assert_eq!( - extract_enclave_event_name("CommitteeSelected(SomeStruct { t: 8 })"), - "CommitteeSelected" - ); - } - - #[test] - fn test_deserialization() -> Result<(), Box> { - let moduli = &vec![0x3FFFFFFF000001]; - let degree = 2048usize; - let plaintext_modulus = 1032193u64; - let mut rng = ChaCha20Rng::from_entropy(); - let params = BfvParametersBuilder::new() - .set_degree(degree) - .set_plaintext_modulus(plaintext_modulus) - .set_moduli(&moduli) - .build_arc()?; - let crp = CommonRandomPoly::new(¶ms, &mut rng)?; - let sk_share = { SecretKey::random(¶ms, &mut rng) }; - let pk_share = { PublicKeyShare::new(&sk_share, crp.clone(), &mut rng)? }; - let pubkey = pk_share.to_bytes(); - let kse = EnclaveEvent::from(KeyshareCreated { - e3_id: E3id::from(1001), - pubkey, - node: address!("d8dA6BF26964aF9D7eEd9e03E53415D37aA96045").to_string(), - }); - let kse_bytes = kse.to_bytes()?; - let _ = EnclaveEvent::from_bytes(&kse_bytes.clone()); - // deserialization occurred without panic! - Ok(()) - } -} diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 8cc813f3..04c736f8 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -1,6 +1,12 @@ #![crate_name = "enclave_core"] #![crate_type = "lib"] -#![warn(missing_docs, unused_imports)] +// #![warn(missing_docs, unused_imports)] + +mod events; +mod eventbus; +mod ordered_set; + +pub use events::*; +pub use eventbus::*; +pub use ordered_set::*; -mod enclave_core; -pub use enclave_core::*; diff --git a/packages/ciphernode/core/src/enclave_core/ordered_set.rs b/packages/ciphernode/core/src/ordered_set.rs similarity index 100% rename from packages/ciphernode/core/src/enclave_core/ordered_set.rs rename to packages/ciphernode/core/src/ordered_set.rs From 66b79aeb7ca2224b7abb991986a97033ae3764ce Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 23:04:30 +1000 Subject: [PATCH 15/26] Add OWO --- packages/ciphernode/Cargo.lock | 15 ++++-- packages/ciphernode/enclave/Cargo.toml | 9 ++-- .../src/bin/aggregator.rs | 0 .../{enclave_node => enclave}/src/bin/node.rs | 0 packages/ciphernode/enclave/src/main.rs | 51 ++++++++++++++++--- ....rs => test_aggregation_and_decryption.rs} | 0 packages/ciphernode/test_helpers/Cargo.toml | 6 +++ .../src/bin/fake_encrypt.rs | 0 .../src/bin/pack_e3_params.rs | 0 9 files changed, 67 insertions(+), 14 deletions(-) rename packages/ciphernode/{enclave_node => enclave}/src/bin/aggregator.rs (100%) rename packages/ciphernode/{enclave_node => enclave}/src/bin/node.rs (100%) rename packages/ciphernode/enclave_node/tests/{internal.rs => test_aggregation_and_decryption.rs} (100%) rename packages/ciphernode/{enclave_node => test_helpers}/src/bin/fake_encrypt.rs (100%) rename packages/ciphernode/{enclave_node => test_helpers}/src/bin/pack_e3_params.rs (100%) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index d30753b2..d4a409f2 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2025,10 +2025,11 @@ dependencies = [ name = "enclave" version = "0.1.0" dependencies = [ - "async-std", - "fhe 0.1.0-beta.7", - "fhe-traits", - "fhe-util", + "actix-rt", + "alloy", + "clap", + "enclave_node", + "tokio", ] [[package]] @@ -5645,7 +5646,13 @@ version = "0.1.0" dependencies = [ "actix", "bincode", + "clap", "enclave-core", + "fhe 0.1.0", + "fhe 0.1.0-beta.7", + "fhe-traits", + "rand", + "rand_chacha", ] [[package]] diff --git a/packages/ciphernode/enclave/Cargo.toml b/packages/ciphernode/enclave/Cargo.toml index dba66d24..a6ecbdc8 100644 --- a/packages/ciphernode/enclave/Cargo.toml +++ b/packages/ciphernode/enclave/Cargo.toml @@ -8,7 +8,8 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -async-std = "1.12.0" -fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +enclave_node = { path = "../enclave_node" } +alloy = { version = "0.3.3", features = ["full"] } +clap = { version = "4.5.17", features = ["derive"] } +actix-rt = "2.10.0" +tokio = { version = "1.38", features = ["full"] } diff --git a/packages/ciphernode/enclave_node/src/bin/aggregator.rs b/packages/ciphernode/enclave/src/bin/aggregator.rs similarity index 100% rename from packages/ciphernode/enclave_node/src/bin/aggregator.rs rename to packages/ciphernode/enclave/src/bin/aggregator.rs diff --git a/packages/ciphernode/enclave_node/src/bin/node.rs b/packages/ciphernode/enclave/src/bin/node.rs similarity index 100% rename from packages/ciphernode/enclave_node/src/bin/node.rs rename to packages/ciphernode/enclave/src/bin/node.rs diff --git a/packages/ciphernode/enclave/src/main.rs b/packages/ciphernode/enclave/src/main.rs index 2008bce5..5b8fabe7 100644 --- a/packages/ciphernode/enclave/src/main.rs +++ b/packages/ciphernode/enclave/src/main.rs @@ -1,9 +1,48 @@ -fn main() { - // read cli inputs and or config options +use alloy::primitives::Address; +use clap::Parser; +use enclave_node::MainCiphernode; - // any preflight checks +const OWO: &str = r#" + ___ ___ ___ ___ ___ + /\__\ /\ \ /\__\ /\ \ ___ /\__\ + /:/ _/_ \:\ \ /:/ / /::\ \ /\ \ /:/ _/_ + /:/ /\__\ \:\ \ /:/ / /:/\:\ \ \:\ \ /:/ /\__\ + /:/ /:/ _/_ _____\:\ \ /:/ / ___ ___ ___ /:/ /::\ \ \:\ \ /:/ /:/ _/_ + /:/_/:/ /\__\ /::::::::\__\ /:/__/ /\__\ /\ \ /\__\ /:/_/:/\:\__\ ___ \:\__\ /:/_/:/ /\__\ + \:\/:/ /:/ / \:\~~\~~\/__/ \:\ \ /:/ / \:\ \ /:/ / \:\/:/ \/__/ /\ \ |:| | \:\/:/ /:/ / + \::/_/:/ / \:\ \ \:\ /:/ / \:\ /:/ / \::/__/ \:\ \|:| | \::/_/:/ / + \:\/:/ / \:\ \ \:\/:/ / \:\/:/ / \:\ \ \:\__|:|__| \:\/:/ / + \::/ / \:\__\ \::/ / \::/ / \:\__\ \::::/__/ \::/ / + \/__/ \/__/ \/__/ \/__/ \/__/ ~~~~ \/__/ + +"#; - // launch production ready enclave node +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +struct Args { + #[arg(short = 'a', long)] + address: String, + #[arg(short = 'r', long)] + rpc: String, + #[arg(short = 'e', long = "enclave-contract")] + enclave_contract: String, + #[arg(short = 'c', long = "registry-contract")] + registry_contract: String, +} - println!("Hello, cipher world!"); -} \ No newline at end of file +#[actix_rt::main] +async fn main() -> Result<(), Box> { + println!("\n\n\n\n\n{}", OWO); + println!("\n\n\n\n"); + let args = Args::parse(); + let address = Address::parse_checksummed(&args.address, None).expect("Invalid address"); + println!("LAUNCHING CIPHERNODE: ({})", address); + let registry_contract = + Address::parse_checksummed(&args.registry_contract, None).expect("Invalid address"); + let enclave_contract = + Address::parse_checksummed(&args.enclave_contract, None).expect("Invalid address"); + let (_, handle) = + MainCiphernode::attach(address, &args.rpc, enclave_contract, registry_contract).await; + let _ = tokio::join!(handle); + Ok(()) +} diff --git a/packages/ciphernode/enclave_node/tests/internal.rs b/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs similarity index 100% rename from packages/ciphernode/enclave_node/tests/internal.rs rename to packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index 550c8630..0637c41d 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -6,5 +6,11 @@ edition = "2021" [dependencies] actix = "0.13.5" enclave-core = { path = "../core" } +fhe = { path = "../fhe" } bincode = "1.3.3" +clap = { version = "4.5.17", features = ["derive"] } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +rand_chacha = "0.3.1" +rand = "0.8.5" diff --git a/packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs similarity index 100% rename from packages/ciphernode/enclave_node/src/bin/fake_encrypt.rs rename to packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs diff --git a/packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs similarity index 100% rename from packages/ciphernode/enclave_node/src/bin/pack_e3_params.rs rename to packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs From a37032974567522e4a69d1befee468afe66fa678 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 23:10:00 +1000 Subject: [PATCH 16/26] Use enclave binary --- packages/ciphernode/enclave/src/bin/node.rs | 28 --------------------- packages/ciphernode/scripts/launch.sh | 2 +- tests/basic_integration/lib/prebuild.sh | 2 +- 3 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 packages/ciphernode/enclave/src/bin/node.rs diff --git a/packages/ciphernode/enclave/src/bin/node.rs b/packages/ciphernode/enclave/src/bin/node.rs deleted file mode 100644 index a961ffae..00000000 --- a/packages/ciphernode/enclave/src/bin/node.rs +++ /dev/null @@ -1,28 +0,0 @@ -use alloy::primitives::Address; -use clap::Parser; -use enclave_node::MainCiphernode; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Args { - #[arg(short = 'a', long)] - address: String, - #[arg(short='r', long)] - rpc: String, - #[arg(short = 'e', long = "enclave-contract")] - enclave_contract: String, - #[arg(short = 'c', long = "registry-contract")] - registry_contract: String -} - -#[actix_rt::main] -async fn main() -> Result<(), Box> { - let args = Args::parse(); - let address = Address::parse_checksummed(&args.address, None).expect("Invalid address"); - println!("LAUNCHING CIPHERNODE: ({})", address); - let registry_contract = Address::parse_checksummed(&args.registry_contract, None).expect("Invalid address"); - let enclave_contract = Address::parse_checksummed(&args.enclave_contract, None).expect("Invalid address"); - let (_, handle) = MainCiphernode::attach(address, &args.rpc, enclave_contract, registry_contract).await; - let _ = tokio::join!(handle); - Ok(()) -} diff --git a/packages/ciphernode/scripts/launch.sh b/packages/ciphernode/scripts/launch.sh index 547e3dbb..d0afb599 100755 --- a/packages/ciphernode/scripts/launch.sh +++ b/packages/ciphernode/scripts/launch.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -RUSTFLAGS="-A warnings" cargo run --bin node -- "$@" +RUSTFLAGS="-A warnings" cargo run --bin enclave -- "$@" diff --git a/tests/basic_integration/lib/prebuild.sh b/tests/basic_integration/lib/prebuild.sh index 6a765c9c..a3cd9e88 100755 --- a/tests/basic_integration/lib/prebuild.sh +++ b/tests/basic_integration/lib/prebuild.sh @@ -1,3 +1,3 @@ #!/usr/bin/env sh -cd packages/ciphernode && RUSTFLAGS="-A warnings" cargo build --bin fake_encrypt --bin node --bin aggregator; +cd packages/ciphernode && RUSTFLAGS="-A warnings" cargo build --bin fake_encrypt --bin enclave --bin aggregator; From 3982eb029b8a8d30ef8da5ed8ba98249366dae66 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 23:24:38 +1000 Subject: [PATCH 17/26] Update factories to be called Lazy to better reflect their meaning --- .../ciphernode/enclave_node/src/aggregator.rs | 11 +++++------ .../ciphernode/enclave_node/src/ciphernode.rs | 7 +++---- .../tests/test_aggregation_and_decryption.rs | 13 ++++++------- .../ciphernode/router/src/e3_request_router.rs | 11 ++++++++--- packages/ciphernode/router/src/hooks.rs | 16 ++++++++-------- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/packages/ciphernode/enclave_node/src/aggregator.rs b/packages/ciphernode/enclave_node/src/aggregator.rs index 8c0901c4..d1048a8e 100644 --- a/packages/ciphernode/enclave_node/src/aggregator.rs +++ b/packages/ciphernode/enclave_node/src/aggregator.rs @@ -7,8 +7,8 @@ use p2p::P2p; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; use router::{ - CommitteeMetaFactory, E3RequestRouter, FheFactory, PlaintextAggregatorFactory, - PublicKeyAggregatorFactory, + CommitteeMetaFactory, E3RequestRouter, LazyFhe, LazyPlaintextAggregator, + LazyPublicKeyAggregator, }; use sortition::Sortition; use std::sync::{Arc, Mutex}; @@ -67,13 +67,12 @@ impl MainAggregator { .await; let e3_manager = E3RequestRouter::builder(bus.clone()) - .add_hook(CommitteeMetaFactory::create()) - .add_hook(FheFactory::create(rng)) - .add_hook(PublicKeyAggregatorFactory::create( + .add_hook(LazyFhe::create(rng)) + .add_hook(LazyPublicKeyAggregator::create( bus.clone(), sortition.clone(), )) - .add_hook(PlaintextAggregatorFactory::create( + .add_hook(LazyPlaintextAggregator::create( bus.clone(), sortition.clone(), )) diff --git a/packages/ciphernode/enclave_node/src/ciphernode.rs b/packages/ciphernode/enclave_node/src/ciphernode.rs index bee1a9eb..f4324332 100644 --- a/packages/ciphernode/enclave_node/src/ciphernode.rs +++ b/packages/ciphernode/enclave_node/src/ciphernode.rs @@ -8,7 +8,7 @@ use p2p::P2p; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; use router::{ - CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, FheFactory, KeyshareFactory, + CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, LazyFhe, LazyKeyshare, }; use sortition::Sortition; use std::sync::{Arc, Mutex}; @@ -67,9 +67,8 @@ impl MainCiphernode { let _ = connect_evm_ciphernode_registry(bus.clone(), rpc_url, registry_contract).await; let e3_manager = E3RequestRouter::builder(bus.clone()) - .add_hook(CommitteeMetaFactory::create()) - .add_hook(FheFactory::create(rng)) - .add_hook(KeyshareFactory::create( + .add_hook(LazyFhe::create(rng)) + .add_hook(LazyKeyshare::create( bus.clone(), data.clone(), &address.to_string(), diff --git a/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs index 3db3de83..332c8074 100644 --- a/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs @@ -9,8 +9,8 @@ use fhe::{setup_crp_params, ParamsWithCrp, SharedRng}; use logger::SimpleLogger; use p2p::P2p; use router::{ - CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, FheFactory, KeyshareFactory, - PlaintextAggregatorFactory, PublicKeyAggregatorFactory, + CiphernodeSelector, E3RequestRouter, LazyFhe, LazyKeyshare, + LazyPlaintextAggregator, LazyPublicKeyAggregator, }; use sortition::Sortition; @@ -39,17 +39,16 @@ async fn setup_local_ciphernode(bus: Addr, rng: SharedRng, logging: bo CiphernodeSelector::attach(bus.clone(), sortition.clone(), addr); E3RequestRouter::builder(bus.clone()) - .add_hook(CommitteeMetaFactory::create()) - .add_hook(FheFactory::create(rng)) - .add_hook(PublicKeyAggregatorFactory::create( + .add_hook(LazyFhe::create(rng)) + .add_hook(LazyPublicKeyAggregator::create( bus.clone(), sortition.clone(), )) - .add_hook(PlaintextAggregatorFactory::create( + .add_hook(LazyPlaintextAggregator::create( bus.clone(), sortition.clone(), )) - .add_hook(KeyshareFactory::create(bus.clone(), data.clone(), addr)) + .add_hook(LazyKeyshare::create(bus.clone(), data.clone(), addr)) .build(); SimpleLogger::attach(addr, bus.clone()); diff --git a/packages/ciphernode/router/src/e3_request_router.rs b/packages/ciphernode/router/src/e3_request_router.rs index 355588a3..83178023 100644 --- a/packages/ciphernode/router/src/e3_request_router.rs +++ b/packages/ciphernode/router/src/e3_request_router.rs @@ -1,9 +1,11 @@ +use crate::CommitteeMetaFactory; + use super::CommitteeMeta; +use aggregator::PlaintextAggregator; +use aggregator::PublicKeyAggregator; use enclave_core::{E3id, EnclaveEvent, EventBus, Subscribe}; use fhe::Fhe; use keyshare::Keyshare; -use aggregator::PlaintextAggregator; -use aggregator::PublicKeyAggregator; use actix::{Actor, Addr, Context, Handler, Recipient}; use std::{collections::HashMap, sync::Arc}; @@ -87,7 +89,10 @@ pub struct E3RequestRouter { impl E3RequestRouter { pub fn builder(bus: Addr) -> E3RequestRouterBuilder { - E3RequestRouterBuilder { bus, hooks: vec![] } + let builder = E3RequestRouterBuilder { bus, hooks: vec![] }; + + // Everything needs the committe meta factory so adding it here by default + builder.add_hook(CommitteeMetaFactory::create()) } } diff --git a/packages/ciphernode/router/src/hooks.rs b/packages/ciphernode/router/src/hooks.rs index da24cb56..f904f8e0 100644 --- a/packages/ciphernode/router/src/hooks.rs +++ b/packages/ciphernode/router/src/hooks.rs @@ -8,9 +8,9 @@ use keyshare::Keyshare; use sortition::Sortition; use std::sync::Arc; -pub struct FheFactory; +pub struct LazyFhe; -impl FheFactory { +impl LazyFhe { pub fn create(rng: SharedRng) -> EventHook { Box::new(move |ctx, evt| { // Saving the fhe on Committee Requested @@ -26,8 +26,8 @@ impl FheFactory { } } -pub struct KeyshareFactory; -impl KeyshareFactory { +pub struct LazyKeyshare; +impl LazyKeyshare { pub fn create(bus: Addr, data: Addr, address: &str) -> EventHook { let address = address.to_string(); Box::new(move |ctx, evt| { @@ -46,8 +46,8 @@ impl KeyshareFactory { } } -pub struct PlaintextAggregatorFactory; -impl PlaintextAggregatorFactory { +pub struct LazyPlaintextAggregator; +impl LazyPlaintextAggregator { pub fn create(bus: Addr, sortition: Addr) -> EventHook { Box::new(move |ctx, evt| { // Save plaintext aggregator @@ -77,8 +77,8 @@ impl PlaintextAggregatorFactory { } } -pub struct PublicKeyAggregatorFactory; -impl PublicKeyAggregatorFactory { +pub struct LazyPublicKeyAggregator; +impl LazyPublicKeyAggregator { pub fn create(bus: Addr, sortition: Addr) -> EventHook { Box::new(move |ctx, evt| { // Saving the publickey aggregator with deps on E3Requested From a1f5983605c48977a1dc28c90aaa64f8ae7721d0 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 3 Oct 2024 23:45:41 +1000 Subject: [PATCH 18/26] Extract out tests module --- packages/ciphernode/Cargo.lock | 34 ++++++++++++++++++ packages/ciphernode/Cargo.toml | 2 +- packages/ciphernode/tests/Cargo.toml | 35 +++++++++++++++++++ packages/ciphernode/tests/src/main.rs | 3 ++ .../tests/test_aggregation_and_decryption.rs | 0 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 packages/ciphernode/tests/Cargo.toml create mode 100644 packages/ciphernode/tests/src/main.rs rename packages/ciphernode/{enclave_node => tests}/tests/test_aggregation_and_decryption.rs (100%) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index d4a409f2..a8cf48d9 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -5655,6 +5655,40 @@ dependencies = [ "rand_chacha", ] +[[package]] +name = "tests" +version = "0.1.0" +dependencies = [ + "actix", + "actix-rt", + "aggregator", + "alloy", + "alloy-primitives 0.6.4", + "anyhow", + "async-std", + "base64 0.22.1", + "base91", + "bfv", + "bincode", + "clap", + "data", + "enclave-core", + "evm", + "fhe 0.1.0", + "fhe 0.1.0-beta.7", + "fhe-traits", + "fhe-util", + "keyshare", + "logger", + "p2p", + "rand", + "rand_chacha", + "router", + "sortition", + "test-helpers", + "tokio", +] + [[package]] name = "thiserror" version = "1.0.63" diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index cfc59420..dffbb841 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["core", "enclave", "enclave_node", "p2p", "bfv", "data", "evm", "fhe", "router", "keyshare", "aggregator", "test_helpers", "logger"] +members = ["core", "enclave", "enclave_node", "p2p", "bfv", "data", "evm", "fhe", "router", "keyshare", "aggregator", "test_helpers", "logger", "tests"] diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml new file mode 100644 index 00000000..3cad1dba --- /dev/null +++ b/packages/ciphernode/tests/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "tests" +version = "0.1.0" +edition = "2021" + +[dependencies] +p2p = { path = "../p2p" } +bfv = { path = "../bfv" } +sortition = { path = "../sortition" } +enclave-core = { path = "../core" } +evm = { path = "../evm" } +logger = { path = "../logger" } +fhe = { path = "../fhe" } +data = { path = "../data" } +keyshare = { path = "../keyshare" } +aggregator = { path = "../aggregator" } +router = { path = "../router" } +test-helpers = { path = "../test_helpers" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +async-std = "1.12.0" +tokio = { version = "1.38", features = ["full"] } +actix-rt = "2.10.0" +alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +alloy = { version = "0.3.3", features = ["full"] } +clap = { version = "4.5.17", features = ["derive"] } +rand_chacha = "0.3.1" +rand = "0.8.5" +bincode = "1.3.3" +base91 = "0.1.0" +base64 = "0.22.1" +actix = "0.13.5" +anyhow = "1.0.86" + diff --git a/packages/ciphernode/tests/src/main.rs b/packages/ciphernode/tests/src/main.rs new file mode 100644 index 00000000..4c8d6791 --- /dev/null +++ b/packages/ciphernode/tests/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Intentially left blank"); +} diff --git a/packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs similarity index 100% rename from packages/ciphernode/enclave_node/tests/test_aggregation_and_decryption.rs rename to packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs From 4229c19b92292d8ddc99b8c745412a66686611d9 Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 00:03:08 +1000 Subject: [PATCH 19/26] Fix wait for file bug --- tests/basic_integration/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic_integration/test.sh b/tests/basic_integration/test.sh index c832905f..942a4576 100755 --- a/tests/basic_integration/test.sh +++ b/tests/basic_integration/test.sh @@ -114,7 +114,7 @@ PRIVATE_KEY=$PRIVATE_KEY yarn ciphernode:aggregator --rpc "$RPC_URL" --enclave-c sleep 1 -waiton-files "$ROOT_DIR/packages/ciphernode/target/debug/node" "$ROOT_DIR/packages/ciphernode/target/debug/aggregator" "$ROOT_DIR/packages/ciphernode/target/debug/fake_encrypt" +waiton-files "$ROOT_DIR/packages/ciphernode/target/debug/enclave" "$ROOT_DIR/packages/ciphernode/target/debug/aggregator" "$ROOT_DIR/packages/ciphernode/target/debug/fake_encrypt" heading "Add ciphernode $CIPHERNODE_ADDRESS_1" yarn ciphernode:add --ciphernode-address $CIPHERNODE_ADDRESS_1 --network localhost From 02c2cd20d9be2947b014005dd50dd2b514232baf Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 09:15:53 +1000 Subject: [PATCH 20/26] Add formatting --- packages/ciphernode/Cargo.lock | 1 - packages/ciphernode/Cargo.toml | 5 ++ packages/ciphernode/aggregator/Cargo.toml | 6 +- packages/ciphernode/aggregator/src/lib.rs | 1 - .../aggregator/src/plaintext_aggregator.rs | 2 - .../aggregator/src/publickey_aggregator.rs | 1 - packages/ciphernode/bfv/src/lib.rs | 71 +++++++++++-------- packages/ciphernode/bfv/src/util.rs | 2 +- packages/ciphernode/core/Cargo.toml | 3 +- packages/ciphernode/core/src/events.rs | 1 - packages/ciphernode/core/src/lib.rs | 5 +- packages/ciphernode/core/src/ordered_set.rs | 2 +- packages/ciphernode/data/src/data.rs | 2 +- .../ciphernode/enclave/src/bin/aggregator.rs | 9 +-- .../ciphernode/enclave_node/src/ciphernode.rs | 4 +- packages/ciphernode/enclave_node/src/main.rs | 2 +- packages/ciphernode/evm/src/caller.rs | 49 +++++++------ packages/ciphernode/evm/src/lib.rs | 1 - packages/ciphernode/evm/src/listener.rs | 7 +- packages/ciphernode/evm/src/manager.rs | 3 +- packages/ciphernode/fhe/src/lib.rs | 1 - packages/ciphernode/keyshare/src/keyshare.rs | 5 +- packages/ciphernode/logger/src/logger.rs | 11 +-- packages/ciphernode/p2p/src/libp2p_router.rs | 5 +- packages/ciphernode/p2p/src/p2p.rs | 3 +- .../ciphernode/router/src/committee_meta.rs | 5 +- .../router/src/e3_request_router.rs | 2 +- packages/ciphernode/router/src/lib.rs | 1 - packages/ciphernode/sortition/src/distance.rs | 1 - packages/ciphernode/sortition/src/index.rs | 8 ++- .../ciphernode/sortition/src/sortition.rs | 5 +- .../test_helpers/src/plaintext_writer.rs | 2 +- .../test_helpers/src/public_key_writer.rs | 2 +- packages/ciphernode/test_helpers/src/utils.rs | 2 +- .../tests/test_aggregation_and_decryption.rs | 5 +- 35 files changed, 115 insertions(+), 120 deletions(-) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index a8cf48d9..7e89a61a 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2041,7 +2041,6 @@ dependencies = [ "alloy-primitives 0.6.4", "alloy-sol-types 0.6.4", "anyhow", - "async-std", "bincode", "bs58", "futures-util", diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index dffbb841..2721c058 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -1,2 +1,7 @@ [workspace] members = ["core", "enclave", "enclave_node", "p2p", "bfv", "data", "evm", "fhe", "router", "keyshare", "aggregator", "test_helpers", "logger", "tests"] + +[workspace.dependencies] +actix = "0.13.5" +anyhow = "1.0.86" +bincode = "1.3.3" diff --git a/packages/ciphernode/aggregator/Cargo.toml b/packages/ciphernode/aggregator/Cargo.toml index e759d389..ab863371 100644 --- a/packages/ciphernode/aggregator/Cargo.toml +++ b/packages/ciphernode/aggregator/Cargo.toml @@ -4,10 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] -actix = "0.13.5" -anyhow = "1.0.86" +actix = { workspace = true } +anyhow = { workspace = true } +bincode = { workspace = true } enclave-core = { path = "../core" } fhe = { path = "../fhe" } sortition = { path = "../sortition" } -bincode = "1.3.3" diff --git a/packages/ciphernode/aggregator/src/lib.rs b/packages/ciphernode/aggregator/src/lib.rs index f3637991..db42567c 100644 --- a/packages/ciphernode/aggregator/src/lib.rs +++ b/packages/ciphernode/aggregator/src/lib.rs @@ -3,4 +3,3 @@ mod publickey_aggregator; pub use plaintext_aggregator::*; pub use publickey_aggregator::*; - diff --git a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs index 013e6571..99231da3 100644 --- a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs +++ b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs @@ -190,5 +190,3 @@ impl Handler for PlaintextAggregator { Ok(()) } } - - diff --git a/packages/ciphernode/aggregator/src/publickey_aggregator.rs b/packages/ciphernode/aggregator/src/publickey_aggregator.rs index 56bc1228..8f1d13b4 100644 --- a/packages/ciphernode/aggregator/src/publickey_aggregator.rs +++ b/packages/ciphernode/aggregator/src/publickey_aggregator.rs @@ -190,4 +190,3 @@ impl Handler for PublicKeyAggregator { Ok(()) } } - diff --git a/packages/ciphernode/bfv/src/lib.rs b/packages/ciphernode/bfv/src/lib.rs index d8e55781..b3c76b19 100644 --- a/packages/ciphernode/bfv/src/lib.rs +++ b/packages/ciphernode/bfv/src/lib.rs @@ -4,14 +4,14 @@ mod util; -use std::{sync::Arc}; use fhe::{ bfv::{BfvParameters, BfvParametersBuilder, Ciphertext, Encoding, Plaintext, SecretKey}, mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, }; -use fhe_traits::{FheDecoder, Serialize as FheSerialize, Deserialize, DeserializeParametrized}; -use rand::{Rng, rngs::OsRng, thread_rng}; -use util::timeit::{timeit}; +use fhe_traits::{Deserialize, DeserializeParametrized, FheDecoder, Serialize as FheSerialize}; +use rand::{rngs::OsRng, thread_rng, Rng}; +use std::sync::Arc; +use util::timeit::timeit; pub struct EnclaveBFV { pub pk_share: PublicKeyShare, @@ -22,52 +22,63 @@ pub struct EnclaveBFV { impl EnclaveBFV { pub fn new(degree: usize, plaintext_modulus: u64, moduli: Vec) -> Self { - // let degree = 4096; - // let plaintext_modulus: u64 = 4096; - // let moduli = vec![0xffffee001, 0xffffc4001, 0x1ffffe0001]; + // let degree = 4096; + // let plaintext_modulus: u64 = 4096; + // let moduli = vec![0xffffee001, 0xffffc4001, 0x1ffffe0001]; - // Generate the BFV parameters structure. - let params = timeit!( - "Parameters generation", - BfvParametersBuilder::new() - .set_degree(degree) - .set_plaintext_modulus(plaintext_modulus) - .set_moduli(&moduli) - .build_arc().unwrap() - ); + // Generate the BFV parameters structure. + let params = timeit!( + "Parameters generation", + BfvParametersBuilder::new() + .set_degree(degree) + .set_plaintext_modulus(plaintext_modulus) + .set_moduli(&moduli) + .build_arc() + .unwrap() + ); - let crp = CommonRandomPoly::new(¶ms, &mut thread_rng()).unwrap(); - //TODO: save encrypted sk_share to disk? + let crp = CommonRandomPoly::new(¶ms, &mut thread_rng()).unwrap(); + //TODO: save encrypted sk_share to disk? let sk_share = SecretKey::random(¶ms, &mut OsRng); let pk_share = PublicKeyShare::new(&sk_share, crp.clone(), &mut thread_rng()).unwrap(); - Self { pk_share, sk_share, params, crp } + Self { + pk_share, + sk_share, + params, + crp, + } } pub fn serialize_pk(&mut self) -> Vec { - self.pk_share.to_bytes() + self.pk_share.to_bytes() } - pub fn deserialize_pk(&mut self, bytes: Vec, par_bytes: Vec, crp_bytes: Vec) -> PublicKeyShare { - let params = Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()); - let crp = CommonRandomPoly::deserialize(&crp_bytes, ¶ms).unwrap(); - PublicKeyShare::deserialize(&bytes, ¶ms, crp.clone()).unwrap() + pub fn deserialize_pk( + &mut self, + bytes: Vec, + par_bytes: Vec, + crp_bytes: Vec, + ) -> PublicKeyShare { + let params = Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()); + let crp = CommonRandomPoly::deserialize(&crp_bytes, ¶ms).unwrap(); + PublicKeyShare::deserialize(&bytes, ¶ms, crp.clone()).unwrap() } pub fn serialize_crp(&mut self) -> Vec { - self.crp.to_bytes() + self.crp.to_bytes() } pub fn deserialize_crp(&mut self, bytes: Vec, par_bytes: Vec) -> CommonRandomPoly { - let params = Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()); - CommonRandomPoly::deserialize(&bytes, ¶ms).unwrap() + let params = Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()); + CommonRandomPoly::deserialize(&bytes, ¶ms).unwrap() } pub fn serialize_params(&mut self) -> Vec { - self.params.to_bytes() + self.params.to_bytes() } pub fn deserialize_params(&mut self, par_bytes: Vec) -> Arc { - Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()) + Arc::new(BfvParameters::try_deserialize(&par_bytes).unwrap()) } -} \ No newline at end of file +} diff --git a/packages/ciphernode/bfv/src/util.rs b/packages/ciphernode/bfv/src/util.rs index 8e3d167f..2b5c2e48 100644 --- a/packages/ciphernode/bfv/src/util.rs +++ b/packages/ciphernode/bfv/src/util.rs @@ -126,4 +126,4 @@ pub fn encode_database( } #[allow(dead_code)] -fn main() {} \ No newline at end of file +fn main() {} diff --git a/packages/ciphernode/core/Cargo.toml b/packages/ciphernode/core/Cargo.toml index 628dcdcf..82d7d6a1 100644 --- a/packages/ciphernode/core/Cargo.toml +++ b/packages/ciphernode/core/Cargo.toml @@ -9,8 +9,7 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -async-std = "1.12.0" -actix = "0.13.5" +actix = { workspace = true } sha2 = "0.10.8" bs58 = "0.5.1" serde = { version = "1.0.208", features = ["derive"] } diff --git a/packages/ciphernode/core/src/events.rs b/packages/ciphernode/core/src/events.rs index e052f5a2..22b70648 100644 --- a/packages/ciphernode/core/src/events.rs +++ b/packages/ciphernode/core/src/events.rs @@ -427,4 +427,3 @@ impl EnclaveEvent { extract_enclave_event_name(&s).to_string() } } - diff --git a/packages/ciphernode/core/src/lib.rs b/packages/ciphernode/core/src/lib.rs index 04c736f8..154d1461 100644 --- a/packages/ciphernode/core/src/lib.rs +++ b/packages/ciphernode/core/src/lib.rs @@ -2,11 +2,10 @@ #![crate_type = "lib"] // #![warn(missing_docs, unused_imports)] -mod events; mod eventbus; +mod events; mod ordered_set; -pub use events::*; pub use eventbus::*; +pub use events::*; pub use ordered_set::*; - diff --git a/packages/ciphernode/core/src/ordered_set.rs b/packages/ciphernode/core/src/ordered_set.rs index c263e30a..31eaedfa 100644 --- a/packages/ciphernode/core/src/ordered_set.rs +++ b/packages/ciphernode/core/src/ordered_set.rs @@ -1,6 +1,6 @@ use std::collections::BTreeSet; -use std::hash::{Hash, Hasher}; use std::fmt; +use std::hash::{Hash, Hasher}; #[derive(Clone)] pub struct OrderedSet(BTreeSet); diff --git a/packages/ciphernode/data/src/data.rs b/packages/ciphernode/data/src/data.rs index 3201e0ca..2b6804c8 100644 --- a/packages/ciphernode/data/src/data.rs +++ b/packages/ciphernode/data/src/data.rs @@ -1,5 +1,5 @@ -use std::collections::BTreeMap; use actix::{Actor, Context, Handler, Message}; +use std::collections::BTreeMap; // TODO: replace with sled version diff --git a/packages/ciphernode/enclave/src/bin/aggregator.rs b/packages/ciphernode/enclave/src/bin/aggregator.rs index 7c03d011..dc3b1745 100644 --- a/packages/ciphernode/enclave/src/bin/aggregator.rs +++ b/packages/ciphernode/enclave/src/bin/aggregator.rs @@ -25,11 +25,8 @@ async fn main() -> Result<(), Box> { println!("LAUNCHING AGGREGATOR"); let registry_contract = Address::parse_checksummed(&args.registry_contract, None).expect("Invalid address"); - let registry_filter_contract = Address::parse_checksummed( - &args.registry_filter_contract, - None, - ) - .expect("Invalid address"); + let registry_filter_contract = + Address::parse_checksummed(&args.registry_filter_contract, None).expect("Invalid address"); let enclave_contract = Address::parse_checksummed(&args.enclave_contract, None).expect("Invalid address"); let (_, handle) = MainAggregator::attach( @@ -38,7 +35,7 @@ async fn main() -> Result<(), Box> { registry_contract, registry_filter_contract, args.pubkey_write_path.as_deref(), - args.plaintext_write_path.as_deref() + args.plaintext_write_path.as_deref(), ) .await; let _ = tokio::join!(handle); diff --git a/packages/ciphernode/enclave_node/src/ciphernode.rs b/packages/ciphernode/enclave_node/src/ciphernode.rs index f4324332..e55914ac 100644 --- a/packages/ciphernode/enclave_node/src/ciphernode.rs +++ b/packages/ciphernode/enclave_node/src/ciphernode.rs @@ -7,9 +7,7 @@ use logger::SimpleLogger; use p2p::P2p; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; -use router::{ - CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, LazyFhe, LazyKeyshare, -}; +use router::{CiphernodeSelector, CommitteeMetaFactory, E3RequestRouter, LazyFhe, LazyKeyshare}; use sortition::Sortition; use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; diff --git a/packages/ciphernode/enclave_node/src/main.rs b/packages/ciphernode/enclave_node/src/main.rs index c2079c01..6ca69372 100644 --- a/packages/ciphernode/enclave_node/src/main.rs +++ b/packages/ciphernode/enclave_node/src/main.rs @@ -1,5 +1,6 @@ use std::error::Error; +use alloy::primitives::address; use bfv::EnclaveBFV; use p2p::EnclaveRouter; use sortition::DistanceSortition; @@ -7,7 +8,6 @@ use tokio::{ self, io::{self, AsyncBufReadExt, BufReader}, }; -use alloy::primitives::address; const OWO: &str = r#" ___ ___ ___ ___ ___ diff --git a/packages/ciphernode/evm/src/caller.rs b/packages/ciphernode/evm/src/caller.rs index 7961ab2c..9f2c8b5c 100644 --- a/packages/ciphernode/evm/src/caller.rs +++ b/packages/ciphernode/evm/src/caller.rs @@ -8,7 +8,6 @@ use sortition::{GetNodes, Sortition}; use super::EVMContract; - pub struct EvmCaller { contracts: HashMap>, bus: Addr, @@ -20,10 +19,7 @@ impl Actor for EvmCaller { } impl EvmCaller { - pub fn new( - bus: Addr, - sortition: Addr, - ) -> Self { + pub fn new(bus: Addr, sortition: Addr) -> Self { Self { contracts: HashMap::new(), bus, @@ -35,10 +31,7 @@ impl EvmCaller { self.contracts.insert(name.to_string(), contract); } - pub fn attach( - bus: Addr, - sortition: Addr, - ) -> Addr { + pub fn attach(bus: Addr, sortition: Addr) -> Addr { let addr = Self::new(bus.clone(), sortition).start(); bus.do_send(Subscribe::new( @@ -94,10 +87,15 @@ impl Handler for EvmCaller { nodes, Bytes::from(data.pubkey), ) - .await + .await { - Ok(tx) => println!("Published committee public key {:?}", tx.transaction_hash), - Err(e) => eprintln!("Failed to publish committee public key: {:?}", e), + Ok(tx) => println!( + "Published committee public key {:?}", + tx.transaction_hash + ), + Err(e) => { + eprintln!("Failed to publish committee public key: {:?}", e) + } } } } @@ -112,7 +110,9 @@ impl Handler for EvmCaller { ) .await { - Ok(tx) => println!("Published plaintext output {:?}", tx.transaction_hash), + Ok(tx) => { + println!("Published plaintext output {:?}", tx.transaction_hash) + } Err(e) => eprintln!("Failed to publish plaintext: {:?}", e), } } @@ -126,7 +126,6 @@ impl Handler for EvmCaller { } } - pub async fn connect_evm_caller( bus: Addr, sortition: Addr, @@ -139,15 +138,19 @@ pub async fn connect_evm_caller( let enclave_instance = EVMContract::new(rpc_url, enclave_contract).await?; let registry_instance = EVMContract::new(rpc_url, registry_contract).await?; - evm_caller.send(AddContract { - name: "enclave".to_string(), - contract: Arc::new(enclave_instance), - }).await?; - - evm_caller.send(AddContract { - name: "registry".to_string(), - contract: Arc::new(registry_instance), - }).await?; + evm_caller + .send(AddContract { + name: "enclave".to_string(), + contract: Arc::new(enclave_instance), + }) + .await?; + + evm_caller + .send(AddContract { + name: "registry".to_string(), + contract: Arc::new(registry_instance), + }) + .await?; Ok(evm_caller) } diff --git a/packages/ciphernode/evm/src/lib.rs b/packages/ciphernode/evm/src/lib.rs index 2a15ccdb..c977102d 100644 --- a/packages/ciphernode/evm/src/lib.rs +++ b/packages/ciphernode/evm/src/lib.rs @@ -11,4 +11,3 @@ pub use contracts::*; pub use enclave::*; pub use listener::*; pub use manager::*; - diff --git a/packages/ciphernode/evm/src/listener.rs b/packages/ciphernode/evm/src/listener.rs index b501b3c9..1bac6d7d 100644 --- a/packages/ciphernode/evm/src/listener.rs +++ b/packages/ciphernode/evm/src/listener.rs @@ -7,11 +7,11 @@ use alloy::{ transports::BoxTransport, }; use anyhow::Result; +use enclave_core::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; use futures_util::stream::StreamExt; use std::collections::HashMap; use std::marker::PhantomData; use std::sync::Arc; -use enclave_core::{EnclaveErrorType, EnclaveEvent, EventBus, FromError}; pub trait ContractEvent: Send + Sync + 'static { fn process(&self, bus: Addr) -> Result<()>; @@ -64,10 +64,7 @@ impl EvmEventListener { // Send enclave error to bus self.bus .clone() - .do_send(EnclaveEvent::from_error( - EnclaveErrorType::Evm, - err, - )); + .do_send(EnclaveEvent::from_error(EnclaveErrorType::Evm, err)); } } } diff --git a/packages/ciphernode/evm/src/manager.rs b/packages/ciphernode/evm/src/manager.rs index aee9ce2b..7c061fdd 100644 --- a/packages/ciphernode/evm/src/manager.rs +++ b/packages/ciphernode/evm/src/manager.rs @@ -6,8 +6,8 @@ use alloy::{ transports::BoxTransport, }; use anyhow::Result; -use std::sync::Arc; use enclave_core::EventBus; +use std::sync::Arc; use super::{EvmEventListener, StartListening}; @@ -72,4 +72,3 @@ impl Handler for EvmContractManager { } } } - diff --git a/packages/ciphernode/fhe/src/lib.rs b/packages/ciphernode/fhe/src/lib.rs index ad7c0b8b..75b9bd75 100644 --- a/packages/ciphernode/fhe/src/lib.rs +++ b/packages/ciphernode/fhe/src/lib.rs @@ -3,4 +3,3 @@ mod utils; pub use fhe::*; pub use utils::*; - diff --git a/packages/ciphernode/keyshare/src/keyshare.rs b/packages/ciphernode/keyshare/src/keyshare.rs index ffa1f29a..0a36ee6a 100644 --- a/packages/ciphernode/keyshare/src/keyshare.rs +++ b/packages/ciphernode/keyshare/src/keyshare.rs @@ -1,11 +1,11 @@ +use actix::prelude::*; +use anyhow::{anyhow, Context, Result}; use data::{Data, Get, Insert}; use enclave_core::{ CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, EnclaveErrorType, EnclaveEvent, EventBus, FromError, KeyshareCreated, }; use fhe::{DecryptCiphertext, Fhe}; -use actix::prelude::*; -use anyhow::{anyhow, Context, Result}; use std::sync::Arc; pub struct Keyshare { @@ -135,4 +135,3 @@ async fn on_decryption_requested( Ok(()) } - diff --git a/packages/ciphernode/logger/src/logger.rs b/packages/ciphernode/logger/src/logger.rs index 38c594f3..fd241329 100644 --- a/packages/ciphernode/logger/src/logger.rs +++ b/packages/ciphernode/logger/src/logger.rs @@ -42,10 +42,13 @@ impl Handler for SimpleLogger { } EnclaveEvent::CiphernodeAdded { data, .. } => { println!("[{}]: CiphernodeAdded({})", self.name, data.address); - }, - EnclaveEvent::E3Requested { data,.. } => { - println!("[{}]: E3Requested(e3_id: {}, threshold_m: {} , seed: {})", self.name, data.e3_id, data.threshold_m, data.seed); - }, + } + EnclaveEvent::E3Requested { data, .. } => { + println!( + "[{}]: E3Requested(e3_id: {}, threshold_m: {} , seed: {})", + self.name, data.e3_id, data.threshold_m, data.seed + ); + } EnclaveEvent::EnclaveError { data, .. } => { println!("[{}]: EnclaveError('{}')", self.name, data.message); } diff --git a/packages/ciphernode/p2p/src/libp2p_router.rs b/packages/ciphernode/p2p/src/libp2p_router.rs index fb81cee2..55511bff 100644 --- a/packages/ciphernode/p2p/src/libp2p_router.rs +++ b/packages/ciphernode/p2p/src/libp2p_router.rs @@ -16,14 +16,13 @@ pub struct MyBehaviour { mdns: mdns::tokio::Behaviour, } - pub struct EnclaveRouter { pub identity: Option, pub gossipsub_config: gossipsub::Config, pub swarm: Option>, pub topic: Option, evt_tx: Sender>, - cmd_rx: Receiver> + cmd_rx: Receiver>, } impl EnclaveRouter { @@ -51,7 +50,7 @@ impl EnclaveRouter { swarm: None, topic: None, evt_tx, - cmd_rx + cmd_rx, }, cmd_tx, evt_rx, diff --git a/packages/ciphernode/p2p/src/p2p.rs b/packages/ciphernode/p2p/src/p2p.rs index 78d91ef0..fd70c42f 100644 --- a/packages/ciphernode/p2p/src/p2p.rs +++ b/packages/ciphernode/p2p/src/p2p.rs @@ -1,14 +1,13 @@ use std::{collections::HashSet, error::Error}; +use crate::libp2p_router::EnclaveRouter; /// Actor for connecting to an libp2p client via it's mpsc channel interface /// This Actor should be responsible for use actix::prelude::*; -use crate::libp2p_router::EnclaveRouter; use tokio::sync::mpsc::{Receiver, Sender}; use enclave_core::{EnclaveEvent, EventBus, EventId, Subscribe}; - pub struct P2p { bus: Addr, tx: Sender>, diff --git a/packages/ciphernode/router/src/committee_meta.rs b/packages/ciphernode/router/src/committee_meta.rs index b8de7d6c..24103ab2 100644 --- a/packages/ciphernode/router/src/committee_meta.rs +++ b/packages/ciphernode/router/src/committee_meta.rs @@ -2,7 +2,6 @@ use enclave_core::{E3Requested, EnclaveEvent, Seed}; use super::EventHook; - #[derive(Clone, Debug, PartialEq, Eq)] pub struct CommitteeMeta { pub threshold_m: usize, @@ -18,9 +17,7 @@ impl CommitteeMetaFactory { return; }; let E3Requested { - threshold_m, - seed, - .. + threshold_m, seed, .. } = data; ctx.meta = Some(CommitteeMeta { threshold_m, seed }); diff --git a/packages/ciphernode/router/src/e3_request_router.rs b/packages/ciphernode/router/src/e3_request_router.rs index 83178023..0d46c689 100644 --- a/packages/ciphernode/router/src/e3_request_router.rs +++ b/packages/ciphernode/router/src/e3_request_router.rs @@ -90,7 +90,7 @@ pub struct E3RequestRouter { impl E3RequestRouter { pub fn builder(bus: Addr) -> E3RequestRouterBuilder { let builder = E3RequestRouterBuilder { bus, hooks: vec![] }; - + // Everything needs the committe meta factory so adding it here by default builder.add_hook(CommitteeMetaFactory::create()) } diff --git a/packages/ciphernode/router/src/lib.rs b/packages/ciphernode/router/src/lib.rs index e18f8846..1f9fae2f 100644 --- a/packages/ciphernode/router/src/lib.rs +++ b/packages/ciphernode/router/src/lib.rs @@ -7,4 +7,3 @@ pub use ciphernode_selector::*; pub use committee_meta::*; pub use e3_request_router::*; pub use hooks::*; - diff --git a/packages/ciphernode/sortition/src/distance.rs b/packages/ciphernode/sortition/src/distance.rs index bf11f405..421f8130 100644 --- a/packages/ciphernode/sortition/src/distance.rs +++ b/packages/ciphernode/sortition/src/distance.rs @@ -35,4 +35,3 @@ impl DistanceSortition { result } } - diff --git a/packages/ciphernode/sortition/src/index.rs b/packages/ciphernode/sortition/src/index.rs index da7162cc..3c2bcf0e 100644 --- a/packages/ciphernode/sortition/src/index.rs +++ b/packages/ciphernode/sortition/src/index.rs @@ -8,7 +8,11 @@ pub struct IndexSortition { impl IndexSortition { pub fn new(random_seed: u64, num_nodes: usize, size: usize) -> Self { - Self { random_seed, num_nodes, size } + Self { + random_seed, + num_nodes, + size, + } } fn get_committee(&mut self) -> Vec { @@ -33,4 +37,4 @@ impl IndexSortition { // Return the leaf indices of the selected committee committee } -} \ No newline at end of file +} diff --git a/packages/ciphernode/sortition/src/sortition.rs b/packages/ciphernode/sortition/src/sortition.rs index d7c61644..ca33e3dd 100644 --- a/packages/ciphernode/sortition/src/sortition.rs +++ b/packages/ciphernode/sortition/src/sortition.rs @@ -1,10 +1,9 @@ use std::collections::HashSet; -use actix::prelude::*; use crate::DistanceSortition; +use actix::prelude::*; use enclave_core::{CiphernodeAdded, CiphernodeRemoved, EnclaveEvent, EventBus, Seed, Subscribe}; - #[derive(Message, Clone, Debug, PartialEq, Eq)] #[rtype(result = "bool")] pub struct GetHasNode { @@ -66,7 +65,6 @@ impl SortitionList for SortitionModule { #[rtype(result = "Vec")] pub struct GetNodes; - pub struct Sortition { list: SortitionModule, } @@ -138,4 +136,3 @@ impl Handler for Sortition { self.get_nodes() } } - diff --git a/packages/ciphernode/test_helpers/src/plaintext_writer.rs b/packages/ciphernode/test_helpers/src/plaintext_writer.rs index b3500383..967b15d2 100644 --- a/packages/ciphernode/test_helpers/src/plaintext_writer.rs +++ b/packages/ciphernode/test_helpers/src/plaintext_writer.rs @@ -1,5 +1,5 @@ -use actix::{Actor, Addr, Context, Handler}; use super::write_file_with_dirs; +use actix::{Actor, Addr, Context, Handler}; use enclave_core::{EnclaveEvent, EventBus, Subscribe}; pub struct PlaintextWriter { diff --git a/packages/ciphernode/test_helpers/src/public_key_writer.rs b/packages/ciphernode/test_helpers/src/public_key_writer.rs index 6edcd7c0..e797dd73 100644 --- a/packages/ciphernode/test_helpers/src/public_key_writer.rs +++ b/packages/ciphernode/test_helpers/src/public_key_writer.rs @@ -1,6 +1,6 @@ -use enclave_core::{EnclaveEvent, EventBus, Subscribe}; use super::write_file_with_dirs; use actix::{Actor, Addr, Context, Handler}; +use enclave_core::{EnclaveEvent, EventBus, Subscribe}; pub struct PublicKeyWriter { path: String, diff --git a/packages/ciphernode/test_helpers/src/utils.rs b/packages/ciphernode/test_helpers/src/utils.rs index a4cf269a..f100610b 100644 --- a/packages/ciphernode/test_helpers/src/utils.rs +++ b/packages/ciphernode/test_helpers/src/utils.rs @@ -1,4 +1,4 @@ -use std::{fs,io::Write, path::Path}; +use std::{fs, io::Write, path::Path}; pub fn write_file_with_dirs(path: &str, content: &[u8]) -> std::io::Result<()> { let abs_path = if Path::new(path).is_absolute() { Path::new(path).to_path_buf() diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index 332c8074..c9a45590 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -1,4 +1,3 @@ - use data::Data; use enclave_core::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, @@ -9,8 +8,8 @@ use fhe::{setup_crp_params, ParamsWithCrp, SharedRng}; use logger::SimpleLogger; use p2p::P2p; use router::{ - CiphernodeSelector, E3RequestRouter, LazyFhe, LazyKeyshare, - LazyPlaintextAggregator, LazyPublicKeyAggregator, + CiphernodeSelector, E3RequestRouter, LazyFhe, LazyKeyshare, LazyPlaintextAggregator, + LazyPublicKeyAggregator, }; use sortition::Sortition; From d8462df48d845f5002a2323d3f2e9406df7d5abe Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 09:36:31 +1000 Subject: [PATCH 21/26] Add formatting to ci --- .github/workflows/rust-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 3e9d2f46..91b7f76a 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -19,7 +19,10 @@ jobs: with: toolchain: 1.81.0 override: true - + + - name: Checking code format + run: cd ./packages/ciphernode && cargo fmt -- --check + - name: Run tests run: | cd ./packages/ciphernode/ From 70ff0cb2af3a0f102481fb4e5428a606b083d6e0 Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 09:40:10 +1000 Subject: [PATCH 22/26] Format toml files --- packages/ciphernode/Cargo.toml | 17 ++++++++++++++++- packages/ciphernode/aggregator/Cargo.toml | 1 - packages/ciphernode/core/Cargo.toml | 7 +++++-- packages/ciphernode/data/Cargo.toml | 1 - packages/ciphernode/enclave_node/Cargo.toml | 6 +++++- packages/ciphernode/evm/Cargo.toml | 6 +++++- packages/ciphernode/fhe/Cargo.toml | 1 - packages/ciphernode/p2p/Cargo.toml | 15 ++++++++++++++- packages/ciphernode/rendezvous/Cargo.toml | 13 +++++++++++-- packages/ciphernode/sortition/Cargo.toml | 1 - packages/ciphernode/test_helpers/Cargo.toml | 1 - packages/ciphernode/tests/Cargo.toml | 7 +++++-- 12 files changed, 61 insertions(+), 15 deletions(-) diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 2721c058..d0c4cd56 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -1,5 +1,20 @@ [workspace] -members = ["core", "enclave", "enclave_node", "p2p", "bfv", "data", "evm", "fhe", "router", "keyshare", "aggregator", "test_helpers", "logger", "tests"] +members = [ + "core", + "enclave", + "enclave_node", + "p2p", + "bfv", + "data", + "evm", + "fhe", + "router", + "keyshare", + "aggregator", + "test_helpers", + "logger", + "tests", +] [workspace.dependencies] actix = "0.13.5" diff --git a/packages/ciphernode/aggregator/Cargo.toml b/packages/ciphernode/aggregator/Cargo.toml index ab863371..695e6bf6 100644 --- a/packages/ciphernode/aggregator/Cargo.toml +++ b/packages/ciphernode/aggregator/Cargo.toml @@ -10,4 +10,3 @@ bincode = { workspace = true } enclave-core = { path = "../core" } fhe = { path = "../fhe" } sortition = { path = "../sortition" } - diff --git a/packages/ciphernode/core/Cargo.toml b/packages/ciphernode/core/Cargo.toml index 82d7d6a1..42e9f287 100644 --- a/packages/ciphernode/core/Cargo.toml +++ b/packages/ciphernode/core/Cargo.toml @@ -16,7 +16,10 @@ serde = { version = "1.0.208", features = ["derive"] } bincode = "1.3.3" futures-util = "0.3" alloy = { version = "0.3.3", features = ["full"] } -alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +alloy-primitives = { version = "0.6", default-features = false, features = [ + "rlp", + "serde", + "std", +] } alloy-sol-types = { version = "0.6" } anyhow = "1.0.86" - diff --git a/packages/ciphernode/data/Cargo.toml b/packages/ciphernode/data/Cargo.toml index c3951e8f..1c9177fa 100644 --- a/packages/ciphernode/data/Cargo.toml +++ b/packages/ciphernode/data/Cargo.toml @@ -7,4 +7,3 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] actix = "0.13.5" - diff --git a/packages/ciphernode/enclave_node/Cargo.toml b/packages/ciphernode/enclave_node/Cargo.toml index 4f5f0d33..9a5f0838 100644 --- a/packages/ciphernode/enclave_node/Cargo.toml +++ b/packages/ciphernode/enclave_node/Cargo.toml @@ -26,7 +26,11 @@ fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-bet async-std = "1.12.0" tokio = { version = "1.38", features = ["full"] } actix-rt = "2.10.0" -alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +alloy-primitives = { version = "0.6", default-features = false, features = [ + "rlp", + "serde", + "std", +] } alloy = { version = "0.3.3", features = ["full"] } clap = { version = "4.5.17", features = ["derive"] } rand_chacha = "0.3.1" diff --git a/packages/ciphernode/evm/Cargo.toml b/packages/ciphernode/evm/Cargo.toml index 07950698..67d4ee3a 100644 --- a/packages/ciphernode/evm/Cargo.toml +++ b/packages/ciphernode/evm/Cargo.toml @@ -6,7 +6,11 @@ edition = "2021" [dependencies] actix = "0.13.5" alloy = { version = "0.3.3", features = ["full"] } -alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +alloy-primitives = { version = "0.6", default-features = false, features = [ + "rlp", + "serde", + "std", +] } anyhow = "1.0.86" enclave-core = { path = "../core" } futures-util = "0.3" diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 0f48ab48..0d9306d8 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -13,4 +13,3 @@ rand = "0.8.5" rand_chacha = "0.3.1" bincode = "1.3.3" serde = { version = "1.0.208", features = ["derive"] } - diff --git a/packages/ciphernode/p2p/Cargo.toml b/packages/ciphernode/p2p/Cargo.toml index 4d778ab1..75645b88 100644 --- a/packages/ciphernode/p2p/Cargo.toml +++ b/packages/ciphernode/p2p/Cargo.toml @@ -11,7 +11,20 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" async-std = { version = "1.12", features = ["attributes"] } async-trait = "0.1" futures = "0.3.30" -libp2p = { version = "0.53.2", features = [ "async-std", "identify", "macros", "noise", "ping", "rendezvous", "tcp", "tokio", "yamux", "mdns", "gossipsub", "quic"] } +libp2p = { version = "0.53.2", features = [ + "async-std", + "identify", + "macros", + "noise", + "ping", + "rendezvous", + "tcp", + "tokio", + "yamux", + "mdns", + "gossipsub", + "quic", +] } tokio = { version = "1.38", features = ["full"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/packages/ciphernode/rendezvous/Cargo.toml b/packages/ciphernode/rendezvous/Cargo.toml index 23a35b16..1874b5ad 100644 --- a/packages/ciphernode/rendezvous/Cargo.toml +++ b/packages/ciphernode/rendezvous/Cargo.toml @@ -14,8 +14,17 @@ fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-bet async-std = { version = "1.12", features = ["attributes"] } async-trait = "0.1" futures = "0.3.30" -libp2p = { version = "0.53.2", features = [ "async-std", "identify", "macros", "noise", "ping", "rendezvous", "tcp", "tokio", "yamux"] } +libp2p = { version = "0.53.2", features = [ + "async-std", + "identify", + "macros", + "noise", + "ping", + "rendezvous", + "tcp", + "tokio", + "yamux", +] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros", "time"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3", features = ["env-filter"] } - diff --git a/packages/ciphernode/sortition/Cargo.toml b/packages/ciphernode/sortition/Cargo.toml index ec8b55c5..5e7268f2 100644 --- a/packages/ciphernode/sortition/Cargo.toml +++ b/packages/ciphernode/sortition/Cargo.toml @@ -14,4 +14,3 @@ rand = "0.8.5" alloy = { version = "0.3.3", features = ["full"] } actix = "0.13.5" enclave-core = { path = "../core" } - diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index 0637c41d..c480951e 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -13,4 +13,3 @@ fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", versi fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } rand_chacha = "0.3.1" rand = "0.8.5" - diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index 3cad1dba..e81e4615 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -22,7 +22,11 @@ fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-bet async-std = "1.12.0" tokio = { version = "1.38", features = ["full"] } actix-rt = "2.10.0" -alloy-primitives = { version = "0.6", default-features = false, features = ["rlp", "serde", "std"] } +alloy-primitives = { version = "0.6", default-features = false, features = [ + "rlp", + "serde", + "std", +] } alloy = { version = "0.3.3", features = ["full"] } clap = { version = "4.5.17", features = ["derive"] } rand_chacha = "0.3.1" @@ -32,4 +36,3 @@ base91 = "0.1.0" base64 = "0.22.1" actix = "0.13.5" anyhow = "1.0.86" - From 0fe9b9216e0fdac718e58b555d9ce4a76051c01b Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 09:50:46 +1000 Subject: [PATCH 23/26] Pin deps to workspace pt 1 --- packages/ciphernode/Cargo.lock | 6 ---- packages/ciphernode/Cargo.toml | 20 +++++++++++ packages/ciphernode/core/Cargo.toml | 22 +++++------- packages/ciphernode/data/Cargo.toml | 2 +- packages/ciphernode/enclave/Cargo.toml | 8 ++--- packages/ciphernode/enclave_node/Cargo.toml | 40 ++++++++------------- packages/ciphernode/evm/Cargo.toml | 14 +++----- 7 files changed, 54 insertions(+), 58 deletions(-) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 7e89a61a..16d9f7b9 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2058,9 +2058,6 @@ dependencies = [ "alloy", "alloy-primitives 0.6.4", "anyhow", - "async-std", - "base64 0.22.1", - "base91", "bfv", "bincode", "clap", @@ -2068,9 +2065,6 @@ dependencies = [ "enclave-core", "evm", "fhe 0.1.0", - "fhe 0.1.0-beta.7", - "fhe-traits", - "fhe-util", "keyshare", "logger", "p2p", diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index d0c4cd56..2ff420e1 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -18,5 +18,25 @@ members = [ [workspace.dependencies] actix = "0.13.5" +actix-rt = "2.10.0" +alloy = { version = "0.3.3", features = ["full"] } +alloy-primitives = { version = "0.6", default-features = false, features = [ + "rlp", + "serde", + "std", +] } +alloy-sol-types = { version = "0.6" } anyhow = "1.0.86" bincode = "1.3.3" +bs58 = "0.5.1" +clap = { version = "4.5.17", features = ["derive"] } +enclave_node = { path = "../enclave_node" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +futures-util = "0.3" +rand_chacha = "0.3.1" +rand = "0.8.5" +serde = { version = "1.0.208", features = ["derive"] } +sha2 = "0.10.8" +tokio = { version = "1.38", features = ["full"] } diff --git a/packages/ciphernode/core/Cargo.toml b/packages/ciphernode/core/Cargo.toml index 42e9f287..ede42cc4 100644 --- a/packages/ciphernode/core/Cargo.toml +++ b/packages/ciphernode/core/Cargo.toml @@ -10,16 +10,12 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] actix = { workspace = true } -sha2 = "0.10.8" -bs58 = "0.5.1" -serde = { version = "1.0.208", features = ["derive"] } -bincode = "1.3.3" -futures-util = "0.3" -alloy = { version = "0.3.3", features = ["full"] } -alloy-primitives = { version = "0.6", default-features = false, features = [ - "rlp", - "serde", - "std", -] } -alloy-sol-types = { version = "0.6" } -anyhow = "1.0.86" +sha2 = { workspace = true } +bs58 = { workspace = true } +serde = { workspace = true } +bincode = { workspace = true } +futures-util = { workspace = true } +alloy = { workspace = true } +alloy-primitives = { workspace = true } +alloy-sol-types = { workspace = true } +anyhow = { workspace = true } diff --git a/packages/ciphernode/data/Cargo.toml b/packages/ciphernode/data/Cargo.toml index 1c9177fa..5624cf4f 100644 --- a/packages/ciphernode/data/Cargo.toml +++ b/packages/ciphernode/data/Cargo.toml @@ -6,4 +6,4 @@ description = "Data persistence for enclave" repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] -actix = "0.13.5" +actix = { workspace = true } diff --git a/packages/ciphernode/enclave/Cargo.toml b/packages/ciphernode/enclave/Cargo.toml index a6ecbdc8..9bb7bd96 100644 --- a/packages/ciphernode/enclave/Cargo.toml +++ b/packages/ciphernode/enclave/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] enclave_node = { path = "../enclave_node" } -alloy = { version = "0.3.3", features = ["full"] } -clap = { version = "4.5.17", features = ["derive"] } -actix-rt = "2.10.0" -tokio = { version = "1.38", features = ["full"] } +alloy = { workspace = true } +clap = { workspace = true } +actix-rt = { workspace = true } +tokio = { workspace = true } diff --git a/packages/ciphernode/enclave_node/Cargo.toml b/packages/ciphernode/enclave_node/Cargo.toml index 9a5f0838..dc40e29d 100644 --- a/packages/ciphernode/enclave_node/Cargo.toml +++ b/packages/ciphernode/enclave_node/Cargo.toml @@ -8,35 +8,25 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -p2p = { path = "../p2p" } +actix = { workspace = true } +actix-rt = { workspace = true } +aggregator = { path = "../aggregator" } +alloy = { workspace = true } +alloy-primitives = { workspace = true } +anyhow = { workspace = true } bfv = { path = "../bfv" } -sortition = { path = "../sortition" } +bincode = { workspace = true } +clap = { workspace = true } +data = { path = "../data" } enclave-core = { path = "../core" } evm = { path = "../evm" } -logger = { path = "../logger" } fhe = { path = "../fhe" } -data = { path = "../data" } keyshare = { path = "../keyshare" } -aggregator = { path = "../aggregator" } +logger = { path = "../logger" } +p2p = { path = "../p2p" } +rand = { workspace = true } +rand_chacha = { workspace = true } router = { path = "../router" } +sortition = { path = "../sortition" } test-helpers = { path = "../test_helpers" } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -async-std = "1.12.0" -tokio = { version = "1.38", features = ["full"] } -actix-rt = "2.10.0" -alloy-primitives = { version = "0.6", default-features = false, features = [ - "rlp", - "serde", - "std", -] } -alloy = { version = "0.3.3", features = ["full"] } -clap = { version = "4.5.17", features = ["derive"] } -rand_chacha = "0.3.1" -rand = "0.8.5" -bincode = "1.3.3" -base91 = "0.1.0" -base64 = "0.22.1" -actix = "0.13.5" -anyhow = "1.0.86" +tokio = { workspace = true } diff --git a/packages/ciphernode/evm/Cargo.toml b/packages/ciphernode/evm/Cargo.toml index 67d4ee3a..d99406de 100644 --- a/packages/ciphernode/evm/Cargo.toml +++ b/packages/ciphernode/evm/Cargo.toml @@ -4,14 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] -actix = "0.13.5" -alloy = { version = "0.3.3", features = ["full"] } -alloy-primitives = { version = "0.6", default-features = false, features = [ - "rlp", - "serde", - "std", -] } -anyhow = "1.0.86" +actix = { workspace = true } +alloy = { workspace = true } +alloy-primitives = { workspace = true } +anyhow = { workspace = true } enclave-core = { path = "../core" } -futures-util = "0.3" +futures-util = { workspace = true } sortition = { path = "../sortition" } From e858cdfa93ed66a1f5fdfd02a35594afb3ec9a1d Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 10:03:08 +1000 Subject: [PATCH 24/26] Pin deps to workspace pt 2 --- packages/ciphernode/Cargo.lock | 7 ----- packages/ciphernode/Cargo.toml | 21 +++++++++++++ packages/ciphernode/fhe/Cargo.toml | 16 +++++----- packages/ciphernode/keyshare/Cargo.toml | 4 +-- packages/ciphernode/logger/Cargo.toml | 4 +-- packages/ciphernode/p2p/Cargo.toml | 18 +++++------ packages/ciphernode/rendezvous/Cargo.toml | 20 ++++++------ packages/ciphernode/router/Cargo.toml | 2 +- packages/ciphernode/sortition/Cargo.toml | 8 ++--- packages/ciphernode/test_helpers/Cargo.toml | 14 ++++----- packages/ciphernode/tests/Cargo.toml | 35 +++++++++------------ 11 files changed, 79 insertions(+), 70 deletions(-) diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 16d9f7b9..f4b8a1d7 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1370,12 +1370,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "base91" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb5fbae7b5ee422f239444a3dca9bdf5ecb3abf3af1bf87c8097db3f7bc025" - [[package]] name = "bfv" version = "0.1.0" @@ -5660,7 +5654,6 @@ dependencies = [ "anyhow", "async-std", "base64 0.22.1", - "base91", "bfv", "bincode", "clap", diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 2ff420e1..a2884404 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -27,16 +27,37 @@ alloy-primitives = { version = "0.6", default-features = false, features = [ ] } alloy-sol-types = { version = "0.6" } anyhow = "1.0.86" +async-std = { version = "1.12", features = ["attributes"] } +async-trait = "0.1" bincode = "1.3.3" bs58 = "0.5.1" +base64 = "0.22.1" clap = { version = "4.5.17", features = ["derive"] } enclave_node = { path = "../enclave_node" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } +futures = "0.3.30" futures-util = "0.3" +num = "0.4.3" rand_chacha = "0.3.1" rand = "0.8.5" serde = { version = "1.0.208", features = ["derive"] } sha2 = "0.10.8" tokio = { version = "1.38", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +libp2p = { version = "0.53.2", features = [ + "async-std", + "identify", + "macros", + "noise", + "ping", + "rendezvous", + "tcp", + "tokio", + "yamux", + "mdns", + "gossipsub", + "quic", +] } diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 0d9306d8..05cf7414 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -5,11 +5,11 @@ edition = "2021" [dependencies] enclave-core = { path = "../core" } -anyhow = "1.0.86" -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -rand = "0.8.5" -rand_chacha = "0.3.1" -bincode = "1.3.3" -serde = { version = "1.0.208", features = ["derive"] } +anyhow = { workspace = true } +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +fhe-util = { workspace = true } +rand = { workspace = true } +rand_chacha = { workspace = true } +bincode = { workspace = true } +serde = { workspace = true } diff --git a/packages/ciphernode/keyshare/Cargo.toml b/packages/ciphernode/keyshare/Cargo.toml index 4a3dc8ab..29ad7d0d 100644 --- a/packages/ciphernode/keyshare/Cargo.toml +++ b/packages/ciphernode/keyshare/Cargo.toml @@ -7,5 +7,5 @@ edition = "2021" data = { path = "../data" } enclave-core = { path = "../core" } fhe = { path = "../fhe" } -actix = "0.13.5" -anyhow = "1.0.86" +actix = { workspace = true } +anyhow = { workspace = true } diff --git a/packages/ciphernode/logger/Cargo.toml b/packages/ciphernode/logger/Cargo.toml index a02153a2..3e70edd8 100644 --- a/packages/ciphernode/logger/Cargo.toml +++ b/packages/ciphernode/logger/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" [dependencies] enclave-core = { path = "../core" } -actix = "0.13.5" -base64 = "0.22.1" +actix = { workspace = true } +base64 = { workspace = true } diff --git a/packages/ciphernode/p2p/Cargo.toml b/packages/ciphernode/p2p/Cargo.toml index 75645b88..fa79f116 100644 --- a/packages/ciphernode/p2p/Cargo.toml +++ b/packages/ciphernode/p2p/Cargo.toml @@ -8,10 +8,10 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -async-std = { version = "1.12", features = ["attributes"] } -async-trait = "0.1" -futures = "0.3.30" -libp2p = { version = "0.53.2", features = [ +async-std = { workspace = true, features = ["attributes"] } +async-trait = { workspace = true } +futures = { workspace = true } +libp2p = { workspace = true, features = [ "async-std", "identify", "macros", @@ -25,9 +25,9 @@ libp2p = { version = "0.53.2", features = [ "gossipsub", "quic", ] } -tokio = { version = "1.38", features = ["full"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tokio = { workspace = true, features = ["full"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } enclave-core = { path = "../core" } -anyhow = "1.0.86" -actix = "0.13.5" +anyhow = { workspace = true } +actix = { workspace = true } diff --git a/packages/ciphernode/rendezvous/Cargo.toml b/packages/ciphernode/rendezvous/Cargo.toml index 1874b5ad..2d573bd6 100644 --- a/packages/ciphernode/rendezvous/Cargo.toml +++ b/packages/ciphernode/rendezvous/Cargo.toml @@ -8,13 +8,13 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -fhe = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -async-std = { version = "1.12", features = ["attributes"] } -async-trait = "0.1" -futures = "0.3.30" -libp2p = { version = "0.53.2", features = [ +fhe = { workspace = true } +fhe-traits = { workspace = true } +fhe-util = { workspace = true } +async-std = { workspace = true, features = ["attributes"] } +async-trait = { workspace = true } +futures = { workspace = true } +libp2p = { workspace = true, features = [ "async-std", "identify", "macros", @@ -25,6 +25,6 @@ libp2p = { version = "0.53.2", features = [ "tokio", "yamux", ] } -tokio = { version = "1.38", features = ["rt-multi-thread", "macros", "time"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tokio = { workspace = true, features = ["rt-multi-thread", "macros", "time"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } diff --git a/packages/ciphernode/router/Cargo.toml b/packages/ciphernode/router/Cargo.toml index dde6c6d3..aef11dc7 100644 --- a/packages/ciphernode/router/Cargo.toml +++ b/packages/ciphernode/router/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -actix = "0.13.5" +actix = { workspace = true } enclave-core = { path = "../core" } sortition = { path = "../sortition" } fhe = { path = "../fhe" } diff --git a/packages/ciphernode/sortition/Cargo.toml b/packages/ciphernode/sortition/Cargo.toml index 5e7268f2..8e540191 100644 --- a/packages/ciphernode/sortition/Cargo.toml +++ b/packages/ciphernode/sortition/Cargo.toml @@ -9,8 +9,8 @@ path = "src/lib.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -num = "0.4.3" -rand = "0.8.5" -alloy = { version = "0.3.3", features = ["full"] } -actix = "0.13.5" +num = { workspace = true } +rand = { workspace = true } +alloy = { workspace = true, features = ["full"] } +actix = { workspace = true } enclave-core = { path = "../core" } diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index c480951e..52fa85a7 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -4,12 +4,12 @@ version = "0.1.0" edition = "2021" [dependencies] -actix = "0.13.5" +actix = { workspace = true } enclave-core = { path = "../core" } fhe = { path = "../fhe" } -bincode = "1.3.3" -clap = { version = "4.5.17", features = ["derive"] } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -rand_chacha = "0.3.1" -rand = "0.8.5" +bincode = { workspace = true } +clap = { workspace = true, features = ["derive"] } +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +rand_chacha = { workspace = true } +rand = { workspace = true } diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index e81e4615..cd179984 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -16,23 +16,18 @@ keyshare = { path = "../keyshare" } aggregator = { path = "../aggregator" } router = { path = "../router" } test-helpers = { path = "../test_helpers" } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", version = "0.1.0-beta.7" } -async-std = "1.12.0" -tokio = { version = "1.38", features = ["full"] } -actix-rt = "2.10.0" -alloy-primitives = { version = "0.6", default-features = false, features = [ - "rlp", - "serde", - "std", -] } -alloy = { version = "0.3.3", features = ["full"] } -clap = { version = "4.5.17", features = ["derive"] } -rand_chacha = "0.3.1" -rand = "0.8.5" -bincode = "1.3.3" -base91 = "0.1.0" -base64 = "0.22.1" -actix = "0.13.5" -anyhow = "1.0.86" +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +fhe-util = { workspace = true } +async-std = { workspace = true } +tokio = { workspace = true } +actix-rt = { workspace = true } +alloy-primitives = { workspace = true } +alloy = { workspace = true } +clap = { workspace = true } +rand_chacha = { workspace = true } +rand = { workspace = true } +bincode = { workspace = true } +base64 = { workspace = true } +actix = { workspace = true } +anyhow = { workspace = true } From 79de7fedf3b07f17628ceaa48c1a913cac51f9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 4 Oct 2024 10:18:40 +1000 Subject: [PATCH 25/26] Update packages/ciphernode/enclave/src/main.rs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- packages/ciphernode/enclave/src/main.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/ciphernode/enclave/src/main.rs b/packages/ciphernode/enclave/src/main.rs index 5b8fabe7..0fc0d84a 100644 --- a/packages/ciphernode/enclave/src/main.rs +++ b/packages/ciphernode/enclave/src/main.rs @@ -35,12 +35,15 @@ async fn main() -> Result<(), Box> { println!("\n\n\n\n\n{}", OWO); println!("\n\n\n\n"); let args = Args::parse(); - let address = Address::parse_checksummed(&args.address, None).expect("Invalid address"); + let address = Address::parse_checksummed(&args.address, None) + .map_err(|e| format!("Invalid node address: {}", e))?; println!("LAUNCHING CIPHERNODE: ({})", address); let registry_contract = - Address::parse_checksummed(&args.registry_contract, None).expect("Invalid address"); + Address::parse_checksummed(&args.registry_contract, None) + .map_err(|e| format!("Invalid registry contract address: {}", e))?; let enclave_contract = - Address::parse_checksummed(&args.enclave_contract, None).expect("Invalid address"); + Address::parse_checksummed(&args.enclave_contract, None) + .map_err(|e| format!("Invalid enclave contract address: {}", e))?; let (_, handle) = MainCiphernode::attach(address, &args.rpc, enclave_contract, registry_contract).await; let _ = tokio::join!(handle); From db3e086e1140c75ddad8421b2382f74ed62e48c1 Mon Sep 17 00:00:00 2001 From: ryardley Date: Fri, 4 Oct 2024 10:20:39 +1000 Subject: [PATCH 26/26] Revert "Update packages/ciphernode/enclave/src/main.rs" This reverts commit 79de7fedf3b07f17628ceaa48c1a913cac51f9e5. --- packages/ciphernode/enclave/src/main.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/ciphernode/enclave/src/main.rs b/packages/ciphernode/enclave/src/main.rs index 0fc0d84a..5b8fabe7 100644 --- a/packages/ciphernode/enclave/src/main.rs +++ b/packages/ciphernode/enclave/src/main.rs @@ -35,15 +35,12 @@ async fn main() -> Result<(), Box> { println!("\n\n\n\n\n{}", OWO); println!("\n\n\n\n"); let args = Args::parse(); - let address = Address::parse_checksummed(&args.address, None) - .map_err(|e| format!("Invalid node address: {}", e))?; + let address = Address::parse_checksummed(&args.address, None).expect("Invalid address"); println!("LAUNCHING CIPHERNODE: ({})", address); let registry_contract = - Address::parse_checksummed(&args.registry_contract, None) - .map_err(|e| format!("Invalid registry contract address: {}", e))?; + Address::parse_checksummed(&args.registry_contract, None).expect("Invalid address"); let enclave_contract = - Address::parse_checksummed(&args.enclave_contract, None) - .map_err(|e| format!("Invalid enclave contract address: {}", e))?; + Address::parse_checksummed(&args.enclave_contract, None).expect("Invalid address"); let (_, handle) = MainCiphernode::attach(address, &args.rpc, enclave_contract, registry_contract).await; let _ = tokio::join!(handle);