package Ġio . open future . chain . consensus . component . block Ċ Ċ import Ġio . open future . chain . consensus . service . Epoch Service Ċ import Ġio . open future . chain . core . component . Node Key Holder Ċ import Ġio . open future . chain . core . service . Block Manager Ċ import Ġio . open future . chain . core . sync . Chain Synchron izer Ċ import Ġio . open future . chain . core . sync . Sync Status . SYN CH RON IZED Ċ import Ġio . open future . chain . network . component . time . Clock Checker Ċ import Ġio . open future . chain . network . component . time . Clock Sync Status . NOT _ SYN CH RON IZED Ċ import Ġio . open future . chain . network . message . consensus . Pending Block Message Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Scheduled ExecutorService Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . annotation . Post Construct Ċ Ċ @ Component Ċ class ĠBlock Production Scheduler ( ĊĠĠĠ Ġprivate Ġval Ġkey Holder : ĠNode Key Holder , ĊĠĠĠ Ġprivate Ġval Ġepoch Service : ĠEpoch Service , ĊĠĠĠ Ġprivate Ġval Ġblock Manager : ĠBlock Manager , ĊĠĠĠ Ġprivate Ġval Ġpending Block Handler : ĠPending Block Handler , ĊĠĠĠ Ġprivate Ġval Ġchain Synchron izer : ĠChain Synchron izer , ĊĠĠĠ Ġprivate Ġval Ġclock Checker : ĠClock Checker Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Block Production Scheduler :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġexecutor : ĠScheduled ExecutorService Ġ= ĠExec utors . new Single Thread Scheduled Executor () ĊĊĊĠĠĠ Ġ@ Post Construct ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . schedule ({ Ġproceed Production Loop () Ġ}, Ġepoch Service . time To Next Time Slot (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproceed Production Loop () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( NOT _ SYN CH RON IZED Ġ== Ġclock Checker . getStatus ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Please Ġset Ġup ĠTime Ġsynchronization Ġby Ġthe Ġn tp Ġservers ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SYN CH RON IZED Ġ!= Ġchain Synchron izer . getStatus ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Ledger Ġis Ġ${ chain Synchron izer . getStatus () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Synchron izer . check Last Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslot Owner Ġ= Ġepoch Service . getCurrent Slot Owner () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" CONS ENS US : ĠSlot Ġowner Ġ$ slot Owner ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Manager . is Genesis Block Required ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenesis Block Ġ= Ġblock Manager . create Genesis Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Manager . add ( genesis Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" CONS ENS US : ĠS aving Ġgenesis Ġblock Ġwith Ġhash Ġ= Ġ${ genesis Block . hash }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Block Handler . reset Slot Number () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( key Holder . get PublicKey As HexString () Ġ== Ġslot Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġblock Manager . create Main Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Block Handler . add Block ( Pending Block Message ( block )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Block Ġcreation Ġfailure Ġinbound : Ġ${ ex . message }") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . schedule ({ Ġproceed Production Loop () Ġ}, Ġepoch Service . time To Next Time Slot (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }