---
# System prepended metadata

title: 'Credential Backup: Clone DNA Pattern'

---

# Credential Backup: Clone DNA Pattern
### Prototype Version (Model and Pseudo Code)

---

## SSI-DNA

#### Model
```rust
[Private Entry]
struct Credentials{
   data: HashMap // (Title, Value)
}
```
#### Zome Functions 
```rust

// Creating some credential-data for backing up
fn create_credentials(data:HashMap){ 
    save_data_on_sourcechain(data)
} 

// Get credential data
fn get_credentials(){
    return query_sourcechain_for_credential_data
}

// Generate a unique NetworkId for Backup DNA
fn generate_backup_networkId(secret_words:[String; 12])-> networkId{
    return Hash_Function(secret_words)
}

// Backup Data to SSIBackup-DNA
fn backup_data(backup_dna_cell:String, secret_words:[String; 12]){
     data = get_credentials()
     Utility::encrypt_data(data,secret_words)
     CallTargetCell(backup_dna_cell).save_data(data)
}
// Restore Data to SSIBackup-DNA
fn restore_backup_data(backup_dna_cell:String, secret_words:[String; 12]){
     backup-data = CallTargetCell(backup_dna_cell).get_data()
     data = Utility::decrypt_data(backup-data,secret_words)
     create_credentials(data)
}
```

#### Utility Functions
```rust
fn encrypt_data(data:HashMap, secret_words:[String; 12])->HashMap {
         return asymetric-encryption(data, secret_words)
}
fn decrypt_data(encrypted_data: HashMap, secret_words:[String; 12]) ->HashMap{
     return asymetric-decryption(data, secret_words)
}
```
___

## SSIBackup-DNA
```rust
[Public Entry]
struct Credentials{
   data: HashMap
}
```

#### Zome Functions 
```rust

// Save data for backing up
fn save_data(data:HashMap){ 
    save_data_on_DHT(data)
} 

// Get backed up data
fn get_data(){ 
   return  Query_DHT()
} 

```
___
## From Test or UI

#### Create Backup
```json
networkId = generate_backup_networkId(secret_words);
backup_dna_cell = install_Backup_DNA(netowrkId){
    // Clone SSIBackup-DNA   
}
backup_data(backup_dna_cell);
```

#### Restore Backup
```json
networkId = generate_backup_networkId(secret_words);
backup_dna_cell = install_Backup_DNA(netowrkId){
    // Clone SSIBackup-DNA
}
restore_backup_data(backup_dna_cell);
```

---

## Test Scenario: from Tryorama or UI 

1. Create an agent **Alice**
2. Create an agent **Bob** as close friend of Alice
3. Alice installs SSI-DNA 
4. Alice creates some credential data
5. Alice clones a SSIBackup-DNA and recieves Cellid & networkId
6. Alice backup her data to SSIBackup-DNA
9. Delay a bit for gossip
10. Assert if backup data is located in SSIBackup-DNA of Alice.
11. Bob clones SSIBackup-DNA with networkId
12. Delay a bit for gossip
13. **Assert** if backup data is located in SSIBackup-DNA of Bob.
14. Create an agent **New-Alice**
15. New-Alice install SSI-DNA 
16. New-Alice clones SSIBackup-DNA with networkId
17. Delay a bit for gossip
18. New-Alice restore data
19. **Assert** if the credentail data of New-Alice == credentail data of Alice