/* Ċ Ġ* Ġ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 . dev p 2 p . v 5 Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . apache . tu w eni . bytes . Bytes Ċ import Ġorg . apache . tu w eni . crypto . Hash Ċ import Ġorg . apache . tu w eni . crypto . SE CP 2 5 6 K 1 Ċ import Ġorg . apache . tu w eni . dev p 2 p . E thereum Node Record Ċ import Ġorg . apache . tu w eni . dev p 2 p . v 5 . internal . Default Udp Connector Ċ import Ġorg . apache . tu w eni . dev p 2 p . v 5 . packet . Random Message Ċ import Ġorg . apache . tu w eni . dev p 2 p . v 5 . storage . Default EN R Storage Ċ import Ġorg . apache . tu w eni . io . Base 6 4 URL Safe Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . time . Instant Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠService Ġexecutes Ġnetwork Ġdiscovery , Ġaccording Ġto Ġdis cv 5 Ġspecification Ċ Ġ* Ġ( https :// github . com / ethereum / dev p 2 p / blob / master / dis cv 5 / dis cv 5 . md ) Ċ Ġ*/ Ċ interface ĠNode Discovery Service Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInitializes Ġnode Ġdiscovery ĊĠĠ Ġ*/ ĊĠ Ġsuspend Ġfun Ġstart () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠExec utes Ġservice Ġshut Ġdown ĊĠĠ Ġ*/ ĊĠ Ġsuspend Ġfun Ġterminate () Ċ } Ċ Ċ internal Ġclass ĠDefault Node Discovery Service ( ĊĠ Ġprivate Ġval Ġkey Pair : ĠSE CP 2 5 6 K 1 . KeyPair , ĊĠ Ġprivate Ġval Ġlocal Port : ĠInt , ĊĠ Ġprivate Ġval Ġbind Address : ĠInet SocketAddress Ġ= ĠInet SocketAddress ( local Port ), ĊĠ Ġprivate Ġval Ġbootstrap EN R List : ĠList < String > Ġ= Ġempty List (), ĊĠ Ġprivate Ġval Ġen r Seq : ĠLong Ġ= ĠInstant . now (). to Epoch Milli (), ĊĠ Ġprivate Ġval Ġself EN R : ĠBytes Ġ= ĠEthereum Node Record . to RLP ( ĊĠĠĠ Ġkey Pair , ĊĠĠĠ Ġen r Seq , ĊĠĠĠ Ġempty Map (), ĊĠĠĠ Ġbind Address . address , ĊĠĠĠ Ġnull , ĊĠĠĠ Ġbind Address . port ĊĠ Ġ), ĊĠ Ġprivate Ġval Ġen r Storage : ĠEN R Storage Ġ= ĠDefault EN R Storage (), ĊĠ Ġprivate Ġval Ġconnector : ĠU dp Connector Ġ= ĠDefault Udp Connector ( bind Address , Ġkey Pair , Ġself EN R , Ġen r Storage ), ĊĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . Default Ċ ) Ġ: ĠNode Discovery Service , ĠCor outine Scope Ġ{ ĊĊĠ Ġoverride Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġconnector . start () ĊĠĠĠ Ġlaunch Ġ{ Ġbootstrap () Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġterminate () Ġ{ ĊĠĠĠ Ġconnector . terminate () ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġbootstrap () Ġ{ ĊĠĠĠ Ġbootstrap EN R List . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . startsWith (" en r :" )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded En r Ġ= Ġit . substring After (" en r :") ĊĠĠĠĠĠĠĠ Ġval Ġr lp EN R Ġ= ĠBase 6 4 URL Safe . decode ( encoded En r ) ĊĠĠĠĠĠĠĠ Ġval Ġen r Ġ= ĠEthereum Node Record . from RLP ( rl p EN R ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrandom Message Ġ= ĠRandom Message () ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet SocketAddress ( en r . ip (), Ġen r . udp ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdest NodeId Ġ= ĠHash . sha 2 _ 2 5 6 ( rl p EN R ) ĊĠĠĠĠĠĠĠ Ġen r Storage . set ( rl p EN R ) ĊĠĠĠĠĠĠĠ Ġconnector . get Nodes Table (). add ( rl p EN R ) ĊĠĠĠĠĠĠĠ Ġconnector . send ( address , Ġrandom Message , Ġdest NodeId ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ