Context
Falcon (falcon512_poseidon2) should become a second-class signature scheme for Guardian accounts and cosigners:
- Falcon signing and verification are significantly slower than ECDSA, including in production benchmark results.
- Post-quantum security is not currently required for this use case.
- Hosted signers such as AWS KMS support secp256k1 ECDSA but not Falcon. Falcon ACK keys therefore cannot move behind the hosted signer boundary.
Falcon remains supported for existing accounts and explicit opt-in use. This issue changes defaults, APIs, examples, and positioning—not protocol support.
Important compatibility constraint
The signature scheme is selected when a multisig account is created and is effectively permanent.
It determines:
- which auth MASM component is compiled into the on-chain account;
- the signature-scheme selector stored in the account;
- whether Guardian stores
Auth::MidenFalconRpo or Auth::MidenEcdsa;
- how cosigner requests and proposal signatures are verified;
- which Guardian ACK key signs accepted deltas.
SwitchGuardian changes the Guardian endpoint/key commitment within the account’s existing scheme. It does not convert a Falcon account into an ECDSA account.
There is currently no in-place Falcon-to-ECDSA account migration.
Current defaults
| Surface |
Current behavior |
Location |
| TypeScript account builder |
Missing signatureScheme selects Falcon |
packages/miden-multisig-client/src/account/builder.ts |
| Rust contract config |
MultisigGuardianConfig::new initializes Falcon |
crates/contracts/src/multisig_guardian.rs |
| Rust multisig builder |
generate_key() generates Falcon; ECDSA is explicitly named |
crates/miden-multisig-client/src/builder.rs |
| Rust signer alias |
GuardianKeyStore aliases FalconKeyStore |
crates/miden-multisig-client/src/keystore.rs |
| Demo CLI |
Empty scheme selection chooses Falcon |
examples/demo/src/main.rs |
| Browser examples |
Local signer and session defaults select Falcon |
examples/_shared/multisig-browser, examples/web, examples/smoke-web |
| Benchmarks |
Default authentication scheme is Falcon |
crates/server/bench/loadgen/src/config.rs |
| Documentation |
Published quickstarts generally introduce Falcon first |
SDK and package READMEs |
/pubkey |
Missing or unrecognized scheme resolves to Falcon |
server HTTP and gRPC APIs |
The server otherwise follows the registered account’s scheme: authentication dispatches from stored metadata, and ACK signing uses that same scheme.
Decision
- ECDSA becomes the recommended scheme and the default in first-party account-creation workflows.
- Low-level public APIs should prefer explicit scheme selection because the choice is permanent.
- Falcon remains available through explicitly named APIs and configuration.
- Existing Falcon accounts must continue to work without migration or operator intervention.
- The server must continue loading and serving the Falcon ACK identity while Falcon accounts may exist.
Scope
1. Documentation and positioning
2. First-party defaults
3. TypeScript SDK
4. Rust SDK and contracts
5. Server compatibility
Why Falcon must not be disabled server-side by default
Existing Falcon accounts:
- have Falcon auth MASM compiled into the on-chain account;
- authenticate through stored
Auth::MidenFalconRpo metadata;
- require Falcon cosigner signatures;
- receive Falcon Guardian ACKs;
- pin the deployment’s Falcon Guardian commitment.
Disabling Falcon verification, ACK signing, or key provisioning would prevent these accounts from submitting and executing deltas. They could not use SwitchGuardian to become ECDSA accounts because that operation preserves the account’s existing signature scheme.
A server default that becomes ECDSA-only would therefore create an unsafe upgrade path for existing deployments.
Follow-up: optional Falcon registration/provisioning
A separate issue may add an operator-controlled policy such as GUARDIAN_ALLOWED_ACCOUNT_SCHEMES.
Such a policy should:
- default to
falcon,ecdsa for upgrade compatibility;
- apply only to first-time account registration;
- allow existing Falcon accounts to continue operating;
- distinguish first-time configuration from reconfiguration;
- report the effective policy through the operator dashboard;
- prevent Falcon ACK provisioning from being disabled while stored Falcon accounts exist;
- avoid Terraform changes that silently remove Falcon support during an ordinary upgrade.
Fresh, verified ECDSA-only deployments could then opt out of provisioning a Falcon ACK key.
Out of scope
- Removing Falcon implementations, dependencies, or MASM contracts.
- Disabling Falcon at server startup.
- Automatically converting existing Falcon accounts to ECDSA.
- Changing the legacy proposal-import fallback.
- Changing EVM behavior, which is already ECDSA.
- Changing operator dashboard authentication, which is independently Falcon-only. ECDSA operator authentication should be handled in a separate issue.
Acceptance criteria
Validation
cargo test -p miden-confidential-contracts
cargo test -p guardian-client
cargo test -p guardian-server
cargo test -p miden-multisig-client
cd packages/guardian-client && npm test
cd packages/miden-multisig-client && npm test
cd examples/smoke-web && npm run typecheck && npm run build
cd examples/web && npm run build
Manual smoke coverage:
- Create, register, sign, and execute a new ECDSA account through the Rust demo.
- Create, register, sign, and execute a new ECDSA account through the browser harness.
- Load and execute against a previously registered Falcon account.
- Verify Falcon and ECDSA
/pubkey responses.
- Verify accepted deltas carry an ACK matching the account’s scheme.
- Confirm dashboard account counts and supported ACK schemes remain accurate.
Context
Falcon (
falcon512_poseidon2) should become a second-class signature scheme for Guardian accounts and cosigners:Falcon remains supported for existing accounts and explicit opt-in use. This issue changes defaults, APIs, examples, and positioning—not protocol support.
Important compatibility constraint
The signature scheme is selected when a multisig account is created and is effectively permanent.
It determines:
Auth::MidenFalconRpoorAuth::MidenEcdsa;SwitchGuardianchanges the Guardian endpoint/key commitment within the account’s existing scheme. It does not convert a Falcon account into an ECDSA account.There is currently no in-place Falcon-to-ECDSA account migration.
Current defaults
signatureSchemeselects Falconpackages/miden-multisig-client/src/account/builder.tsMultisigGuardianConfig::newinitializes Falconcrates/contracts/src/multisig_guardian.rsgenerate_key()generates Falcon; ECDSA is explicitly namedcrates/miden-multisig-client/src/builder.rsGuardianKeyStorealiasesFalconKeyStorecrates/miden-multisig-client/src/keystore.rsexamples/demo/src/main.rsexamples/_shared/multisig-browser,examples/web,examples/smoke-webcrates/server/bench/loadgen/src/config.rs/pubkeyThe server otherwise follows the registered account’s scheme: authentication dispatches from stored metadata, and ACK signing uses that same scheme.
Decision
Scope
1. Documentation and positioning
docs/MULTISIG_SDK.mdto lead withEcdsaSignerandgenerate_ecdsa_key().crates/client/README.mdcrates/miden-multisig-client/README.mdpackages/guardian-client/README.mdpackages/miden-multisig-client/README.mddocs/CONCEPTS.md.SwitchGuardian.2. First-party defaults
smoke-websession defaults to ECDSA./pubkeyomission behavior.3. TypeScript SDK
MultisigConfig.signatureSchememandatory in the low-level account builder.ecdsa.FalconSignerexported and supported.4. Rust SDK and contracts
generate_falcon_key()with_falcon_secret_key(...)generate_key()with_secret_key(...)GuardianKeyStore = FalconKeyStorein favor of explicitFalconKeyStoreandEcdsaGuardianKeyStorenames.generate_ecdsa_key().MultisigGuardianConfig::newbehavior compatible during the current release line.MultisigGuardianConfig::new.5. Server compatibility
AckRegistry./pubkeywithout a scheme returning Falcon for legacy clients.GET /dashboard/infocontinues exposing:miden_falconandmiden_ecdsaaccount counts.Why Falcon must not be disabled server-side by default
Existing Falcon accounts:
Auth::MidenFalconRpometadata;Disabling Falcon verification, ACK signing, or key provisioning would prevent these accounts from submitting and executing deltas. They could not use
SwitchGuardianto become ECDSA accounts because that operation preserves the account’s existing signature scheme.A server default that becomes ECDSA-only would therefore create an unsafe upgrade path for existing deployments.
Follow-up: optional Falcon registration/provisioning
A separate issue may add an operator-controlled policy such as
GUARDIAN_ALLOWED_ACCOUNT_SCHEMES.Such a policy should:
falcon,ecdsafor upgrade compatibility;Fresh, verified ECDSA-only deployments could then opt out of provisioning a Falcon ACK key.
Out of scope
Acceptance criteria
/pubkeyomission behavior remains compatible, while first-party clients no longer rely on it.Validation
Manual smoke coverage:
/pubkeyresponses.