Skip to content

Latest commit

 

History

History
165 lines (100 loc) · 6.01 KB

system.rst

File metadata and controls

165 lines (100 loc) · 6.01 KB

NNS 概述

NNS是一个基于Neo区块链的分布式、开源和可扩展的域名系统,旨在为NEO提供域名解析服务。

NNS可以将域名解析到各种目标。最容易联想到的是Neo的地址(Address),或者智能合约(ScriptHash)。 但我们在设计这个系统时预留了足够的扩展性,可以在不升级NNS系统的情况下支持更多的解析目标种类。

功能

NNS系统有两个作用 一是将beautiful.neo 等人类可读的名称解析为机器使用的标识符,如Neo的地址等。 二是为域名提供描述性数据,比如whois,合约接口描述等

NNS 和 DNS的目标类似,或者说和ENS的目标一致^_^,基于区块链架构设计。使用和DNS一样用点(.)分割的域名称系统, 域名的所有者对隶属于他的子域名有完全的分配权。

.neo .gas 这样的根域名由一个称为(注册器Registry)的智能合约管理。一个注册器管理一个根域名,并设定取得其一级域名所有权的规则。 任何人均可遵照对应的注册器设定的规则取得一级域名的所有权。

架构

NNS有四个系统组件

  1. 顶级域名合约(域名根是管理根域名的脚本)
  2. 所有者(所有者可以是一个address,也可以是一个智能合约)
  3. 注册机(专门负责给一个域名的子域名分配所有者的智能合约,根域名也会指定一个根域名的注册机)
  4. 解析器(负责解析一个域名或者他的子域名)

顶级域名合约

域名根是一个根域名 比如.test 所有信息的管理者。 无论二级域名 aa.test 还是 三级域名 bbb.aa.test,他们的所有者都保存在域名根之中。 域名根以字典的形式保存如下数据

  1. 域名的所有者(owner)
  2. 域名的注册器(register)
  3. 域名的解析器(resolver)
  4. 域名的TTL(域名到期时间)

所有者

域名的所有者可以是一个账户地址或者一个智能合约。 (ens的设计是拥有域名的智能合约叫做注册器,实际上注册器只是owner的一个特例,我们将域名的所有者和注册器分开了,这个系统会变得更加清晰)

域名的所有者(owner)可以

  1. 将域名的所有权转移到另一个地址
  2. 更改注册器,最常见域名注册器为“管理员手动分配子域名”
  3. 更改解析器允许所有者是一个智能合约,可以提供多种多样的所有权模式
  • 双人共有域名,要两人签名才可以转让域名或者更改注册器
  • 多人共有域名,超过50%人签名才可以转让域名或者更改注册器

如果域名的所有者是一个账户地址,那么用户可以调用注册器的接口管理二级域名。

注册器

(ens的设计是拥有域名的智能合约叫做注册器,实际上注册器只是owner的一个特例, 我们将域名的所有者和注册器分开了,这个系统会变得更加清晰。大部分用户并不会去卖自己的二级域名,所以大部分用户无需配置注册器,配置解析器即可)

注册器专门负责将一个域名的子域名重新分配给其他所有者。 注册器会调用域名根脚本进行操作。 域名根会检查注册器是否有权限操作此域名。 注册器有两个功能:

  1. 将一个域名的子域名重新分配给其他所有者
  2. 查询一个子域名的拥有者是否合法,因为存在三级域名卖掉了,然后二级域名转让给别人这种情况

所以在做完整解析的情况下,解析过程会询问注册器,他的下级域名是不是分配给了指定的所有者,如果没有,则此解析无效。

注册器是一个智能合约,可以有不同种类的注册器。

  1. 先到先得注册器,大家可以自由抢域名
  2. 管理员手动分配注册器,由一个管理员来设置将子域名的所有权如何处理
  3. 拍卖注册器,等等

解析器

NNS最主要的功能,就是完成从域名到解析器的映射。 解析器是一个智能合约,他来完成实际将名字翻译成地址的实际过程。

只要遵循NNS解析器规范的智能合约就可以被配置为解析器。NNS会提供通用的解析器。

如果要增加新的协议类型,在对现有NNS规范没有颠覆性改变的情况下,都可以不需改动NNS系统,直接配置实现。

具体解析规则

域名的存储

NNS中存储的域名为32字节散列值,而不是域名原文的文本。这有几个设计原因:

  1. 处理过程统一,允许任意长度的域名
  2. 一定程度保留了域名的隐私
  3. 将域名转换为散列的算法称为`NameHash`_

NameHash的定义方式为递归式

//aaa.neo 对应
hashA  =  hash256(hash256(".neo") + "aaa")
//bbb.aaa.neo对应
hashB  =  hash256(hashA + "bbb")
//ccc.bbb.aaa.neo 对应
HashC  =  hash256(hashB + "ccc")

这样的定义方式让我们可以将所有层次的域名,一级,二级到无数级,都扁平化的保存在一个Map 的数据结构中。

这正是注册器保存域名解析的方法

这个递归计算NameHash的方式,可以用一个函数表达

Hash = NameHash(“xxx.xxx.xxx…”);

NameHash实现方法另外撰文。

所有的注册器都必须被保存到域名根

解析过程

用户调用根域名的解析函数进行解析,根域名提供完整和快速两种解析方式。可根据需要调用,也可以直接查询解析器,自行调用。

快速解析方式

快速方式域名根直接查表完整域名的解析器,如果没有,查询父域名的解析器。然后调用解析器解析。

快速方式运算次数少,但可能存在一个漏洞,即为三级域名卖给了别人,解析器存在,但是二级域名已经转让的情况。 此时依然可以正常解析

完整解析方式

完整方式,域名根将从根域名开始,逐层检查所有权和TTL,如果不符合将失败。

运算次数较多,与域名级数线性增长。