/* Ċ Ġ* Ġ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 . eth client Ċ Ċ import Ġio . vertx . core . Vert x Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . apache . lucene . analysis . standard . Standard Analyzer Ċ import Ġorg . apache . lucene . index . Index Writer Ċ import Ġorg . apache . lucene . index . Index Writer Config Ċ import Ġorg . apache . lucene . store . NI OF SD irectory Ċ import Ġorg . apache . tu w eni . bytes . Bytes Ċ import Ġorg . apache . tu w eni . concurrent . Async Completion Ċ import Ġorg . apache . tu w eni . concurrent . coroutines . await Ċ import Ġorg . apache . tu w eni . dev p 2 p . Discovery Service Ċ import Ġorg . apache . tu w eni . dev p 2 p . eth . Eth Requests Manager Ċ import Ġorg . apache . tu w eni . dev p 2 p . eth . Eth Sub protocol Ċ import Ġorg . apache . tu w eni . dev p 2 p . eth . Eth Sub protocol . Companion . ETH 6 6 Ċ import Ġorg . apache . tu w eni . dev p 2 p . eth . Simple Blockchain Information Ċ import Ġorg . apache . tu w eni . dev p 2 p . parse En ode Uri Ċ import Ġorg . apache . tu w eni . dev p 2 p . proxy . Proxy Client Ċ import Ġorg . apache . tu w eni . dev p 2 p . proxy . Proxy Sub protocol Ċ import Ġorg . apache . tu w eni . dev p 2 p . proxy . Tcp Down stream Ċ import Ġorg . apache . tu w eni . dev p 2 p . proxy . Tcp Upstream Ċ import Ġorg . apache . tu w eni . eth . genesis . Genesis File Ċ import Ġorg . apache . tu w eni . eth . repository . Blockchain Index Ċ import Ġorg . apache . tu w eni . eth . repository . Blockchain Repository Ċ import Ġorg . apache . tu w eni . eth . repository . Memory Transaction Pool Ċ import Ġorg . apache . tu w eni . kv . In fin is pan KeyValue Store Ċ import Ġorg . apache . tu w eni . kv . KeyValue Store Ċ import Ġorg . apache . tu w eni . kv . Map KeyValue Store Ċ import Ġorg . apache . tu w eni . kv . Persistence Marshaller Ċ import Ġorg . apache . tu w eni . metrics . Metrics Service Ċ import Ġorg . apache . tu w eni . rl px . RL Px Service Ċ import Ġorg . apache . tu w eni . rl px . vertx . Vert x RL Px Service Ċ import Ġorg . apache . tu w eni . units . big ints . UInt 2 5 6 Ċ import Ġorg . in fin is pan . Cache Ċ import Ġorg . in fin is pan . configuration . cache . Configuration Builder Ċ import Ġorg . in fin is pan . configuration . global . Global Configuration Builder Ċ import Ġorg . in fin is pan . manager . Default CacheManager Ċ import Ġorg . in fin is pan . persistence . ro cksdb . configuration . R ocks DB Store Configuration Builder Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . net . URI Ċ import Ġjava . nio . file . Path Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠTop - level Ġclass Ġto Ġrun Ġan ĠEthereum Ġclient . Ċ Ġ*/ Ċ class ĠEthereum Client ( ĊĠ Ġval Ġvert x : ĠVert x , ĊĠ Ġval Ġconfig : ĠEthereum ClientConfig , ĊĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . Un conf ined , Ċ ) Ġ: ĠCor outine Scope Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( E thereum Client :: class . java ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġmetrics Service : ĠMetrics Service ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġgenesis Files Ġ= Ġmutable Map Of < String , ĠGen esis File >() ĊĠ Ġprivate Ġval Ġservices Ġ= Ġmutable Map Of < String , ĠR LP x Service >() ĊĠ Ġprivate Ġval Ġstorage Repositories Ġ= Ġmutable Map Of < String , ĠBlock chain Repository >() ĊĠ Ġval Ġpeer Repositories Ġ= Ġmutable Map Of < String , ĠEthereum Peer Repository >() ĊĠ Ġprivate Ġval Ġdns Clients Ġ= Ġmutable Map Of < String , ĠDNS Client >() ĊĠ Ġprivate Ġval Ġdiscovery Services Ġ= Ġmutable Map Of < String , ĠDiscovery Service >() ĊĠ Ġprivate Ġval Ġsynchron izers Ġ= Ġmutable Map Of < String , ĠSynchron izer >() ĊĊĠ Ġprivate Ġval Ġmanager Handler Ġ= Ġmutable ListOf < Default CacheManager >() ĊĊĠ Ġprivate Ġfun Ġcreate Store ( data Storage : ĠPath , Ġmanager : ĠDefault CacheManager , Ġname : ĠString ): ĠKey Value Store < Bytes , ĠBytes > Ġ{ ĊĠĠĠ Ġval Ġheaders Cache : ĠCache < Bytes , ĠBytes > Ġ= Ġmanager . create Cache ( ĊĠĠĠĠĠ Ġname , ĊĠĠĠĠĠ ĠConfiguration Builder (). persistence (). add Store ( R ocks DB Store Configuration Builder :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. location ( data Storage . resolve ( name ). to AbsolutePath (). toString ()) ĊĠĠĠĠĠĠĠ Ġ. expired Location ( data Storage . resolve ("$ name - expired "). to AbsolutePath (). toString ()). build () ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn ĠIn fin is pan KeyValue Store . open ( headers Cache ) ĊĠ Ġ} ĊĊĠ Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġlogger . info (" Starting ĠEthereum Ġclient ...") ĊĠĠĠ Ġif Ġ( config . metrics Enabled ()) Ġ{ ĊĊĠĠĠĠĠ Ġval Ġmetrics Service Ġ= ĠMetrics Service ( ĊĠĠĠĠĠĠĠ Ġ" tu w eni ", ĊĠĠĠĠĠĠĠ Ġport Ġ= Ġconfig . metrics Port (), ĊĠĠĠĠĠĠĠ Ġnetwork Interface Ġ= Ġconfig . metrics NetworkInterface (), ĊĠĠĠĠĠĠĠ Ġenable Grpc Push Ġ= Ġconfig . metrics Grpc Push Enabled (), ĊĠĠĠĠĠĠĠ Ġenable Pro metheus Ġ= Ġconfig . metrics Pro metheus Enabled () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġthis . metrics Service Ġ= Ġmetrics Service ĊĠĠĠ Ġ} ĊĠĠĠ Ġconfig . peer Repositories (). forEach Ġ{ ĊĠĠĠĠĠ Ġpeer Repositories [ it . getName ()] Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it . getType ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" memory " Ġ-> ĠMemory E thereum Peer Repository () ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconfig . genesis Files (). forEach Ġ{ ĊĠĠĠĠĠ Ġgenesis Files [ it . getName ()] Ġ= Ġit . genesis File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrepo To Genesis File Ġ= ĠHashMap < Blockchain Repository , ĠGen esis File >() ĊĊĠĠĠ Ġconfig . data Stores (). forEach Ġ{ Ġdata Store Ġ-> ĊĠĠĠĠĠ Ġval Ġgenesis File Ġ= Ġgenesis Files [ data Store . get Genesis File ()] ĊĠĠĠĠĠ Ġval Ġgenesis Block Ġ= Ġgenesis File !!. to Block () ĊĠĠĠĠĠ Ġval Ġdata Storage Ġ= Ġdata Store . get Storage Path () ĊĠĠĠĠĠ Ġval Ġindex Ġ= ĠNI OF SD irectory ( data Storage . resolve (" index ")) ĊĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠStandard Analyzer () ĊĠĠĠĠĠ Ġval Ġconfig Ġ= ĠIndex Writer Config ( analyzer ) ĊĠĠĠĠĠ Ġval Ġwriter Ġ= ĠIndex Writer ( index , Ġconfig ) ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠGlobal Configuration Builder (). serialization (). marshaller ( Persistence Marshaller ()) ĊĊĠĠĠĠĠ Ġval Ġmanager Ġ= ĠDefault CacheManager ( builder . build ()) ĊĠĠĠĠĠ Ġmanager Handler . add ( manager ) ĊĊĠĠĠĠĠ Ġval Ġrepository Ġ= ĠBlock chain Repository . init ( ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" bodies "), ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" headers "), ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" metadata "), ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" transaction Receipt s "), ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" transactions "), ĊĠĠĠĠĠĠĠ Ġcreate Store ( data Storage , Ġmanager , Ġ" state "), ĊĠĠĠĠĠĠĠ ĠBlock chain Index ( writer ), ĊĠĠĠĠĠĠĠ Ġgenesis Block , ĊĠĠĠĠĠĠĠ Ġmetrics Service ?. meter Sdk Provider ?. get ("${ data Store . getName ()} _ storage ") ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġstorage Repositories [ data Store . getName ()] Ġ= Ġrepository ĊĠĠĠĠĠ Ġrepo To Genesis File [ repository ] Ġ= Ġgenesis File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconfig . dns Clients (). forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġpeer Repository Ġ= Ġpeer Repositories [ it . peer Repository ()] ĊĠĠĠĠĠ Ġif Ġ( peer Repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( peer Repositories . isEmpty ()) Ġ" none " Ġelse Ġpeer Repositories . keys . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"," ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ" Ġdefined " ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Repository Ġ$ peer Repository Ġnot Ġfound , Ġ$ message " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġdns Client Ġ= ĠDNS Client ( it , ĠMap KeyValue Store . open (), Ġpeer Repository ) ĊĠĠĠĠĠ Ġdns Clients [ it . getName ()] Ġ= Ġdns Client ĊĠĠĠĠĠ Ġdns Client . start () ĊĠĠĠĠĠ Ġlogger . info (" Started ĠDNS Ġclient Ġ${ it . getName ()} Ġfor Ġ${ it . en r Link () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconfig . discovery Services (). forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġpeer Repository Ġ= Ġpeer Repositories [ it . get Peer Repository ()] ĊĠĠĠĠĠ Ġif Ġ( peer Repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( peer Repositories . isEmpty ()) Ġ" none " Ġelse Ġpeer Repositories . keys . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"," ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ" Ġdefined " ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Repository Ġ$ peer Repository Ġnot Ġfound , Ġ$ message " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠTODO Ġright Ġnow Ġthis Ġdoesn 't Ġuse Ġthe Ġpeer Ġrepository Ġsince Ġthere Ġis Ġno Ġimpl Ġsatisf ying Ġboth Ġlibraries . ĊĠĠĠĠĠ Ġval Ġdiscovery Service Ġ= ĠDiscovery Service . open ( ĊĠĠĠĠĠĠĠ Ġvert x , ĊĠĠĠĠĠĠĠ Ġkey Pair Ġ= Ġit . get Identity (), ĊĠĠĠĠĠĠĠ Ġport Ġ= Ġit . getPort (), ĊĠĠĠĠĠĠĠ Ġhost Ġ= Ġit . get NetworkInterface () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġdiscovery Services [ it . getName ()] Ġ= Ġdiscovery Service ĊĠĠĠĠĠ Ġlogger . info (" Started Ġdiscovery Ġservice Ġ${ it . getName () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠAsync Completion . all Of ( ĊĠĠĠĠĠ Ġconfig . rl px Services (). map Ġ{ Ġrl px Config Ġ-> ĊĠĠĠĠĠĠĠ Ġlogger . info (" Creating ĠR LP x Ġservice Ġ${ rl px Config . getName () }") ĊĠĠĠĠĠĠĠ Ġval Ġpeer Repository Ġ= Ġpeer Repositories [ rl px Config . peer Repository ()] ĊĠĠĠĠĠĠĠ Ġif Ġ( peer Repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( peer Repositories . isEmpty ()) Ġ" none " Ġelse Ġpeer Repositories . keys . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"," ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ" Ġdefined " ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Repository Ġ${ rl px Config . peer Repository ()} Ġnot Ġfound , Ġ$ message " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġstorage Repositories [ rl px Config . repository ()] ĊĠĠĠĠĠĠĠ Ġif Ġ( repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( storage Repositories . isEmpty ()) Ġ" none " Ġelse Ġstorage Repositories . keys . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"," ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ" Ġdefined " ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Repository Ġ${ rl px Config . repository ()} Ġnot Ġfound , Ġ$ message " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgenesis File Ġ= Ġrepo To Genesis File [ repository ] ĊĠĠĠĠĠĠĠ Ġval Ġgenesis Block Ġ= Ġrepository . retrieve Genesis Block () ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠWire Connection Peer Repository Adapter ( peer Repository ) ĊĠĠĠĠĠĠĠ Ġval Ġblockchain Info Ġ= ĠSimple Blockchain Information ( ĊĠĠĠĠĠĠĠĠĠ ĠUInt 2 5 6 . valueOf ( genesis File !!. chain Id . to Long ()), Ġgenesis Block . header . difficulty , ĊĠĠĠĠĠĠĠĠĠ Ġgenesis Block . header . hash , Ġgenesis Block . header . number , Ġgenesis Block . header . hash , Ġgenesis File . fork s ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Initializing Ġwith Ġblockchain Ġinformation Ġ$ blockchain Info ") ĊĠĠĠĠĠĠĠ Ġval Ġeth Sub protocol Ġ= ĠE th Sub protocol ( ĊĠĠĠĠĠĠĠĠĠ Ġrepository Ġ= Ġrepository , ĊĠĠĠĠĠĠĠĠĠ Ġblockchain Info Ġ= Ġblockchain Info , ĊĠĠĠĠĠĠĠĠĠ Ġpending Transactions Pool Ġ= ĠMemory Transaction Pool (), ĊĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġadapter :: listen To Status , ĊĠĠĠĠĠĠĠĠĠ Ġselection Strategy Ġ= Ġ{ ĠConnection Management Strategy ( peer Repository Adapter Ġ= Ġadapter ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmeter Ġ= Ġmetrics Service ?. meter Sdk Provider ?. get ("${ rl px Config . getName ()} _ rl px ") ĊĠĠĠĠĠĠĠ Ġval Ġproxy Sub protocol Ġ= ĠProxy Sub protocol () ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠVert x RL Px Service ( ĊĠĠĠĠĠĠĠĠĠ Ġvert x , ĊĠĠĠĠĠĠĠĠĠ Ġrl px Config . port (), ĊĠĠĠĠĠĠĠĠĠ Ġrl px Config . network Interface (), ĊĠĠĠĠĠĠĠĠĠ Ġrl px Config . advert ised Port (), ĊĠĠĠĠĠĠĠĠĠ Ġrl px Config . key Pair (), ĊĠĠĠĠĠĠĠĠĠ ĠlistOf ( eth Sub protocol , Ġproxy Sub protocol ), ĊĠĠĠĠĠĠĠĠĠ Ġrl px Config . client Name (), ĊĠĠĠĠĠĠĠĠĠ Ġmeter , ĊĠĠĠĠĠĠĠĠĠ Ġadapter ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġservices [ rl px Config . getName ()] Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġpeer Repository . add Identity Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġservice . connect To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . publicKey (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet SocketAddress ( it . network Interface (), Ġit . port ()) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġservice . start (). then Run Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Started ĠEthereum Ġclient Ġ${ rl px Config . getName () }") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproxy Client Ġ= Ġservice . getClient ( Proxy Sub protocol . ID ) Ġas ĠProxy Client ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( proxy Config Ġin Ġconfig . proxies ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( "" Ġ!= Ġproxy Config . upstream ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI . create (" tcp ://${ proxy Config . upstream () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠTcp Upstream ( vertx , Ġuri . host , Ġuri . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Client . registered Sites [ proxy Config . name ()] Ġ= Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( "" Ġ!= Ġproxy Config . down stream ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI . create (" tcp ://${ proxy Config . down stream () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġclose Ġdownstream Ġon Ġexit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠTcp Down stream ( vertx , Ġproxy Config . name (), Ġuri . host , Ġuri . port , Ġproxy Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sync Ġin Ġconfig . synchron izers ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sync . getType ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSynchron izer Type . best Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbest Synchron izer Ġ= ĠFrom Best Block Header Synchron izer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Ġ= Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġservice . getClient ( ETH 6 6 ) Ġas ĠE th Requests Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Repository Ġ= Ġpeer Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġsync . get From (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġsync . get To (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Synchron izer . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchron izers [ sync . getName ()] Ġ= Ġbest Synchron izer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSynchron izer Type . status Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsynchron izer Ġ= ĠPeer Status Eth Synchron izer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Ġ= Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġservice . getClient ( ETH 6 6 ) Ġas ĠE th Requests Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Repository Ġ= Ġpeer Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġadapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġsync . get From (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġsync . get To (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchron izer . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchron izers [ sync . getName ()] Ġ= Ġsynchron izer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSynchron izer Type . parent Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Synchron izer Ġ= ĠFrom Unknown Parent Synchron izer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Ġ= Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġservice . getClient ( ETH 6 6 ) Ġas ĠE th Requests Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Repository Ġ= Ġpeer Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġsync . get From (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġsync . get To (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Synchron izer . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchron izers [ sync . getName ()] Ġ= Ġparent Synchron izer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Finished Ġconfiguring ĠEthereum Ġclient Ġ${ rl px Config . getName () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ). await () ĊĊĠĠĠ Ġfor Ġ( static Peers Ġin Ġconfig . static Peers ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġpeer Repository Ġ= Ġpeer Repositories [ static Peers . peer Repository ()] ĊĠĠĠĠĠ Ġif Ġ( peer Repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( peer Repositories . isEmpty ()) Ġ" none " Ġelse Ġpeer Repositories . keys . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"," ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ" Ġdefined " ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Repository Ġ${ static Peers . peer Repository ()} Ġnot Ġfound , Ġ$ message " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( en ode Ġin Ġstatic Peers . en odes ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġadd Ġconfig Ġvalidation Ġfor Ġen ode Ġur is ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġparse En ode Uri ( URI . create ( en ode )) ĊĠĠĠĠĠĠĠ Ġpeer Repository . store Identity ( uri . endpoint . address , Ġuri . endpoint . tcp Port Ġ?: Ġuri . endpoint . udp Port , Ġuri . nodeId ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( object Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ= Ġthis @ E thereum Client . stop () ĊĠĠĠ Ġ}) ĊĠĠĠ Ġlogger . info (" Started ĠEthereum Ġclient ") ĊĠ Ġ} ĊĊĠ Ġfun Ġstop () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġdns Clients . values . forEach ( DNS Client :: stop ) ĊĠĠĠ ĠAsync Completion . all Of ( discovery Services . values . map ( Discovery Service :: shutdown Async )). await () ĊĠĠĠ Ġsynchron izers . values . forEach Ġ{ ĊĠĠĠĠĠ Ġit . stop () ĊĠĠĠ Ġ} ĊĠĠĠ Ġmanager Handler . forEach Ġ{ ĊĠĠĠĠĠ Ġit . stop () ĊĠĠĠ Ġ} ĊĠĠĠ ĠAsync Completion . all Of ( services . values . map ( RL Px Service :: stop )). await () ĊĠĠĠ Ġstorage Repositories . values . forEach ( Blockchain Repository :: close ) ĊĠĠĠ Ġmetrics Service ?. close () ĊĠĠĠ ĠUnit ĊĠ Ġ} Ċ } Ċ