3.6 KiB
3.6 KiB
Architecture Overview
This document describes the architecture and design rationale for the modular Rust system, including the kvstore, vault, and evm_client crates, as well as the CLI and WASM/web-app targets.
Table of Contents
- Summary
- Crate and Module Structure
- Design Rationale
- Vault Crate Design
- Async, WASM, and Integration
- Diagrams & References
Summary
This system is organized as a Rust workspace with three core crates:
kvstore: Abstract, async key-value storage for both native and WASM environments.vault: Manages encrypted keyspaces and cryptographic operations, usingkvstorefor persistence.evm_client: Ethereum RPC client, signs transactions using keys fromvault.
Front-end targets:
- CLI (with Rhai scripting)
- WASM/web-app (with JS interop)
Crate and Module Structure
- Workspace: Top-level
Cargo.tomllists all member crates. - Features & cfg: Use Cargo features and
#[cfg]attributes for platform-specific code (e.g.,sledfor native,idbfor WASM). - Dependencies:
kvstoreusessled(native) andidb(WASM).vaultuseskvstoreand crypto crates (chacha20poly1305,pbkdf2, etc.).evm_clientusesvaultand Ethereum libraries (e.g.,alloy).- CLI uses Rhai and async runtime (e.g., Tokio).
- Web app uses
wasm-bindgenand exposes Rust APIs to JS.
Design Rationale
Improvements in the New Implementation
- Async/Await API: All operations are async, supporting non-blocking I/O for both WASM and native environments.
- Backend Abstraction: The
KVStoretrait abstracts over multiple storage backends, enabling cross-platform support and easier testing. - Separation of Concerns:
kvstorehandles only storage.vaultis responsible for encryption, decryption, and password management.
- WASM and Native Support: Out-of-the-box support for both browser (IndexedDB) and native (sled) environments.
- Cleaner, Testable Design: Each layer is independently testable and mockable.
Why Encryption and Password Protection are in Vault
- Single Responsibility:
kvstoreis for storage;vaulthandles security. - Flexibility: Encryption algorithms and policies can evolve in
vaultwithout changing storage. - Security: Cryptography is isolated in
vault, reducing attack surface and easing audits. - Cross-Platform Consistency: Same vault logic regardless of storage backend.
Vault Crate Design
- Encrypted Keyspace: Password-protected, supports multiple keypairs (e.g., secp256k1, Ed25519).
- Crypto APIs: Async functions for key management, signing, encryption/decryption.
- Storage: Uses
kvstorefor persistence; re-encrypts and stores the keyspace as a blob. - WASM Compatibility: Uses Rust crypto crates that support
wasm32-unknown-unknown.
Async, WASM, and Integration
- Exports: Use
#[wasm_bindgen]to expose async functions to JS. - Async runtime: Use
wasm_bindgen_futures::spawn_localin the browser. - Interop: JS and Rust communicate via Promises and
JsValue. - CLI: Uses Rhai scripting and async runtime.
Diagrams & References
- See included diagrams for crate relationships and message-passing patterns.
- Design patterns and best practices are drawn from Rust async and WASM guidelines.
This document merges and replaces content from the previous Architecture.md and kvstore-vault-architecture.md. For further details on implementation, see vault_impl_plan.md.