package Ġme . che bet os . akka . blockchain Ċ Ċ import Ġakka . actor . typed . Actor System Ċ import Ġakka . actor . typed . jav ad sl . Ask Pattern Ċ import Ġme . che bet os . akka . blockchain . actors . Manager Behavior Ċ import Ġme . che bet os . akka . blockchain . actors . Min ing System Behavior Ċ import Ġme . che bet os . akka . blockchain . model . Block Ċ import Ġme . che bet os . akka . blockchain . model . Block Chain Ċ import Ġme . che bet os . akka . blockchain . model . Hash Result Ċ import Ġme . che bet os . akka . blockchain . model . Partial Block Ċ import Ġme . che bet os . akka . blockchain . utils . Blocks Data Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Completion Stage ĊĊ Ċ class ĠBlock Chain Miner Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdifficulty Level Ġ= Ġ 7 ĊĠĠĠ Ġprivate Ġval Ġblocks Ġ= ĠBlock Chain () ĊĠĠĠ Ġprivate Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġactor System : ĠActor System < Manager Behavior . Command > ĊĊĠĠĠ Ġprivate Ġfun Ġmine Next Block (): ĠCompletion Stage < Hash Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Block Id : ĠInt Ġ= Ġblocks . getSize () ĊĠĠĠĠĠĠĠ Ġif Ġ( next Block Id Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactor System . terminate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . print And Validate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Time Ġtaken Ġ" Ġ+ Ġ( end Ġ- Ġstart ) Ġ+ Ġ" Ġms .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . completed Future ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlast Hash Ġ= Ġif Ġ( next Block Id Ġ> Ġ 0 ) Ġblocks . getLast Hash () !! Ġelse Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġprintln (" Min ing Ġblock : Ġ$ next Block Id , Ġlast Hash =$ last Hash ") ĊĠĠĠĠĠĠĠ Ġval Ġblock : ĠPartial Block Ġ= ĠBlocks Data . getNext Block ( next Block Id , Ġlast Hash ) ĊĠĠĠĠĠĠĠ Ġval Ġresults : ĠCompletion Stage < Hash Result > Ġ= ĠAsk Pattern . ask ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactor System , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġme Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ me . path ()} Ġ- Ġrequesting Ġmine Ġblock : Ġ$ block ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManager Behavior . Mine Block Command ( block , Ġme , Ġdifficulty Level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactor System . scheduler () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprintln (" Waiting Ġresult Ġfor Ġblock Ġ$ next Block Id ") ĊĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġresults . then Compose Ġ{ Ġreply : ĠHash Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Received Ġresult Ġfor Ġblock Ġ$ next Block Id : Ġ$ reply ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! reply . complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : ĠNo Ġvalid Ġhash Ġwas Ġfound Ġfor Ġa Ġblock ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Block Ġ= ĠBlock . from Partial Block And Hash Result ( block , Ġreply ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . add Block ( new Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Block Ġadded Ġwith Ġhash Ġ: Ġ${ new Block . hash }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Block Ġadded Ġwith Ġnonce : Ġ${ new Block . nonce }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ then Compose Ġmine Next Block () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBlock ValidationException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : ĠNo Ġvalid Ġhash Ġwas Ġfound Ġfor Ġa Ġblock ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġmine An In dependent Blocks () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġpartial Block Ġ= ĠBlocks Data . getNext Block ( 7 , Ġ" 1 2 3 4 5 6 ") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġresults : ĠCompletion Stage < Hash Result > Ġ= ĠAsk Pattern . ask ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġactor System , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġme Ġ-> ĠManager Behavior . Mine Block Command ( partial Block , Ġme , Ġdifficulty Level ) Ġ}, Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġactor System . scheduler () Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġresults . when Complete Ġ{ Ġreply : ĠHash Result , Ġ_: ĠThrowable Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Received Ġresult Ġfor Ġblock Ġ 7 : Ġ$ reply ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! reply . complete ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : ĠNo Ġvalid Ġhash Ġwas Ġfound Ġfor Ġa Ġblock ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Block Ġ= ĠBlock . from Partial Block And Hash Result ( partial Block , Ġreply ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Received Ġblock Ġ: Ġ$ new Block ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBlock ValidationException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : ĠNo Ġvalid Ġhash Ġwas Ġfound Ġfor Ġa Ġblock ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmine Blocks (): ĠBlock Chain Ġ{ ĊĠĠĠĠĠĠĠ Ġactor System Ġ= ĠActor System . create ( Min ing System Behavior . create (), Ġ" Block Chain Miner ") ĊĠĠĠĠĠĠĠ Ġmine Next Block () Ċ // ĠĠĠĠĠĠĠ Ġmine An In dependent Blocks () ĊĠĠĠĠĠĠĠ Ġreturn Ġblocks ĊĠĠĠ Ġ} Ċ }