Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Allow empty store_ids - #95

Merged
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id
Mar 17, 2026
Merged

Allow empty store_ids#95
tankyleo merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2026-02-empty-store-id

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Contributor

Most VSS users don't actually care about the store_id - they have some data which they want to store for themselves (keyed on the authenticated user id) and that's it. There's not really any reason to force them to specify a store_id, the empty string is just as valid as any other. Thus we allow it here.

@ldk-reviews-bot

ldk-reviews-bot commented Feb 24, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @tankyleo as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other. Thus we allow it here.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleotankyleo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks LGTM, how about we make sure all the server implementations can handle the empty string for store_id ? The VSS api allows it.

diff --git a/rust/api/src/kv_store_tests.rs b/rust/api/src/kv_store_tests.rs
index b1f998d..5b870bf 100644
--- a/rust/api/src/kv_store_tests.rs+++ b/rust/api/src/kv_store_tests.rs@@ -552,8 +552,10 @@ pub struct TestContext<'a> {
impl<'a> TestContext<'a> {
/// Creates a new [`TestContext`] with the given [`KvStore`] implementation.
pub fn new(kv_store: &'a dyn KvStore) -> Self {
- let store_id: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();- TestContext { kv_store, user_token: "userToken".to_string(), store_id }+ let store_id_len = thread_rng().gen_range(0..7);+ let store_id: String = (0..store_id_len).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ let user_token: String = (0..7).map(|_| thread_rng().sample(Alphanumeric) as char).collect();+ TestContext { kv_store, user_token, store_id }
}
async fn get_object(&self, key: &str) -> Result<KeyValue, VssError> {

I'll ping tnull to make sure he's onboard too.

@tankyleo
tankyleo requested a review from tnullMarch 2, 2026 21:22
Most VSS users don't actually care about the `store_id` - they have
some data which they want to store for themselves (keyed on the
authenticated user id) and that's it. There's not really any reason
to force them to specify a `store_id`, the empty string is just as
valid as any other.
In the previous commit we allowed empty `store_id`s in the postgres
backend, here we add tests (randomly) with empty `store_id`s in the
standardized backend tests.
@TheBlueMatt

Copy link
Copy Markdown
ContributorAuthor

Good point, done. We discussed it lightly at lightningdevkit/ldk-node#755 (comment)

@@ -1,6 +1,6 @@
CREATE TABLE vss_db (
user_token character varying(120) NOT NULL CHECK (user_token <> ''),
store_id character varying(120) NOT NULL CHECK (store_id <> ''),

@G8XSUG8XSUMar 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization. Once that becomes the default pattern, it's hard to rollback.

Main purpose is namespace isolation via store_id, which is particularly helpful in:

  1. Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)
  2. Multi-purpose storage: As more consumers use VSS for data beyond LDK channel state (wallet metadata, app preferences, payment-store) which aren't as critical to sync immediately or at startup. This separation will be particularly helpful. (Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes)

SideNote: You don't know what those agents might want to use it for, better to not dump everything in single namespace, it will pollute and make operations such as list/sync inefficient.
cc: @tnull

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once that becomes the default pattern, it's hard to rollback.

Yeah, I guess that's a somewhat reasonable concern. As mentioned over at the other PR I don't feel too strongly either way, but I guess since we still have the separation currently, there's little reason to rip it out if we see some future use?

  • Diff syncing: Clean namespace boundaries make it cheaper to track and apply deltas per logical data group. (Critical for faster sync of lightning state.)

Isn't that also redundant to separating by user_token, assuming that (most) users wouldn't have many different stores/store_ids anyways?

cc: @tnull

@G8XSU Btw, could you send me a DM via Discord/Signal/Mail, I'd like to follow-up something if you don't mind?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand how it might seem that way for current usage, allowing empty store_ids effectively encourages users to dump everything into a single flat keyspace without any organization.

I think this somewhat misreads the motivation. Rather, in most use-cases for VSS its used by a single application (or even library within that application) for storing its own relatively small state. If multiple separate subsystems in (or, more likely, libraries within) the application are using the same VSS server, they can/should use a separate key to authenticate, thus creating a separate namespace through the authenticated user-id instead. The API in #755 somewhat loosely encourages downstream non-LDK-node libraries to use a separate key to authenticate.

Some already happening: https://github.com/lightningdevkit/ldk-node/pull/811/changes

This could also happen through the existing top-level and second-level namespaces, which is also consistent with other LDK Node APIs where we only have the KVStore namespaces to go on.

TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
TheBlueMatt added a commit to TheBlueMatt/ldk-node that referenced this pull request Mar 3, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@tnull
tnull removed their request for review March 4, 2026 13:13
@tankyleo
tankyleo self-requested a review March 8, 2026 16:36
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

febyeji pushed a commit to febyeji/ldk-node that referenced this pull request Mar 12, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tankyleo
tankyleo merged commit 2d7cb75 into lightningdevkit:mainMar 17, 2026
6 checks passed
vincenzopalazzo pushed a commit to vincenzopalazzo/ldk-node that referenced this pull request Mar 26, 2026
For now VSS Server rejects empty `store_id`s, though we intend to
change that in
lightningdevkit/vss-server#95, until that
lands we have to use non-empty `store_id`s.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TheBlueMatt@ldk-reviews-bot@tnull@G8XSU@tankyleo