/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġ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 Ġorg . apache . tu w eni . str atum . server Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Processing Exception Ċ import Ġcom . fasterxml . jackson . databind . json . Json Mapper Ċ import Ġorg . apache . tu w eni . bytes . Bytes Ċ import Ġorg . apache . tu w eni . bytes . Bytes 3 2 Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjava . time . Instant Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Random Ċ Ċ /** Ċ Ġ* ĠHandler Ġcapable Ġof Ġtaking Ġcare Ġof Ġa Ġconnection Ġto Ġa ĠStr atum Ġserver Ġaccording Ġto Ġa Ġspecific Ġflavor Ġof Ġthe ĠStr atum Ġprotocol . Ċ Ġ*/ Ċ interface ĠStr atum Protocol Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠChecks Ġif Ġthe Ġprotocol Ġcan Ġhandle Ġa ĠTCP Ġconnection , Ġbased Ġon Ġthe Ġinitial Ġmessage . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġinitial Message Ġthe Ġinitial Ġmessage Ġsent Ġover Ġthe ĠTCP Ġconnection . ĊĠĠ Ġ* Ġ@ param Ġconn Ġthe Ġconnection Ġitself ĊĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġprotocol Ġcan Ġhandle Ġthis Ġconnection ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcan Handle ( initial Message : ĠString , Ġconn : ĠStr atum Connection ): ĠBoolean ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCallback Ġwhen Ġa Ġstr atum Ġconnection Ġis Ġclosed . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġconn Ġthe Ġconnection Ġthat Ġjust Ġclosed ĊĠĠ Ġ*/ ĊĠ Ġfun ĠonClose ( conn : ĠStr atum Connection ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHandle Ġa Ġmessage Ġover Ġan Ġestablished ĠStr atum Ġconnection ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġconn Ġthe ĠStr atum Ġconnection ĊĠĠ Ġ* Ġ@ param Ġmessage Ġthe Ġmessage Ġto Ġhandle ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhandle ( conn : ĠStr atum Connection , Ġmessage : ĠString ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġcurrent Ġproof - of - work Ġjob . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġinput Ġthe Ġnew Ġproof - of - work Ġjob Ġto Ġsend Ġto Ġmin ers ĊĠĠ Ġ*/ ĊĠ Ġfun ĠsetCurrent Work Task ( input : ĠPo W Input ) Ċ } Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof Ġthe Ġstr atum + tcp Ġprotocol . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġprotocol Ġallows Ġmin ers Ġto Ġsubmit ĠE th Hash Ġsolutions Ġover Ġa Ġpersistent ĠTCP Ġconnection . Ċ Ġ*/ Ċ class ĠStr atum 1 Protocol ( ĊĠ Ġprivate Ġval Ġex tran once : ĠString , ĊĠ Ġprivate Ġval Ġjob Id Supplier : Ġ() Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠ Ġval Ġtime Value : ĠBytes Ġ= ĊĠĠĠĠĠ ĠBytes . minimal Bytes ( Instant . now (). to Epoch Milli ()) ĊĠĠĠ Ġtime Value . slice ( time Value . size () Ġ- Ġ 4 , Ġ 4 ). to Short HexString () ĊĠ Ġ}, ĊĠ Ġprivate Ġval Ġsubscription Id Creator : Ġ() Ġ-> ĠString Ġ= Ġ{ Ġcreate Subscription ID () Ġ}, ĊĠ Ġprivate Ġval Ġsubmit Callback : Ġ( Po WS olution ) Ġ-> Ġ( Boolean ), ĊĠ Ġprivate Ġval Ġseed Supplier : Ġ() Ġ-> ĠBytes 3 2 , Ċ ) Ġ: ĠStr atum Protocol Ġ{ ĊĠ Ġprivate Ġvar Ġcurrent Input : ĠPo W Input ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġactive Connections : ĠMutable List < Str atum Connection > Ġ= ĠArrayList () ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Str atum 1 Protocol :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= ĠJson Mapper () ĊĠĠĠ Ġprivate Ġval ĠSTR AT UM _ 1 Ġ= Ġ" E thereum Str atum / 1 . 0 . 0 " ĊĠĠĠ Ġprivate Ġfun Ġcreate Subscription ID (): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġsubscription Bytes Ġ= ĠByteArray ( 1 6 ) ĊĠĠĠĠĠ ĠRandom (). next Bytes ( subscription Bytes ) ĊĠĠĠĠĠ Ġreturn ĠBytes . wrap ( subscription Bytes ). to Short HexString () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcan Handle ( initial Message : ĠString , Ġconn : ĠStr atum Connection ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! initial Message . contains (" mining . subscribe ")) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug (" Invalid Ġfirst Ġmessage Ġmethod : Ġ{}", Ġinitial Message ) ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrequest Body : ĠJson Rpc Request ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġrequest Body Ġ= Ġmapper . readValue ( initial Message , ĠJson Rpc Request :: class . java ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġnotify Ġ= Ġmapper . writeValue AsString ( ĊĠĠĠĠĠĠĠ ĠJson Rpc Success Response ( ĊĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġrequest Body . id , ĊĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mining . notify ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription Id Creator (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR AT UM _ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex tran once ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġconn . send ( notify Ġ+ Ġ"\ n ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġregister Connection ( conn : ĠStr atum Connection ) Ġ{ ĊĠĠĠ Ġactive Connections . add ( conn ) ĊĠĠĠ Ġif Ġ( current Input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġsend New Work ( conn ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsend New Work ( conn : ĠStr atum Connection ) Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġcurrent Input Ġ?: Ġreturn ĊĠĠĠ Ġval Ġparams Ġ= Ġmutable ListOf < Any >( ĊĠĠĠĠĠ Ġjob Id Supplier (), ĊĠĠĠĠĠ ĠBytes . wrap ( input . pre Pow Hash ). to HexString (), ĊĠĠĠĠĠ Ġseed Supplier (). to HexString (), ĊĠĠĠĠĠ Ġinput . target . to Bytes (). to HexString (), ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġreq Ġ= ĠJson Rpc Request (" 2 . 0 ", Ġ" mining . notify ", Ġparams , Ġ" 3 2 ") ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġconn . send ( mapper . writeValue AsString ( req ) Ġ+ Ġ"\ n ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonClose ( conn : ĠStr atum Connection ) Ġ{ ĊĠĠĠ Ġactive Connections . remove ( conn ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġhandle ( conn : ĠStr atum Connection , Ġmessage : ĠString ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġreq : ĠJson Rpc Request Ġ= Ġmapper . readValue ( message , ĠJson Rpc Request :: class . java ) ĊĠĠĠĠĠ Ġif Ġ(" mining . authorize " Ġ== Ġreq . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Min ing Authorize ( conn , Ġreq ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(" mining . submit " Ġ== Ġreq . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Min ing Submit ( conn , Ġreq ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Min ing Submit ( conn : ĠStr atum Connection , Ġmessage : ĠJson Rpc Request ) Ġ{ ĊĠĠĠ Ġlogger . debug (" Miner Ġsubmitted Ġsolution Ġ{}", Ġmessage ) ĊĠĠĠ Ġval Ġsolution Ġ= ĠPo WS olution ( ĊĠĠĠĠĠ Ġmessage . bytes ( 2 ). getLong ( 0 ), ĊĠĠĠĠĠ Ġmessage . bytes 3 2 ( 4 ), ĊĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠ Ġmessage . bytes ( 3 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġcurrent Input ?. pre Pow Hash ?. equals ( solution . pow Hash )?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsubmit Callback ( solution ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmapper . writeValue AsString ( Json Rpc Success Response ( message . id , Ġresult Ġ= Ġresult )) ĊĠĠĠĠĠĠĠ Ġconn . send ( response Ġ+ Ġ"\ n ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġhandle Min ing Authorize ( conn : ĠStr atum Connection , Ġmessage : ĠJson Rpc Request ) Ġ{ ĊĠĠĠ Ġ// Ġdiscard Ġmessage Ġcontents Ġas Ġwe Ġdon 't Ġcare Ġfor Ġusername / password . ĊĠĠĠ Ġ// Ġsend Ġconfirmation ĊĠĠĠ Ġval Ġconfirm Ġ= Ġmapper . writeValue AsString ( Json Rpc Success Response ( message . id , Ġresult Ġ= Ġtrue )) ĊĠĠĠ Ġconn . send ( confirm Ġ+ Ġ"\ n ") ĊĠĠĠ Ġ// Ġready Ġfor Ġwork . ĊĠĠĠ Ġregister Connection ( conn ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetCurrent Work Task ( input : ĠPo W Input ) Ġ{ ĊĠĠĠ Ġcurrent Input Ġ= Ġinput ĊĠĠĠ Ġlogger . debug (" Sending Ġnew Ġwork Ġto Ġmin ers : Ġ{}", Ġinput ) ĊĠĠĠ Ġfor Ġ( conn : ĠStr atum Connection Ġin Ġactive Connections ) Ġ{ ĊĠĠĠĠĠ Ġsend New Work ( conn ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof Ġthe Ġstr atum 1 + tcp Ġprotocol . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġprotocol Ġallows Ġmin ers Ġto Ġsubmit ĠE th Hash Ġsolutions Ġover Ġa Ġpersistent ĠTCP Ġconnection . Ċ Ġ*/ Ċ class ĠStr atum 1 Eth Proxy Protocol ( ĊĠ Ġprivate Ġval Ġsubmit Callback : Ġ( Po WS olution ) Ġ-> ĠBoolean , ĊĠ Ġprivate Ġval Ġseed Supplier : Ġ() Ġ-> ĠBytes 3 2 , ĊĠ Ġprivate Ġval Ġhash rate Callback : Ġ( Bytes , ĠLong ) Ġ-> ĠBoolean , Ċ ) Ġ: ĠStr atum Protocol Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Str atum 1 Eth Proxy Protocol :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= ĠJson Mapper () ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġcurrent Input : ĠPo W Input ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġcan Handle ( initial Message : ĠString , Ġconn : ĠStr atum Connection ): ĠBoolean Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġreq Ġ= Ġmapper . readValue ( initial Message , ĠJson Rpc Request :: class . java ) ĊĠĠĠĠĠ Ġif Ġ( req . method Ġ!= Ġ" eth _ submit Login ") Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Invalid Ġfirst Ġmessage Ġmethod : Ġ{}", Ġinitial Message ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmapper . writeValue AsString ( Json Rpc Success Response ( req . id , Ġresult Ġ= Ġtrue )) ĊĠĠĠĠĠ Ġconn . send ( response Ġ+ Ġ"\ n ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsend New Work ( conn : ĠStr atum Connection , Ġid : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġcurrent Input Ġ?: Ġreturn ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠ Ġinput . pre Pow Hash . to HexString (), ĊĠĠĠĠĠ Ġseed Supplier (), ĊĠĠĠĠĠ Ġinput . target . to HexString () ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġreq Ġ= ĠJson Rpc Success Response ( id Ġ= Ġid , Ġresult Ġ= Ġresult ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġconn . send ( mapper . writeValue AsString ( req ) Ġ+ Ġ"\ n ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonClose ( conn : ĠStr atum Connection ) Ġ{} ĊĊĠ Ġoverride Ġfun Ġhandle ( conn : ĠStr atum Connection , Ġmessage : ĠString ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġreq : ĠJson Rpc Request Ġ= Ġmapper . readValue ( message , ĠJson Rpc Request :: class . java ) ĊĠĠĠĠĠ Ġif Ġ(" eth _ get Work " Ġ== Ġreq . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend New Work ( conn , Ġreq . id ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(" eth _ submit Work " Ġ== Ġreq . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Min ing Submit ( conn , Ġreq ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(" eth _ submit Hash rate " Ġ== Ġreq . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Hash rate Submit ( mapper , Ġconn , Ġreq ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Unsupported Ġmessage : Ġ{}", Ġreq . method ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Processing Exception ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ Ġlogger . debug ( e . message , Ġe ) ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġhandle Min ing Submit ( conn : ĠStr atum Connection , Ġreq : ĠJson Rpc Request ) Ġ{ ĊĠĠĠ Ġlogger . debug (" Miner Ġsubmitted Ġsolution Ġ{}", Ġreq ) ĊĠĠĠ Ġval Ġsolution Ġ= ĠPo WS olution ( ĊĠĠĠĠĠ Ġreq . bytes ( 0 ). getLong ( 0 ), ĊĠĠĠĠĠ Ġreq . bytes 3 2 ( 2 ), ĊĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠ Ġreq . bytes ( 1 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġcurrent Input ?. pre Pow Hash ?. equals ( solution . pow Hash )?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsubmit Callback ( solution ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmapper . writeValue AsString ( Json Rpc Success Response ( id Ġ= Ġreq . id , Ġresult Ġ= Ġresult )) ĊĠĠĠĠĠĠĠ Ġconn . send ( response Ġ+ Ġ"\ n ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetCurrent Work Task ( input : ĠPo W Input ) Ġ{ ĊĠĠĠ Ġcurrent Input Ġ= Ġinput ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġhandle Hash rate Submit ( ĊĠĠĠ Ġmapper : ĠJson Mapper , ĊĠĠĠ Ġconn : ĠStr atum Connection , ĊĠĠĠ Ġmessage : ĠJson Rpc Request ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġhash Rate Ġ= Ġmessage . bytes ( 0 ) ĊĠĠĠ Ġval Ġid Ġ= Ġmessage . bytes ( 1 ) ĊĠĠĠ Ġval Ġresponse Ġ= Ġmapper . writeValue AsString ( ĊĠĠĠĠĠ ĠJson Rpc Success Response ( ĊĠĠĠĠĠĠĠ Ġmessage . id , ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġhash rate Callback ( id , Ġhash Rate . to BigInteger (). to Long ()) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġconn . send ( response Ġ+ Ġ"\ n ") ĊĠ Ġ} Ċ } Ċ