/* Ċ Ġ* Ġ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 . tracer Ċ Ċ import Ġio . ex flo . domain . Block Trace Ċ import Ġio . ex flo . domain . Transaction Trace Ċ import Ġio . ex flo . ingest ion . extensions . measure Time Millis Ċ import Ġio . ex flo . ingest ion . tokens . Token Detector Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . hyperledger . bes u . ethereum . chain . Blockchain Ċ import Ġorg . hyperledger . bes u . ethereum . core . Block Ċ import Ġorg . hyperledger . bes u . ethereum . core . Block Body Ċ import Ġorg . hyperledger . bes u . ethereum . core . Block Header Ċ import Ġorg . hyperledger . bes u . ethereum . core . Mutable World State Ċ import Ġorg . hyperledger . bes u . ethereum . core . Transaction Ċ import Ġorg . hyperledger . bes u . ethereum . core . Transaction Receipt Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Transaction Processor Ċ import Ġorg . hyperledger . bes u . ethereum . transaction . Transaction Simulator Ċ import Ġorg . hyperledger . bes u . ethereum . vm . Block Hash Lookup Ċ import Ġorg . hyperledger . bes u . ethereum . vm . Message Frame Ċ Ċ /** Ċ Ġ* ĠUsed Ġto Ġproduce Ġdebug Ġtraces Ġof Ġblocks . Ċ Ġ*/ Ċ class ĠBlock Tracer ( ĊĠĠĠ Ġprivate Ġval Ġblock Replay : ĠBlock Replay , ĊĠĠĠ Ġprivate Ġval Ġtransaction Simulator : ĠTransaction Simulator Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLog Manager . getLogger () ĊĊĠĠĠ Ġfun Ġtrace ( block : ĠBlock , Ġreceipt s : ĠList < Transaction Receipt >): ĠBlock Trace ? Ġ= ĊĠĠĠĠĠĠĠ Ġblock Replay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. block ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceipt s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġtx Index , Ġtransaction , Ġheader , Ġblockchain , Ġmutable World State , Ġtransaction Processor Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdater Ġ= Ġmutable World State . updater () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracer Ġ= ĠEx flo Operation Tracer () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( result , Ġelapsed Ms ) Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Processor . process Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblockchain , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdater , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . coin base , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Hash Lookup ( header , Ġblockchain ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouched Accounts Ġ= Ġupdater . touched Accounts . toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequired Ġto Ġkeep Ġour Ġtemporary Ġmutable Ġworld Ġstate Ġconsistent Ġwith Ġtransaction Ġexecution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdater . commit () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrace Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Trace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracer . trace Frames , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracer . contracts Created ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġelem Ġ-> ĠTrip le ( elem . frame , Ġelem . pc , Ġelem . event ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( frame , Ġpc , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Invalid ) Ġreturn @ filter Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġframe . state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠMessage Frame . State . COMPLETED _ SUCCESS ) Ġreturn @ filter Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġframe . message Stack Depth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Depth Ġ= Ġdepth Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġframe . type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Status Check Success Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ== ĠMessage Frame . Type . CONTRACT _ CRE ATION Ġ&& Ġpc Ġ== Ġ 0 Ġ&& Ġdepth Ġ== Ġ 0 Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtracer . depth Frames [ next Depth ]?. poll First ()?. state Ġ== ĠMessage Frame . State . COMPLETED _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepth Status Check Success ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ(_, Ġ_, Ġev ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( contract Type , Ġcapabilities , Ġmetadata ) Ġ= ĠToken Detector ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Simulator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . contract Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). detect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Hash Ġ= Ġtransaction . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġcontract Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapabilities Ġ= Ġcapabilities , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ= Ġmetadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracer . contracts Destroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġresult . is Successful Ġ&& Ġit . frame . state Ġ== ĠMessage Frame . State . COMPLETED _ SUCCESS Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . event . copy ( transaction Hash Ġ= Ġtransaction . hash ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracer . internal Transactions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġresult . is Successful Ġ&& Ġit . frame . state Ġ== ĠMessage Frame . State . COMPLETED _ SUCCESS Ġ&& Ġ! it . event . amount . is Zero Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . event . copy ( transaction Hash Ġ= Ġtransaction . hash ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouched Accounts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace (" Tracing Ġ-> ĠBlock : Ġ${ block . header . number } Ġ| ĠTx ĠHash : Ġ${ transaction . hash } Ġ| ĠTx ĠIndex : Ġ$ tx Index Ġ| ĠContract s Ġcreated : Ġ${ trace . contracts Created . size } Ġ| ĠContract s Ġdestroyed : Ġ${ trace . contracts Destroyed . size } Ġ| ĠInternal ĠT xs : Ġ${ trace . internal Transactions . size } Ġ| ĠTr aced Ġin Ġ$ elapsed Ms Ġms ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ type alias ĠBlock Action < T > Ġ= Ġ( ĊĠĠĠ Ġbody : ĠBlock Body , ĊĠĠĠ Ġblock Header : ĠBlock Header , ĊĠĠĠ Ġblockchain : ĠBlock chain , ĊĠĠĠ Ġworld State : ĠMutable World State , ĊĠĠĠ Ġtransaction Processor : ĠTransaction Processor Ċ ) Ġ-> ĠT ? Ċ Ċ type alias ĠRe play Action < T > Ġ= Ġ( ĊĠĠĠ Ġtransaction Index : ĠInt , ĊĠĠĠ Ġtransaction : ĠTransaction , ĊĠĠĠ Ġblock Header : ĠBlock Header , ĊĠĠĠ Ġblockchain : ĠBlock chain , ĊĠĠĠ Ġworld State : ĠMutable World State , ĊĠĠĠ Ġtransaction Processor : ĠTransaction Processor Ċ ) Ġ-> ĠT Ċ