ENS 注册表合约是 ENS 系统中的核心合约,了解这个合约可以敲开我们理解 ENS 域名系统的大门。

打开下面的折叠区域可以查看用 Solidity 语言编写的详细代码。当前部署在以太坊中的 ENS 注册表合约是用 LLL 语言编写的(ENS 最早采用 LLL 语言的原因),但因为 LLL 语言的可读性很差,于是 ENS 官方团队公布了用 Solidity 语言实现的 ENS 注册表合约。

 pragma solidity ^0.5.;

 import "./ENS.sol";

 contract ENSRegistry is ENS {
struct Record {
address owner;
address resolver;
uint64 ttl;
} mapping (bytes32 => Record) records; modifier only_owner(bytes32 node) {
require(records[node].owner == msg.sender);
_;
} constructor() public {
records[0x0].owner = msg.sender;
} function setOwner(bytes32 node, address owner) external only_owner(node) {
emit Transfer(node, owner);
records[node].owner = owner;
} function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external only_owner(node) {
bytes32 subnode = keccak256(abi.encodePacked(node, label));
emit NewOwner(node, label, owner);
records[subnode].owner = owner;
} function setResolver(bytes32 node, address resolver) external only_owner(node) {
emit NewResolver(node, resolver);
records[node].resolver = resolver;
} function setTTL(bytes32 node, uint64 ttl) external only_owner(node) {
emit NewTTL(node, ttl);
records[node].ttl = ttl;
} function owner(bytes32 node) external view returns (address) {
return records[node].owner;
} function resolver(bytes32 node) external view returns (address) {
return records[node].resolver;
} function ttl(bytes32 node) external view returns (uint64) {
return records[node].ttl;
} }

ENSRegistry.sol

下面我们来一步一步解析这个智能合约。

pragma solidity ^0.5.;

这是 solidity 版本声明,0.5.0代表 solidity 版本,^ 号表示向上兼容。

import "./ENS.sol";

表示合约引用了 ENS.sol 合约。ENS.sol 合约是一个注册表接口合约,而 ENSRegistry.sol 合约包含着具体的注册表实现代码。

struct Record {
address owner;
address resolver;
uint64 ttl;
}

定义了 ENS 记录的结构。

字段 address 表示一个 ENS 域名的所有者地址。
字段 address 表示一个 ENS 域名的解析器地址。
字段 ttl 表示一个 ENS 域名的 TTL 值。

mapping (bytes32 => Record) records;

创建了一个名为 records 的映射类型,表示从节点到记录的映射。节点是指在 ENS 系统中用来标识域名的一个哈希值,节点的处理是 ENS 系统中的关键内容,有兴趣的可以进一步了解 ENS 域名处理

modifier only_owner(bytes32 node) {
require(records[node].owner == msg.sender);
_;
}

创建了一个函数修改器,用来限定那些只允许指定节点的所有者来执行的函数。

constructor() public {
records[0x0].owner = msg.sender;
}

合约构造器。合约部署时会将 ENS 域名根域的所有权赋予部署者。

function setOwner(bytes32 node, address owner) external only_owner(node) {
emit Transfer(node, owner);
records[node].owner = owner;
}

setOwner 函数实现将一个节点的所有权转让给另一个地址,该函数只能由该节点当前的所有者来调用。

参数 node 表示需要转让所有权的节点。
参数 owner 表示接收节点所有权的地址。
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external only_owner(node) {
bytes32 subnode = keccak256(abi.encodePacked(node, label));
emit NewOwner(node, label, owner);
records[subnode].owner = owner;
}

setSubnodeOwner 函数将一个子节点的所有权转让给一个新的地址,该函数只能由其父节点的所有者来调用。

参数 node 表示父节点。
参数 label 表示指定子节点标签的哈希。
参数 owner 表示接收子节点所有权的地址。
function setResolver(bytes32 node, address resolver) external only_owner(node) {
emit NewResolver(node, resolver);
records[node].resolver = resolver;
}

setResolver 函数用来设置指定节点的解析器地址,该函数只能由这个节点的所有者来调用。

参数 node 表示需要设置的节点。
参数 resolver 表示解析器地址。
function setTTL(bytes32 node, uint64 ttl) external only_owner(node) {
emit NewTTL(node, ttl);
records[node].ttl = ttl;
}

setTTL 函数用来设置指定节点的 TTL,该函数只能由这个节点的所有者来调用。

参数 node 表示需要设置的节点。
参数 ttl 表示以秒为单位的 TTL 值。
function owner(bytes32 node) external view returns (address) {
return records[node].owner;
}

owner 函数用来获取指定节点的所有者地址。

function resolver(bytes32 node) external view returns (address) {
return records[node].resolver;
}

resolver 函数用来获取指定节点的解析器地址。

function ttl(bytes32 node) external view returns (uint64) {
return records[node].ttl;
}

ttl 函数用来获取指定节点的 TTL 值。

以上就是 ENSRegistry.sol 合约的全部代码,这个合约自部署到以太坊主网来以来,一直没有变更过,相当于 ENS 的 “户籍系统” ,它记录着所有的 ENS 域名的所有者、解析器等 “户口信息” 。

ENS 在未来会有更加广泛的应用。如果您对 ENS 域名有兴趣,一定要在下面留言与我交流。

ENS 域名注册表智能合约(ENSRegistry.sol)解析的更多相关文章

  1. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

  2. 区块链学习(四)truffle部署编译智能合约以太坊私有链

    前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04  Truf ...

  3. 域名注册域名解析域名绑定 dns服务器解析 域名记录的添加 记录类型含义@ www 访问域名请求过程

    创建一个web应用,简言之就是访问一个域名,可以到达一个地方,这个地方就是你存放供别人查看的文件的地方 就像一条绳,从这头拉一下,可以拉出来另一头的东西 主要有两个部分: 域名 虚拟主机(空间) 1. ...

  4. Wise Registry Cleaner Pro(智能注册表清理) V9.31 绿色版

    软件名称: Wise Registry Cleaner Pro(智能注册表清理)软件语言: 简体中文授权方式: 免费试用运行环境: Win7 / Vista / Win2003 / WinXP 软件大 ...

  5. 基于Fisco-Bcos的区块链智能合约-简单案例实践

    一.智能合约介绍 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上.FISCO BCOS平台支持两种智能合约类型:Solidity智能合约与预编译智能合约 Solidity与Java类 ...

  6. NEO从入门到开窗(2) - 智能合约的面相

    一.啰嗦两句 昨天讲了智能合约的一生,那丫长啥样啊?今儿我就跟各位唠叨唠叨. 二.一个简单的智能合约 下面这段就是NEO实例源码里的一个,干撒用的?聪明的你一眼儿就看出来了吧,就是一个所谓域名合约的增 ...

  7. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  8. Go语言打造以太坊智能合约测试框架(level2)

    传送门: 柏链项目学院 第二课 智能合约自动化编译 前期内容回顾 之前我们的介绍的是如何通过solc编译智能合约,并且调用智能合约,本节我们继续实践,将智能合约的代码自动化编译以及abi文件生成搞定. ...

  9. 以太坊智能合约 Solidity 的常用数据类型介绍

    目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...

随机推荐

  1. Laravel 中 validation 验证 返回中文提示 全局设置

    <?php return [ /* |-------------------------------------------------------------------------- | V ...

  2. JavaScript的一些SAO操作

    IE判断检测 jQuery 在 1.9 版本之前,提供了一个浏览器对象检测的属性 使用率极高.但是在版本发布之后,大家钟爱的这个属性被无情的抛弃了.大家开始着手寻找.browser 的替代方案.于是各 ...

  3. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  4. POJ 2387 Til the Cows Come Home(最短路模板)

    题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...

  5. vue-learning:10-template-ref

    使用ref直接访问DOM元素 传统DOM操作或jQuery操作DOM,都必须是选择器先选择对应的DOM元素.比如: <button id="btn">按钮</bu ...

  6. VRChat模型制作及上传总篇(201912)

    1.视频资源及软件插件模型资源: Kodoku-shi :https://www.bilibili.com/video/av20097333(自己目前找到讲的最详细的教程,但是blender减免部分貌 ...

  7. 关于python2和python3除法的区别

    在Python2中,除法的取值结果取整数 >>> 9/2 4 而在Python3中,除法/的结果包含小数,如果只想取整数需要使用// >>> 9/2 4.5 > ...

  8. Go处理PDF

    工作中经常会遇到一些pdf文件处理的问题,一千种pdf有一千种处理方式,每次都是绞尽脑汁和这些pdf战斗到底. 本人又是一个gopher,所以这篇文章会以一个goper的视角,列举一下我所经历过的每一 ...

  9. saltstack的配置使用

    介绍 认证管理,使其可以用于编配, 远程执行, 配置管理等等.部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. 号称世界上最快的消息队列ZeroMQ使得 ...

  10. SpringCloud + Consul服务注册中心 + gateway网关

    1  启动Consul 2  创建springcloud-consul项目及三个子模块 2.1 数据模块consul-producer 2.2 数据消费模块consul-consumer 2.3 ga ...