@@ -5,7 +5,7 @@ use crate::NodeId;
55use crate :: bill:: BillId ;
66use crate :: util:: { self , BcrKeys , crypto} ;
77use crate :: { File , OptionalPostalAddress , identity:: Identity } ;
8- use borsh:: to_vec;
8+ use borsh:: { from_slice , to_vec} ;
99use borsh_derive:: { BorshDeserialize , BorshSerialize } ;
1010use log:: error;
1111use secp256k1:: PublicKey ;
@@ -79,7 +79,7 @@ impl From<Identity> for IdentityCreateBlockData {
7979 }
8080}
8181
82- #[ derive( BorshSerialize , BorshDeserialize , Debug , Clone , PartialEq ) ]
82+ #[ derive( BorshSerialize , BorshDeserialize , Default , Debug , Clone , PartialEq ) ]
8383pub struct IdentityUpdateBlockData {
8484 pub name : Option < String > ,
8585 pub email : Option < String > ,
@@ -112,6 +112,7 @@ pub struct IdentitySignCompanyBillBlockData {
112112#[ derive( BorshSerialize , BorshDeserialize , Debug , Clone , PartialEq ) ]
113113pub struct IdentityCreateCompanyBlockData {
114114 pub company_id : NodeId ,
115+ pub company_key : String ,
115116 pub block_hash : String ,
116117}
117118
@@ -131,6 +132,17 @@ pub struct IdentityRemoveSignatoryBlockData {
131132 pub signatory : NodeId ,
132133}
133134
135+ #[ derive( Debug ) ]
136+ pub enum IdentityBlockPayload {
137+ Create ( IdentityCreateBlockData ) ,
138+ Update ( IdentityUpdateBlockData ) ,
139+ SignPersonalBill ( IdentitySignPersonBillBlockData ) ,
140+ SignCompanyBill ( IdentitySignCompanyBillBlockData ) ,
141+ CreateCompany ( IdentityCreateCompanyBlockData ) ,
142+ AddSignatory ( IdentityAddSignatoryBlockData ) ,
143+ RemoveSignatory ( IdentityRemoveSignatoryBlockData ) ,
144+ }
145+
134146impl Block for IdentityBlock {
135147 type OpCode = IdentityOpCode ;
136148 type BlockDataToHash = IdentityBlockDataToHash ;
@@ -393,6 +405,34 @@ impl IdentityBlock {
393405 }
394406 Ok ( new_block)
395407 }
408+
409+ pub fn get_block_data ( & self , keys : & BcrKeys ) -> Result < IdentityBlockPayload > {
410+ let data = self . get_decrypted_block ( keys) ?;
411+ let result: IdentityBlockPayload = match self . op_code {
412+ IdentityOpCode :: Create => IdentityBlockPayload :: Create ( from_slice ( & data) ?) ,
413+ IdentityOpCode :: Update => IdentityBlockPayload :: Update ( from_slice ( & data) ?) ,
414+ IdentityOpCode :: SignPersonBill => {
415+ IdentityBlockPayload :: SignPersonalBill ( from_slice ( & data) ?)
416+ }
417+ IdentityOpCode :: SignCompanyBill => {
418+ IdentityBlockPayload :: SignCompanyBill ( from_slice ( & data) ?)
419+ }
420+ IdentityOpCode :: CreateCompany => {
421+ IdentityBlockPayload :: CreateCompany ( from_slice ( & data) ?)
422+ }
423+ IdentityOpCode :: AddSignatory => IdentityBlockPayload :: AddSignatory ( from_slice ( & data) ?) ,
424+ IdentityOpCode :: RemoveSignatory => {
425+ IdentityBlockPayload :: RemoveSignatory ( from_slice ( & data) ?)
426+ }
427+ } ;
428+ Ok ( result)
429+ }
430+
431+ fn get_decrypted_block ( & self , keys : & BcrKeys ) -> Result < Vec < u8 > > {
432+ let bytes = util:: base58_decode ( & self . data ) ?;
433+ let decrypted_bytes = util:: crypto:: decrypt_ecies ( & bytes, & keys. get_private_key ( ) ) ?;
434+ Ok ( decrypted_bytes)
435+ }
396436}
397437
398438#[ derive( Serialize , Deserialize , Debug , Clone ) ]
@@ -424,6 +464,28 @@ impl IdentityBlockchain {
424464 blocks : vec ! [ first_block] ,
425465 } )
426466 }
467+
468+ /// Creates an identity chain from a list of blocks
469+ pub fn new_from_blocks ( blocks_to_add : Vec < IdentityBlock > ) -> Result < Self > {
470+ match blocks_to_add. first ( ) {
471+ None => Err ( super :: Error :: BlockchainInvalid ) ,
472+ Some ( first) => {
473+ if !first. verify ( ) || !first. validate_hash ( ) {
474+ return Err ( super :: Error :: BlockchainInvalid ) ;
475+ }
476+
477+ let chain = Self {
478+ blocks : blocks_to_add,
479+ } ;
480+
481+ if !chain. is_chain_valid ( ) {
482+ return Err ( super :: Error :: BlockchainInvalid ) ;
483+ }
484+
485+ Ok ( chain)
486+ }
487+ }
488+ }
427489}
428490
429491#[ cfg( test) ]
@@ -515,6 +577,7 @@ mod tests {
515577 chain. get_latest_block ( ) ,
516578 & IdentityCreateCompanyBlockData {
517579 company_id : node_id_test ( ) ,
580+ company_key : "some key" . to_string ( ) ,
518581 block_hash : "some hash" . to_string ( ) ,
519582 } ,
520583 & keys,
0 commit comments