From b48e06de040e20ba29ebdaccff934a3c9d844a1b Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Fri, 14 Mar 2025 10:52:33 -0700 Subject: [PATCH 1/2] Add VSS Blogpost. --- docs/_blog/announcing-vss.md | 180 +++++++++++++++++++++++ docs/assets/vss-data-flow-simplified.png | Bin 0 -> 37332 bytes 2 files changed, 180 insertions(+) create mode 100644 docs/_blog/announcing-vss.md create mode 100644 docs/assets/vss-data-flow-simplified.png diff --git a/docs/_blog/announcing-vss.md b/docs/_blog/announcing-vss.md new file mode 100644 index 00000000..3f186a4b --- /dev/null +++ b/docs/_blog/announcing-vss.md @@ -0,0 +1,180 @@ +--- +title: "Announcing Versioned Storage Service (VSS)" +description: "The Versioned Storage Service (VSS) provides a server-side storage solution for non-custodial mobile, web and hosted wallets." +date: "2025-03-14" +authors: + - Gursharan Singh +tags: + - VSS + - Mobile + - Storage + - Self-custody +--- + +The Versioned Storage Service (VSS) provides a server-side storage solution for non-custodial mobile, web and hosted +wallets. VSS significantly simplifies the wallet development process by offering a reliable, secure, and robust +framework that stores and manages the various forms of state data required for the Lightning Network (LN) and Bitcoin +applications. + +# What Is VSS? + +VSS is a client-server storage framework for Lightning Network (LN) and Bitcoin wallet data. VSS primarily serves two +core functionalities: + +* Recovery: VSS enables the restoration of states and wallet access, helping users regain their funds and control even + in scenarios of device or data loss. +* Multi-device Access: While this isn’t available now, future phases will allow the same wallet app across multiple + devices to securely share and access the LN state, leading to consistent access to funds. + +Clients can also leverage VSS for general application metadata storage including payment history, user metadata, and +more. + +# Why VSS? + +VSS aims to lower the barriers to high-quality LN wallet development. Wallet builders can host the VSS service in-house +for straightforward interaction with the service or use reliable third-party VSS providers, if available. + +VSS was designed with privacy in mind, offering features such as client-side encryption, key-obfuscation, and robust +authorization. It also ensures data and version number verifiability, and will support multi-device access in the +future. The software ensures modularity for seamless integration with different storage backend technologies. +Additionally, VSS can work with various applications with different key-level versioning and data-integrity mechanisms +and even allows disabling versioning for single-device wallet usage. + +### Why do we need VSS as primary storage for lightning wallets? + +Keeping VSS in sync with the latest Lightning state isn’t optional; if the server’s version lags and the user loses the +device, there is a risk for funds loss. That’s why VSS-powered wallets must be designed to hold off advancing the +lightning state until everything’s securely updated on the server. + +The on-device state of a Lightning wallet changes every time a user sends or receives payments. While some backup +options offer frequency-based backups, these can lead to data being out of sync and do not ensure full funds or channel +recovery if the device is lost. Protocols that sync asynchronously based on intervals inherently have insufficient data +for complete recovery by design. + +Using VSS as the primary storage ensures that every state change is securely stored in real-time, enabling full recovery +of funds and channels regardless of device loss. + +
+ VSS High Level Data Flow (Simplified) +

VSS High Level Data Flow (Simplified)

+
+ +# Customization + +While VSS can be readily used, it is intended to be customized based on specific requirements. For example, clients +might need to implement custom authorization, encryption, or backend database integration with different cloud +providers. With the accurate facilitation of the API contract, wallets can easily switch between different instances of +VSS. For example, a wallet can easily switch from VSS-Provider-A to VSS-Provider-B by just downloading the whole state +and uploading it to the new provider. + +By default, VSS incorporates a PostgreSQL implementation and can be hosted on preferred infrastructure/cloud providers +such as AWS, GCP, and others. Its backend storage can be interchanged with other implementations for KeyValueStore if +necessary. + +# Usage + +### Using with LDK Node: + +[LDK Node](https://github.com/lightningdevkit/ldk-node) can be easily configured to run with VSS as primary storage. It +is integrated in LDK Node (written in Rust) using [VSS-rust-client](https://github.com/lightningdevkit/vss-rust-client), +and there is also support for other languages such as Swift, Kotlin and Python +through [UniFFI](https://mozilla.github.io/uniffi-rs/) bindings. + +```rust +use ldk_node::Builder; + +fn main() { +let mut node_builder = Builder::new(); + ... + // Note: store_id can be freely set by the user and is useful for creating separate namespaces within storage. + // However, it must remain fixed for the entire life of the node as it is used for database storage. + let node = node_builder + .build_with_vss_store_and_fixed_headers( + vss_endpoint, + store_id, + HashMap::new(), + ) + .unwrap(); + + node.start().unwrap(); + ... + ... +} +``` + +### Using with Other Applications + +VSS is designed to store application-related metadata. Clients can use +the [VSS-rust-client](https://github.com/lightningdevkit/vss-rust-client) directly for this purpose. This can help +provide a complete user data recovery solution for applications, as well as enable turn-key multi-device support in the +future. + +### Hosting + +VSS can either be self-hosted or deployed in the cloud. If a service provider is hosting VSS for multiple users, it must +be configured with **HTTPS**, **Authentication/Authorization**, and **rate-limiting**. + +Application/wallet vendors can choose to either self-host VSS instances or use one of the existing hosted VSS providers. + +### Authentication & Authorization + +Currently, the VSS-server supports [JWT](https://datatracker.ietf.org/doc/html/rfc7519)\-based authentication and +authorization, and can run without authentication for local testing or in trusted setups. The VSS-rust-client supports +LNURL-auth & JWT based authentication and authorization. Switching to simple HTTP header authentication is +straightforward by adding another implementation. Note that the security of authentication heavily relies on using HTTPS +for all requests. + +### Scaling + +VSS itself is stateless and can be horizontally scaled easily. VSS can be configured to point to a PostgreSQL cluster, +and further scaling considerations need to be addressed in the PostgreSQL cluster. + +# Project Status + +VSS execution is split into two phases: Phase I prioritizes recovery and single-device use, whereas Phase II covers +multi-device use. Phase I is ready to use and integrated within [LDK Node](https://github.com/lightningdevkit/ldk-node). +Phase II will be subject to monitoring for demand from wallets and may slip to a later date. Refer +to [LDK-Roadmap](https://lightningdevkit.org/blog/ldk-roadmap/#vss) for more details. + +# Implementation + +Currently, the VSS server has Java and Rust based implementations and is ready to use. +[VSS-rust-client](https://github.com/lightningdevkit/vss-rust-client) is a Rust-based client with support +for client-side encryption, key obfuscation, retry mechanisms, and LNURL-auth. VSS is also integrated starting +with [LDK Node](https://github.com/lightningdevkit/ldk-node) v0.4.x as alpha support. + +# Future + +In the future, LDK and VSS will introduce multi-device support. This will enable users to seamlessly access the same +Lightning node across multiple devices. + +With synchronized updates and real-time access, users can manage their Lightning wallet from any preferred device, +enhancing convenience and accessibility while maintaining consistency across platforms. + +# Conclusion + +In summary, VSS provides an open-source, server-side cloud storage solution optimized specifically for non-custodial +Lightning/Bitcoin wallets as well as auxiliary application storage needs. Its key features include multi-device access, +recovery capabilities, user privacy protection, and data verifiability. With VSS, wallet developers can focus on +creating innovative Lightning wallets without the extra burden of crafting +complex [live backup storage](https://lightningdevkit.org/blog/the-challenges-of-developing-non-custodial-lightning-on-mobile/#live-backups) +solutions from scratch. + +# Resources + +1. [vss-server](https://github.com/lightningdevkit/vss-server) : A java and rust implementation of VSS server with + PostgreSQL as default storage backend. + +2. [vss-rust-client](https://crates.io/crates/vss-client) : A rust client for VSS, with in-built support for retries, + client-side encryption and custom auth mechanism. + +3. [LDK Node](https://github.com/lightningdevkit/ldk-node/blob/f1fdee50d5a8b628040fb2d584a7c4b831090de4/src/builder.rs#L441-L557) : + VSS is integrated with LDK Node and currently has alpha/experimental support. + +4. Bindings: On the client side, VSS is also usable with existing LDK Node bindings in Kotlin/swift/python. + +# Support + +If you encounter any issues or have questions, feel free to open an issue on +the [GitHub repository](https://github.com/lightningdevkit/vss-server/issues). For further assistance or to discuss the +development of VSS, you can reach out to us in the [LDK Discord](https://discord.gg/5AcknnMfBw) in the `#vss` channel. diff --git a/docs/assets/vss-data-flow-simplified.png b/docs/assets/vss-data-flow-simplified.png new file mode 100644 index 0000000000000000000000000000000000000000..631dcedc640846582a3366b182a6781cce3d2ff9 GIT binary patch literal 37332 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 Date: Mon, 17 Mar 2025 12:38:20 -0400 Subject: [PATCH 2/2] Update date --- docs/_blog/announcing-vss.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_blog/announcing-vss.md b/docs/_blog/announcing-vss.md index 3f186a4b..de6205e7 100644 --- a/docs/_blog/announcing-vss.md +++ b/docs/_blog/announcing-vss.md @@ -1,7 +1,7 @@ --- title: "Announcing Versioned Storage Service (VSS)" description: "The Versioned Storage Service (VSS) provides a server-side storage solution for non-custodial mobile, web and hosted wallets." -date: "2025-03-14" +date: "2025-03-17" authors: - Gursharan Singh tags: @@ -21,9 +21,9 @@ applications. VSS is a client-server storage framework for Lightning Network (LN) and Bitcoin wallet data. VSS primarily serves two core functionalities: -* Recovery: VSS enables the restoration of states and wallet access, helping users regain their funds and control even +- Recovery: VSS enables the restoration of states and wallet access, helping users regain their funds and control even in scenarios of device or data loss. -* Multi-device Access: While this isn’t available now, future phases will allow the same wallet app across multiple +- Multi-device Access: While this isn’t available now, future phases will allow the same wallet app across multiple devices to securely share and access the LN state, leading to consistent access to funds. Clients can also leverage VSS for general application metadata storage including payment history, user metadata, and @@ -80,12 +80,12 @@ is integrated in LDK Node (written in Rust) using [VSS-rust-client](https://gith and there is also support for other languages such as Swift, Kotlin and Python through [UniFFI](https://mozilla.github.io/uniffi-rs/) bindings. -```rust +```rust use ldk_node::Builder; -fn main() { -let mut node_builder = Builder::new(); - ... +fn main() { +let mut node_builder = Builder::new(); + ... // Note: store_id can be freely set by the user and is useful for creating separate namespaces within storage. // However, it must remain fixed for the entire life of the node as it is used for database storage. let node = node_builder @@ -96,10 +96,10 @@ let mut node_builder = Builder::new(); ) .unwrap(); - node.start().unwrap(); - ... + node.start().unwrap(); + ... ... -} +} ``` ### Using with Other Applications