@@ -6,25 +6,31 @@ use std::panic::RefUnwindSafe;
66
77use crate :: io:: utils:: check_namespace_key_validity;
88use lightning:: util:: persist:: KVStore ;
9+ use prost:: Message ;
10+ use rand:: RngCore ;
911use tokio:: runtime:: Runtime ;
1012use vss_client:: client:: VssClient ;
1113use vss_client:: error:: VssError ;
1214use vss_client:: types:: {
1315 DeleteObjectRequest , GetObjectRequest , KeyValue , ListKeyVersionsRequest , PutObjectRequest ,
16+ Storable ,
1417} ;
18+ use vss_client:: util:: storable_builder:: { EntropySource , StorableBuilder } ;
1519
1620/// A [`KVStore`] implementation that writes to and reads from a [VSS](https://github.com/lightningdevkit/vss-server/blob/main/README.md) backend.
1721pub struct VssStore {
1822 client : VssClient ,
1923 store_id : String ,
2024 runtime : Runtime ,
25+ storable_builder : StorableBuilder < RandEntropySource > ,
2126}
2227
2328impl VssStore {
24- pub ( crate ) fn new ( base_url : & str , store_id : String ) -> Self {
25- let client = VssClient :: new ( base_url) ;
29+ pub ( crate ) fn new ( base_url : String , store_id : String , data_encryption_key : [ u8 ; 32 ] ) -> Self {
30+ let client = VssClient :: new ( base_url. as_str ( ) ) ;
2631 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
27- Self { client, store_id, runtime }
32+ let storable_builder = StorableBuilder :: new ( data_encryption_key, RandEntropySource ) ;
33+ Self { client, store_id, runtime, storable_builder }
2834 }
2935
3036 fn build_key (
@@ -99,20 +105,25 @@ impl KVStore for VssStore {
99105 _ => Error :: new ( ErrorKind :: Other , msg) ,
100106 }
101107 } ) ?;
102- Ok ( resp. value . unwrap ( ) . value )
108+ // unwrap safety: resp.value must be always present for a non-erroneous VSS response, otherwise
109+ // it is an API-violation which is converted to [`VssError::InternalServerError`] in [`VssClient`]
110+ let storable = Storable :: decode ( & resp. value . unwrap ( ) . value [ ..] ) ?;
111+ Ok ( self . storable_builder . deconstruct ( storable) ?. 0 )
103112 }
104113
105114 fn write (
106115 & self , primary_namespace : & str , secondary_namespace : & str , key : & str , buf : & [ u8 ] ,
107116 ) -> io:: Result < ( ) > {
108117 check_namespace_key_validity ( primary_namespace, secondary_namespace, Some ( key) , "write" ) ?;
118+ let version = -1 ;
119+ let storable = self . storable_builder . build ( buf. to_vec ( ) , version) ;
109120 let request = PutObjectRequest {
110121 store_id : self . store_id . clone ( ) ,
111122 global_version : None ,
112123 transaction_items : vec ! [ KeyValue {
113124 key: self . build_key( primary_namespace, secondary_namespace, key) ?,
114- version: - 1 ,
115- value: buf . to_vec ( ) ,
125+ version,
126+ value: storable . encode_to_vec ( ) ,
116127 } ] ,
117128 delete_items : vec ! [ ] ,
118129 } ;
@@ -171,6 +182,15 @@ impl KVStore for VssStore {
171182 }
172183}
173184
185+ /// A source for generating entropy/randomness using [`rand`].
186+ pub ( crate ) struct RandEntropySource ;
187+
188+ impl EntropySource for RandEntropySource {
189+ fn fill_bytes ( & self , buffer : & mut [ u8 ] ) {
190+ rand:: thread_rng ( ) . fill_bytes ( buffer) ;
191+ }
192+ }
193+
174194#[ cfg( test) ]
175195impl RefUnwindSafe for VssStore { }
176196
@@ -180,14 +200,16 @@ mod tests {
180200 use super :: * ;
181201 use crate :: io:: test_utils:: do_read_write_remove_list_persist;
182202 use rand:: distributions:: Alphanumeric ;
183- use rand:: { thread_rng, Rng } ;
203+ use rand:: { thread_rng, Rng , RngCore } ;
184204
185205 #[ test]
186206 fn read_write_remove_list_persist ( ) {
187207 let vss_base_url = std:: env:: var ( "TEST_VSS_BASE_URL" ) . unwrap ( ) ;
188208 let mut rng = thread_rng ( ) ;
189209 let rand_store_id: String = ( 0 ..7 ) . map ( |_| rng. sample ( Alphanumeric ) as char ) . collect ( ) ;
190- let vss_store = VssStore :: new ( & vss_base_url, rand_store_id) ;
210+ let mut data_encryption_key = [ 0u8 ; 32 ] ;
211+ rng. fill_bytes ( & mut data_encryption_key) ;
212+ let vss_store = VssStore :: new ( vss_base_url, rand_store_id, data_encryption_key) ;
191213
192214 do_read_write_remove_list_persist ( & vss_store) ;
193215 }
0 commit comments