ENS 域名注册表智能合约(ENSRegistry.sol)解析

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

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

 1 pragma solidity ^0.5.0;
 2
 3 import "./ENS.sol";
 4
 5 contract ENSRegistry is ENS {
 6     struct Record {
 7         address owner;
 8         address resolver;
 9         uint64 ttl;
10     }
11
12     mapping (bytes32 => Record) records;
13
14     modifier only_owner(bytes32 node) {
15         require(records[node].owner == msg.sender);
16         _;
17     }
18
19     constructor() public {
20         records[0x0].owner = msg.sender;
21     }
22
23     function setOwner(bytes32 node, address owner) external only_owner(node) {
24         emit Transfer(node, owner);
25         records[node].owner = owner;
26     }
27
28     function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external only_owner(node) {
29         bytes32 subnode = keccak256(abi.encodePacked(node, label));
30         emit NewOwner(node, label, owner);
31         records[subnode].owner = owner;
32     }
33
34     function setResolver(bytes32 node, address resolver) external only_owner(node) {
35         emit NewResolver(node, resolver);
36         records[node].resolver = resolver;
37     }
38
39     function setTTL(bytes32 node, uint64 ttl) external only_owner(node) {
40         emit NewTTL(node, ttl);
41         records[node].ttl = ttl;
42     }
43
44     function owner(bytes32 node) external view returns (address) {
45         return records[node].owner;
46     }
47
48     function resolver(bytes32 node) external view returns (address) {
49         return records[node].resolver;
50     }
51
52     function ttl(bytes32 node) external view returns (uint64) {
53         return records[node].ttl;
54     }
55
56 }

ENSRegistry.sol

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

pragma solidity ^0.5.0;

这是 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 域名有兴趣,一定要在下面留言与我交流。

原文地址:https://www.cnblogs.com/cnliu/p/ens-registry-contract.html

时间: 2024-08-30 18:32:51

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

OKEX智能合约交易平台系统解析

说到区块链,首先不得不提的是比特币,区块链能够在今天达到众人皆知的地位,主要归功于一个叫中本聪的老兄创造了比特币,并赋予比特币以金融价值,这才引得世人癫狂.你想想啊,前几年的比特币无人搭理,慢慢地能买披萨吃,到现在已经达到一万多美元一枚,当年中国大妈疯狂抢黄金引得黄金价格大涨,给歪果仁留下笑柄,如今美国大妈疯狂入市比特币,引得比特币价格大涨,谁比谁高级啊!!! 那么,看到这样的好事,中国的聪明人都坐不住了,纷纷发行币,什么狗狗币.莱特币.瑞波币等等,这还是榜上有名的,其他的就更多了.前几日,老铁

2018年以太坊智能合约开发语言Solidity最佳IDEs

Solidity是一种以智能合约为导向的编程语言.这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约. 理解它官方文档应该是学习Solidity的最佳来源:solidity.readthedocs.io 想在以太坊的网络上建立自己的加密货币吗?想拥有自己的初始代码产品吗?以下是您今天可以使用的最佳Solidity IDE. Remix IDE Remix IDE是基于浏览器的,并且集成了编译器.没有服务器端组件. 官网: https://remix.ethereum.orggi

Windows下以太坊集成开发环境(Remix-IDE)搭建与智能合约的简单应用

前面我们介绍了在以太坊平台下开发区块链私有链的过程,以及在私有链下进行挖矿的操作,而随着区块链技术的发展,区块链技术已不仅限于比特币的应用,未来将重在着眼于向其他领域的扩展推广,以此开启区块链2.0以智能合约为代表的时代.本文选用remix作为开发应用平台,配合geth客户端实现与以太坊网络的交互,下一篇文章则改用truffle和ganache搭建开发框架(这是后话). 本文分为remix-ide搭建和智能合约部署应用两部分. 一.remix-ide搭建 [准备工作] 1.安装Node.js.N

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

软件名称: Wise Registry Cleaner Pro(智能注册表清理)软件语言: 简体中文授权方式: 免费试用运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 2.3MB图片预览: 软件简介:Wise Registry Cleaner Pro有个很漂亮的中文名:智能注册表清洁专家,其实这个工具不仅可以清理注册表,还同时带有系统优化和注册表碎片整理等功能,官方提供Free(免费版)和Professional(专业版)2个版本 软件下载页面:http:/

以太坊Dapp项目-拍卖网站-智能合约编写测试

修订日期 姓名 邮箱 2018-10-18 brucefeng [email protected] 前言 写这篇文章的初衷其实很简单,在MyEtherWallet上申请以太坊ENS的时候,竞标的以太币两次被吞,而且是在规定时间点进行了价格公告,这篇文章的设计思路其实就是跟ENS的竞标流程类似,希望对大家有所帮助,所以,准备写完之后,再重新去整一次ENS的申请,如果再被吞,我就要举报了:-),本文主要是本人用于项目整理,便于自己查询,不做任何商业用途. 现在回归到技术上来,这个项目其实涉及到蛮多的

【刘文彬】【精解】开发一个智能合约

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/contract.html 智能合约 这两天被老大搞去搬砖,学习计划有变但无大碍,这篇文章将仔细分析智能合约相关内容. 关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j 合约 合约也称合同.协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件.智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它

solidity编写智能合约(入门)

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } 在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成

经典:浅谈以太坊智能合约的设计模式与升级方法

目录 1. 最佳实践 2. 实用设计案例 2.1 控制器合约与数据合约: 1->1 2.2 控制器合约与数据合约: 1->N 2.3 控制器合约与数据合约: N->1 2.4 控制器合约与数据合约: N->N 2.5 总结 3. 升级 3.1 控制器合约升级,数据合约不升级 3.2 控制器合约不升级,数据合约升级 3.3 控制器合约升级,数据合约升级 4. 数据迁移 4.1 硬编码迁移法 4.2 硬拷贝迁移法 4.3 默克尔树迁移法 以太坊EVM是当前区块链行业应用最为广泛的虚拟机

solidity开发以太坊代币智能合约

智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity. 让我们先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. contract SimpleStorage { uint storedData; functi