// Ġ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 . store Ċ Ċ import Ġorg . ver ib lock . sdk . Constants Ċ import Ġorg . ver ib lock . sdk . Sha 2 5 6 Hash Ċ import Ġorg . ver ib lock . sdk . V Bl ake Hash Ċ import Ġorg . ver ib lock . sdk . Ver i Block Block Ċ import Ġorg . ver ib lock . sdk . services . Serialize Deserialize Service Ċ import Ġorg . ver ib lock . sdk . util . Utils Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . ByteBuffer Ċ Ċ class ĠStored Ver i Block Block ( ĊĠĠĠ Ġval Ġblock : ĠVer i Block Block , ĊĠĠĠ Ġval Ġwork : ĠBigInteger , ĊĠĠĠ Ġprivate Ġvar Ġblock Of Proof : ĠSh a 2 5 6 Hash Ġ= ĠSh a 2 5 6 Hash . ZERO _ HASH Ċ ) Ġ{ ĊĠĠĠ Ġval Ġhash : ĠV Bl ake Hash ĊĊĠĠĠ Ġval Ġheight : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġblock . height ĊĊĠĠĠ Ġval Ġkey stone Index : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġblock . height Ġ/ Ġ 2 0 Ġ* Ġ 2 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( work Ġ>= ĠBigInteger . ZERO ) Ġ{ Ġ" Work Ġmust Ġbe Ġpositive !" Ġ} ĊĠĠĠĠĠĠĠ Ġthis . hash Ġ= Ġblock . hash ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Block Of Proof (): ĠSh a 2 5 6 Hash ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Of Proof ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Block Of Proof ( block Of Proof : ĠSh a 2 5 6 Hash ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( block Of Proof . length Ġ== ĠSh a 2 5 6 Hash . BIT CO IN _ LENGTH ) Ġ{ Ġ" Invalid Ġblock Ġof Ġproof Ġ$ block Of Proof " Ġ} ĊĠĠĠĠĠĠĠ Ġthis . block Of Proof Ġ= Ġblock Of Proof ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer . put ( hash . bytes ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( Utils . to Bytes ( work , ĠCH AIN _ WORK _ BYTES )) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( block Of Proof . bytes ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( Serialize Deserialize Service . serialize Headers ( block )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠByteBuffer . allocate Direct ( SIZE ) ĊĠĠĠĠĠĠĠ Ġserialize ( local ) ĊĊĠĠĠĠĠĠĠ Ġlocal . flip () ĊĠĠĠĠĠĠĠ Ġval Ġserialized Ġ= ĠByteArray ( SIZE ) ĊĠĠĠĠĠĠĠ Ġlocal . get ( serialized ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġserialized ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSIZE Ġ= Ġ 2 4 Ġ+ Ġ 1 2 Ġ+ Ġ 3 2 Ġ+ Ġ 6 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCH AIN _ WORK _ BYTES Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġfun Ġdeserialize ( buffer : ĠByteBuffer ): ĠStored Ver i Block Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Bytes Ġ= ĠByteArray ( CHAIN _ WORK _ BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . get ( work Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Ġ= ĠBigInteger ( 1 , Ġwork Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Of Proof Bytes Ġ= ĠByteArray ( Sha 2 5 6 Hash . BIT CO IN _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . get ( block Of Proof Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Of Proof Ġ= ĠSh a 2 5 6 Hash . wrap ( block Of Proof Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Bytes Ġ= ĠByteArray ( Constants . HEADER _ SIZE _ Ver i Block Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . get ( block Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠSerialize Deserialize Service . parse Ver i Block Block ( block Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStored Ver i Block Block ( block , Ġwork , Ġblock Of Proof ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ