package Ġorg . know ledger . ledger . storage . coin base Ċ Ċ import Ġorg . know ledger . ledger . crypto . Encoded PublicKey Ċ import Ġorg . know ledger . ledger . crypto . Hash Ċ import Ġorg . know ledger . ledger . crypto . hash . to Encoded Ċ import Ġorg . know ledger . ledger . data . Difficulty Ċ import Ġorg . know ledger . ledger . data . Pay out Ċ import Ġorg . know ledger . ledger . data . Physical Data Ċ import Ġorg . know ledger . ledger . database . Managed Session Ċ import Ġorg . know ledger . ledger . database . Storage ID Ċ import Ġorg . know ledger . ledger . results . Outcome Ċ import Ġorg . know ledger . ledger . service . Ledger Info Ċ import Ġorg . know ledger . ledger . service . results . Update Failure Ċ import Ġorg . know ledger . ledger . storage .* Ċ import Ġorg . know ledger . ledger . storage . adapters . Transaction Output Storage Adapter Ċ import Ġorg . know ledger . ledger . storage . adapters . W itness Storage Adapter Ċ import Ġorg . know ledger . ledger . storage . transaction . output . Storage Aware Transaction Output Ċ import Ġorg . know ledger . ledger . storage . w itness . Storage Aware W itness Ċ Ċ internal Ġclass ĠStorage Aware Coin base Ġprivate Ġconstructor ( ĊĠĠĠ Ġinternal Ġval Ġcoin base : ĠHas hed Coin base Impl Ċ ) Ġ: ĠHas hed Coin base Ġby Ġcoin base , ĊĠĠĠ ĠMark able Ġby Ġcoin base , ĊĠĠĠ ĠN once Re gen , ĠW itness Adding , ĊĠĠĠ ĠStorage Aware < Has hed Coin base > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ invalid ated : ĠArray < Storage Pairs <* >> Ġ= ĊĠĠĠĠĠĠĠ Ġempty Array () ĊĊĠĠĠ Ġoverride Ġval Ġinvalid ated : ĠArray < Storage Pairs <* >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ invalid ated ĊĊĠĠĠ Ġoverride Ġvar Ġid : ĠStorage ID ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcoin base : ĠHas hed Coin base Impl , ĊĠĠĠĠĠĠĠ Ġw itness Storage Adapter : ĠW itness Storage Adapter ĊĠĠĠ Ġ) Ġ: Ġthis ( coin base ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ invalid ated Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Pairs . Native (" extra Nonce "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Pairs . Hash (" hash "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Pairs . LinkedList ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" wit nesses ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw itness Storage Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠStorage Pairs . Native (" block height "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Pairs . Difficulty (" difficulty ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġinfo : ĠLed ger Info , ĊĠĠĠĠĠĠĠ Ġw itness Storage Adapter : ĠW itness Storage Adapter ĊĠĠĠ Ġ) Ġ: Ġthis ( Has hed Coin base Impl ( info ), Ġw itness Storage Adapter ) ĊĊĠĠĠ Ġoverride Ġfun Ġnew Nonce () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoin base . new Nonce () ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 0 , Ġextra Nonce ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 1 , Ġhash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark For Min ing ( block height : ĠLong , Ġdifficulty : ĠDiff iculty ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoin base . mark For Min ing ( block height , Ġdifficulty ) ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 1 , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 3 , Ġblock height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 4 , Ġdifficulty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġsession : ĠManaged Session ĊĠĠĠ Ġ): ĠOut come < Storage ID , ĠUpdate Failure > Ġ= ĊĠĠĠĠĠĠĠ Ġupdate Linked ( session , Ġinvalid ated ) ĊĊĠĠĠ Ġfun Ġcalculate Transaction Output ( ĊĠĠĠĠĠĠĠ Ġpay out : ĠPay out , ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Transaction : ĠHash , ĊĠĠĠĠĠĠĠ Ġprevious Block : ĠHash , ĊĠĠĠĠĠĠĠ Ġprevious Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġprevious Transaction : ĠHash ĊĠĠĠ Ġ): ĠStorage Aware Transaction Output Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Aware Transaction Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoin base . calculate Transaction Output ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay out Ġ= Ġpay out , Ġnew Index Ġ= Ġnew Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transaction Ġ= Ġnew Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Block Ġ= Ġprevious Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Index Ġ= Ġprevious Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Transaction Ġ= Ġprevious Transaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġcalculate W itness ( ĊĠĠĠĠĠĠĠ ĠpublicKey : ĠEn coded PublicKey , Ġprevious W itness Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġprevious Coin base : ĠHash , Ġtransaction Output : ĠTransaction Output , ĊĠĠĠĠĠĠĠ Ġtransaction Output Storage Adapter : ĠTransaction Output Storage Adapter ĊĠĠĠ Ġ): ĠStorage Aware W itness Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Aware W itness ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Output Storage Adapter Ġ= Ġtransaction Output Storage Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw itness Ġ= Ġcoin base . calculate W itness ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey , Ġprevious W itness Index Ġ= Ġprevious W itness Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Coin base Ġ= Ġprevious Coin base , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Output Ġ= Ġtransaction Output ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġcalculate W itness ( ĊĠĠĠĠĠĠĠ ĠpublicKey : ĠEn coded PublicKey , Ġpay out : ĠPay out , ĊĠĠĠĠĠĠĠ Ġprevious W itness Index : ĠInt , Ġprevious Coin base : ĠHash , ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt , Ġnew Transaction : ĠHash , ĊĠĠĠĠĠĠĠ Ġprevious Block : ĠHash , Ġprevious Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġprevious Transaction : ĠHash , ĊĠĠĠĠĠĠĠ Ġtransaction Output Storage Adapter : ĠTransaction Output Storage Adapter ĊĠĠĠ Ġ): ĠStorage Aware W itness Ġ= ĊĠĠĠĠĠĠĠ Ġcalculate W itness ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey , Ġprevious W itness Index , Ġprevious Coin base , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Transaction Output ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay out Ġ= Ġpay out , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Index Ġ= Ġnew Index , Ġnew Transaction Ġ= Ġnew Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Block Ġ= Ġprevious Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Index Ġ= Ġprevious Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Transaction Ġ= Ġprevious Transaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġtransaction Output Storage Adapter Ġ= Ġtransaction Output Storage Adapter ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠaddTo W itness ( ĊĠĠĠĠĠĠĠ Ġw itness : ĠW itness , ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Transaction : ĠTransaction , ĊĠĠĠĠĠĠĠ Ġlatest Known Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġlatest Known Hash : ĠHash , ĊĠĠĠĠĠĠĠ Ġlatest Known : ĠPhysical Data ?, ĊĠĠĠĠĠĠĠ Ġlatest Known Block Hash : ĠHash ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoin base . calculate Then Add ( new Transaction , Ġlatest Known ) Ġ{ Ġpay out ToAdd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoin base . addTo Outputs ( w itness Ġ= Ġw itness ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Transaction Output ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay out Ġ= Ġpay out ToAdd , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Index Ġ= Ġnew Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transaction Ġ= Ġnew Transaction . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Block Ġ= Ġlatest Known Block Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Index Ġ= Ġlatest Known Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Transaction Ġ= Ġlatest Known Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠaddTo W itness ( ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Transaction : ĠTransaction , ĊĠĠĠĠĠĠĠ Ġprevious W itness Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġlatest Coin base : ĠHash , ĊĠĠĠĠĠĠĠ Ġlatest Known Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġlatest Known Hash : ĠHash , ĊĠĠĠĠĠĠĠ Ġlatest Known : ĠPhysical Data ?, ĊĠĠĠĠĠĠĠ Ġlatest Known Block Hash : ĠHash , ĊĠĠĠĠĠĠĠ Ġtransaction Output Storage Adapter : ĠTransaction Output Storage Adapter ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoin base . calculate Then Add ( new Transaction , Ġlatest Known ) Ġ{ Ġpay out ToAdd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoin base . addTo Outputs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate W itness ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpay out Ġ= Ġpay out ToAdd , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Index Ġ= Ġnew Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transaction Ġ= Ġnew Transaction . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Block Ġ= Ġlatest Known Block Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Index Ġ= Ġlatest Known Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Transaction Ġ= Ġlatest Known Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġnew Transaction . publicKey . to Encoded (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious W itness Index Ġ= Ġprevious W itness Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Coin base Ġ= Ġlatest Coin base , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Output Storage Adapter Ġ= Ġtransaction Output Storage Adapter !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ated . replace ( 2 , Ġw it nesses ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcoin base Ġ== Ġother ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġcoin base . hashCode () Ċ }