package Ġcom . app spot . mist ap ost le . h ss bc . core . model ĊĊ Ċ import Ġcom . app spot . mist ap ost le . h ss bc . core . BC System Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . common . io . Base Encoding Ċ import Ġorg . junit . Test Ġas Ġtest Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . BeforeClass Ċ import Ġsun . misc . BASE 6 4 Encoder Ċ import Ġjava . security . Key Ċ import Ġjava . security . KeyPair Generator Ċ import Ġjava . security . Secure Random Ċ import Ġjava . security . KeyPair ĊĊĊĊ Ċ class ĠTest BaseModel Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġsigner Public Keys : ĠImmutableList < String > ĊĠĠĠ Ġprivate Ġvar Ġsigner Private Keys : ImmutableList < String > ĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Gen Ġ= ĠKey Pair Generator . getInstance (" RSA ") ĊĠĠĠĠĠĠĠ Ġkey Gen . initialize ( 5 1 2 , ĠSecure Random ()) ĊĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= Ġkey Gen . generate KeyPair () ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠBase Encoding . base 6 4 (). encode ( ĠĠ Ġkey Pair . private . encoded ) ĊĠĠĠĠĠĠĠ Ġthis . signer Private Keys Ġ= ĠImmutableList . of ( privateKey ) ĊĠĠĠĠĠĠĠ Ġval Ġpub Key Ġ= ĠBase Encoding . base 6 4 (). encode ( ĠĠ Ġkey Pair . public . encoded ) ĊĠĠĠĠĠĠĠ Ġthis . signer Public Keys Ġ= ĠImmutableList . of ( pub Key ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ test ĊĠĠĠ Ġfun Ġnew Chain () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtr Ġ= ĠBC System . sign ( Ġ ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" root Ġtrans ation Ġ Ġ"), this . signer Private Keys ) ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= BC System . sign ( ĠĠ ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" trans ation Ġ 1 Ġ"), this . signer Private Keys ) ĊĠĠĠĠĠĠĠ Ġval Ġt 2 = ĠBC System . sign ( Ġ ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" trans ation Ġ 2 Ġ"), this . signer Private Keys ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠBlock ("", ĠBlock Header (" PO W ĠEV AN Ġ 1 . 0 . 0 ", Ġ" 1 "), ĠImmutableList . of ( tr )) ĊĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= ĠBlock ( br . id , Block Header (" PO W ĠEV AN Ġ 1 . 0 . 0 ", Ġ" 1 "), ImmutableList . of ( t 1 , t 2 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġbc Ġ= ĠBlock Chain ( br , 1 ) ĊĠĠĠĠĠĠĠ Ġbc . add Block ( b 1 ) ĊĊĠĠĠĠĠĠĠ Ġprintln (" bc Ġ: Ġ\ n Ġ${ bc }") ĊĠĠĠĠĠĠĠ Ġprintln (" bc . pre block Ġ: Ġ\ n Ġ${ br }") ĊĊĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbc . add Block ( br ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail () ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠIllegalArgumentException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . message !!. contains ( Regex (" block . previous Block Id .* != \\ s * last Block . id "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ test ĊĠĠĠ Ġfun Ġtest Pow (){ ĊĠĠĠĠĠĠĠ Ġval Ġtr Ġ= ĠBC System . sign ( Ġ ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" root Ġtrans ation Ġ Ġ"), this . signer Private Keys ) ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= ĠBC System . sign ( ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" trans ation Ġ 1 Ġ"), this . signer Private Keys ) ĊĠĠĠĠĠĠĠ Ġval Ġt 2 = ĠBC System . sign ( ĠUnsigned Trans ation (" 1 . 0 . 0 ", Ġthis . signer Public Keys , Ġ" trans ation Ġ 2 Ġ"), this . signer Private Keys ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġmine ( pre Id Ġ: ĠString Ġ, trs Ġ: ĠImmutableList < Transaction >) Ġ: ĠBlock ? { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblock Ġ: ĠBlock ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( Ġi < 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= ĠBlock ( pre Id , ĠBlock Header (" PO W ĠEV AN Ġ 1 . 0 . 0 ", Ġ"${ i ++ } "), Ġtr s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( BC System . verify Pow ( block )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġroot Block Ġ= Ġmine ("", ĠImmutableList . of ( tr )) ĊĠĠĠĠĠĠĠ Ġprintln (" root Block : Ġ$ root Block ") ĊĠĠĠĠĠĠĠ Ġif ( root Block != null ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock 1 Ġ= Ġmine ( root Block . id , ĠImmutableList . of ( t 1 , Ġt 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" block 1 : Ġ$ block 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }