@@ -5,7 +5,7 @@ use crate::NodeId;
5
5
use crate :: bill:: BillId ;
6
6
use crate :: util:: { self , BcrKeys , crypto} ;
7
7
use crate :: { File , OptionalPostalAddress , identity:: Identity } ;
8
- use borsh:: to_vec;
8
+ use borsh:: { from_slice , to_vec} ;
9
9
use borsh_derive:: { BorshDeserialize , BorshSerialize } ;
10
10
use log:: error;
11
11
use secp256k1:: PublicKey ;
@@ -79,7 +79,7 @@ impl From<Identity> for IdentityCreateBlockData {
79
79
}
80
80
}
81
81
82
- #[ derive( BorshSerialize , BorshDeserialize , Debug , Clone , PartialEq ) ]
82
+ #[ derive( BorshSerialize , BorshDeserialize , Default , Debug , Clone , PartialEq ) ]
83
83
pub struct IdentityUpdateBlockData {
84
84
pub name : Option < String > ,
85
85
pub email : Option < String > ,
@@ -112,6 +112,7 @@ pub struct IdentitySignCompanyBillBlockData {
112
112
#[ derive( BorshSerialize , BorshDeserialize , Debug , Clone , PartialEq ) ]
113
113
pub struct IdentityCreateCompanyBlockData {
114
114
pub company_id : NodeId ,
115
+ pub company_key : String ,
115
116
pub block_hash : String ,
116
117
}
117
118
@@ -131,6 +132,17 @@ pub struct IdentityRemoveSignatoryBlockData {
131
132
pub signatory : NodeId ,
132
133
}
133
134
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
+
134
146
impl Block for IdentityBlock {
135
147
type OpCode = IdentityOpCode ;
136
148
type BlockDataToHash = IdentityBlockDataToHash ;
@@ -393,6 +405,34 @@ impl IdentityBlock {
393
405
}
394
406
Ok ( new_block)
395
407
}
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
+ }
396
436
}
397
437
398
438
#[ derive( Serialize , Deserialize , Debug , Clone ) ]
@@ -424,6 +464,28 @@ impl IdentityBlockchain {
424
464
blocks : vec ! [ first_block] ,
425
465
} )
426
466
}
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
+ }
427
489
}
428
490
429
491
#[ cfg( test) ]
@@ -515,6 +577,7 @@ mod tests {
515
577
chain. get_latest_block ( ) ,
516
578
& IdentityCreateCompanyBlockData {
517
579
company_id : node_id_test ( ) ,
580
+ company_key : "some key" . to_string ( ) ,
518
581
block_hash : "some hash" . to_string ( ) ,
519
582
} ,
520
583
& keys,
0 commit comments