Chapter 41: Person

A Person cannot have more than one (node, id) pair. This pair is allocated when the Person is first registered in the system and cannot subsequently be changed. The node identifies a compute and database node in the distributed system used to manage the core system data.

The model in this chapter encompasses the information requirements that appear in Article X: Identity of the VoTa constitution.


value BirthEvent
{
    TimeStamp time;
    Address address;
}

value DeathStatusEvent
{
    TimeStamp effectiveTime;
    TimeStamp recordedTime;
    Boolean isDeceased;
}

value ChangeOfAddress
{
    TimeStamp time;
    Address address;
}

value ChangeOfName
{
    TimeStamp time;
    String firstName;
    String[] middleNames;
    String lastName;
}

value CitizenshipEvent
{
    TimeStamp time;
    Boolean isCitizen;
}

value ResidencyEvent
{
    TimeStamp time;
    Boolean isResident;
}

enum PersonStatus
{
    active,
    suspended,
    revoked
}

value PersonStatusEvent
{
    TimeStamp time;
    PersonStatus status;
}

entity Person
{
    NodeId node;
    Uint32 id;
    Image portrait;
    Fingerprints fingerPrints;
    RetinaScan retinaScan;
    BirthEvent birth;
    DeathStatusEvent[] deathEvents;
    ChangeOfAddress[] addressEvents;
    ChangeOfName[] nameEvents;
    CitizenshipEvent[] citizenEvents;
    ResidencyEvent[] residencyEvents;
    PersonStatusEvent[] statusEvents;

    key {node,id};
}

Each event history is ordered by time and has at most one event at any given time. Its latest event determines the current value. The first citizenship, residency and Person-status events establish the corresponding status when the Person is registered. A later death-status event for which isDeceased is false corrects an erroneous record of death.

A resident must be a living citizen. A Person recorded as deceased, suspended or revoked cannot authenticate. Address history is kept separate from residency status because an address does not by itself establish legal residency.

Login


enum CredentialStatus
{
    active,
    suspended,
    revoked
}

value PublicKey
{
    String algorithm;
    Byte[] encoded;
}

entity LoginCredential
{
    Person person;
    Uint32 id;
    PublicKey publicKey;
    TimeStamp created;
    TimeStamp expires?;
    TimeStamp revoked?;
    CredentialStatus status;

    key {person, id};
}

Authentication requires an active, unexpired credential and successful biometric verification against the biometric information recorded for the Person.