EZID
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # NAAN Registry The NAAN registry provides the source of truth for Name Assigning Authority Number (NAANs) records. These records associate a NAAN with a service for resolving ARK identifiers created under that NAAN prefix. The NAAN registry provides two important roles: 1. Ensuring that NAANs are unique 2. Associating each NAAN with an ARK resolver service Additionally, the metadata associated with each NAAN record can assist with monitoring and maintenance activities, as well as providing general information about the domain of a NAAN. See also: - [Resolver systems](https://hackmd.io/dor0GlmTSEuLYouGJ6TIjA) - [ARKS org GitHub](https://github.com/arks-org) - [Private NAANs](https://github.com/CDLUC3/naan_reg_priv) - [Public NAANs](https://github.com/CDLUC3/naan_reg_public) ## Current situation The NAAN registry currently (early 2024) consists of a source document (`main_naans`) in [ANVL format](https://datatracker.ietf.org/doc/html/draft-kunze-anvl-02) listing the registered NAANs, and a set of scripts for performing various checks and operations to assist with updating the source documents and disseminating changes. The registry is maintained as a [private git repository hosted by GitHub](https://github.com/CDLUC3/naan_reg_priv). The repository is private to protect personal information that may be contained in NAAN records (personal contact information). The current workflow for creating and updating NAAN records uses a workflow involving several systems, and while functional, is difficult to maintain and can be cumbersome for NAAN registry maintainers. ## Upcoming Changes The NAAN registry operational procedures are changing with a general focus on streamlining operations, increasing transparency, and simplifying maintenance. An important change is a transition from ANVl to JSON for storing NAAN records. There are many technical benefits to this format which outweigh the reduction in human friendliness. The storage and processing capabilities of GitHub will be leveraged for storing NAAN records and performing basic operations. This does increase dependency on GitHub, though the core elements for NAAN record storage and processing are implemented in an independent manner so that operations could be transitioned to another environment if necessary without significant disruption or loss of history. A high level architecture view of the new NAAN infrastructure is depicted in Figure 1. ```plantuml !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml title NAANs,ARKs Container(NS, "NAAN Schema", "NAAN Record formal definition") Container(NE, "NAAN Editor", "Web UI for NAAN create and update") Container(NR, "NAAN Records", "Repository of NAAN records") Container(NPR, "Public NAAN Records", "Repository of public NAAN records") Rel(NS, NE, "Informs") Rel(NS, NR, "Defines") Rel(NS, NPR, "Defines") Rel(NE, NR, "Create, Update\n[Using GH Issue]") Rel(NR, NPR, "Export\n[Using GH Action]") Container(AO,"arks.org", "ARK NAAN resolver") Rel(NPR, AO, "Configure\n[webhook]") Container_Ext(N2T, "n2t.net", "N2T Scheme Resolver") Rel(N2T, AO, "Redirect") Rel(NE, AO, "Hosted by") Container_Ext(IAR, "ARK Services", "Community ark resolver and resource servers") Rel(AO, IAR, "Redirect") ``` **Figure 1.** Container diagram of the NAAN record infrastructure. NAAN record structure is defined by a JSON schema which is used to generate the editor and validate records in the private and public registries. New and updated NAAN records are submitted as GitHub issues to the private NAAN repository for attention by curators. Processing of NAAN records is performed by GitHub actions within the private NAAN repository. The public NAAN repository is updated in response to changes in the private NAAN repository. Instances of the arks.org resolver are updated with new configuration details when changes are made to the public NAAN repository. ### JSON representation of NAAN records The NAAN registry shall be composed of a folder containing JSON documents, each document being a complete NAAN registration conforming with a JSON Schema defining the required properties of the records. As there are more than a thousand authoritative NAAN records, the records shall be held in sub-folders named with the first character (1-9) of the NAAN records contained therein. ``` naans ├── 1 │ ├── 12345.json │ └── ... ├── 2/ │ ├── 23456.json │ └── ... ... └── 9/ ├── 99999.json └── ... ``` Hence the full path to an authoritative NAAN record shall be: ``` naans/1/12345.json ``` Where `12345` is the NAAN value, and `1` corresponds to the first character of the NAAN value. All path and file names shall be lower case and constrained to ASCII a-z, 1-9. This is necessary to avoid potential conflicts with file systems that are not case sensitive. The JSON NAAN records will be generated from the `main_naans` ANVL source during initial phases of the registry transition (Figure 2). Technically, an update to `main_naans` will trigger a GitHub action that runs a python script to parse `main_naans`, update affected NAAN JSON records, and commit those changes. ```plantuml actor Admin participant Private participant Action participant Public participant Action2 Admin -> Repo: update Repo -> Action: notify main_naans updated Action --> Action2: main_naans updated Action2 -> Repo: pull Action2 -> Action2: generate public JSON Action2 -> Public: commit, push ``` **Figure 2.** Workflow for updating the public NAAN records while `main_naans` is source of truth. This is currently implemented with https://github.com/CDLUC3/naan_reg_public The workflow when `main_naans` is no longer the authoritative source will be similar, with the source of truth being the private NAAN records and the trigger being any update to those records. ### Maintenance of NAAN records Three basic use cases need to be supported: 1. Create new NAAN records 2. Update existing NAAN records 3. Disseminate NAAN records to dependent services #### Use Case: Create NAAN record ```plantuml actor User participant UI participant Auth participant Repo actor Admin User -> UI: New entry form UI -> User: Email one-time-passcode note right: Email addresses must be validated\nbefore the form can be submitted. User -> UI: Verify OTP UI -> UI: Validate Record UI -> Repo: Create Issue note right: Issue contains NAAN entry in JSON\nfor review and processing UI --> User: OK Repo -> Admin: Notify Admin -> Admin: Review Admin -> Repo: Approve Repo -> Repo: GH Action note right: Action assigns new NAAN, updates registry\nDownstream dependencies are informed. Repo -> User: Notify ``` **Figure 3.** Sequence for creating a new NAAN record. Details are entered into a web form that is based on the NAAN JSON schema. Email addresses entered must be verified before the form can be submitted. A non-interactive recaptcha is used to help reduce spam requests. The record is submitted to GitHub as a new issue, and the NAAN record embedded in the issue as a block of JSON. After approval by a curator, the issue is submitted to a workflow that updates the registry and notifies downstream consumers. #### Use Case: Update NAAN record ```plantuml actor User participant UI participant Auth participant Repo actor Admin User -> UI: NAAN and email UI -> User: Email OTP User -> UI: Verify OTP UI -> User: Present NAAN record User -> UI: edit record, submit UI -> Repo: Create Issue UI --> User: OK Repo -> Admin: Notify Admin -> Repo: Approve Repo -> Repo: GH Action Repo -> User: Notify ``` **Figure 4.** Update an existing NAAN record. The user specifies the NAAN and email address. A OTP is sent to the user via email, and when entered to the form, the full NAAN record is retrieved from the repository. On submission, a new issue is created in the GitHub repository, and processing continues as above with NAAN records updated and downstream consumers informed. ## Use Case: Distribute NAAN records Public content is extracted and serialized to JSON as: - a single json file - a folder of individual json records These are readily consumed by downstream applications and provide authoritative information for resolver services. ```plantuml participant Repo participant Workflow participant Public as "Public Repo" participant Universe as Public Repo -> Repo: merge Repo -> Workflow: Generate artifacts Workflow -> Repo: Push release Workflow -> Public: Notify Public -> Repo: pull latest Repo --> Public: latest Public -> Universe: Notify note right: There may be multiple subscribers\nfor release notification. ``` **Figure 5.** Sequence for distributing public NAAN records. After the private NAAN repository is updated, and action is triggered on the public repository. A public view of the NAAN records is generated and registered webhooks triggered. Two repositories are invovled: the Private Repository and a Public Repository. The Private Repository is the source of truth and is not accessible without group membership. The Public Repository is updated only by workflows triggered by updates on the Private Repository. It contains only public portions of the NAAN records and broadcasts a notification to subscribers when an update is available.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully