88from node .blockchain .inner_models import Block as PydanticBlock
99from node .blockchain .models import Block as ORMBlock
1010from node .blockchain .models import PendingBlock
11+ from node .blockchain .tasks .process_pending_blocks import start_process_pending_blocks_task
12+ from node .core .utils .misc import apply_on_commit
1113
1214logger = logging .getLogger (__name__ )
1315
@@ -22,16 +24,21 @@ def to_representation(self, instance):
2224 # This "hack" is needed to reduce deserialization / serialization overhead when reading blocks
2325 return OrderedDict (body = instance .body )
2426
25- def validate_message (self , message ):
26- is_invalid_number = ((block_number := message .get ('number' )) is None or
27- block_number < BlockchainFacade .get_instance ().get_next_block_number ())
28- if is_invalid_number :
29- raise ValidationError ('Invalid number' )
30-
31- return message
32-
3327 def create (self , validated_data ):
3428 block = PydanticBlock .parse_obj (validated_data )
29+
30+ facade = BlockchainFacade .get_instance ()
31+ block_number = block .get_block_number ()
32+ next_block_number = facade .get_next_block_number ()
33+ if block_number < next_block_number :
34+ raise ValidationError ('Invalid block number' )
35+
36+ if block_number == next_block_number :
37+ # Preliminary validation (we will revalidate it later) therefore providing `bypass_lock_validation=True`
38+ block .validate_all (facade , bypass_lock_validation = True )
39+ else :
40+ block .validate_business_logic ()
41+
3542 instance , _ = PendingBlock .objects .update_or_create (
3643 number = block .get_block_number (),
3744 signer = block .signer ,
@@ -42,6 +49,9 @@ def create(self, validated_data):
4249 },
4350 )
4451
52+ if block_number == next_block_number :
53+ apply_on_commit (start_process_pending_blocks_task )
54+
4555 return instance
4656
4757 class Meta :
0 commit comments