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.uj5u.com/qukuanlian/2167.html
標籤:區塊鏈
上一篇:JZ51 構建乘積陣列
下一篇:以太坊錢包搭建與使用

