package Ġbitcoin . blockchain Ċ Ċ import Ġcom . xen om ach ina . arg parser . Arg Parser Ċ import Ġorg . bitcoin j . core .* Ċ import Ġorg . bitcoin j . params . Main Net Params Ċ import Ġorg . bitcoin j . utils . Block File Loader Ċ import Ġorg . jetbrains . ex posed . sql . Slf 4 j Sql Logger Ċ import Ġorg . jetbrains . ex posed . sql . batch Insert Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . text . SimpleDateFormat ĊĊ Ċ class ĠMain Ġ{ ĊĊĠĠĠ Ġclass ĠTx Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġblock Hash : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġtx Hash : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġis Coin base : ĠBoolean ? Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Main :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect DB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnp : ĠNetwork Parameters Ġ= ĠMain Net Params () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbatch Insert ( blk Buf : ĠMutable List < org . bitcoin j . core . Block >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Buf : ĠMutable List < Tx >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx In Buf : ĠMutable List < Transaction Input >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Out Buf : ĠMutable List < Transaction Output >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . add Logger ( Slf 4 j Sql Logger ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock . batch Insert ( blk Buf , Ġbody Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . hash ] Ġ= Ġit . hash AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . difficulty Target ] Ġ= Ġit . difficulty Target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . mer kle Root ] Ġ= Ġit . mer kle Root . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . nonce ] Ġ= Ġit . nonce ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . prev Block Hash ] Ġ= Ġit . prev Block Hash . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . time ] Ġ= Ġit . time . time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Block . version ] Ġ= Ġit . version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction . batch Insert ( tx Buf , Ġbody Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Transaction . block Hash ] Ġ= Ġit . block Hash !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Transaction . tx Hash ] Ġ= Ġit . tx Hash !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Transaction . is Coin base ] Ġ= Ġit . is Coin base ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Input . batch Insert ( tx In Buf , Ġbody Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Tx Input . address ] Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . from Address . to Base 5 8 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠScript Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" tx Hash : Ġ${ it . parent Transaction . hash AsString }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Un parsed Ġaddress Ġ[ 0 ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Tx Input . tx Hash ] Ġ= Ġit . parent Transaction . hash AsString ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Output . batch Insert ( tx Out Buf , Ġbody Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Tx Output . address ] Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . script PubKey . get To Address ( np ). to Base 5 8 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠScript Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" tx Hash : Ġ${ it . parent Transaction !!. hash AsString }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Un parsed Ġaddress Ġ[ 0 ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Tx Output . coin Value ] Ġ= Ġit . value . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ Tx Output . tx Hash ] Ġ= Ġit . parent Transaction !!. hash AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblk Buf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Buf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx In Buf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Out Buf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Parser Ġ= ĠCli Arg ( Arg Parser ( args )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Parser . db Cmd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Dir Ġ= Ġarg Parser . blocks Dir ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . get OrCreate ( np ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Chain List Ġ= ĠFiles . list ( File ( blocks Dir ). to Path ()). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . to File (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . startsWith (" blk ") Ġ&& Ġname . endsWith (". dat ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠBlock File Loader ( np , Ġblock Chain List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcnt Ġ= Ġ 0 ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblk Buf Ġ= Ġmutable ListOf < org . bitcoin j . core . Block >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Buf Ġ= Ġmutable ListOf < Tx >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx In Buf Ġ= Ġmutable ListOf < Transaction Input >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Out Buf Ġ= Ġmutable ListOf < Transaction Output >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloader . forEach Ġ{ Ġblk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcnt Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdf Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss ĠE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblk Buf . add ( blk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" blk : Ġ${ blk . hash } ĠAT Ġ${ df . format ( blk . time )} ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblk . transactions !!. forEach { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ= ĠTx () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . block Hash Ġ= Ġblk . hash AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Hash Ġ= Ġit . hash AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . is Coin base Ġ= Ġit . is Coin Base ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Buf . add ( tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . inputs . forEach Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! input . is Coin Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx In Buf . add ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . outputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Out Buf . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbatch Ġinsert ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( blk Buf . size Ġ% Ġ 1 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Insert ( blk Buf , Ġtx Buf , Ġtx In Buf , Ġtx Out Buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Insert ( blk Buf , Ġtx Buf , Ġtx In Buf , Ġtx Out Buf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" total : Ġ$ cnt ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }