@@ -111,14 +111,15 @@ fn blkfiles_fetcher(
111111) -> Result < Fetcher < Vec < BlockEntry > > > {
112112 let magic = daemon. magic ( ) ;
113113 let blk_files = daemon. list_blk_files ( ) ?;
114+ let xor_key = daemon. read_blk_file_xor_key ( ) ?;
114115
115116 let chan = SyncChannel :: new ( 1 ) ;
116117 let sender = chan. sender ( ) ;
117118
118119 let mut entry_map: HashMap < BlockHash , HeaderEntry > =
119120 new_headers. into_iter ( ) . map ( |h| ( * h. hash ( ) , h) ) . collect ( ) ;
120121
121- let parser = blkfiles_parser ( blkfiles_reader ( blk_files) , magic) ;
122+ let parser = blkfiles_parser ( blkfiles_reader ( blk_files, xor_key ) , magic) ;
122123 Ok ( Fetcher :: from (
123124 chan. into_receiver ( ) ,
124125 spawn_thread ( "blkfiles_fetcher" , move || {
@@ -151,7 +152,7 @@ fn blkfiles_fetcher(
151152 ) )
152153}
153154
154- fn blkfiles_reader ( blk_files : Vec < PathBuf > ) -> Fetcher < Vec < u8 > > {
155+ fn blkfiles_reader ( blk_files : Vec < PathBuf > , xor_key : Option < [ u8 ; 8 ] > ) -> Fetcher < Vec < u8 > > {
155156 let chan = SyncChannel :: new ( 1 ) ;
156157 let sender = chan. sender ( ) ;
157158
@@ -160,8 +161,11 @@ fn blkfiles_reader(blk_files: Vec<PathBuf>) -> Fetcher<Vec<u8>> {
160161 spawn_thread ( "blkfiles_reader" , move || {
161162 for path in blk_files {
162163 trace ! ( "reading {:?}" , path) ;
163- let blob = fs:: read ( & path)
164+ let mut blob = fs:: read ( & path)
164165 . unwrap_or_else ( |e| panic ! ( "failed to read {:?}: {:?}" , path, e) ) ;
166+ if let Some ( xor_key) = xor_key {
167+ blkfile_apply_xor_key ( xor_key, & mut blob) ;
168+ }
165169 sender
166170 . send ( blob)
167171 . unwrap_or_else ( |_| panic ! ( "failed to send {:?} contents" , path) ) ;
@@ -170,6 +174,14 @@ fn blkfiles_reader(blk_files: Vec<PathBuf>) -> Fetcher<Vec<u8>> {
170174 )
171175}
172176
177+ /// By default, bitcoind v28.0+ applies an 8-byte "xor key" over each "blk*.dat"
178+ /// file. We have xor again to undo this transformation.
179+ fn blkfile_apply_xor_key ( xor_key : [ u8 ; 8 ] , blob : & mut [ u8 ] ) {
180+ for ( i, blob_i) in blob. iter_mut ( ) . enumerate ( ) {
181+ * blob_i ^= xor_key[ i & 0x7 ] ;
182+ }
183+ }
184+
173185fn blkfiles_parser ( blobs : Fetcher < Vec < u8 > > , magic : u32 ) -> Fetcher < Vec < SizedBlock > > {
174186 let chan = SyncChannel :: new ( 1 ) ;
175187 let sender = chan. sender ( ) ;
0 commit comments