53
53
54
54
class BaseBeaconChainDB (ABC ):
55
55
db = None # type: BaseAtomicDB
56
- block_class = None # type: Type[BaseBeaconBlock]
57
-
58
- @abstractmethod
59
- def set_block_class (self , block_class : Type [BaseBeaconBlock ]) -> None :
60
- pass
61
56
62
57
#
63
58
# Block API
64
59
#
65
60
@abstractmethod
66
- def persist_block (self ,
67
- block : BaseBeaconBlock ) -> Tuple [Tuple [bytes , ...], Tuple [bytes , ...]]:
61
+ def persist_block (
62
+ self ,
63
+ block : BaseBeaconBlock ,
64
+ block_class : Type [BaseBeaconBlock ]
65
+ ) -> Tuple [Tuple [bytes , ...], Tuple [bytes , ...]]:
68
66
pass
69
67
70
68
@abstractmethod
71
69
def get_canonical_block_root (self , slot : int ) -> Hash32 :
72
70
pass
73
71
74
72
@abstractmethod
75
- def get_canonical_block_by_slot (self , slot : int ) -> BaseBeaconBlock :
73
+ def get_canonical_block_by_slot (self ,
74
+ slot : int ,
75
+ block_class : Type [BaseBeaconBlock ]) -> BaseBeaconBlock :
76
76
pass
77
77
78
78
@abstractmethod
79
79
def get_canonical_block_root_by_slot (self , slot : int ) -> Hash32 :
80
80
pass
81
81
82
82
@abstractmethod
83
- def get_canonical_head (self ) -> BaseBeaconBlock :
83
+ def get_canonical_head (self , block_class : Type [ BaseBeaconBlock ] ) -> BaseBeaconBlock :
84
84
pass
85
85
86
86
@abstractmethod
87
- def get_block_by_root (self , block_root : Hash32 ) -> BaseBeaconBlock :
87
+ def get_block_by_root (self ,
88
+ block_root : Hash32 ,
89
+ block_class : Type [BaseBeaconBlock ]) -> BaseBeaconBlock :
88
90
pass
89
91
90
92
@abstractmethod
@@ -97,8 +99,9 @@ def block_exists(self, block_root: Hash32) -> bool:
97
99
98
100
@abstractmethod
99
101
def persist_block_chain (
100
- self ,
101
- blocks : Iterable [BaseBeaconBlock ]
102
+ self ,
103
+ blocks : Iterable [BaseBeaconBlock ],
104
+ block_class : Type [BaseBeaconBlock ]
102
105
) -> Tuple [Tuple [BaseBeaconBlock , ...], Tuple [BaseBeaconBlock , ...]]:
103
106
pass
104
107
@@ -127,20 +130,19 @@ def get(self, key: bytes) -> bytes:
127
130
128
131
129
132
class BeaconChainDB (BaseBeaconChainDB ):
130
- def __init__ (self , db : BaseAtomicDB , block_class : Type [ BaseBeaconBlock ] ) -> None :
133
+ def __init__ (self , db : BaseAtomicDB ) -> None :
131
134
self .db = db
132
- self .block_class = block_class
133
-
134
- def set_block_class (self , block_class : Type [BaseBeaconBlock ]) -> None :
135
- self .block_class = block_class
136
135
137
- def persist_block (self ,
138
- block : BaseBeaconBlock ) -> Tuple [Tuple [bytes , ...], Tuple [bytes , ...]]:
136
+ def persist_block (
137
+ self ,
138
+ block : BaseBeaconBlock ,
139
+ block_class : Type [BaseBeaconBlock ]
140
+ ) -> Tuple [Tuple [bytes , ...], Tuple [bytes , ...]]:
139
141
"""
140
142
Persist the given block.
141
143
"""
142
144
with self .db .atomic_batch () as db :
143
- return self ._persist_block (db , block , self . block_class )
145
+ return self ._persist_block (db , block , block_class )
144
146
145
147
@classmethod
146
148
def _persist_block (
@@ -188,14 +190,16 @@ def _get_canonical_block_root(db: BaseDB, slot: int) -> Hash32:
188
190
else :
189
191
return rlp .decode (encoded_key , sedes = rlp .sedes .binary )
190
192
191
- def get_canonical_block_by_slot (self , slot : int ) -> BaseBeaconBlock :
193
+ def get_canonical_block_by_slot (self ,
194
+ slot : int ,
195
+ block_class : Type [BaseBeaconBlock ]) -> BaseBeaconBlock :
192
196
"""
193
197
Return the block with the given slot in the canonical chain.
194
198
195
199
Raise BlockNotFound if there's no block with the given slot in the
196
200
canonical chain.
197
201
"""
198
- return self ._get_canonical_block_by_slot (self .db , slot , self . block_class )
202
+ return self ._get_canonical_block_by_slot (self .db , slot , block_class )
199
203
200
204
@classmethod
201
205
def _get_canonical_block_by_slot (
@@ -223,11 +227,11 @@ def _get_canonical_block_root_by_slot(
223
227
validate_slot (slot )
224
228
return cls ._get_canonical_block_root (db , slot )
225
229
226
- def get_canonical_head (self ) -> BaseBeaconBlock :
230
+ def get_canonical_head (self , block_class : Type [ BaseBeaconBlock ] ) -> BaseBeaconBlock :
227
231
"""
228
232
Return the current block at the head of the chain.
229
233
"""
230
- return self ._get_canonical_head (self .db , self . block_class )
234
+ return self ._get_canonical_head (self .db , block_class )
231
235
232
236
@classmethod
233
237
def _get_canonical_head (cls ,
@@ -239,8 +243,10 @@ def _get_canonical_head(cls,
239
243
raise CanonicalHeadNotFound ("No canonical head set for this chain" )
240
244
return cls ._get_block_by_root (db , Hash32 (canonical_head_root ), block_class )
241
245
242
- def get_block_by_root (self , block_root : Hash32 ) -> BaseBeaconBlock :
243
- return self ._get_block_by_root (self .db , block_root , self .block_class )
246
+ def get_block_by_root (self ,
247
+ block_root : Hash32 ,
248
+ block_class : Type [BaseBeaconBlock ]) -> BaseBeaconBlock :
249
+ return self ._get_block_by_root (self .db , block_root , block_class )
244
250
245
251
@staticmethod
246
252
def _get_block_by_root (db : BaseDB ,
@@ -280,15 +286,16 @@ def _block_exists(db: BaseDB, block_root: Hash32) -> bool:
280
286
return block_root in db
281
287
282
288
def persist_block_chain (
283
- self ,
284
- blocks : Iterable [BaseBeaconBlock ]
289
+ self ,
290
+ blocks : Iterable [BaseBeaconBlock ],
291
+ block_class : Type [BaseBeaconBlock ]
285
292
) -> Tuple [Tuple [BaseBeaconBlock , ...], Tuple [BaseBeaconBlock , ...]]:
286
293
"""
287
294
Return two iterable of blocks, the first containing the new canonical blocks,
288
295
the second containing the old canonical headers
289
296
"""
290
297
with self .db .atomic_batch () as db :
291
- return self ._persist_block_chain (db , blocks , self . block_class )
298
+ return self ._persist_block_chain (db , blocks , block_class )
292
299
293
300
@classmethod
294
301
def _set_block_scores_to_db (
0 commit comments