@@ -24,7 +24,7 @@ use bitcoin::Network;
2424use lightning:: impl_writeable_tlv_based_enum;
2525use lightning:: io:: { self , Error , ErrorKind } ;
2626use lightning:: sign:: { EntropySource as LdkEntropySource , RandomBytes } ;
27- use lightning:: util:: persist:: { KVStore , KVStoreSync } ;
27+ use lightning:: util:: persist:: { KVStore , KVStoreSync , MigratableKVStore } ;
2828use lightning:: util:: ser:: { Readable , Writeable } ;
2929use prost:: Message ;
3030use vss_client:: client:: VssClient ;
@@ -386,6 +386,27 @@ impl Drop for VssStore {
386386 }
387387}
388388
389+ impl MigratableKVStore for VssStore {
390+ fn list_all_keys ( & self ) -> io:: Result < Vec < ( String , String , String ) > > {
391+ let internal_runtime = self . internal_runtime . as_ref ( ) . ok_or_else ( || {
392+ debug_assert ! ( false , "Failed to access internal runtime" ) ;
393+ let msg = format ! ( "Failed to access internal runtime" ) ;
394+ Error :: new ( ErrorKind :: Other , msg)
395+ } ) ?;
396+ let inner = Arc :: clone ( & self . inner ) ;
397+ let fut = async move {
398+ let stored_keys = inner. list_all_stored_keys ( & inner. blocking_client ) . await ?;
399+ let mut decoded = Vec :: with_capacity ( stored_keys. len ( ) ) ;
400+ for stored_key in stored_keys {
401+ if let Some ( key_parts) = inner. decode_stored_key ( & stored_key) ? {
402+ decoded. push ( key_parts) ;
403+ }
404+ }
405+ Ok ( decoded)
406+ } ;
407+ tokio:: task:: block_in_place ( move || internal_runtime. block_on ( fut) )
408+ }
409+ }
389410struct VssStoreInner {
390411 schema_version : VssSchemaVersion ,
391412 blocking_client : VssClient < CustomRetryPolicy > ,
@@ -507,6 +528,93 @@ impl VssStoreInner {
507528 Ok ( keys)
508529 }
509530
531+ async fn list_all_stored_keys (
532+ & self , client : & VssClient < CustomRetryPolicy > ,
533+ ) -> io:: Result < Vec < String > > {
534+ let mut page_token = None ;
535+ let mut keys = Vec :: new ( ) ;
536+
537+ while page_token != Some ( "" . to_string ( ) ) {
538+ let request = ListKeyVersionsRequest {
539+ store_id : self . store_id . clone ( ) ,
540+ key_prefix : None ,
541+ page_token,
542+ page_size : None ,
543+ } ;
544+
545+ let response = client. list_key_versions ( & request) . await . map_err ( |e| {
546+ let msg = format ! ( "Failed to list all stored keys: {}" , e) ;
547+ Error :: new ( ErrorKind :: Other , msg)
548+ } ) ?;
549+
550+ for kv in response. key_versions {
551+ keys. push ( kv. key ) ;
552+ }
553+
554+ page_token = response. next_page_token ;
555+ }
556+
557+ Ok ( keys)
558+ }
559+
560+ fn decode_stored_key ( & self , stored_key : & str ) -> io:: Result < Option < ( String , String , String ) > > {
561+ match self . schema_version {
562+ VssSchemaVersion :: V0 => {
563+ if !stored_key. contains ( '#' ) {
564+ let key = self . key_obfuscator . deobfuscate ( stored_key) ?;
565+ if key == VSS_SCHEMA_VERSION_KEY {
566+ return Ok ( None ) ;
567+ }
568+ return Ok ( Some ( ( "" . to_string ( ) , "" . to_string ( ) , key) ) ) ;
569+ }
570+
571+ let mut parts = stored_key. splitn ( 3 , '#' ) ;
572+ let primary_namespace = parts
573+ . next ( )
574+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key format" ) ) ?;
575+ let secondary_namespace = parts
576+ . next ( )
577+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key format" ) ) ?;
578+ let obfuscated_key = parts
579+ . next ( )
580+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key format" ) ) ?;
581+
582+ let key = self . key_obfuscator . deobfuscate ( obfuscated_key) ?;
583+ if key == VSS_SCHEMA_VERSION_KEY {
584+ return Ok ( None ) ;
585+ }
586+
587+ Ok ( Some ( ( primary_namespace. to_string ( ) , secondary_namespace. to_string ( ) , key) ) )
588+ } ,
589+ VssSchemaVersion :: V1 => {
590+ let mut parts = stored_key. splitn ( 2 , '#' ) ;
591+ let obfuscated_prefix = parts
592+ . next ( )
593+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key format" ) ) ?;
594+ let obfuscated_key = parts
595+ . next ( )
596+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key format" ) ) ?;
597+
598+ let prefix = self . key_obfuscator . deobfuscate ( obfuscated_prefix) ?;
599+ let key = self . key_obfuscator . deobfuscate ( obfuscated_key) ?;
600+
601+ if key == VSS_SCHEMA_VERSION_KEY {
602+ return Ok ( None ) ;
603+ }
604+
605+ let mut prefix_parts = prefix. splitn ( 2 , '#' ) ;
606+ let primary_namespace = prefix_parts
607+ . next ( )
608+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key prefix" ) ) ?;
609+ let secondary_namespace = prefix_parts
610+ . next ( )
611+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid VSS key prefix" ) ) ?;
612+
613+ Ok ( Some ( ( primary_namespace. to_string ( ) , secondary_namespace. to_string ( ) , key) ) )
614+ } ,
615+ }
616+ }
617+
510618 async fn read_internal (
511619 & self , client : & VssClient < CustomRetryPolicy > , primary_namespace : String ,
512620 secondary_namespace : String , key : String ,
0 commit comments