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 @@

Noir Prover

+ + + +
@@ -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, }