Skip to content

Commit 1aed0ed

Browse files
committed
update 61-ENS
1 parent 9028b01 commit 1aed0ed

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

basic/61-ENS/package.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "61-ENS",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"license": "MIT",
6+
"scripts": {
7+
"test-ethers": "node src/ethers-ens/index.js"
8+
},
9+
"devDependencies": {
10+
"ethers": "^5.5.2"
11+
}
12+
}

basic/61-ENS/readme.md

+33
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,43 @@
22

33
### 简介
44

5+
ENS(Ethereum Name Service)是以太坊域名服务,是一个基于以太坊区块链的分布式、开放和可扩展的命名系统。
6+
7+
ENS的工作是将可读的域名(比如"alice.eth")解析为计算机可以识别的标识符,如以太坊地址、内容的散列、元数据等。ENS还支持"反向解析",这使得将元数据(如规范化域名或接口描述)与以太坊地址相关联成为可能
8+
59
### 使用流程
610

11+
ENS JavaScript 库:
12+
13+
- [ethereum-ens](https://www.npmjs.com/package/ethereum-ens),由ENS开发者维护
14+
- [ethjs-ens](https://www.npmjs.com/package/ethjs-ens)
15+
- [ethers.js](https://github.com/ethers-io/ethers.js)[ethers.js中文文档](https://learnblockchain.cn/docs/ethers.js/))
16+
- [web3.js](https://web3js.readthedocs.io/en/1.0/web3-eth-ens.html):不支持反向解析
17+
718
### 原理
819

20+
#### ENS架构
21+
22+
ENS主要有两个组件:
23+
24+
- 注册表:是一个智能[合约](https://github.com/ensdomains/ens/blob/master/contracts/ENS.sol),该合约维护所有域名和子域名列表
25+
- 解析器:是一个智能合约,负责将 ENS 域名转换为地址或其他类型的哈希和文本数据,合约内保存着这些解析记录
26+
27+
注册表负责将域名映射到负责解析这个域名的解析器
28+
29+
解析器负责将域名转换为地址
30+
31+
#### 解析过程
32+
33+
1. 对将要解析的域名进行规范化和哈希
34+
- 规范化:对域名进行规范化和有效性检查(比如将fOO.eth 规范为 foo.eth)并屏蔽包含下划线等禁止字符的域名
35+
- 哈希:Namehash 是一个递归过程,可以为任何有效的域名生成唯一的哈希
36+
2. 在 ENS 注册表上调用 `resolver()` ,并将第 1 步输出的哈希作为参数传递,然后 `resolver()` 会返回负责解析这个域名的解析器的地址。
37+
- ENS 注册表是 ENS 系统中的核心合约,所有的 ENS 查询都从注册表开始。注册表负责管理域名列表,记录每个域名的所有者、解析器和 TTL ,并允许域名的所有者对这些数据进行更改
38+
3. 使用 [resolver 接口](https://github.com/ensdomains/resolvers/blob/master/contracts/Resolver.sol) ,在第 2 步返回的解析器地址上调用 `addr()` ,并将第1步输出的哈希作为参数传递。
39+
40+
41+
942
## 参考链接
1043

1144
- ens 介绍: <https://ethfans.org/posts/new-decaying-price-premium-for-newly-released-names>

basic/61-ENS/src/ethers-ens/index.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var ethers = require('ethers');
2+
3+
var provider = ethers.getDefaultProvider('ropsten');
4+
5+
const ensName = 'registrar.firefly.eth';
6+
const address = '0x6fC21092DA55B392b045eD78F4732bff3C580e2c';
7+
8+
(async () => {
9+
// 解析至以太坊地址
10+
const ethAddress = await provider.resolveName(ensName);
11+
console.log(`${ensName}对应的以太坊地址: ${ethAddress}`);
12+
13+
// 反向解析
14+
const name = await provider.lookupAddress(address);
15+
console.log(`${address}对应的ens名称: ${name}`);
16+
17+
// ethers支持在任何需要使用地址的地方也可以使用ENS域名,一般不需要直接调用resolveName
18+
const balance = await provider.getBalance(ensName);
19+
console.log('balance: ', ethers.utils.formatEther(balance));
20+
})()

0 commit comments

Comments
 (0)