package Ġorg . ver ib lock . sp v . service Ċ Ċ import Ġorg . ver ib lock . core . crypto . Previous Block V bk Hash Ċ import Ġorg . ver ib lock . sp v . model . Stored Ver i Block Block Ċ Ċ const Ġval ĠKEY ST ONE _ INTERVAL Ġ= Ġ 2 0 Ċ Ċ data Ġclass ĠBlock Index ( ĊĠĠĠ Ġval Ġsmall Hash : ĠPrevious Block V bk Hash , ĊĠĠĠ Ġval Ġposition : ĠLong , ĊĠĠĠ Ġval Ġheight : ĠInt , ĊĠĠĠ Ġ// Ġfor Ġfast Ġaccess Ġof Ġprevious Ġblock ĊĠĠĠ Ġval Ġprev : ĠBlock Index ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġget Ancestor At Height ( height : ĠInt ): ĠBlock Index ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ< Ġ 0 Ġ|| Ġheight Ġ> Ġthis . height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġin ĠO ( n ) Ġseek Ġbackwards Ġuntil Ġwe Ġhit Ġvalid Ġheight ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠBlock Index ? Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor . height Ġ> Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcursor . prev ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Block ( store : ĠBlock Store ): ĠStored Ver i Block Block ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore . read Block ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Ke yst one : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġheight Ġ% ĠKEY ST ONE _ INTERVAL Ġ== Ġ 0 ĊĊĠĠĠ Ġval Ġprevious Ke yst one : ĠBlock Index ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġwith Ġprevious Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġthis . prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġ! cursor . is Ke yst one ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcursor . prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsecond Previous Ke yst one : ĠBlock Index ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġwith Ġprevious Ġblock Ġof Ġprevious Ġkey stone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġthis . previous Ke yst one ?. prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġ! cursor . is Ke yst one ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcursor . prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ small Hash Ġ@ Ġ$ height Ġ($ position )" ĊĠĠĠ Ġ} Ċ } Ċ