// Ġ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 1 9 Ġ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 . ver ib lock . lite . core Ċ Ċ import Ġorg . ver ib lock . lite . params . Network Parameters Ċ import Ġorg . ver ib lock . sdk . Ver i Block Block Ċ import Ġorg . ver ib lock . sdk . util . Bitcoin Utils Ċ Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . math . Round ingMode Ċ Ċ object ĠVer i Block Difficulty Calculator Ġ{ ĊĠĠĠ Ġconst Ġval ĠRET ARGET _ PERIOD Ġ= Ġ 1 0 0 Ġ// ĠIn Ġblocks ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠT Ġ= Ġ 3 0 Ġ// Ġ 3 0 Ġseconds ĊĠĠĠ Ġprivate Ġconst Ġval ĠN Ġ= ĠRET ARGET _ PERIOD ĊĠĠĠ Ġprivate Ġval ĠK Ġ= ĠBigInteger . valueOf ( N . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigInteger . valueOf ( N . to Long ()). add ( BigInteger . valueOf (- 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigInteger . valueOf ( T . to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. divide ( BigInteger . valueOf ( 2 )) ĊĊĠĠĠ Ġ@ Strict fp ĊĠĠĠ Ġfun Ġcalculate ( params : ĠNetwork Parameters , Ġlast Block : ĠVer i Block Block , Ġcontext : ĠList < Ver i Block Block >): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Context Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġif Ġ( last Block . height Ġ< ĠN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBitcoin Utils . decode Compact Bits ( last Block . difficulty . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsum Target Ġ= ĠBigDecimal . valueOf ( 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġt : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġj : ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Context . size Ġ> ĠN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Context Ġ= Ġcurrent Context . sub List ( 0 , ĠN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcurrent Context . size Ġ- Ġ 1 Ġdown To Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsolve Time Ġ= Ġcurrent Context [ i Ġ- Ġ 1 ]. timestamp Ġ- Ġcurrent Context [ i ]. timestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( solve Time Ġ> ĠT Ġ* Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsolve Time Ġ= ĠT Ġ* Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( solve Time Ġ< Ġ- 6 Ġ* ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsolve Time Ġ= Ġ- 6 Ġ* ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġsolve Time Ġ* Ġj ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum Target Ġ= Ġsum Target . add ( BigDecimal ( Bitcoin Utils . decode Compact Bits ( current Context [ i ]. difficulty . to Long ()))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsum Target Ġ= Ġsum Target . divide ( BigDecimal . valueOf (( N Ġ- Ġ 1 ). to Long ()), Ġ 8 , ĠRound ingMode . HALF _ UP ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ< ĠK . divide ( BigInteger . valueOf ( 1 0 )). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= ĠK . divide ( BigInteger . valueOf ( 1 0 )). toInt (). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Target Ġ= Ġsum Target . multiply ( BigDecimal ( K ). divide ( BigDecimal . valueOf ( t ), Ġ 8 , ĠRound ingMode . HALF _ UP )). to BigInteger () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( next Target Ġ< Ġparams . minimum Difficulty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . minimum Difficulty ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnext Target ĊĠĠĠ Ġ} Ċ } Ċ