-
Notifications
You must be signed in to change notification settings - Fork 130
ENS学习拓展
ENS(Ethereum Name Service) 是建立以太坊区块链之上的分布式命名系统,为用户提供简短易读的域名来代替以太坊生态圈中使用的哈希地址。注册一个 ENS 域名是一个完全去中心化的过程,域名并不是通过购买获得,而是需要通过竞标获得,然后再将.eth域名绑定到对应的以太坊地址上。
ENS采用Vickrey auction。整个竞拍流程分为:
- 开启竞拍:任何一个符合规定的域名,如果还没有人注册,就可以调用官方的ENS智能合约打入ETH开启对这个名字的竞拍;
- 竞价阶段:开启竞拍后三天内处于竞价阶段,每个人都有一次出价机会。在这一期间,竞拍信息是被保密的;
- 公示阶段:期间不能出价,之前竞价阶段的出价者需亮出竞拍信息,如果不亮视为退出并损失全部竞拍价钱,若不是最高价钱,竞价结束后会返还95%的ETH;
- 结算阶段:公示期结束后,出价最高的人获得域名使用权,但是价格只按第二高出价。多余的ETH会返回给账户。
ENS系统包括 the registry, and resolvers
the registry:ENS注册表是一个智能合约,主要包括信息如下:
域名对应的拥有者
域名对应的解析器
域名下对应的TTL(time to live)记录
域名的拥有者可以是外部账户或者合约,其有关操作如下:
为域名设置解析器,ttl
转移域名所有权至其他地址
分配子域名
Resolvers:解析器负责将域名转换为对应的信息,比如Ethereum address, Swarm content hash;
在ENS中解析域名分为两步:
-
请求ENS注册表,通过域名获取对应的解析器地址
-
调用解析器对应的方法返回域名对应的信息
如上截图可知,域名是通过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