diff --git a/crates/dashboard/src/dashboard.html b/crates/dashboard/src/dashboard.html
index eb6e2ae195..a5ee6f155e 100644
--- a/crates/dashboard/src/dashboard.html
+++ b/crates/dashboard/src/dashboard.html
@@ -118,7 +118,17 @@
font-size: 13px;
outline: none;
}
-input[type="text"]:focus { border-color: var(--accent); }
+input[type="text"]:focus, select:focus { border-color: var(--accent); }
+select {
+ background: var(--bg);
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ padding: 6px 12px;
+ color: var(--text);
+ font-size: 13px;
+ outline: none;
+ cursor: pointer;
+}
button {
background: var(--accent);
color: #fff;
@@ -170,6 +180,9 @@
.badge-green { background: rgba(74,222,128,0.15); color: var(--green); }
.badge-red { background: rgba(248,113,113,0.15); color: var(--red); }
.badge-yellow { background: rgba(251,191,36,0.15); color: var(--yellow); }
+tr.evt-error td { border-left: 3px solid var(--red); }
+tr.evt-warn td { border-left: 3px solid var(--yellow); }
+tr.evt-state td { border-left: 3px solid var(--green); }
@@ -206,6 +219,26 @@
+
+
+ All sources
+ Local
+ Net
+ Evm
+
+
+ All events
+ Errors only
+ Warnings
+ State changes
+
+
+ Newest first
+ Oldest first
+ Type A-Z
+ Type Z-A
+ Source A-Z
+
Refresh
Auto-refresh
@@ -322,7 +355,7 @@
Wallet
async function loadEvents(since, append) {
try {
const s = since !== undefined ? since : 0;
- const text = await api('/api/events?since=' + s + '&limit=50');
+ const text = await api('/api/events?since=' + s + '&limit=500');
// Split on newlines first; if a line fails to parse, try splitting on }{ boundaries
const lines = text.trim().split('\n').filter(function(l) { return l.trim().length > 0; });
if (!append) allEvents = [];
@@ -366,21 +399,49 @@
Wallet
if (eventCursor !== null) loadEvents(eventCursor, true);
}
+var ERROR_TYPES = ['EnclaveError','E3Failed','ProofVerificationFailed','SignedProofFailed','ThresholdShareCollectionFailed','EncryptionKeyCollectionFailed'];
+var WARNING_TYPES = ['AccusationVote','ProofFailureAccusation','CommitmentMismatch'];
+var STATE_TYPES = ['E3Requested','CiphernodeSelected','CommitteePublished','CommitteeFinalized','CiphertextOutputPublished','PlaintextOutputPublished','PlaintextAggregated','E3StageChanged'];
+
function renderEvents() {
- const filter = document.getElementById('evt-filter').value.toLowerCase();
- const tbody = document.getElementById('evt-body');
- const rows = [];
- for (const evt of allEvents) {
- const ctx = evt.ctx || {};
- const type = extractType(evt);
+ var filter = document.getElementById('evt-filter').value.toLowerCase();
+ var e3Filter = document.getElementById('evt-e3-filter').value.toLowerCase();
+ var sourceFilter = document.getElementById('evt-source-filter').value;
+ var severityFilter = document.getElementById('evt-severity-filter').value;
+ var sortKey = document.getElementById('evt-sort').value;
+ var sorted = allEvents.slice();
+ sorted.sort(function(a, b) {
+ var seqA = (a.ctx || {}).seq || 0;
+ var seqB = (b.ctx || {}).seq || 0;
+ if (sortKey === 'seq-asc') return seqA - seqB;
+ if (sortKey === 'seq-desc') return seqB - seqA;
+ var typeA = extractType(a);
+ var typeB = extractType(b);
+ if (sortKey === 'type-asc') return typeA.localeCompare(typeB);
+ if (sortKey === 'type-desc') return typeB.localeCompare(typeA);
+ if (sortKey === 'source-asc') return ((a.ctx || {}).source || '').localeCompare((b.ctx || {}).source || '');
+ return seqB - seqA;
+ });
+ var tbody = document.getElementById('evt-body');
+ var rows = [];
+ for (var i = 0; i < sorted.length; i++) {
+ var evt = sorted[i];
+ var ctx = evt.ctx || {};
+ var type = extractType(evt);
if (filter && !type.toLowerCase().includes(filter)) continue;
- const seq = ctx.seq !== undefined ? ctx.seq : '-';
- const e3id = extractE3Id(evt);
- const src = ctx.source || '-';
+ var e3id = extractE3Id(evt);
+ if (e3Filter && !String(e3id).toLowerCase().includes(e3Filter)) continue;
+ if (sourceFilter && ctx.source !== sourceFilter) continue;
+ if (severityFilter === 'error' && !ERROR_TYPES.some(function(t) { return type === t; })) continue;
+ if (severityFilter === 'warning' && !WARNING_TYPES.some(function(t) { return type === t; })) continue;
+ if (severityFilter === 'state' && !STATE_TYPES.some(function(t) { return type === t; })) continue;
+ var seq = ctx.seq !== undefined ? ctx.seq : '-';
+ var src = ctx.source || '-';
const id = 'evt-' + rows.length;
var ts = hlcToTime(ctx.ts);
+ var rowClass = ERROR_TYPES.indexOf(type) >= 0 ? 'evt-error' : WARNING_TYPES.indexOf(type) >= 0 ? 'evt-warn' : STATE_TYPES.indexOf(type) >= 0 ? 'evt-state' : '';
rows.push(
- '
' +
+ ' ' +
'' + esc(String(seq)) + ' ' +
'' + esc(ts) + ' ' +
'' + esc(type) + ' ' +
@@ -391,6 +452,7 @@ Wallet
);
}
tbody.innerHTML = rows.length ? rows.join('') : ' No events ';
+ document.getElementById('evt-refresh').textContent = 'Refresh (' + allEvents.length + ' total, ' + rows.length + ' shown)';
}
function extractType(evt) {
@@ -402,9 +464,14 @@
Wallet
function extractE3Id(evt) {
if (!evt.payload) return '-';
- const data = Object.values(evt.payload)[0];
+ var data = Object.values(evt.payload)[0];
if (!data || typeof data !== 'object') return '-';
- return data.e3_id || data.e3Id || '-';
+ var eid = data.e3_id !== undefined ? data.e3_id : data.e3Id;
+ if (eid == null) return '-';
+ if (typeof eid === 'object' && eid.id !== undefined) {
+ return eid.chain_id !== undefined ? eid.chain_id + ':' + eid.id : String(eid.id);
+ }
+ return String(eid);
}
function toggleDetail(id) {
@@ -413,6 +480,10 @@
Wallet
}
document.getElementById('evt-filter').addEventListener('input', renderEvents);
+document.getElementById('evt-e3-filter').addEventListener('input', renderEvents);
+document.getElementById('evt-source-filter').addEventListener('change', renderEvents);
+document.getElementById('evt-severity-filter').addEventListener('change', renderEvents);
+document.getElementById('evt-sort').addEventListener('change', renderEvents);
// Auto-refresh for events
document.getElementById('evt-auto').addEventListener('change', function() {
diff --git a/crates/keyshare/src/decryption_key_shared_collector.rs b/crates/keyshare/src/decryption_key_shared_collector.rs
index 9148ba50a8..a6253c587d 100644
--- a/crates/keyshare/src/decryption_key_shared_collector.rs
+++ b/crates/keyshare/src/decryption_key_shared_collector.rs
@@ -16,7 +16,7 @@ use tracing::{info, warn};
use crate::ThresholdKeyshare;
-const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(1200);
+const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(3600);
enum CollectorState {
Collecting,
diff --git a/crates/keyshare/src/encryption_key_collector.rs b/crates/keyshare/src/encryption_key_collector.rs
index f110acdf58..184ad96a9e 100644
--- a/crates/keyshare/src/encryption_key_collector.rs
+++ b/crates/keyshare/src/encryption_key_collector.rs
@@ -19,7 +19,7 @@ use e3_trbfv::PartyId;
use e3_utils::MAILBOX_LIMIT;
use tracing::{info, warn};
-const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(60);
+const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(600);
use crate::ThresholdKeyshare;
diff --git a/crates/keyshare/src/threshold_share_collector.rs b/crates/keyshare/src/threshold_share_collector.rs
index a62a34a4a0..4c7e65e9c1 100644
--- a/crates/keyshare/src/threshold_share_collector.rs
+++ b/crates/keyshare/src/threshold_share_collector.rs
@@ -34,7 +34,7 @@ pub struct ReceivedShareProofs {
pub signed_c3b_proofs: Vec
,
}
-const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(800);
+const DEFAULT_COLLECTION_TIMEOUT: Duration = Duration::from_secs(3600);
pub(crate) enum CollectorState {
Collecting,
diff --git a/crates/net/src/net_interface.rs b/crates/net/src/net_interface.rs
index 6f69cfc711..32f968c370 100644
--- a/crates/net/src/net_interface.rs
+++ b/crates/net/src/net_interface.rs
@@ -55,9 +55,10 @@ use tokio::{
use tracing::{debug, error, info, trace, warn};
const PROTOCOL_NAME: StreamProtocol = StreamProtocol::new("/enclave/kad/1.0.0");
-const MAX_KADEMLIA_PAYLOAD_MB: usize = 10;
+const MAX_KADEMLIA_PAYLOAD_MB: usize = 100;
+const MAX_KADEMLIA_RECORD_MB: usize = 25; // Largest record: ~21MB ThresholdShare with prod params
const DHT_MAX_RECORDS: usize = 4096;
-const MAX_GOSSIP_MSG_SIZE_KB: usize = 700;
+const MAX_GOSSIP_MSG_SIZE_KB: usize = 10240; // 10MB — prod params C6 proofs are ~4.6MB
const MAX_CONSECUTIVE_DIAL_FAILURES: u32 = 40;
const EVENT_CHANNEL_SIZE: usize = 1000;
const CMD_CHANNEL_SIZE: usize = 1000;
@@ -308,7 +309,7 @@ fn create_behaviour(
.set_query_timeout(Duration::from_secs(30));
let store_config = MemoryStoreConfig {
max_records: DHT_MAX_RECORDS,
- max_value_bytes: MAX_KADEMLIA_PAYLOAD_MB * 1024 * 1024,
+ max_value_bytes: MAX_KADEMLIA_RECORD_MB * 1024 * 1024,
max_providers_per_key: usize::MAX,
max_provided_keys: DHT_MAX_RECORDS,
};
diff --git a/crates/program-server/src/lib.rs b/crates/program-server/src/lib.rs
index 32b6ff89b0..f73bd279a8 100644
--- a/crates/program-server/src/lib.rs
+++ b/crates/program-server/src/lib.rs
@@ -117,6 +117,7 @@ impl E3ProgramServer {
let server = HttpServer::new(move || {
App::new()
.app_data(web::Data::new(config.clone()))
+ .app_data(web::JsonConfig::default().limit(10 * 1024 * 1024)) // 10MB for prod params
.wrap(Logger::default())
.route("/run_compute", web::post().to(handle_compute))
.route("/health", web::get().to(handle_health_check))
diff --git a/crates/zk-prover/src/actors/commitment_consistency_checker_ext.rs b/crates/zk-prover/src/actors/commitment_consistency_checker_ext.rs
index 94d60e23f3..1550111507 100644
--- a/crates/zk-prover/src/actors/commitment_consistency_checker_ext.rs
+++ b/crates/zk-prover/src/actors/commitment_consistency_checker_ext.rs
@@ -16,8 +16,8 @@ use super::commitment_links;
use anyhow::Result;
use async_trait::async_trait;
use e3_events::{BusHandle, EnclaveEvent, EnclaveEventData, Event};
-use e3_request::{E3Context, E3ContextSnapshot, E3Extension};
-use tracing::info;
+use e3_request::{E3Context, E3ContextSnapshot, E3Extension, META_KEY};
+use tracing::{error, info};
pub struct CommitmentConsistencyCheckerExtension {
bus: BusHandle,
@@ -46,9 +46,14 @@ impl E3Extension for CommitmentConsistencyCheckerExtension {
let e3_id = data.e3_id.clone();
+ let Some(meta) = ctx.get_dependency(META_KEY) else {
+ error!("E3Meta not available — cannot start CommitmentConsistencyChecker");
+ return;
+ };
+
info!("Starting CommitmentConsistencyChecker for E3 {}", e3_id);
- let links = commitment_links::default_links();
+ let links = commitment_links::default_links(meta.params_preset);
let addr = CommitmentConsistencyChecker::setup(&self.bus, e3_id, links);
ctx.set_event_recipient("commitment_consistency_checker", Some(addr.into()));
diff --git a/crates/zk-prover/src/actors/commitment_links/mod.rs b/crates/zk-prover/src/actors/commitment_links/mod.rs
index 723f6a41b4..cfe978ecef 100644
--- a/crates/zk-prover/src/actors/commitment_links/mod.rs
+++ b/crates/zk-prover/src/actors/commitment_links/mod.rs
@@ -22,7 +22,7 @@ pub mod c4b_to_c6;
pub mod c6_to_c7;
use e3_events::ProofType;
-use e3_fhe_params::DEFAULT_BFV_PRESET;
+use e3_fhe_params::BfvPreset;
/// A 32-byte BN254 field element extracted from public signals.
pub type FieldValue = [u8; 32];
@@ -104,8 +104,8 @@ pub trait CommitmentLink: Send + Sync {
/// that C4 consumes as `expected_commitments`. Since C2→C3 already ensures
/// C3 encrypts the correct share, C2→C4 closes the remaining gap (preventing
/// a party from using different commitments in C4 than they computed in C2).
-pub fn default_links() -> Vec> {
- let l = DEFAULT_BFV_PRESET.metadata().num_moduli;
+pub fn default_links(preset: BfvPreset) -> Vec> {
+ let l = preset.metadata().num_moduli;
vec![
Box::new(c0_to_c3::C3aToC0PkCommitmentLink),
Box::new(c0_to_c3::C3bToC0PkCommitmentLink),
diff --git a/examples/CRISP/enclave.config.yaml b/examples/CRISP/enclave.config.yaml
index 3327b7d2ae..5beead4481 100644
--- a/examples/CRISP/enclave.config.yaml
+++ b/examples/CRISP/enclave.config.yaml
@@ -3,7 +3,7 @@ chains:
rpc_url: ws://localhost:8545
contracts:
e3_program:
- address: "0x809d550fca64d94Bd9F66E60752A544199cfAC3D"
+ address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029"
deploy_block: 31
enclave:
address: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e"
diff --git a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json
index bc26c7fda9..ab3da643bd 100644
--- a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json
+++ b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json
@@ -151,21 +151,21 @@
},
"localhost": {
"PoseidonT3": {
- "blockNumber": 4,
+ "blockNumber": 3,
"address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93"
},
"MockUSDC": {
"constructorArgs": {
"initialSupply": "1000000"
},
- "blockNumber": 5,
+ "blockNumber": 4,
"address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"
},
"EnclaveToken": {
"constructorArgs": {
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 6,
+ "blockNumber": 5,
"address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
},
"EnclaveTicketToken": {
@@ -174,14 +174,14 @@
"registry": "0x0000000000000000000000000000000000000001",
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 8,
+ "blockNumber": 7,
"address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"
},
"SlashingManager": {
"constructorArgs": {
"admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 9,
+ "blockNumber": 8,
"address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707"
},
"CiphernodeRegistryOwnable": {
@@ -196,7 +196,7 @@
"proxyAdminAddress": "0x9bd03768a7DCc129555dE410FF8E85528A4F88b5",
"implementationAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F"
},
- "blockNumber": 10,
+ "blockNumber": 9,
"address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853"
},
"BondingRegistry": {
@@ -218,7 +218,7 @@
"proxyAdminAddress": "0x8aCd85898458400f7Db866d53FCFF6f0D49741FF",
"implementationAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6"
},
- "blockNumber": 11,
+ "blockNumber": 10,
"address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318"
},
"Enclave": {
@@ -238,7 +238,7 @@
"proxyAdminAddress": "0x8dAF17A20c9DBA35f005b6324F493785D239719d",
"implementationAddress": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788"
},
- "blockNumber": 14,
+ "blockNumber": 13,
"address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e"
},
"E3RefundManager": {
@@ -254,70 +254,70 @@
"proxyAdminAddress": "0x32467b43BFa67273FC7dDda0999Ee9A12F2AaA08",
"implementationAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0"
},
- "blockNumber": 16,
+ "blockNumber": 15,
"address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82"
},
"MockComputeProvider": {
- "blockNumber": 18,
- "address": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB"
+ "blockNumber": 17,
+ "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042"
},
"MockDecryptionVerifier": {
- "blockNumber": 19,
- "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042"
+ "blockNumber": 18,
+ "address": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9"
},
"MockPkVerifier": {
- "blockNumber": 20,
- "address": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9"
+ "blockNumber": 19,
+ "address": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8"
},
"MockE3Program": {
- "blockNumber": 21,
- "address": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8"
+ "blockNumber": 20,
+ "address": "0x851356ae760d987E095750cCeb3bC6014560891C"
},
"ZKTranscriptLib": {
- "blockNumber": 23,
- "address": "0xf5059a5D33d5853360D16C683c16e67980206f36"
+ "blockNumber": 22,
+ "address": "0x95401dc811bb5740090279Ba06cfA8fcF6113778"
},
"RecursiveAggregationFoldVerifier": {
- "blockNumber": 24,
- "address": "0x95401dc811bb5740090279Ba06cfA8fcF6113778"
+ "blockNumber": 23,
+ "address": "0x998abeb3E57409262aE5b751f60747921B33613E"
},
"ThresholdDecryptedSharesAggregationVerifier": {
- "blockNumber": 25,
- "address": "0x998abeb3E57409262aE5b751f60747921B33613E"
+ "blockNumber": 24,
+ "address": "0x70e0bA845a1A0F2DA3359C97E0285013525FFC49"
},
"ThresholdPkAggregationVerifier": {
- "blockNumber": 26,
- "address": "0x70e0bA845a1A0F2DA3359C97E0285013525FFC49"
+ "blockNumber": 25,
+ "address": "0x4826533B4897376654Bb4d4AD88B7faFD0C98528"
},
"BfvDecryptionVerifier": {
- "blockNumber": 27,
- "address": "0x4826533B4897376654Bb4d4AD88B7faFD0C98528"
+ "blockNumber": 26,
+ "address": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf"
},
"BfvPkVerifier": {
- "blockNumber": 29,
- "address": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF"
+ "blockNumber": 28,
+ "address": "0x8f86403A4DE0BB5791fa46B8e795C547942fE4Cf"
},
"MockRISC0Verifier": {
- "address": "0x9d4454B023096f34B160D6B654540c56A1F81688",
- "blockNumber": 31
+ "address": "0x5eb3Bc0a489C5A8288765d2336659EbCA68FCd00",
+ "blockNumber": 30
},
"HonkVerifier": {
- "address": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
- "blockNumber": 32
+ "address": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
+ "blockNumber": 31
},
"CRISPProgram": {
- "address": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
- "blockNumber": 32,
+ "address": "0x4c5859f0F772848b2D91F1D83E2Fe57935348029",
+ "blockNumber": 31,
"constructorArgs": {
"enclave": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e",
- "verifierAddress": "0x9d4454B023096f34B160D6B654540c56A1F81688",
- "honkVerifierAddress": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
+ "verifierAddress": "0x5eb3Bc0a489C5A8288765d2336659EbCA68FCd00",
+ "honkVerifierAddress": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
"imageId": "0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2"
}
},
"MockVotingToken": {
- "address": "0x1291Be112d480055DaFd8a610b7d1e203891C274",
- "blockNumber": 34
+ "address": "0x5f3f1dBD7B74C6B46e8c44f98792A1dAf8d69154",
+ "blockNumber": 33
}
}
}
\ No newline at end of file
diff --git a/examples/CRISP/server/.env.example b/examples/CRISP/server/.env.example
index e3d3929bfb..a4f7a24c36 100644
--- a/examples/CRISP/server/.env.example
+++ b/examples/CRISP/server/.env.example
@@ -15,7 +15,7 @@ CRON_API_KEY=1234567890
# Based on Default Anvil Deployments (Only for testing)
ENCLAVE_ADDRESS=0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e
FEE_TOKEN_ADDRESS=0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
-E3_PROGRAM_ADDRESS=0x809d550fca64d94Bd9F66E60752A544199cfAC3D
+E3_PROGRAM_ADDRESS=0x4c5859f0F772848b2D91F1D83E2Fe57935348029
CIPHERNODE_REGISTRY_ADDRESS=0xa513E6E4b8f2a923D98304ec87F64353C4D5C853
# E3 Config
diff --git a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json
index da5ef9efa5..a09ba7ccc5 100644
--- a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json
+++ b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json
@@ -2545,5 +2545,5 @@
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/Enclave.sol",
- "buildInfoId": "solc-0_8_28-ad0ab271a39c8d6cc271ed8cba75fab865dc3973"
+ "buildInfoId": "solc-0_8_28-38a8aa7c2958101f3ea7c42a19f4351c1d072b39"
}
\ No newline at end of file
diff --git a/packages/enclave-contracts/scripts/deployEnclave.ts b/packages/enclave-contracts/scripts/deployEnclave.ts
index a37768e3ae..5271ec98be 100644
--- a/packages/enclave-contracts/scripts/deployEnclave.ts
+++ b/packages/enclave-contracts/scripts/deployEnclave.ts
@@ -3,6 +3,7 @@
// This file is provided WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE.
+import { ethers as ethersLib } from "ethers";
import hre from "hardhat";
import { autoCleanForLocalhost } from "./cleanIgnitionState";
@@ -20,6 +21,51 @@ import { deployAndSaveSlashingManager } from "./deployAndSave/slashingManager";
import { deployAndSaveAllVerifiers } from "./deployAndSave/verifiers";
import { deployMocks } from "./deployMocks";
+// BFV parameter presets — hardcoded from crates/fhe-params/src/constants.rs
+// to avoid a cyclic dependency on @enclave-e3/sdk.
+const BFV_PARAMS = {
+ insecure512: {
+ degree: 512n,
+ plaintextModulus: 100n,
+ moduli: [0xffffee001n, 0xffffc4001n],
+ error1Variance: "3",
+ },
+ secure8192: {
+ degree: 8192n,
+ plaintextModulus: 100n,
+ moduli: [
+ 0x0008000000820001n,
+ 0x0010000000060001n,
+ 0x00100000003e0001n,
+ 0x00100000006e0001n,
+ ],
+ error1Variance:
+ "523091811282223396986315785267318739368948664428268466733056000",
+ },
+} as const;
+
+function encodeBfvParams(params: {
+ degree: bigint;
+ plaintextModulus: bigint;
+ moduli: readonly bigint[];
+ error1Variance: string;
+}): string {
+ const abiCoder = ethersLib.AbiCoder.defaultAbiCoder();
+ return abiCoder.encode(
+ [
+ "tuple(uint256 degree, uint256 plaintext_modulus, uint256[] moduli, string error1_variance)",
+ ],
+ [
+ [
+ params.degree,
+ params.plaintextModulus,
+ [...params.moduli],
+ params.error1Variance,
+ ],
+ ],
+ );
+}
+
/**
* Default timeout configuration (in seconds)
*/
@@ -52,19 +98,8 @@ export const deployEnclave = async (
const ownerAddress = await owner.getAddress();
- const polynomial_degree = ethers.toBigInt(512);
- const plaintext_modulus = ethers.toBigInt(100);
- const moduli = [
- ethers.toBigInt("0xffffee001"),
- ethers.toBigInt("0xffffc4001"),
- ];
- const error1_variance = "3";
- const encoded = ethers.AbiCoder.defaultAbiCoder().encode(
- [
- "tuple(uint256 degree, uint256 plaintext_modulus, uint256[] moduli, string error1_variance)",
- ],
- [[polynomial_degree, plaintext_modulus, moduli, error1_variance]],
- );
+ const encodedInsecure = encodeBfvParams(BFV_PARAMS.insecure512);
+ const encodedSecure = encodeBfvParams(BFV_PARAMS.secure8192);
const THIRTY_DAYS_IN_SECONDS = 60 * 60 * 24 * 30;
const SORTITION_SUBMISSION_WINDOW = 10;
@@ -232,8 +267,10 @@ export const deployEnclave = async (
// Register BFV param sets
console.log("Registering BFV param sets...");
- await enclave.setParamSet(0, encoded); // ParamSet.Insecure512
+ await enclave.setParamSet(0, encodedInsecure); // ParamSet.Insecure512
+ await enclave.setParamSet(1, encodedSecure); // ParamSet.Secure8192
console.log("ParamSet.Insecure512 registered");
+ console.log("ParamSet.Secure8192 registered");
const encryptionSchemeId = ethers.keccak256(ethers.toUtf8Bytes("fhe.rs:BFV"));
diff --git a/packages/enclave-sdk/src/crypto/types.ts b/packages/enclave-sdk/src/crypto/types.ts
index 0a0ff40853..0a9fde6853 100644
--- a/packages/enclave-sdk/src/crypto/types.ts
+++ b/packages/enclave-sdk/src/crypto/types.ts
@@ -30,3 +30,8 @@ export interface EncryptedValueAndPublicInputs {
encryptedData: Uint8Array
circuitInputs: CircuitInputs
}
+
+export interface BfvParamSet {
+ name: ThresholdBfvParamsPresetName
+ params: BfvParams
+}
diff --git a/templates/default/deployed_contracts.json b/templates/default/deployed_contracts.json
index 8c2873bc99..d206e0b287 100644
--- a/templates/default/deployed_contracts.json
+++ b/templates/default/deployed_contracts.json
@@ -1,21 +1,21 @@
{
"localhost": {
"PoseidonT3": {
- "blockNumber": 7,
+ "blockNumber": 6,
"address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93"
},
"MockUSDC": {
"constructorArgs": {
"initialSupply": "1000000"
},
- "blockNumber": 8,
+ "blockNumber": 7,
"address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"
},
"EnclaveToken": {
"constructorArgs": {
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 9,
+ "blockNumber": 8,
"address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
},
"EnclaveTicketToken": {
@@ -24,14 +24,14 @@
"registry": "0x0000000000000000000000000000000000000001",
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 11,
+ "blockNumber": 10,
"address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"
},
"SlashingManager": {
"constructorArgs": {
"admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
- "blockNumber": 12,
+ "blockNumber": 11,
"address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707"
},
"CiphernodeRegistryOwnable": {
@@ -46,7 +46,7 @@
"proxyAdminAddress": "0x9bd03768a7DCc129555dE410FF8E85528A4F88b5",
"implementationAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F"
},
- "blockNumber": 13,
+ "blockNumber": 12,
"address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853"
},
"BondingRegistry": {
@@ -68,7 +68,7 @@
"proxyAdminAddress": "0x8aCd85898458400f7Db866d53FCFF6f0D49741FF",
"implementationAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6"
},
- "blockNumber": 14,
+ "blockNumber": 13,
"address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318"
},
"Enclave": {
@@ -88,7 +88,7 @@
"proxyAdminAddress": "0x8dAF17A20c9DBA35f005b6324F493785D239719d",
"implementationAddress": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788"
},
- "blockNumber": 17,
+ "blockNumber": 16,
"address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e"
},
"E3RefundManager": {
@@ -104,56 +104,56 @@
"proxyAdminAddress": "0x32467b43BFa67273FC7dDda0999Ee9A12F2AaA08",
"implementationAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0"
},
- "blockNumber": 19,
+ "blockNumber": 18,
"address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82"
},
"MockComputeProvider": {
- "blockNumber": 21,
- "address": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB"
+ "blockNumber": 20,
+ "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042"
},
"MockDecryptionVerifier": {
- "blockNumber": 22,
- "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042"
+ "blockNumber": 21,
+ "address": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9"
},
"MockPkVerifier": {
- "blockNumber": 23,
- "address": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9"
+ "blockNumber": 22,
+ "address": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8"
},
"MockE3Program": {
- "blockNumber": 24,
- "address": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8"
+ "blockNumber": 23,
+ "address": "0x851356ae760d987E095750cCeb3bC6014560891C"
},
"ZKTranscriptLib": {
- "blockNumber": 26,
- "address": "0xf5059a5D33d5853360D16C683c16e67980206f36"
+ "blockNumber": 25,
+ "address": "0x95401dc811bb5740090279Ba06cfA8fcF6113778"
},
"RecursiveAggregationFoldVerifier": {
- "blockNumber": 27,
- "address": "0x95401dc811bb5740090279Ba06cfA8fcF6113778"
+ "blockNumber": 26,
+ "address": "0x998abeb3E57409262aE5b751f60747921B33613E"
},
"ThresholdDecryptedSharesAggregationVerifier": {
- "blockNumber": 28,
- "address": "0x998abeb3E57409262aE5b751f60747921B33613E"
+ "blockNumber": 27,
+ "address": "0x70e0bA845a1A0F2DA3359C97E0285013525FFC49"
},
"ThresholdPkAggregationVerifier": {
- "blockNumber": 29,
- "address": "0x70e0bA845a1A0F2DA3359C97E0285013525FFC49"
+ "blockNumber": 28,
+ "address": "0x4826533B4897376654Bb4d4AD88B7faFD0C98528"
},
"BfvDecryptionVerifier": {
- "blockNumber": 30,
- "address": "0x4826533B4897376654Bb4d4AD88B7faFD0C98528"
+ "blockNumber": 29,
+ "address": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf"
},
"BfvPkVerifier": {
- "blockNumber": 32,
- "address": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF"
+ "blockNumber": 31,
+ "address": "0x8f86403A4DE0BB5791fa46B8e795C547942fE4Cf"
},
"ImageID": {
- "address": "0x5eb3Bc0a489C5A8288765d2336659EbCA68FCd00",
- "blockNumber": 35
+ "address": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
+ "blockNumber": 34
},
"MyProgram": {
- "address": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
- "blockNumber": 37
+ "address": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
+ "blockNumber": 36
}
}
}
\ No newline at end of file
diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml
index 60c85ac8fe..4b1cdf9106 100644
--- a/templates/default/enclave.config.yaml
+++ b/templates/default/enclave.config.yaml
@@ -4,22 +4,22 @@ chains:
contracts:
enclave:
address: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e"
- deploy_block: 17
+ deploy_block: 16
ciphernode_registry:
address: "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853"
- deploy_block: 13
+ deploy_block: 12
bonding_registry:
address: "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318"
- deploy_block: 14
+ deploy_block: 13
slashing_manager:
address: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707"
- deploy_block: 13
+ deploy_block: 11
fee_token:
address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"
- deploy_block: 8
+ deploy_block: 7
e3_program:
- address: "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570"
- deploy_block: 37
+ address: "0x809d550fca64d94Bd9F66E60752A544199cfAC3D"
+ deploy_block: 36
program:
dev: true
nodes:
@@ -29,6 +29,7 @@ nodes:
ctrl_port: 50501
autonetkey: true
autopassword: true
+ dashboard_port: 8004
cn2:
address: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"
quic_port: 9202
diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts
index fa383f36f1..a26f8d2fad 100644
--- a/templates/default/server/index.ts
+++ b/templates/default/server/index.ts
@@ -290,7 +290,7 @@ function handleGetSessions(req: Request, res: Response) {
}
const app = express()
-app.use(express.json())
+app.use(express.json({ limit: '50mb' }))
app.post('/', handleWebhookRequest)
app.get('/sessions', handleGetSessions)
diff --git a/templates/default/tests/integration.spec.ts b/templates/default/tests/integration.spec.ts
index 2080bc5407..dd4c735367 100644
--- a/templates/default/tests/integration.spec.ts
+++ b/templates/default/tests/integration.spec.ts
@@ -11,6 +11,7 @@ import {
encodeComputeProviderParams,
decodePlaintextOutput,
CommitteeSize,
+ ThresholdBfvParamsPresetNames,
} from '@enclave-e3/sdk'
import { EnclaveEventType, RegistryEventType } from '@enclave-e3/sdk/events'
import type { AllEventTypes, EnclaveEvent } from '@enclave-e3/sdk/events'
@@ -170,7 +171,7 @@ describe('Integration', () => {
},
rpcUrl: 'ws://localhost:8545',
chain: anvil,
- thresholdBfvParamsPresetName: 'INSECURE_THRESHOLD_512',
+ thresholdBfvParamsPresetName: ThresholdBfvParamsPresetNames[0],
privateKey: testPrivateKey,
})
@@ -188,7 +189,7 @@ describe('Integration', () => {
const { waitForEvent } = await setupEventListeners(sdk, store)
const committeeSize = CommitteeSize.Micro
- const duration = 450
+ const duration = 1000
const inputWindow = await calculateInputWindow(publicClient, duration)
const computeProviderParams = encodeComputeProviderParams(
DEFAULT_COMPUTE_PROVIDER_PARAMS,
@@ -203,7 +204,7 @@ describe('Integration', () => {
committeeSize,
inputWindow,
e3Program: contracts.e3Program,
- paramSet: 0, // ParamSet.Insecure512
+ paramSet: 0, // ParamSet.InsecureThreshold512
computeProviderParams,
proofAggregationEnabled: false,
}