@@ -12,11 +12,13 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
12
12
alias LambdaEthereumConsensus.P2P.BlockDownloader
13
13
alias LambdaEthereumConsensus.Store.BlobDb
14
14
alias LambdaEthereumConsensus.Store.Blocks
15
+ alias LambdaEthereumConsensus.Utils
15
16
alias Types.BlockInfo
16
17
alias Types.SignedBeaconBlock
17
18
alias Types.Store
18
19
19
- @ type block_status :: :pending | :invalid | :download | :download_blobs | :unknown
20
+ @ type block_status ::
21
+ :transitioned | :pending | :invalid | :download | :download_blobs | :unknown
20
22
@ type block_info ::
21
23
{ SignedBeaconBlock . t ( ) , :pending | :download_blobs }
22
24
| { nil , :invalid | :download }
@@ -40,15 +42,18 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
40
42
def add_block ( store , signed_block ) do
41
43
block_info = BlockInfo . from_block ( signed_block )
42
44
loaded_block = Blocks . get_block_info ( block_info . root )
45
+ log_md = [ slot: signed_block . message . slot , root: block_info . root ]
43
46
44
47
# If the block is new or was to be downloaded, we store it.
45
48
if is_nil ( loaded_block ) or loaded_block . status == :download do
46
49
missing_blobs = missing_blobs ( block_info )
47
50
48
51
if Enum . empty? ( missing_blobs ) do
52
+ Logger . debug ( "[PendingBlocks] No missing blobs for block, process it" , log_md )
49
53
Blocks . new_block_info ( block_info )
50
54
process_block_and_check_children ( store , block_info )
51
55
else
56
+ Logger . debug ( "[PendingBlocks] Missing blobs for block, scheduling download" , log_md )
52
57
BlobDownloader . request_blobs_by_root ( missing_blobs , & process_blobs / 2 , @ download_retries )
53
58
54
59
block_info
@@ -72,6 +77,7 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
72
77
{ :ok , blocks } ->
73
78
blocks
74
79
|> Enum . sort_by ( fn % BlockInfo { } = block_info -> block_info . signed_block . message . slot end )
80
+ # Could we process just one/a small amount of blocks at a time? would it make more sense?
75
81
|> Enum . reduce ( store , fn block_info , store ->
76
82
{ store , _state } = process_block ( store , block_info )
77
83
store
@@ -101,16 +107,28 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
101
107
end
102
108
end
103
109
104
- defp process_block ( store , block_info ) do
110
+ defp process_block ( store , % BlockInfo { signed_block: % { message: message } } = block_info ) do
105
111
if block_info . status != :pending do
106
- Logger . error ( "Called process block for a block that's not ready: #{ block_info } " )
112
+ Logger . error (
113
+ "[PendingBlocks] Called process block for a block that's not ready: #{ block_info } "
114
+ )
107
115
end
108
116
109
- parent_root = block_info . signed_block . message . parent_root
117
+ log_md = [ slot: message . slot , root: block_info . root ]
118
+ parent_root = message . parent_root
119
+
120
+ Logger . debug (
121
+ "[PendingBlocks] Processing block, parent: #{ Utils . format_binary ( parent_root ) } " ,
122
+ log_md
123
+ )
110
124
111
125
case Blocks . get_block_info ( parent_root ) do
112
126
nil ->
113
- Logger . debug ( "[PendingBlocks] Add parent to download #{ inspect ( parent_root ) } " )
127
+ Logger . debug (
128
+ "[PendingBlocks] Add parent with root: #{ Utils . format_shorten_binary ( parent_root ) } to download" ,
129
+ log_md
130
+ )
131
+
114
132
Blocks . add_block_to_download ( parent_root )
115
133
116
134
BlockDownloader . request_blocks_by_root (
@@ -127,19 +145,25 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
127
145
{ store , :download_pending }
128
146
129
147
% BlockInfo { status: :invalid } ->
148
+ Logger . warning (
149
+ "[PendingBlocks] Parent block with root:#{ Utils . format_shorten_binary ( parent_root ) } is invalid, making this block also invalid" ,
150
+ log_md
151
+ )
152
+
130
153
Blocks . change_status ( block_info , :invalid )
131
154
{ store , :invalid }
132
155
133
156
% BlockInfo { status: :transitioned } ->
134
157
case ForkChoice . on_block ( store , block_info ) do
135
158
{ :ok , store } ->
159
+ Logger . debug ( "[PendingBlocks] Block transitioned after ForkChoice.on_block/2" , log_md )
136
160
Blocks . change_status ( block_info , :transitioned )
137
161
{ store , :transitioned }
138
162
139
163
{ :error , reason , store } ->
140
- Logger . error ( "[PendingBlocks] Saving block as invalid #{ reason } " ,
141
- slot: block_info . signed_block . message . slot ,
142
- root: block_info . root
164
+ Logger . error (
165
+ "[PendingBlocks] Saving block as invalid after ForkChoice.on_block/2 error: #{ reason } " ,
166
+ log_md
143
167
)
144
168
145
169
Blocks . change_status ( block_info , :invalid )
@@ -157,15 +181,15 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
157
181
158
182
defp process_downloaded_block ( store , { :error , reason } ) do
159
183
# We might want to declare a block invalid here.
160
- Logger . error ( "Error downloading block: #{ inspect ( reason ) } " )
184
+ Logger . error ( "[PendingBlocks] Error downloading block: #{ inspect ( reason ) } " )
161
185
{ :ok , store }
162
186
end
163
187
164
- defp process_blobs ( store , { :ok , blobs } ) , do: { :ok , add_blobs ( store , blobs ) }
188
+ def process_blobs ( store , { :ok , blobs } ) , do: { :ok , add_blobs ( store , blobs ) }
165
189
166
- defp process_blobs ( store , { :error , reason } ) do
190
+ def process_blobs ( store , { :error , reason } ) do
167
191
# We might want to declare a block invalid here.
168
- Logger . error ( "Error downloading blobs: #{ inspect ( reason ) } " )
192
+ Logger . error ( "[PendingBlocks] Error downloading blobs: #{ inspect ( reason ) } " )
169
193
{ :ok , store }
170
194
end
171
195
@@ -178,19 +202,20 @@ defmodule LambdaEthereumConsensus.Beacon.PendingBlocks do
178
202
|> Enum . map ( & BlobDb . store_blob / 1 )
179
203
|> Enum . uniq ( )
180
204
|> Enum . reduce ( store , fn root , store ->
181
- with % BlockInfo { } = block_info <- Blocks . get_block_info ( root ) ,
205
+ with % BlockInfo { status: :download_blobs } = block_info <- Blocks . get_block_info ( root ) ,
182
206
[ ] <- missing_blobs ( block_info ) do
183
207
block_info
184
208
|> Blocks . change_status ( :pending )
185
209
|> then ( & process_block_and_check_children ( store , & 1 ) )
186
210
else
187
- _ -> store
211
+ _ ->
212
+ store
188
213
end
189
214
end )
190
215
end
191
216
192
217
@ spec missing_blobs ( BlockInfo . t ( ) ) :: [ Types.BlobIdentifier . t ( ) ]
193
- defp missing_blobs ( % BlockInfo { root: root , signed_block: signed_block } ) do
218
+ def missing_blobs ( % BlockInfo { root: root , signed_block: signed_block } ) do
194
219
signed_block . message . body . blob_kzg_commitments
195
220
|> Stream . with_index ( )
196
221
|> Enum . filter ( & blob_needs_download? ( & 1 , root ) )
0 commit comments