NNS是一个基于Neo区块链的分布式、开源和可扩展的域名系统,旨在为NEO提供域名解析服务。
NNS可以将域名解析到各种目标。最容易联想到的是Neo的地址(Address),或者智能合约(ScriptHash)。 但我们在设计这个系统时预留了足够的扩展性,可以在不升级NNS系统的情况下支持更多的解析目标种类。
NNS系统有两个作用 一是将beautiful.neo 等人类可读的名称解析为机器使用的标识符,如Neo的地址等。 二是为域名提供描述性数据,比如whois,合约接口描述等
NNS 和 DNS的目标类似,或者说和ENS的目标一致^_^,基于区块链架构设计。使用和DNS一样用点(.)分割的域名称系统, 域名的所有者对隶属于他的子域名有完全的分配权。
.neo .gas 这样的根域名由一个称为(注册器Registry)的智能合约管理。一个注册器管理一个根域名,并设定取得其一级域名所有权的规则。 任何人均可遵照对应的注册器设定的规则取得一级域名的所有权。
NNS有四个系统组件
- 顶级域名合约(域名根是管理根域名的脚本)
- 所有者(所有者可以是一个address,也可以是一个智能合约)
- 注册机(专门负责给一个域名的子域名分配所有者的智能合约,根域名也会指定一个根域名的注册机)
- 解析器(负责解析一个域名或者他的子域名)
域名根是一个根域名 比如.test 所有信息的管理者。 无论二级域名 aa.test 还是 三级域名 bbb.aa.test,他们的所有者都保存在域名根之中。 域名根以字典的形式保存如下数据
- 域名的所有者(owner)
- 域名的注册器(register)
- 域名的解析器(resolver)
- 域名的TTL(域名到期时间)
域名的所有者可以是一个账户地址或者一个智能合约。 (ens的设计是拥有域名的智能合约叫做注册器,实际上注册器只是owner的一个特例,我们将域名的所有者和注册器分开了,这个系统会变得更加清晰)
域名的所有者(owner)可以
- 将域名的所有权转移到另一个地址
- 更改注册器,最常见域名注册器为“管理员手动分配子域名”
- 更改解析器允许所有者是一个智能合约,可以提供多种多样的所有权模式
- 双人共有域名,要两人签名才可以转让域名或者更改注册器
- 多人共有域名,超过50%人签名才可以转让域名或者更改注册器
如果域名的所有者是一个账户地址,那么用户可以调用注册器的接口管理二级域名。
(ens的设计是拥有域名的智能合约叫做注册器,实际上注册器只是owner的一个特例, 我们将域名的所有者和注册器分开了,这个系统会变得更加清晰。大部分用户并不会去卖自己的二级域名,所以大部分用户无需配置注册器,配置解析器即可)
注册器专门负责将一个域名的子域名重新分配给其他所有者。 注册器会调用域名根脚本进行操作。 域名根会检查注册器是否有权限操作此域名。 注册器有两个功能:
- 将一个域名的子域名重新分配给其他所有者
- 查询一个子域名的拥有者是否合法,因为存在三级域名卖掉了,然后二级域名转让给别人这种情况
所以在做完整解析的情况下,解析过程会询问注册器,他的下级域名是不是分配给了指定的所有者,如果没有,则此解析无效。
注册器是一个智能合约,可以有不同种类的注册器。
- 先到先得注册器,大家可以自由抢域名
- 管理员手动分配注册器,由一个管理员来设置将子域名的所有权如何处理
- 拍卖注册器,等等
NNS最主要的功能,就是完成从域名到解析器的映射。 解析器是一个智能合约,他来完成实际将名字翻译成地址的实际过程。
只要遵循NNS解析器规范的智能合约就可以被配置为解析器。NNS会提供通用的解析器。
如果要增加新的协议类型,在对现有NNS规范没有颠覆性改变的情况下,都可以不需改动NNS系统,直接配置实现。
NNS中存储的域名为32字节散列值,而不是域名原文的文本。这有几个设计原因:
- 处理过程统一,允许任意长度的域名
- 一定程度保留了域名的隐私
- 将域名转换为散列的算法称为`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,如果不符合将失败。
运算次数较多,与域名级数线性增长。