Loading vLEI.wiki
Fetching knowledge base...
Fetching knowledge base...
This comprehensive explanation has been generated from 141 GitHub source documents. All source documents are searchable here.
Last updated: October 7, 2025
This content is meant to be consumed by AI agents via MCP. Click here to get the MCP configuration.
Note: In rare cases it may contain LLM hallucinations.
For authoritative documentation, please consult the official GLEIF vLEI trainings and the ToIP Glossary.
A wallet in KERI/ACDC is a collection of data stores comprising a keystore (encrypted private key storage), local and remote key event log databases, and credential databases, providing both secure storage and agency (active functionality) for managing autonomic identifiers and verifiable credentials.
In the KERI and ACDC ecosystems, a wallet represents a comprehensive data management system that extends beyond simple key storage to encompass the complete infrastructure needed for decentralized identity management. Unlike traditional cryptocurrency wallets that focus primarily on private key storage, KERI wallets are supersets of keystores that integrate multiple specialized databases and provide active agency capabilities.
According to Philip Feairheller's authoritative definition, a KERI wallet is a collection of data stores comprising:
This multi-database architecture reflects KERI's separation of concerns between key management, event logging, and credential handling, enabling modular security policies and optimized performance for different data types.
The KERI ecosystem makes an important architectural distinction:
Encryption Requirements: All wallet implementations MUST encrypt private keys at rest using strong encryption (AES-256 or equivalent). Passcodes should be processed through key derivation functions (PBKDF2, Argon2) with appropriate iteration counts and salt values.
Key Separation: Maintain strict separation between:
Backup Strategy: Implement comprehensive backup mechanisms including:
KERI wallets use LMDB (Lightning Memory-Mapped Database) for efficient key-value storage with ACID properties. The database structure includes:
key.db): Encrypted private keys indexed by AIDdb/): Key event logs with sequence number indexingreg/): Transaction event logs for credentialsesc/): Out-of-order events awaiting dependenciesThis separation enables:
Wallets must implement robust witness coordination:
Witness Pool Management:
Receipt Collection:
This layered approach reflects KERI's modular design philosophy, where core identifier management (KERI) provides the trust basis for higher-level credential operations (ACDC).
KERI wallets provide comprehensive storage for:
Beyond passive storage, KERI wallets provide agency - active functional capabilities including:
Encryption at Rest: All sensitive data in KERI wallets is encrypted using passcodes or other authentication mechanisms. The default encryption approach uses password-based key derivation to protect the keystore and associated databases.
Separation of Concerns: By maintaining separate databases for keys, events, and credentials, KERI wallets enable:
Multi-signature Support: KERI wallets support multi-signature configurations where multiple key pairs must cooperate to authorize operations, enabling:
Sparán is the reference GUI wallet implementation for KERI, providing a graphical alternative to the command-line kli tool.
Prerequisites:
curl -LsSf https://astral.sh/uv/install.sh | sh)Installation:
# Clone the repository
git clone https://github.com/keri-foundation/wallet.git
cd wallet
# Setup dependencies
make setup
# Run the wallet
uv run flet run main.py
Development Mode:
export WALLET_ENVIRONMENT=development
uv run flet run main.py
# Or use the convenience command:
make dev
Required Services:
Before running Sparán, two supporting services must be started:
kli witness demo
This starts a sample set of six witnesses for testing.
vLEI-server -s ./schema/acdc -c ./samples/acdc/ -o ./samples/oobis/
This serves ACDC credential schemas and sample credentials.
Environment Configuration:
Sparán supports multiple deployment environments through the WALLET_ENVIRONMENT variable:
production: Production GLEIF infrastructurestaging: Staging environment for testingdevelopment: Local development with test witnessesConfiguration files are located in src/app/config/ with environment-specific settings for witness endpoints, schema servers, and network parameters.
Signify Browser Extension (in development) will provide browser-integrated wallet functionality:
KERIMask (planned) aims to provide MetaMask-like functionality for KERI:
Veridian Wallet (Cardano Foundation):
The KERI Command Line Interface (kli) provides wallet functionality through terminal commands:
# Create a new wallet (habitat)
kli init --name alice --passcode 0123456789abcdefghijk
# Create an AID
kli incept --name alice --alias alice-aid
# List identifiers in wallet
kli status --name alice
# Export wallet data
kli export --name alice --output alice-backup.json
The --name parameter references a named Habitat (conceptually similar to a wallet) for performing operations, allowing management of multiple identifier contexts.
KERIA (KERI Agent in the cloud) exposes wallet functionality through three HTTP interfaces:
1. Boot Interface: Agent worker initialization
POST /boot
Content-Type: application/json
{
"name": "agent-name",
"passcode": "secure-passcode",
"salt": "random-salt-value"
}
2. Admin Interface: REST API for wallet operations
# Create identifier
POST /identifiers
Content-Type: application/json
Signature-Input: ...
{
"name": "my-identifier",
"wits": ["witness-1-oobi", "witness-2-oobi"],
"toad": 2
}
# List credentials
GET /credentials
Signature-Input: ...
# Present credential
POST /presentations
Content-Type: application/json
Signature-Input: ...
{
"credential": "credential-said",
"recipient": "verifier-aid"
}
3. KERI Protocol Interface: CESR over HTTP for protocol interactions
POST /
Content-Type: application/cesr+json
{CESR-encoded key event or receipt}
SignifyPy provides Python bindings for interacting with KERIA agents:
from signify.app.clienting import SignifyClient
# Initialize client
client = SignifyClient(passcode="secure-passcode", tier="low")
# Boot agent
await client.boot()
# Create identifier
aid = await client.identifiers().create(
name="my-identifier",
wits=["witness-oobi-1", "witness-oobi-2"],
toad=2
)
# Issue credential
credential = await client.credentials().issue(
issuer=aid["prefix"],
schema="schema-said",
data={"LEI": "123456789012345678"},
recipient="recipient-aid"
)
# List credentials
creds = await client.credentials().list()
# Present credential
await client.ipex().present(
credential=credential["sad"]["d"],
recipient="verifier-aid"
)
SignifyTS provides TypeScript/JavaScript bindings:
import { Signify } from 'signify-ts';
// Initialize client
const client = new Signify();
await client.boot();
await client.connect(
'http://localhost:3901',
'my-passcode',
Tier.low
);
// Create identifier
const result = await client.identifiers().create('my-aid', {
wits: ['witness-oobi-1', 'witness-oobi-2'],
toad: 2
});
// Issue credential
const credential = await client.credentials().issue({
issuer: result.prefix,
schema: 'schema-said',
data: { LEI: '123456789012345678' },
recipient: 'recipient-aid'
});
// Present credential
await client.ipex().present(
credential.sad.d,
'verifier-aid'
);
KERI wallets store data in structured formats:
Keystore Structure (encrypted LMDB database):
/usr/local/var/keri/
ks/
{wallet-name}/
key.db # Encrypted private keys
db/ # Key event logs
reg/ # Credential registries
esc/ # Escrow databases
Habitat Configuration:
{
"name": "alice",
"salt": "0AAkG1BmB7xnXBxo2Aasxrq9",
"pidx": 0,
"tier": "low",
"temp": false
}
KERIpy (reference implementation):
kli command-line interfaceKERIA (cloud agent):
SignifyPy (client library):
SignifyTS (client library):
Signify Browser Extension (in development):
KERIox (Rust implementation):
Veridian Wallet (Cardano Foundation):
KERIml (Swift implementation):
Sparán (KERI Foundation):
Passcode Strength: Wallet encryption relies on user-provided passcodes. Implementations should:
Key Rotation: Wallets must support KERI's pre-rotation mechanism:
Backup and Recovery: Critical wallet data includes:
Backup strategies should consider:
KERI wallets support sophisticated multi-signature configurations:
Threshold Signatures:
{
"kt": "2", // Current threshold: 2 signatures required
"k": ["key1", "key2", "key3"], // 3 signing keys
"nt": "2", // Next threshold
"n": ["digest1", "digest2", "digest3"] // Next key digests
}
Weighted Multi-Sig:
{
"kt": ["1/2", "1/2", "1/2"], // Fractional weights
"k": ["key1", "key2", "key3"],
"nt": ["1/2", "1/2", "1/2"],
"n": ["digest1", "digest2", "digest3"]
}
Non-Custodial Wallets:
Custodial Wallets:
Wallets must coordinate with witness pools:
Witness Configuration:
# Configure witnesses during AID creation
await client.identifiers().create(
name="my-aid",
wits=[
"http://witness1.example.com/oobi/witness1-aid",
"http://witness2.example.com/oobi/witness2-aid",
"http://witness3.example.com/oobi/witness3-aid"
],
toad=2 # Threshold of accountable duplicity
)
Witness Rotation:
# Rotate witness pool
await client.identifiers().rotate(
name="my-aid",
wits=[
"http://witness4.example.com/oobi/witness4-aid",
"http://witness5.example.com/oobi/witness5-aid"
],
toad=1
)
Wallets handle complete credential lifecycles:
Issuance:
Presentation:
Database Indexing: Wallets should index:
Caching Strategies:
Batch Operations:
KERI wallets should support:
Standard Formats:
Protocol Support:
DID Methods:
did:keri for KERI-native DIDsdid:webs for web-based KERI DIDsdid:web for traditional web DIDsTest Environments:
kli witness demo)Development Tools:
kli for command-line testingIssuance Workflow:
Presentation Workflow:
Verification Workflow:
Caching Strategy:
Indexing Requirements:
Batch Operations:
Encoding Support:
Protocol Compliance:
DID Method Support:
did:keri for native KERI identifiersdid:webs for web-based KERI identifiersdid:web for traditional web DIDsKey Event Validation:
Credential Validation:
Network Resilience:
Unit Tests:
Integration Tests:
End-to-End Tests:
Desktop (Sparán):
Browser Extensions:
Mobile (Veridian):
Cloud Agents (KERIA):