dfinity / ICRC

Repository to ICRC proposals
Apache License 2.0
31 stars 5 forks source link

ICRC-86 - Domain Claim Standard[WIP] #86

Open skilesare opened 4 months ago

skilesare commented 3 months ago
ICRC Title Author Discussions Status Type Category Created
86 Domain Claim Standard Austin Fatheree (@skilesare), Draft Standards Track 2024-04-10

ICRC-86: Domain Claim Standard

ICRC-86 is a standard for claiming and managing the right control a domain and its underlying namespaces on the Internet Computer.

Introduction

Domain are consist of a Top-level domain prefix and a series of more specific specifiers. For example, com.foo, org.dfinity, com.github.skilesare.repos. The goal of ICRC-86 is to sync control of official TLD controlled by ICANN as well as provide domain names that are under decentralized control.

Data Structures

Domains

Domains are represented by a vec text in the reverse order of a typical web address. For example, subdomain.foo.com would be ["com","foo","subdomain"].

Undecorated position 0 items are assumed to be standard ICANN TLDs and should be vetted against the ICANN system.

Decentralized TLDs managed by the ICRC-86 system are decorated with an underscore at the end. For example: ["icp_","foo","subdomain"] would be managed by the server and validation would follow a different pathway than ICANN TLDs.

DomainClaimRequest

A request structure is used when a user or a project claims a domain for participating in the cycle sharing.

type DomainClaimRequest = {
  domain: vec text;
  controllers: vec principal;
  gateAccount: opt Account
  validationCode: opt text; //will be null for initial requests; provide this when automated authentication is available and DNS can be read
};

DomainClaimResponse

Defines the possible responses to a domain claim request.

type DomainClaimResponse = variant {
  ValidationRequired: {
    controllers: vec principal;
    existingControllers: vec principal;
    domain: vec text;
    validation: text;
  };
  Ok: {
    controllers: vec principal;
    domain: vec text;
  };
  RecordExists: {
    controllers: vec principal;
    domain: vec text;
  };
  Err: variant {
    ValidationGateFailed;
    ValidationRecordNotFound;
    ValidationRecordNotApproved;
    Unauthorized;
  };
};

DomainApprovalRequest

Used by an administrative system to approve a previously claimed domain.

type DomainApprovalRequest = {
  domain: vec text;
  validationCode: text;
};

DomainApprovalResponse

Possible responses to a domain approval request.

type DomainApprovalResponse = variant {
  Ok;
  Err : variant {
    #ValidationRecordNotFound;
    #ValidationSucceededButTransferError : record { message: text };
  };
};

Update Functions

icrc86_claim_domain

This function allows a user or a project to claim a domain for managing their domains within the system. The claim request includes the domain identifier, a set of controlling principals, and a validation code for cases where automated verification is required.

Initial requests for a validation code are made with the validationCode property null. This provided code can then be used to verify that the requested owner owns the indicated domain.

Parameters:

Returns:

icrc86_approve_domain

This function is used to approve a previously claimed domain. It is typically called by an administrator or automated system after verifying the claimant's request. Ideal implementations should automate this by reading DNS via HTTPs outcalls.

Parameters:

Returns:

Query Functions

icrc86_domain_look_up

This query function is designed to look up the information about a specific domain to determine if it has been claimed, by whom, and any related account information. It acts as a critical tool for transparency within a ICRC-86 system, allowing participants to verify ownership and claim status of namespaces.

Parameters:

Returns:

icrc86_namespace_look_up

This query function is designed to look up the highest resolution information about a specific fully qualified namespace to determine the controllers.

Parameters:

Returns:

For example:

A request for vec {"com"; "foo"; "listframework"; "v1";} might return the following if there is a record for "com"; "foo"; "listframework" but not "com"; "foo"; "listframework"; "v1".

{
  domain: vec {"com"; "foo"; "listframework";};
  controllers vec {"principala", "principalb"}
}

Block Schemas

Block Schema for "86DomainApproved"

This block type logs when a domain is approved in an ICRC-86 system.

{
  "btype": "86DomainApp",
  "tx": {
    "domain": "Array(text)",
    "approvedBy": "Blob", //approver
    "ts": "Nat",
    "controllers" : "Array(Blob)
  }
}

Description:

Block Schema for "86DomainRequested"

This block type captures requests for domain registrations in the ledger, which is crucial for initializing new projects or participants.

{
  "btype": "85DomainReq",
  "tx": {
    "domain": "Array(Text)",
    "requestedBy": "Blob",
    "controllers" : "#Array(Blob)
    "ts": "nat",
    "validation": "text"
  }
}

_description:

icrc10_supported_standards

An implementation of ICRC-86 MUST implement the method icrc10_supported_standards as put forth in ICRC-10.

The result of the call MUST always have at least the following entries:

record { name = "ICRC-86"; url = "https://github.com/dfinity/ICRC/ICRCs/ICRC-86"; }
record { name = "ICRC-10"; url = "https://github.com/dfinity/ICRC/ICRCs/ICRC-10"; }

Future features

Initial implementations may rely on administrators or third-party systems to detect, approve, and maintain validations of control. Eventually, an automated system for ICANN lookups should be implemented.