/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠE mer ald Pay , ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . em eral dp ay . d sh ack le . cache Ċ Ċ import Ġcom . github . ben man es . caffe ine . cache . C affe ine Ċ import Ġio . em eral dp ay . d sh ack le . data . Block Container Ċ import Ġio . em eral dp ay . d sh ack le . data . Block Id Ċ import Ġio . em eral dp ay . d sh ack le . data . Tx Container Ċ import Ġio . em eral dp ay . d sh ack le . data . Tx Id Ċ import Ġio . em eral dp ay . d sh ack le . reader . Reader Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġreactor . core . publisher . Mono Ċ Ċ /** Ċ Ġ* ĠMemory Ġcache Ġfor Ġtransactions Ċ Ġ*/ Ċ open Ġclass ĠTx Mem Cache ( ĊĠĠĠ Ġ// Ġusually Ġthere Ġis Ġ 1 0 0 - 1 5 0 Ġtx Ġper Ġblock Ġon ĠEthereum , Ġwe Ġkeep Ġdata Ġfor Ġabout Ġ 3 2 Ġblocks Ġby Ġdefault ĊĠĠĠ Ġprivate Ġval ĠmaxSize : ĠInt Ġ= Ġ 1 2 5 Ġ* Ġ 3 2 Ċ ) Ġ: ĠReader < Tx Id , ĠTx Container > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Tx Mem Cache :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmapping Ġ= ĠC affe ine . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. maximum Size ( maxSize . to Long ()) ĊĠĠĠĠĠĠĠ Ġ. build < Tx Id , ĠTx Container >() ĊĊĠĠĠ Ġoverride Ġfun Ġread ( key : ĠTx Id ): ĠMono < Tx Container > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . just OrEmpty ( mapping . get If Present ( key )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġev ict ( block : ĠBlock Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock . transactions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping . invalidate ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġev ict ( block : ĠBlock Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġmapping . as Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . block Id Ġ== Ġblock Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġmapping . invalidate All ( ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġadd ( tx : ĠTx Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġcache Ġfresh Ġtransactions ĊĠĠĠĠĠĠĠ Ġif Ġ( tx . block Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmapping . put ( tx . hash , Ġtx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġpurge () Ġ{ ĊĠĠĠĠĠĠĠ Ġmapping . clean Up () ĊĠĠĠ Ġ} Ċ } Ċ