Skip to content

ENS学习拓展

owen05 edited this page Jan 26, 2018 · 1 revision

ENS(Ethereum Name Service) 是建立以太坊区块链之上的分布式命名系统,为用户提供简短易读的域名来代替以太坊生态圈中使用的哈希地址。注册一个 ENS 域名是一个完全去中心化的过程,域名并不是通过购买获得,而是需要通过竞标获得,然后再将.eth域名绑定到对应的以太坊地址上。

竞拍流程

ENS采用Vickrey auction。整个竞拍流程分为:

  1. 开启竞拍:任何一个符合规定的域名,如果还没有人注册,就可以调用官方的ENS智能合约打入ETH开启对这个名字的竞拍;
  2. 竞价阶段:开启竞拍后三天内处于竞价阶段,每个人都有一次出价机会。在这一期间,竞拍信息是被保密的;
  3. 公示阶段:期间不能出价,之前竞价阶段的出价者需亮出竞拍信息,如果不亮视为退出并损失全部竞拍价钱,若不是最高价钱,竞价结束后会返还95%的ETH;
  4. 结算阶段:公示期结束后,出价最高的人获得域名使用权,但是价格只按第二高出价。多余的ETH会返回给账户。

ENS系统概述

ENS系统包括 the registry, and resolvers

the registry:ENS注册表是一个智能合约,主要包括信息如下:

	域名对应的拥有者
	域名对应的解析器
	域名下对应的TTL(time to live)记录

域名的拥有者可以是外部账户或者合约,其有关操作如下:

	为域名设置解析器,ttl
	转移域名所有权至其他地址
	分配子域名	

Resolvers:解析器负责将域名转换为对应的信息,比如Ethereum address, Swarm content hash;

ENS解析流程

在ENS中解析域名分为两步:

  1. 请求ENS注册表,通过域名获取对应的解析器地址

  2. 调用解析器对应的方法返回域名对应的信息

NameHash

如上截图可知,域名是通过namehash处理后生成32字节的固定长度hash值来进行存储及检索。

域名以“.”进行分割,分割为多个labels,从最后一个label开始,拼接前一个hash结果(第一个默认为32个0字节)再进行hash,因此“mysite.swarm”的nameHash计算过程如下:

node = '\0' * 32
node = sha3(node + sha3('swarm'))
node = sha3(node + sha3('mysite'))

python实现的伪代码如下:

def namehash(name):
  if name == '':
    return '\0' * 32
  else:
    label, _, remainder = name.partition('.')
    return sha3(namehash(remainder) + sha3(label))

参考文章&&扩展阅读:

https://medium.com/the-ethereum-name-service/a-beginners-guide-to-buying-an-ens-domain-3ccac2bdc770

https://docs.ens.domains/en/latest/introduction.html

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-137.md

https://registrar.ens.domains/

http://ethfans.org/posts/711