/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġ 4 1 North . Ċ Ġ* Ċ Ġ* Ġ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 . ex flo . ingest ion Ċ Ċ import Ġio . ex flo . ingest ion . K oin Modules . events Module Ċ import Ġio . ex flo . ingest ion . K oin Modules . state Module Ċ import Ġio . ex flo . ingest ion . K oin Modules . storage Module Ċ import Ġio . ex flo . ingest ion . tokens . pre compiled . Pre compiled Contracts Factory Ċ import Ġio . ex flo . ingest ion . tracker . Block Writer Ċ import Ġio . ex flo . ingest ion . tracker . Chain Tracker Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . hyperledger . bes u . cli . config . Eth Network Config Ċ import Ġorg . hyperledger . bes u . cli . config . Network Name Ċ import Ġorg . hyperledger . bes u . config . Genesis ConfigFile Ċ import Ġorg . hyperledger . bes u . ethereum . chain . Genesis State Ċ import Ġorg . hyperledger . bes u . ethereum . core . Privacy Parameters Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Main net Protocol Schedule Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Protocol Schedule Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Schedule Based Block Header Functions Ċ import Ġorg . hyperledger . bes u . plugin . B es u Context Ċ import Ġorg . hyperledger . bes u . plugin . B es u Plugin Ċ import Ġorg . hyperledger . bes u . plugin . services . P ico CLI Options Ċ import Ġorg . k oin . core . K oin Application Ċ import Ġorg . k oin . core . context . start K oin Ċ import Ġorg . k oin . core . context . stop K oin Ċ import Ġorg . k oin . core . module . Module Ċ import Ġorg . k oin . dsl . module Ċ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ abstract Ġclass ĠEx flo Plugin < T Ġ: ĠEx flo Cli Options > Ġ: ĠBes u Plugin Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLog Manager . getLogger () ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġname : ĠString ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġoptions : ĠT ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġcontext : ĠBes u Context ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġblock Writer : ĠBlock Writer ĊĊĠĠĠ Ġprivate Ġval Ġro cks DB Plugin Ġ= ĠR ocks DB Plugin () ĊĊĠĠĠ Ġoverride Ġfun Ġregister ( context : ĠBes u Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġro cks DB Plugin . register ( context ) ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Register ing Ġplugin ") ĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd line Options Ġ= Ġcontext . getService ( P ico CLI Options :: class . java ) ĊĠĠĠĠĠĠĠ Ġcheck (! cmdline Options . isEmpty ) Ġ{ Ġ" Expecting Ġa ĠP ico CL IO Ġoptions Ġto Ġregister ĠCLI Ġoptions Ġwith , Ġbut Ġnone Ġfound ." Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcli Options Ġ= Ġcmd line Options . get () ĊĠĠĠĠĠĠĠ Ġcli Options . add P ico CLI Options ( name , Ġoptions ) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Plugin Ġregistered ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġimpl K oin Modules (): ĠList < Module > ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġimpl Start ( k oin App : ĠK oin Application ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Starting Ġplugin ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġro cks DB Plugin . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠReview Ġwith ĠBes u Ġde vs Ġif Ġthere 's Ġa Ġbetter Ġway Ġof Ġobtaining Ġthis Ġinfo Ġwithout Ġres ort ing Ġon Ġenv Ġvariables ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Name Ġ= ĠNetwork Name . valueOf ( System . getenv (" B ES U _ NETWORK "). toUpperCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Config Ġ= ĠE th Network Config . get Network Config ( network Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Network Ġname : Ġ$ network Name Ġ| ĠNetwork ĠConfig : Ġ$ network Config ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenesis ConfigFile Ġ= ĠGen esis ConfigFile . from Config ( network Config . genesis Config ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġneeds Ġto Ġchange Ġbased Ġon Ġnetwork Ġproperties , Ġshould Ġbe Ġgood Ġfor Ġmain net Ġand Ġro p sten ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Schedule Ġ= ĠMain net Protocol Schedule . from Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenesis ConfigFile . config Options , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrivacy Parameters . DEFAULT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegister Ġcustom Ġpre compiled Ġcontracts ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPre compiled Contracts Factory . register ( protocol Schedule , Ġnetwork Config . network Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenesis State Ġ= ĠGen esis State . from Config ( genesis ConfigFile , Ġprotocol Schedule ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġa Ġmodule Ġfor Ġinject ing Ġvarious Ġbasic Ġcontext Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Module Ġ= Ġmodule Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ Ġcontext Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ Ġnetwork Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ Ġnetwork Config Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ Ġprotocol Schedule Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ Ġgenesis State Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ ĠSchedule Based Block Header Functions . create ( get < Protocol Schedule < Void >> ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ ĠChain Tracker ( get (), Ġget (), Ġget (), Ġget (), Ġget ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġimplementation Ġspecific ĠDI Ġmodules Ġwhich Ġwe Ġcombine Ġwith Ġother Ġstandard Ġmodules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimpl K oin Modules Ġ= Ġimpl K oin Modules () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġthe ĠDI Ġsystem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk oin App Ġ= Ġstart K oin Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log . isDebugEnabled ) Ġprint Logger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents Module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Module ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġimpl K oin Modules ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġallow Ġderived Ġplugins Ġto Ġexecute Ġsome Ġstart Ġlogic Ġbefore Ġwe Ġstart Ġpublishing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimpl Start ( k oin App ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Writer Ġ= Ġk oin App . k oin . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Writer . start () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġstart ", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Stopping Ġplugin ") ĊĠĠĠĠĠĠĠ Ġblock Writer . stop () ĊĠĠĠĠĠĠĠ Ġstop K oin () ĊĠĠĠĠĠĠĠ Ġro cks DB Plugin . stop () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDefines Ġcommon Ġcli Ġoptions Ġshared Ġamong Ġimplement ors . Ċ Ġ*/ Ċ interface ĠEx flo Cli Options Ġ{ ĊĊĠĠĠ Ġvar Ġstart Block Override : ĠLong ? ĊĊĠĠĠ Ġvar Ġmax Fork Size : ĠInt ĊĊĠĠĠ Ġenum Ġclass ĠProcess able Entity Ġ{ ĊĠĠĠĠĠĠĠ ĠHEADER , ĊĠĠĠĠĠĠĠ ĠB ODY , ĊĠĠĠĠĠĠĠ ĠRE CE IP TS , ĊĠĠĠĠĠĠĠ ĠTR ACES ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠEx flo Cli Default Options Ġ{ ĊĠĠĠ Ġconst Ġval ĠEX FLO _ POST GRES _ PLUGIN _ ID : ĠString Ġ= Ġ" ex flo - postgres " ĊĠĠĠ Ġconst Ġval ĠEX FLO _ K AF KA _ PLUGIN _ ID : ĠString Ġ= Ġ" ex flo - kafka " ĊĊĠĠĠ Ġconst Ġval ĠMAX _ F ORK _ SIZE : ĠInt Ġ= Ġ 1 9 2 Ċ } Ċ