@@ -40,14 +40,15 @@ impl<'a> GetBlocksProofProcess<'a> {
40
40
41
41
let snapshot = self . protocol . shared . snapshot ( ) ;
42
42
43
- let last_hash = self . message . last_hash ( ) . to_entity ( ) ;
44
- let last_block = if let Some ( block) = snapshot. get_block ( & last_hash) {
45
- block
46
- } else {
43
+ let last_block_hash = self . message . last_hash ( ) . to_entity ( ) ;
44
+ if !snapshot. is_main_chain ( & last_block_hash) {
47
45
return self
48
46
. protocol
49
47
. reply_tip_state :: < packed:: SendBlocksProof > ( self . peer , self . nc ) ;
50
- } ;
48
+ }
49
+ let last_block = snapshot
50
+ . get_block ( & last_block_hash)
51
+ . expect ( "block should be in store" ) ;
51
52
52
53
let block_hashes: Vec < _ > = self
53
54
. message
@@ -59,42 +60,30 @@ impl<'a> GetBlocksProofProcess<'a> {
59
60
let mut uniq = HashSet :: new ( ) ;
60
61
if !block_hashes
61
62
. iter ( )
62
- . chain ( [ last_hash . clone ( ) ] . iter ( ) )
63
+ . chain ( [ last_block_hash ] . iter ( ) )
63
64
. all ( |hash| uniq. insert ( hash) )
64
65
{
65
66
return StatusCode :: MalformedProtocolMessage
66
67
. with_context ( "duplicate block hash exists" ) ;
67
68
}
68
69
69
- let ( positions , block_headers , missing_blocks ) = block_hashes
70
+ let ( found , missing ) : ( Vec < _ > , Vec < _ > ) = block_hashes
70
71
. into_iter ( )
71
- . map ( |block_hash| {
72
- snapshot
73
- . get_block_header ( & block_hash)
74
- . map ( |header| header. number ( ) )
75
- . filter ( |number| * number != last_block. number ( ) )
76
- . and_then ( |number| snapshot. get_ancestor ( & last_hash, number) )
77
- . filter ( |header| header. hash ( ) == block_hash)
78
- . ok_or ( block_hash)
79
- } )
80
- . fold (
81
- ( Vec :: new ( ) , Vec :: new ( ) , Vec :: new ( ) ) ,
82
- |( mut positions, mut block_headers, mut missing_blocks) , result| {
83
- match result {
84
- Ok ( header) => {
85
- positions. push ( leaf_index_to_pos ( header. number ( ) ) ) ;
86
- block_headers. push ( header) ;
87
- }
88
- Err ( block_hash) => {
89
- missing_blocks. push ( block_hash) ;
90
- }
91
- }
92
- ( positions, block_headers, missing_blocks)
93
- } ,
94
- ) ;
72
+ . partition ( |block_hash| snapshot. is_main_chain ( block_hash) ) ;
73
+
74
+ let mut positions = Vec :: with_capacity ( found. len ( ) ) ;
75
+ let mut block_headers = Vec :: with_capacity ( found. len ( ) ) ;
76
+
77
+ for block_hash in found {
78
+ let header = snapshot
79
+ . get_block_header ( & block_hash)
80
+ . expect ( "header should be in store" ) ;
81
+ positions. push ( leaf_index_to_pos ( header. number ( ) ) ) ;
82
+ block_headers. push ( header. data ( ) ) ;
83
+ }
95
84
96
- let proved_items = block_headers. into_iter ( ) . map ( |view| view . data ( ) ) . pack ( ) ;
97
- let missing_items = missing_blocks . pack ( ) ;
85
+ let proved_items = block_headers. pack ( ) ;
86
+ let missing_items = missing . pack ( ) ;
98
87
99
88
self . protocol . reply_proof :: < packed:: SendBlocksProof > (
100
89
self . peer ,
0 commit comments