From 2b4a5c35b58eb1b8295a1345aaaf9f019789e643 Mon Sep 17 00:00:00 2001 From: Alexander Chuprov Date: Mon, 23 Sep 2024 13:58:03 +0300 Subject: [PATCH] [#114] nns: Add docs Signed-off-by: Alexander Chuprov --- docs/globally-unique-domain-zone.md | 162 ++++++++++++++++++++++++++++ docs/img/GUDZ-1.png | Bin 0 -> 30730 bytes docs/img/GUDZ-2.png | Bin 0 -> 27363 bytes docs/img/GUDZ.drawio | 147 +++++++++++++++++++++++++ nns/README.md | 46 ++++++++ 5 files changed, 355 insertions(+) create mode 100644 docs/globally-unique-domain-zone.md create mode 100644 docs/img/GUDZ-1.png create mode 100644 docs/img/GUDZ-2.png create mode 100644 docs/img/GUDZ.drawio create mode 100644 nns/README.md diff --git a/docs/globally-unique-domain-zone.md b/docs/globally-unique-domain-zone.md new file mode 100644 index 0000000..0ff565f --- /dev/null +++ b/docs/globally-unique-domain-zone.md @@ -0,0 +1,162 @@ +# Globally unique domain zone + +**Make sure you understand the [basic concepts](../nns/README.md) of `NNS`.** + +`Globally Unique Domains Zone` (`GUDZ`) is an extension of `NNS` that ensures unique names across multiple domain zones. When this option is enabled, all newly created domains will automatically receive a corresponding alias in the designated global zone. Deleting a domain will also remove its alias from the global zone. + +It's important to note that this feature is not retroactive: domains created before this option is enabled will not receive a global alias. Likewise, if the option is later disabled, domains that already have a `GUDZ` alias will retain their records. To fully disable `GUDZ`, all domains must be recreated with the option turned off. + +To enable `GUDZ`, add a `cnametgt=$(global domain)` `TXT` record that specifies the global zone. + +**Example:** + +Domains: +- `poland` +- `sweden` +- `animals.org` + +![](img/GUDZ-2.png) + +It is necessary to associate the domain zones `.poland` and `.sweden` into the global zone `.animals`. + +![](img/GUDZ-1.png) + +Create domains: + +``` +frostfs-adm morph nns register --name="poland" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +frostfs-adm morph nns register --name="sweden" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +frostfs-adm morph nns register --name="org" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +frostfs-adm morph nns register --name="animals.org" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + +Add the `cnametgt` records: + +``` +frostfs-adm morph nns add-record --name="poland" --data="cnametgt=animals.org" --type="txt" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +frostfs-adm morph nns add-record --name="sweden" --data="cnametgt=animals.org" --type="txt" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + +Create a domain with mapping to the global zone: + +``` +frostfs-adm morph nns register --name="bober.poland" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + +Add any `TXT` record + +``` +frostfs-adm morph nns add-record --name="bober.poland" --data="CID" --type="txt" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + +Verify that the created domain has alias in the global zone + +``` +frostfs-adm morph nns tokens -v --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml + +balance.frostfs +animals.org +group.frostfs +container +org +container.frostfs +proxy.frostfs +policy.frostfs +alphabet0.frostfs +sweden +frostfsid.frostfs +bober.animals.org (CNAME: bober.sweden) +netmap.frostfs +frostfs +poland +bober.poland +``` + +Create of a conflicting domain +``` +frostfs-adm morph nns register --name="bober.sweden" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml + +unable to register domain: script failed (FAULT state) due to an error: at instruction 1263 (THROW): unhandled exception: "global domain is already taken: bober.animals.org. Domain: bober.sweden +``` + +**Disable GUDZ** +Delete `cnametgt` records + +``` +frostfs-adm morph nns delete-records --type=txt --name=poland --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` +Create `hamster.poland` and `hamster.sweden` +``` +frostfs-adm morph nns register --name="hamster.poland" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +frostfs-adm morph nns register --name="hamster.sweden" --email="email@email.email" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` +`hamster.poland` and `hamster.sweden` does not have alias +``` +frostfs-adm morph nns tokens -v --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +balance.frostfs +animals.org +group.frostfs +container +org +container.frostfs +proxy.frostfs +policy.frostfs +alphabet0.frostfs +sweden +frostfsid.frostfs +bober.animals.org (CNAME: bober.poland) +netmap.frostfs +frostfs +poland +bober.poland +hamster.poland +``` +Delete global alias of `bober.poland` + +``` + frostfs-adm morph nns delete-records --name="bober.poland" --type="txt" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + + +``` +frostfs-adm morph nns tokens -v --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +balance.frostfs +animals.org +group.frostfs +container +org +container.frostfs +proxy.frostfs +policy.frostfs +alphabet0.frostfs +sweden +frostfsid.frostfs +netmap.frostfs +frostfs +poland +bober.poland +hamster.poland +``` +Delete `bober.poland` +``` + frostfs-adm morph nns delete --name="bober.poland" --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +``` + +``` +frostfs-adm morph nns tokens -v --config /home/achuprov/Documents/work/frostfs-dev-env/frostfs-adm.yml +balance.frostfs +animals.org +group.frostfs +container +org +container.frostfs +proxy.frostfs +policy.frostfs +alphabet0.frostfs +sweden +frostfsid.frostfs +netmap.frostfs +frostfs +poland +hamster.poland +``` \ No newline at end of file diff --git a/docs/img/GUDZ-1.png b/docs/img/GUDZ-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a653e5b3a9276b240347ec6fe33b497ae305f103 GIT binary patch literal 30730 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/docs/img/GUDZ-2.png b/docs/img/GUDZ-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdfd44665a96a9c55ae5d5e61bf7d1f40a2d2bb GIT binary patch literal 27363 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nns/README.md b/nns/README.md new file mode 100644 index 0000000..18644d1 --- /dev/null +++ b/nns/README.md @@ -0,0 +1,46 @@ +# NNS +NNS - Neo Name Service is a service that allows manage a domain name as a digital asset (NFT). It has an interface similar to `DNS` but has significant differences in its internal structure. + +## Entities: + +- Domain +- Record +- Owner +- Committee + +### Domain + +Domain is string that satisfies the following requirements: +- Length from 2 to 255 characters. +- Root domain must start with a letter. +- All other fragments must start and end with a letter or digit. + +Domain has owner, a registration period, and may optionally have records. + +A fee established by the committee is charged upon domain registration. After registration, the owner can manage this asset (add/delete records, transfer ownership to another owner) until the end of the domain registration period. + +### Record + +A record is a pair of values ``. + +Supported record types: + +| Type | Description | +|-------|-------------------------------------------| +| A | Represents address record type | +| AAA | Represents IPv6 address record type | +| TXT | Represents text record type | +| CNAME | Represents canonical name record type | +| SOA | Represents start of authority record type | + +### Owner + +An owner is a wallet that has the right to manage this NFT (domain). + +### Committee + +The committee makes new tokens (domains), sets, and charges a fee for issuance. + +## Globally Unique Domain Zone + +For more information, see [here](../docs/globally-unique-domain-zone.md).