sequenceDiagram autonumber participant Sr as Synchronizer::received participant BP as BlockProcess participant Sp as Synchronizer::poll participant C as main thread participant PU as PreloadUnverified thread participant CV as ConsumeUnverifiedBlocks thread box crate:ckb-sync participant Sr participant Sp participant BP end box crate:ckb-chain participant C participant PU participant CV end Note left of Sr: synchronizer received
Block(122) from remote peer Note over Sr: try_process SyncMessageUnionReader::SendBlock Sr ->>+ BP: BlockProcess::execute(Block(122)) BP ->>+ C: asynchronous_process_block(Block(122)) Note over C: non_contextual_verify(Block(122)) Note over C: insert_block(Block(122)) Note over C: OrphanBroker.process_lonly_block(Block(122)) alt parent is BLOCK_STORED or parent is_pending_veryfing Note over C: OrphanBroker.process_lonly_block(Block(122)) Note over C: increase unverified_tip to Block(122) C ->>+ PU: send Block(122) to PreloadUnverified via channel else parent not found Note over C: OrphanBroker.process_lonly_block(Block(122)) Note over C: insert Block(122) to OrphanBroker end C ->>+ PU: send Block(123) to PreloadUnverified via channel C ->>- BP: return BP ->>- Sr: return Note left of Sr: synchronizer received
Block(123) from remote peer Note over Sr: try_process SyncMessageUnionReader::SendBlock Sr ->>+ BP: BlockProcess::execute(Block(123)) BP ->>+ C: asynchronous_process_block(Block(123)) Note over C: non_contextual_verify(Block(123)) Note over C: insert_block(Block(123)) Note over C: OrphanBroker.process_lonly_block(Block(123)) alt parent is BLOCK_STORED or parent is_pending_veryfing Note over C: OrphanBroker.process_lonly_block(Block(123)) Note over C: increase unverified_tip to Block(123) C ->>+ PU: send Block(123) to PreloadUnverified via channel else parent not found Note over C: OrphanBroker.process_lonly_block(Block(123)) Note over C: insert Block(123) to OrphanBroker end C ->>- BP: return BP ->>- Sr: return loop load unverified Note over PU: receive LonelyBlockHash Note over PU: load UnverifiedBlock from db PU ->>+ CV: send UnverifiedBlock to ConsumeUnverifiedBlocks end loop Consume Unverified Blocks Note over CV: start verify UnverifiedBlock if the channel is not empty Note over CV: Verify Block in CKB VM alt Block is Valid Note over CV: remove Block block_status and HeaderMap else Block is Invalid Note over CV: mark block as BLOCK_INVALID in block_status_map Note over CV: Decrease Unverified TIP end opt Execute Callback Note over CV: execute callback to punish the malicious peer if block is invalid Note over CV: callback: Box) + Send + Sync> end end