---
# System prepended metadata

title: Nom for Nor

---

# Nom for Nor

This document serves as an architecture specification for Nom Name Registry DNA and any related service implementation needed for Nor games.

## Cliff note
- Proposal - Power Nor game(s) player identity with a Nom/Holo/Holochain federated, distributed ID
- Game = https://welcometonor.com/; aim is 500 players using this ID system in November 
- Nom Name Registry DNA primarily needs to;
    - Allow Nor to register their namespace (values can be hard coded an committed during init()
    - Allow players of Nor to claim unique player handle
        - Determinism of registration is achieved through simple countersigning conscensus between 3 compile-time known agents (these 3 agents are called **witnesses** in nom terminology). For this phase, I suggest the easisest way to implement this must be pursued (i.e. pre-generate 3 agent keys and have 3 hosted agents with those keys act as witnesses)
    - Allow players to check whether a name is already registered
- Nom will not have a dedicated UI for its DNA. Instead, all zome calls will be called directly from Nor Game interface
    - Note that Nor game is written in PHP, and holochain related clients are all in Javascript
## ERD, Entry Structures, Validations
- **Solid borders:** DHT Entry 
- **Dashed borders:** Path
```mermaid
graph TD
    subgraph Nom Name Registry DNA for NOR GAMES
            subgraph namespace	
            	norNamespace
            end
            subgraph nameRegistration
                norNamespace-->aliceNameRegistration
                aliceNameRegistration-.->norNamespace
            end
            subgraph agents
				alice-->|player_handle|aliceNameRegistration
            end
    end
```
### ERD
### Entries
```rust
#[hdk_entry]
struct Namespace {
    name: string,
    valid_name_structure_regex: string,
    
}

// validation

#[hdk_entry]
struct NameRegistration {
    namespace: HoloHash<EntryHash>,
    name: Vec<u8>,
}
```
## Zome Calls
#### `init()` for `create_namespace`
```mermaid
sequenceDiagram

participant  NGI as NorGameInterface
participant  HKM as HoloChaperone
participant  NDNA as NomNameRegDNA
participant  NDHT as NomNameRegDHT

NGI-->>HKM: Create Keys
HKM-->>HKM: Generate Keys
HKM-->>NDNA: generate source chain and call init()
NDNA-->>NDNA: retrive Nor Namespace entry from DNA properties
NDNA-->>NDHT: get Nor Nemspace entry
NDNA-->>NDHT: commit Nor Namespace entry if get() is None
```
#### `create_unique_name`
```mermaid
sequenceDiagram

participant  NGI as NorGameInterface
participant  HKM as HoloKeyManager
participant  NDNA as NomNameRegDNA
participant  NDHT as NomNameRegDHT

NGI-->>HKM: Sign In / Sign Up
HKM-->>HKM: Generate Keys from payload
HKM-->>NDNA: Call get_my_name()
NDNA-->>NDHT: get link on agent tag 'player_handle'
alt if get is None 
    NDNA-->>NGI: return None
    NGI-->>NGI: display name registration interface
    NGI-->>NDNA: create_unique_name
    NDNA-->>NDNA: initiate countersigning session of NameRegistration (3 compile-time known agents)
    alt countersigning success
        NDNA-->>NDHT: NameRegistration crate_entry()
        NDNA-->>NDHT: create_link agent->nameRegistration
        NDNA-->>NDHT: crate_link from Namespace entry
        NDNA-->>NGI: NameRegistrationDetail
    else countersigning error
        NDNA-->>NGI: error
    end
end
```
#### `get_my_name`
```mermaid
sequenceDiagram

participant  NGI as NorGameInterface
participant  HKM as HoloChaperone
participant  NDNA as NomNameRegDNA
participant  NDHT as NomNameRegDHT

NGI-->>HKM: call get_my_name()
HKM-->>NDNA: get_my_name()
NDNA-->>NDHT: get link from AgentPubKey tag 'player_handle'
alt Some()
NDHT-->>NDNA: NameRegistration Record
NDNA-->>NGI: NameRegistration Record
else None
NDNA-->>NGI: None
end
```
#### `is_name_registered`
- **Note:** This Zome Call checks whether a name exist or not from the entries on DHT. It should only be used to approximately check whether a name is available or not (say when the user types the name they want). When names are registered, witness agents will still check their own source chain to make sure the name is unique at validation time
```mermaid
sequenceDiagram

participant  NGI as NorGameInterface
participant  HKM as HoloChaperone
participant  NDNA as NomNameRegDNA
participant  NDHT as NomNameRegDHT

NGI-->>HKM: call is_name_registered()
HKM-->>NDNA: is_name_registered()
NDNA-->>NDNA: create Nor Namespace Entry from Dna Property and get its hash
NDNA-->>NDHT: get links base: Namespace entry hash
NDHT-->>NDNA: NameRegistration Links
NDNA-->>NDNA: create NameRegistration Entry Hash from given name
NDNA-->>NDNA: check if Entry Hash already exists in one of the links
alt Entry Hash exist
    NDNA-->>NGI: true
else Entry Hash doesnt exist
    NDNA-->>NGI: false
end
```
#### `get_all_names`
```mermaid
sequenceDiagram

participant  NGI as NorGameInterface
participant  HKM as HoloChaperone
participant  NDNA as NomNameRegDNA
participant  NDHT as NomNameRegDHT

NGI-->>HKM: call get_all_names()
HKM-->>NDNA: get_all_names()
NDNA-->>NDNA: create empty NameRegistrations Vec
NDNA-->>NDNA: create Nor Namespace Entry from Dna Property and get its hash
NDNA-->>NDHT: get links base: Namespace entry hash
NDHT-->>NDNA: NameRegistration Links
loop link in links
    NDNA-->>NDHT: get() entry from link
    NDNA-->>NDNA: insert NameRegistrations entry to NameRegistrations  
end
NDNA-->>NGI: NameRegistrations
```

## Nom and Rival
Reference: https://docs.google.com/spreadsheets/d/1-v_AJKzmHdCr1dH9OAJ5NhjCb9jOtHpzybO0sk3qWUU/edit?usp=sharing
- Nom
    - Name and Namespace Registration
    - Global Name Regisration for Agent Name and Object Name (since this may be bulk of the revenue, this can be somehow stewarded jointly with Rival)
        -   DHT Roles Management Services
            - Admin Group Role Mgt
        - Launch NFT Transfer Marketplace
        - Global Agent Name
- Rival
    - Witnesses (Outsourced to Nom for Name and Namespace Registration?)
    -   Hosting of Bootstrap Nodes
    -   Hosting of Archive Nodes (& Export)
    -   Consensus on Changes to a Generic Data Structure
    -   Mutual Credit Currency Witnessing
    -   Custom Witness App Installation (with modified witness pools)
    -   Identity Services (to hApp ecosystem)
    -   Identity Services (Public offering)
