package Ġnet . cord a . node . services Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . flows . Flow Logic Ċ import Ġnet . cord a . core . internal . Fetch Transactions Flow Ċ import Ġnet . cord a . core . internal . Resolve Transactions Flow Ċ import Ġnet . cord a . core . internal . Transactions Resolver Ċ import Ġnet . cord a . core . internal . dependencies Ċ import Ġnet . cord a . core . node . States To Record Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . utilities . debug Ċ import Ġnet . cord a . core . utilities . trace Ċ import Ġnet . cord a . core . utilities . seconds Ċ import Ġnet . cord a . node . services . api . Writable Transaction Storage Ċ import Ġjava . util .* Ċ Ċ class ĠDb Transactions Resolver ( private Ġval Ġflow : ĠResolve Transactions Flow ) Ġ: ĠTransactions Resolver Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġsorted Dependencies : ĠList < Secure Hash >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġflow . logger ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġdownload Dependencies ( batch Mode : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Downloading Ġdependencies Ġfor Ġtransactions Ġ${ flow . tx Hashes }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Storage Ġ= Ġflow . service Hub . validated Transactions Ġas ĠWrit able Transaction Storage ĊĊĠĠĠĠĠĠĠ Ġ// ĠMaint ain Ġa Ġwork Ġqueue Ġof Ġall Ġhashes Ġto Ġload / download , Ġinitial ised Ġwith Ġour Ġstarting Ġset . ĠThen Ġdo Ġa Ġb read th ĊĠĠĠĠĠĠĠ Ġ// Ġfirst Ġtraversal Ġacross Ġthe Ġdependency Ġgraph . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThis Ġapproach Ġhas Ġtwo Ġproblems . ĠAn alyze Ġand Ġresolve Ġthem : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ( 1 ) ĠThis Ġflow Ġle aks Ġprivate Ġdata . ĠIf Ġyou Ġdownload Ġa Ġtransaction Ġand Ġthen Ġdo ĠNOT Ġrequest Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġdependency , Ġit Ġmeans Ġyou Ġalready Ġhave Ġit , Ġwhich Ġin Ġturn Ġmeans Ġyou Ġmust Ġhave Ġbeen Ġinvolved Ġwith Ġit Ġbefore ĊĠĠĠĠĠĠĠ Ġ// Ġsomehow , Ġeither Ġin Ġthe Ġtx Ġitself Ġor Ġin Ġany Ġfollowing Ġspend Ġof Ġit . ĠIf Ġthere Ġwere Ġno Ġfollowing Ġsp ends , Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġyour Ġpeer Ġknows Ġfor Ġsure Ġthat Ġyou Ġwere Ġinvolved Ġ... Ġthis Ġis Ġbad ! ĠThe Ġonly Ġobvious Ġways Ġto Ġfix Ġthis Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġsomething Ġlike Ġon ion Ġrouting Ġof Ġrequests , Ġsecure Ġhardware , Ġor Ġboth . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ( 2 ) ĠIf Ġthe Ġidentity Ġservice Ġchanges Ġthe Ġassumed Ġidentity Ġof Ġone Ġof Ġthe Ġpublic Ġkeys , Ġit 's Ġpossible ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġthe Ġ" tx Ġin Ġdb Ġis Ġvalid " Ġinvariant Ġis Ġvi olated Ġif Ġone Ġof Ġthe Ġcontracts Ġchecks Ġthe Ġidentity ! ĠShould ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġdb Ġcontain Ġthe Ġident ities Ġthat Ġwere Ġresolved Ġwhen Ġthe Ġtransaction Ġwas Ġfirst Ġchecked , Ġor Ġshould Ġwe ĊĠĠĠĠĠĠĠ Ġ// Ġaccept Ġthis Ġkind Ġof Ġchange Ġis Ġpossible ? ĠMost Ġlikely Ġsolution Ġis Ġfor Ġidentity Ġdata Ġto Ġbe Ġan Ġattachment . ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Requests Ġ= ĠLinked HashSet < Secure Hash >( flow . tx Hashes ) Ġ// ĠKeep Ġthings Ġunique Ġbut Ġordered , Ġfor Ġunit Ġtest Ġstability . ĊĠĠĠĠĠĠĠ Ġval Ġtopo logical Sort Ġ= ĠTop ological Sort () ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Db Transactions Resolver . download Dependencies ( batch Mode =$ batch Mode )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( next Requests . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Main Ġfetch Ġloop : Ġsize _ remaining =${ next Requests . size }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġre - download Ġthe Ġsame Ġtx Ġwhen Ġwe Ġhaven 't Ġverified Ġit Ġyet Ġbut Ġit 's Ġreferenced Ġmultiple Ġtimes Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgraph Ġwe 're Ġtra ver sing . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Requests . removeAll ( topo logical Sort . transaction Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Requests . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDone Ġearly . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġthe Ġstandalone Ġtransaction Ġdata Ġ( which Ġmay Ġrefer Ġto Ġthings Ġwe Ġdon 't Ġyet Ġhave ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( existing Tx Ids , Ġdownloaded T xs ) Ġ= Ġfetch Required Transactions ( Collections . singleton ( next Requests . first ())) Ġ// ĠFetch Ġfirst Ġitem Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( tx Ġin Ġdownloaded T xs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġtx . dependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopo logical Sort . add ( tx . id , Ġdependencies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsus pended Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( downloaded Ġin Ġdownloaded T xs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pended Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġdownloaded . dependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġkeep Ġin Ġmemory Ġas Ġthis Ġb loat s Ġthe Ġcheckpoint . ĠWrite Ġeach Ġitem Ġto Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Storage . add Un verified Transaction ( downloaded ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġwrite Ġlocks Ġare Ġonly Ġreleased Ġover Ġa Ġsuspend , Ġso Ġneed Ġto Ġkeep Ġtrack Ġof Ġwhether Ġthe Ġflow Ġhas Ġbeen Ġsus pended Ġto Ġensure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġlocks Ġare Ġnot Ġheld Ġbeyond Ġeach Ġwhile Ġloop Ġiteration Ġ( as Ġdoing Ġthis Ġwould Ġresult Ġin Ġa Ġdead lock Ġdue Ġto Ġclaim ing Ġlocks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġwrong Ġorder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pended Via Attachments Ġ= Ġflow . fetch Missing Attachments ( downloaded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pended Via Params Ġ= Ġflow . fetch Missing Network Parameters ( downloaded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsus pended Ġ= Ġsus pended Ġ|| Ġsus pended Via Attachments Ġ|| Ġsus pended Via Params ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġall Ġinput Ġstates Ġand Ġreference Ġinput Ġstates Ġto Ġthe Ġwork Ġqueue . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Requests . addAll ( dependencies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġflow Ġdid Ġnot Ġsuspend Ġon Ġthe Ġlast Ġiteration Ġof Ġthe Ġdownloaded Ġloop Ġabove , Ġperform Ġa Ġsuspend Ġhere Ġto Ġensure Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġdata Ġis Ġfl ushed Ġto Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! sus pended ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow Logic . sleep ( 0 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġpossible Ġthat Ġthe Ġnode Ġhas Ġa Ġtransaction Ġin Ġstorage Ġalready . ĠDependencies Ġshould Ġalso Ġbe Ġpresent Ġfor Ġthis Ġtransaction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġjust Ġremove Ġthese ĠIDs Ġfrom Ġthe Ġset Ġof Ġnext Ġrequests . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Requests . removeAll ( existing Tx Ids ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsorted Dependencies Ġ= Ġtopo logical Sort . complete () ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Downloaded Ġ${ sorted Dependencies ?. size } Ġdependencies Ġfrom Ġremote Ġpeer Ġfor Ġtransactions Ġ${ flow . tx Hashes }" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrecord Dependencies ( used States To Record : ĠStates To Record ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsorted Dependencies Ġ= ĠcheckNotNull ( this . sorted Dependencies ) ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Recording Ġ${ sorted Dependencies . size } Ġdependencies Ġfor Ġ${ flow . tx Hashes . size } Ġtransactions " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Storage Ġ= Ġflow . service Hub . validated Transactions Ġas ĠWrit able Transaction Storage ĊĠĠĠĠĠĠĠ Ġfor Ġ( tx Id Ġin Ġsorted Dependencies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġand Ġdelete Ġthe Ġtransaction Ġfrom Ġthe Ġun verified Ġstore . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tx , Ġis Verified ) Ġ= ĠcheckNotNull ( transaction Storage . getTransaction Internal ( tx Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Some how Ġthe Ġun verified Ġtransaction Ġ($ tx Id ) Ġthat Ġwe Ġstored Ġpreviously Ġis Ġno Ġlonger Ġthere ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Verified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . verify ( flow . service Hub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . service Hub . record Transactions ( used States To Record , ĠlistOf ( tx )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" No Ġneed Ġto Ġrecord Ġ$ tx Id Ġas Ġit 's Ġalready Ġbeen Ġverified " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġtransactions Ġalready Ġpresent Ġin Ġthe Ġdatabase Ġdo Ġnot Ġneed Ġto Ġbe Ġcheckpoint ed Ġon Ġevery Ġiteration Ġof Ġdownloading ĊĠĠĠ Ġ// Ġdependencies Ġfor Ġother Ġtransactions , Ġso Ġstrip Ġthese Ġdown Ġto Ġjust Ġthe ĠIDs Ġhere . ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġprivate Ġfun Ġfetch Required Transactions ( requests : ĠSet < Secure Hash >): ĠPair < List < Secure Hash >, ĠList < Signed Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequested T xs Ġ= Ġflow . sub Flow ( Fetch Transactions Flow ( requests , Ġflow . other Side )) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( requested T xs . from Disk . map Ġ{ Ġit . id Ġ}, Ġrequested T xs . downloaded ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġway Ġto Ġtopo logic ally Ġsort ĠSigned Transactions Ġrepresented Ġjust Ġtheir Ġ[ Secure Hash ] ĠIDs . ĠThis Ġmeans Ġthat Ġgiven Ġany Ġtwo Ġtransactions ĊĠĠĠĠ Ġ* ĠT 1 Ġand ĠT 2 Ġin Ġthe Ġlist Ġreturned Ġby Ġ[ complete ] Ġif ĠT 1 Ġis Ġa Ġdependency Ġof ĠT 2 Ġthen ĠT 1 Ġwill Ġoccur Ġearlier Ġthan ĠT 2 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠTop ological Sort Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġforward Graph Ġ= ĠHashMap < Secure Hash , ĠMutable Set < Secure Hash >>() ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ids Ġ= ĠLinked HashSet < Secure Hash >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnon D upe Hash Ġ= ĠHashMap < Secure Hash , ĠSecure Hash >() ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġde du pe ( sh : ĠSecure Hash ): ĠSecure Hash Ġ= Ġnon D upe Hash . get Or Put ( sh ) Ġ{ Ġsh Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġtransaction Ġto Ġthe Ġto - be - sorted Ġset Ġof Ġtransactions . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtx Id ĠThe ĠID Ġof Ġthe Ġtransaction . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdependent Ids Ġthe ĠIDs Ġof Ġall Ġthe Ġtransactions Ġ[ tx Id ] Ġdepends Ġon . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( tx Id p : ĠSecure Hash , Ġdependent Ids : ĠSet < Secure Hash >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġde du pe ( tx Id p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( transaction Ids . add ( tx Id )) Ġ{ Ġ" Transaction ĠID Ġ$ tx Id Ġalready Ġseen " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependent Ids . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġwe Ġuse Ġa ĠLinked HashSet Ġhere Ġto Ġmake Ġthe Ġtraversal Ġdeterministic Ġ( as Ġlong Ġas Ġthe Ġinput Ġlist Ġis ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde D upe It Ġ= Ġde du pe ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforward Graph . compute If Absent ( de D upe It ) Ġ{ ĠLinked HashSet () Ġ}. add ( tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġthe Ġsorted Ġlist Ġof Ġtransaction ĠIDs . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcomplete (): ĠList < Secure Hash > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= ĠHashSet < Secure Hash >( transaction Ids . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Secure Hash >( transaction Ids . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġvisit ( tx Id : ĠSecure Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visited . add ( tx Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforward Graph [ tx Id ]?. forEach (:: visit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġtx Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ids . forEach (:: visit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . apply ( Collections :: reverse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }