// ĠVer i Block ĠBlock chain ĠProject Ċ // ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 ĠVer i Block , ĠInc Ċ // ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠX en ios ĠSE ZC Ċ // ĠAll Ġrights Ġreserved . Ċ // Ġhttps :// www . ver ib lock . org Ċ // ĠDistributed Ġunder Ġthe ĠMIT Ġsoftware Ġlicense , Ġsee Ġthe Ġaccompanying Ċ // Ġfile ĠLICENSE Ġor Ġhttp :// www . opensource . org / licenses / mit - license . php . Ċ package Ġorg . node core . v pm mock . mock mining Ċ Ċ import Ġorg . ver ib lock . core . bitcoin j . Bitcoin Utilities Ċ import Ġorg . ver ib lock . core . crypto . Sha 2 5 6 Hash Ċ import Ġorg . ver ib lock . core . utilities . Utility Ċ import Ġorg . ver ib lock . core . utilities . create Logger Ċ import Ġorg . ver ib lock . sdk . models . Bitcoin Block Ċ import Ġorg . ver ib lock . sdk . services . Validation Service Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ private Ġval Ġlogger Ġ= Ġcreate Logger Ġ{} Ċ Ċ class ĠB tc Blockchain ( ĊĠĠĠ Ġval Ġgenesis Block : ĠBitcoin Block , ĊĠĠĠ Ġval Ġgenesis Block Height : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġ// Ġin - memory Ġblock Ġindex ĊĠĠĠ Ġval Ġblock Index Ġ= ĠConcurrent HashMap < Sha 2 5 6 Hash , ĠB tc Block Index >() ĊĠĠĠ Ġlateinit Ġvar Ġactive Chain : ĠB tc Chain ĊĠĠĠ Ġval Ġsize Ġget () Ġ= Ġblock Index . size ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Genesis Block () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGetter Ġfor Ġblock Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Block Index ( hash : ĠSh a 2 5 6 Hash ): ĠB tc Block Index ? Ġ= Ġblock Index [ hash ] ĊĠĠĠ Ġfun Ġget Block Index ( height : ĠInt ): ĠB tc Block Index ? Ġ= Ġactive Chain [ height ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGetter Ġfor Ġtip . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Chain Head Index (): ĠB tc Block Index Ġ= Ġactive Chain . tip ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġa Ġchain Ġof Ġblocks Ġfrom Ġactive Ġchain Ġof Ġgiven Ġ` size ` Ġending Ġwith Ġ` hash ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Chain With Tip ( hash : ĠSh a 2 5 6 Hash , Ġsize : ĠInt ): ĠList < Bitcoin Block > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠArrayList < Btc Block Index >() ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġget Block Index ( hash ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġi ++ Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġget Block Index ( cursor . header . previous Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġret . reverse () ĊĠĠĠĠĠĠĠ Ġreturn Ġret . map Ġ{ Ġit . header Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Body ( hash : ĠSh a 2 5 6 Hash ): ĠBitcoin Block Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Index [ hash ]?. body ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetContext ( from : ĠSh a 2 5 6 Hash , Ġto : ĠSh a 2 5 6 Hash ): ĠList < Bitcoin Block > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Bitcoin Block >() ĊĠĠĠĠĠĠĠ Ġval Ġ_ from Ġ= Ġget Block Index ( from ) ĊĠĠĠĠĠĠĠ Ġval Ġ_ to Ġ= Ġget Block Index ( to )?. prev ĊĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġ_ to ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor Ġ!= Ġ_ from ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( cursor . header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcursor . prev ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist . reversed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmine ( data : ĠBitcoin Block Data , Ġprev : ĠB tc Block Index Ġ= Ġactive Chain . tip ): ĠBitcoin Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġprev . header . timestamp . coerce At Least ( Utility . getCurrent Timestamp ()) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( w arch ant ): Ġeventually Ġadd Ġdiff Ġcalculator ĊĠĠĠĠĠĠĠ Ġval Ġdifficulty Ġ= Ġprev . header . difficulty ĊĠĠĠĠĠĠĠ Ġfor Ġ( nonce Ġin Ġ 0 Ġuntil ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Block Ġ= ĠBitcoin Block ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev . header . version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev . header . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . mer kle Root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdifficulty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnonce ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Validation Service . is Proof OfWork Valid ( new Block )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġaccept Block ( new Block , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( ret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġmine Ġthe Ġblock Ġdue Ġto Ġtoo Ġhigh Ġdifficulty ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġnew Ġblock Ġto ĠBlock chain . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġblock Ġis Ġvalid , Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġaccept Block ( ĊĠĠĠĠĠĠĠ Ġblock : ĠBitcoin Block , ĊĠĠĠĠĠĠĠ Ġbody : ĠBitcoin Block Data ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getBlock Index ( block . hash ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġblock Ġis Ġvalid , Ġwe Ġalready Ġhave Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdoes Ġblock Ġconnect Ġto Ġblockchain ? ĊĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġget Block Index ( block . previous Block ) ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Can Ġnot Ġconnect Ġblock =${ block . hash }, Ġits Ġprev =${ block . previous Block }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġis Ġblock Ġstate lessly Ġvalid ? ĊĠĠĠĠĠĠĠ Ġif Ġ(! Validation Service . check Block ( block )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcontext ually Ġcheck Ġblock ĊĊĠĠĠĠĠĠĠ Ġ// Ġall Ġok , Ġwe Ġcan Ġadd Ġblock Ġto Ġblockchain ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠB tc Block Index ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= Ġblock , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Ġ= Ġprev . work Ġ+ ĠBitcoin Utilities . decode Compact Bits ( block . difficulty . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġprev , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġprev . height Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġblock Index [ block . hash ] Ġ= Ġindex ĊĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġfork Ġresolution ĊĠĠĠĠĠĠĠ Ġif Ġ( index . work Ġ> Ġactive Chain . tip . work ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnew Ġblock Ġwins ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Chain . set Tip ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Genesis Block () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġgenesis Block . hash ĊĠĠĠĠĠĠĠ Ġval Ġwork Ġ= ĠBitcoin Utilities . decode Compact Bits ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenesis Block . difficulty . to Long () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġblock Ġindex Ġalways Ġcontains Ġgenesis Ġblock Ġon Ġstart ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠB tc Block Index ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġgenesis Block Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Ġ= Ġwork , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠBitcoin Block Data (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= Ġgenesis Block ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġblock Index [ hash ] Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġactive Chain Ġ= ĠB tc Chain ( genesis Block Height , Ġindex ) ĊĠĠĠ Ġ} Ċ } Ċ