File tree 3 files changed +65
-0
lines changed
3 files changed +65
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change 2
2
3
3
### 简介
4
4
5
+ ENS(Ethereum Name Service)是以太坊域名服务,是一个基于以太坊区块链的分布式、开放和可扩展的命名系统。
6
+
7
+ ENS的工作是将可读的域名(比如"alice.eth")解析为计算机可以识别的标识符,如以太坊地址、内容的散列、元数据等。ENS还支持"反向解析",这使得将元数据(如规范化域名或接口描述)与以太坊地址相关联成为可能
8
+
5
9
### 使用流程
6
10
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
+
7
18
### 原理
8
19
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
+
9
42
## 参考链接
10
43
11
44
- ens 介绍: < https://ethfans.org/posts/new-decaying-price-premium-for-newly-released-names >
Original file line number Diff line number Diff line change
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
+ } ) ( )
You can’t perform that action at this time.
0 commit comments