Skip to main content

Architecture

The Policy Engine is embedded in every Silent Network MPC node. It is not a separate, centralized service that approves a request before handing it to the signing network. Instead, every participating node authenticates the request, verifies the integrity of its locally stored records, and evaluates the key-bound policy before participating in MPC signing.

End-to-end signing and policy evaluation

A signing request can be authorized directly by the key owner or by a delegatee holding an ephemeral session key. The Wallet Provider authenticates the application request and sends it to a selected MPC node.

Each node independently performs the following checks inside its TEE:

  1. Authenticate the request and derive its issuer.
  2. Load the wallet records associated with key_id and verify their MAC integrity.
  3. Decode the transaction and evaluate the policy rules matching the issuer and transaction type.
  4. Participate in the MPC signing protocol only when the policy result is ALLOW.

A node that rejects the request does not participate in MPC signing. A signature is produced only if the required MPC participants independently authorize the request and successfully complete the signing protocol.

End-to-end signing and policy evaluation
Silent Network + Policy Engine
Silent Network + Policy Engine
Every participating MPC node authenticates the transaction issuer, verifies policy integrity, and evaluates the transaction inside its TEE before contributing a signature share.
Every participating MPC node authenticates the transaction issuer, verifies policy integrity, and evaluates the transaction inside its TEE before contributing a signature share.
Wallet Provider project
Wallet Provider project
Wallet Provider
Build transaction request
Select and connect to an initiator
Wallet Provider...
Authenticated sign request
user signature +
Wallet Provider signature (WPBE_sig)
Authenticated sign request...
MPC Operator project
MPC Operator project
Initiator role
One node receives the request and orchestrates participants. It does not replace their independent checks.
Initiator role...
Node 1 | Attested TEE | Initiator
Node 1 | Attested TEE | Initiator
1. Authenticate
Verify WPBE_sig and owner / session credential; resolve issuer ID
1. Authenticate...
2. Load + integrity check
Read key-bound policy, credential, key share and optional policy state; verify MAC
2. Load + integrity check...
3. Policy Engine
Decode transaction; match issuer + chain/type; evaluate conditions
and optional historical state

DENY wins; no match = DENY
3. Policy Engine...
4. ALLOW → MPC protocol run
4. ALLOW → MPC protocol run
Node 2..N | Independent attested TEEs
Node 2..N | Independent attested TEEs
1. Authenticate independently
1. Authenticate independently
2. Verify local protected records
Policy and data are independently stored per node
2. Verify local protected records...
3.Policy Engine
Evaluate same request locally

Any local DENY → reject signing
3. Policy Engine...
4. ALLOW → MPC protocol run
4. ALLOW → MPC protocol run
Per-node logical storage
key share (encrypted)
owner + session credentials
one policy per key + MAC
state controllers / entries (optional) + MAC
Per-node logical storage...
Network outcome
ALLOW: threshold participants complete MPC signing
DENY / failed integrity / failed auth: abort, no signature
Network outcome...
Optional stateful rules
Evaluation reads local totals. Entries update only after successful signing.
Optional stateful rules...
read
read
Secret Guardian Project
Secret Guardian Project
Attestation-gated secrets
Key-management keys and operator configuration.
Released only to approved TEE workloads.
Attestation-gated secrets...
Blockchain / destination network
Blockchain / destinatio...
Owner-authorized operations
Owner-authorized operations
Session-authenticated signing
Session-authenticated signing
authenticate request
authenticate request
route to initiator
route to initiator
mutually attested MPC protocol
mutually attested MPC protocol
TEE attestation → keys / configuration
TEE attestation → keys / configuration
signed transaction
signed transaction
Delegatee / agent
Ephemeral session key
No owner prompt per sign
Delegatee / agent...
Key owner
Passkey / EOA / Social login
Key owner...

How a node determines the issuer

An issuer identifies which authenticated actor sent the request. The Policy Engine represents an issuer using <type>:<issuer_id>, for example:

UserId:alice_passkey
SessionKeyId:trading_agent_session

The issuer is needed to determine which policy rules apply to the request. A node first authenticates the supplied credential, derives its issuer, and considers only rules whose issuer field matches it. The matching rule's conditions then determine whether the requested transaction is allowed.

Each node maps the user credentials user_cred to an issuer as follows:

Request authenticationDerived issuer
EOA, Passkey, or JWTUserId derived from user_cred
EphemeralSessionKeyId derived from user_cred
Missing or unsupported user_credUserId containing the Wallet Provider API key

The identifier is therefore selected from the authenticated credential, not from transaction data supplied to the policy.

Policy lifecycle and delegation

Delegation connects a registered session credential to policy rules through its SessionKeyId.

1. Establish the delegatee's session identity

Register an ephemeral credential and expiry for the wallet through an owner-authenticated request. In this example, session ID is trading_agent_session.

2. Construct a policy rule for the delegatee

Use the registered session ID as the rule issuer:

{
"version": "1.0",
"description": "Delegate trading-agent signing",
"rules": [
{
"issuer": [{
"type": "SessionKeyId",
"id": "trading_agent_session"
}],
"action": "allow",
"logic": "and",
"chain_type": "ethereum",
"conditions": [
{
"transaction_type": "nativeTransfer",
"transaction_attr": "receiver",
"operator": "in",
"value": ["0xApprovedRecipient..."]
},
{
"transaction_type": "nativeTransfer",
"transaction_attr": "nativeValue",
"operator": "lte",
"value": "100000000000000000"
}
]
}
]
}

Only requests deriving the same issuer can match this rule.

3. Attach the policy to the wallet key

Attach the policy during wallet creation, or update the policy for an existing key_id. Each node authenticates the owner request, validates the policy, and stores it with its MAC.

4. Authorize a delegatee's signing request

The delegatee submits the transaction with user_cred.method = Ephemeral, the session credential ID, and its authentication signature. Each node authenticates the request and derives:

Issuer { issuer_type: IssuerType::SessionKeyId, id: "trading_agent_session" }

The node selects rules matching that issuer, evaluates their transaction conditions, and participates in MPC signing only when the result is ALLOW.

Flow summary

Loading Diagram...
Policy lifecycle and delegation
Policy lifecycle and delegated signing
Policy lifecycle and delegated signing
The key owner defines authority once; every participating node independently enforces the same integrity-protected policy before contributing an MPC signature share.
The key owner defines authority once; every participating node independently enforces the same integrity-protected policy before contributing an MPC signature share.
Key owner authority
Key owner authority
Key owner

Passkey / EOA / Social login
Key owner...
Owner-authorized controls

• Create wallet + initial policy during DKG
• Replace or delete the key-bound policy
• Create or revoke ephemeral session credentials
• Manage policy state controllers
Owner-authorized controls...
Replicated in every MPC node in Attested TEE
Replicated in every MPC node in Attested TEE
Wallet records per key_id

Encrypted MPC key share
Owner authentication credential
One policy + MAC
Session credentials + expiry / revocation
Optional policy state controllers / entries
Wallet records per key_id...
Independent authorization in each node

1. Authenticate owner or session issuer
2. Load records and verify MAC integrity
3. Decode and evaluate the transaction
4. Apply DENY precedence; no matching rule = DENY
Independent authorization in each node...
ALLOW → MPC signing
or
DENY → reject signing
ALLOW → MPC signing...
Delegated signing
Delegated signing
Session issuer (Delegatee / agent)

Holds an ephemeral session private key, never the MPC wallet private key.
Session issuer (Delegatee / agent)...
Session-signed transaction request

key_id + transaction
SessionKeyId + ephemeral-key signature
Session-signed transaction request...
Delegation is policy-scoped

The session can sign only transactions allowed by rules matching its SessionKeyId.
Delegation is policy-scoped...
owner authenticates
owner authenticates
Owner-signed request;
node verifies and stores
Owner-signed request;...
policy record includes
policy record includes
authenticate + verify integrity
authenticate + verify integrity
evaluate matching rules
evaluate matching rules
authenticate with session key
authenticate with session key
session-signed request;
node verifies
session-signed request;...
Policy and delegated authority

Multiple rules can target:
• the owner:UserId (owner)
• the delegatee:SessionKeyId (session)

Rules constrain chain, transaction type, recipient, amount, contract calls, and optional historical state.
Policy and delegated authority...

For request formats and lifecycle operations, see Policy Management.