# SOUL
SOUL is a proof-of-personhood protocol that provides an enhanced soul-bound NFT.
This is through the usage of biometrics to prove **unique** humanness through a series of different steps:
1. Facial Scanning
2. Randomised Video Gesture
3. Randomised Audio-Video Phrase
In steps 2 & 3, the facial scan from step 1 will be used to **verify** the person in the proceeding videos utilising facial recognition. Step 3 will be used to produce an audio profile for the user which **must** be the same each time the process is gone through - despite being random words used.
There is no network and no token. Monetisation can be done through selling integration services with platforms (ideally Web2 companies).
## Architectural Diagrams
The protocol can be developed in numerous ways: below are some diagrams detailing some ideas around its design.
_NOTE: This is still a work in progress_
### High Level Component Diagram
```mermaid
---
title: Component Diagram
---
erDiagram
APP {
access public-key
access camera
access microphone
access NFC
}
PROCESSES {
video facial-scan
video randomised-gesture
video randomised-audio-phrase
}
BIOMETRICS {
bytes facial-scan
bytes audio-profile
serde serialiser
serde deserialiser
}
ENCODED-BIOMETRICS {
bytes biometrics
}
ENCRYPTOR {
string public-key
}
CONTRACT {
serde biometrics
method mint
method vouch
method link
}
SDK {
fluentbase zk-trie
fluentbase evm-contract
}
DECRYPTOR {
user Alice
wallet evm-wallet
}
NFT {
uuid biometric-recursive-proof
uint64 vouch-score
list credentials
flag non-transferable
}
VOUCHER {
uses nfc
bytes commitment
}
APP }|..|{ CAMERA : uses
APP }|..|{ MICROPHONE: uses
APP }|..|{ NFC: uses
APP ||--|{ PROCESSES: performs
PROCESSES ||--|| CAMERA: "facial scan"
PROCESSES ||--|| CAMERA: "randomised gesture"
PROCESSES ||--|| MICROPHONE: "randomised audio phrase"
MICROPHONE ||--|| CAMERA: "audio-video"
PROCESSES ||--|| CAMERA: "verifies face each process"
PROCESSES ||--|| BIOMETRICS: creates
BIOMETRICS ||--|| ENCODED-BIOMETRICS: serialises
ENCODED-BIOMETRICS ||--|| ENCRYPTOR: encrypts
ENCRYPTOR ||--|| CONTRACT: "sends encrypted bytes"
SDK ||--|| CONTRACT: "contract_read_input()"
CONTRACT ||--|| DECRYPTOR: "decrypt bytes"
DECRYPTOR ||--|| ENCODED-BIOMETRICS: "unencrypts bytes"
ENCODED-BIOMETRICS ||--|| BIOMETRICS: deserialises
CONTRACT ||--|{ NFT: mint
APP ||--|{ VOUCHER: "anonymous commitment to social vouching"
NFC ||--|{ VOUCHER: "tap phones"
VOUCHER ||--|{ CONTRACT: "NFC ZK vouching"
WEB-UI ||--|{ CONTRACT: "credential authentication and linking"
```
### Biometric Userflow
```mermaid
---
title: User Flow
---
flowchart
subgraph App
subgraph a1_hw[Hardware Access]
a1_ca[Camera]
a1_mi[Microphone]
end
subgraph a1_bi[Biometric Process]
a1_fs[Facial Scan]
a1_gs[Random Gesture]
a1_av[Random Audio Phrase]
end
subgraph bp[Biometric Profile]
b1_fs[Facial Scan]
b1_ap[Audio Profile]
end
a1_eb[Encrypted Bytes]
subgraph sbp[Serialised Biometric Profile]
s1_bz[Bytes]
end
subgraph ebp[Encrypted Biometric Profile]
e1_bz[Bytes]
end
end
subgraph FluentXYZ
f1_ch[Accounts]
f1_sk[SDK]
end
User --"Authenticate"--> App
a1_ca --"#CreateFacialScan()"--> a1_fs
a1_ca --"#VerifyFacialScan()"--> a1_gs
a1_ca --"#VerifyFacialScan()"--> a1_av
a1_mi --"#CreateAudioProfile()"--> a1_av
a1_fs --> b1_fs
a1_av --> b1_ap
bp --"#SerialiseProfile()"--> sbp
sbp -."#GetPublicKeyForAccount()".-> f1_ch
ebp --"Encrypted, Serialised, Biometric Profile"--> a1_eb
a1_eb -."#CallContract(EncryptedBytes)".-> f1_sk
f1_ch --"#EncryptSerialisedProfile()"--> ebp
f1_sk --"Biometric NFT"--> Wallet
```