From 5fc3138ebade51f2d9527adb9ef7b63b78481e1a Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Sun, 5 May 2019 12:10:19 +1200 Subject: [PATCH] Remove obsolete docs --- docs/Makefile | 20 --- docs/conf.py | 156 ----------------- docs/deploying.rst | 60 ------- docs/dns.rst | 21 --- docs/ethregistrar.rst | 239 -------------------------- docs/faq.rst | 147 ---------------- docs/img/ens-architecture.png | Bin 22940 -> 0 bytes docs/img/ens-flow.png | Bin 9693 -> 0 bytes docs/img/ens-logo.png | Bin 92538 -> 0 bytes docs/implementers.rst | 286 ------------------------------- docs/index.rst | 32 ---- docs/introduction.rst | 77 --------- docs/libraries.rst | 31 ---- docs/make.bat | 36 ---- docs/quickstart.rst | 95 ----------- docs/requirements.txt | 3 - docs/userguide.rst | 312 ---------------------------------- 17 files changed, 1515 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py delete mode 100644 docs/deploying.rst delete mode 100644 docs/dns.rst delete mode 100644 docs/ethregistrar.rst delete mode 100644 docs/faq.rst delete mode 100644 docs/img/ens-architecture.png delete mode 100644 docs/img/ens-flow.png delete mode 100644 docs/img/ens-logo.png delete mode 100644 docs/implementers.rst delete mode 100644 docs/index.rst delete mode 100644 docs/introduction.rst delete mode 100644 docs/libraries.rst delete mode 100644 docs/make.bat delete mode 100644 docs/quickstart.rst delete mode 100644 docs/requirements.txt delete mode 100644 docs/userguide.rst diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 29ff72d4..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = ENS -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index b0784888..00000000 --- a/docs/conf.py +++ /dev/null @@ -1,156 +0,0 @@ -# -*- coding: utf-8 -*- -# -# ENS documentation build configuration file, created by -# sphinx-quickstart on Thu Dec 15 16:45:41 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['sphinx.ext.mathjax'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'ENS' -copyright = u'2016, Nick Johnson ' -author = u'Nick Johnson ' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'0.1' -# The full version, including alpha/beta/rc tags. -release = u'0.1' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'ENSdoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'ENS.tex', u'ENS Documentation', - u'Nick Johnson \\textless{}nick@ethereum.org\\textgreater{}', 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'ens', u'ENS Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'ENS', u'ENS Documentation', - author, 'ENS', 'One line description of project.', - 'Miscellaneous'), -] - - - diff --git a/docs/deploying.rst b/docs/deploying.rst deleted file mode 100644 index 4d9d6982..00000000 --- a/docs/deploying.rst +++ /dev/null @@ -1,60 +0,0 @@ -*************** -Deploying ENS -*************** - -If you'd like to deploy ENS on your own network, or deploy your own copy of ENS on a public network, this guide shows you how. If you want to use an existing ENS deployment, read :ref:`interacting` instead. If you want to register a name on the Ropsten (testnet) ENS deployment, read :ref:`fifs` or :ref:`auctions`. - -Deploy the registry -------------------- - -First, you need to deploy ENS's central component, the registry. To do so, paste this code into an Ethereum console: - -:: - - var ensContract = web3.eth.contract([{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"name":"","type":"uint64"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"}]); - var ens = ensContract.new({ - from: web3.eth.accounts[0], - data: "0x33600060000155610220806100146000396000f3630178b8bf60e060020a600035041415610023576020600435015460405260206040f35b6302571be360e060020a600035041415610047576000600435015460405260206040f35b6316a25cbd60e060020a60003504141561006b576040600435015460405260206040f35b635b0fc9c360e060020a6000350414156100b8576000600435015433141515610092576002565b6024356000600435015560243560405260043560198061020760003960002060206040a2005b6306ab592360e060020a6000350414156101165760006004350154331415156100df576002565b6044356000600435600052602435602052604060002001556044356040526024356004356021806101e660003960002060206040a3005b631896f70a60e060020a60003504141561016357600060043501543314151561013d576002565b60243560206004350155602435604052600435601c806101ca60003960002060206040a2005b6314ab903860e060020a6000350414156101b057600060043501543314151561018a576002565b602435604060043501556024356040526004356016806101b460003960002060206040a2005b6002564e657754544c28627974657333322c75696e743634294e65775265736f6c76657228627974657333322c61646472657373294e65774f776e657228627974657333322c627974657333322c61646472657373295472616e7366657228627974657333322c6164647265737329", - gas: 4700000 - }, function (e, contract){ - console.log(e, contract); - if (typeof contract.address !== 'undefined') { - console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); - } - }); - -Once successfully mined, you will have a fresh ENS registry, whose root node is owned by the account that created the transaction (in this case, the first account on your node). This account has total control over the ENS registry - it can create and replace any node in the entire tree. - -For instructions on how to interact with the registry, see :ref:`interacting`. - -Deploying a registrar ---------------------- - -A registrar is a contract that has ownership over a node (name) in the ENS registry, and provides an interface for users to register subnodes (subdomains). You can deploy a registrar on any name; in this example we'll deploy a simple first-in-first-served registrar for the root node. - -To deploy a first-in-first-served registrar on the root node of an ENS registry you control, execute this code in an Ethereum console: - -:: - - var registrarContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"subnode","type":"bytes32"},{"name":"owner","type":"address"}],"name":"register","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"},{"name":"node","type":"bytes32"}, {"name": "_startDate", "type": "uint256"}],"type":"constructor"}]); - var registrar = registrarContract.new( - ens.address, - 0, - 0, - {from: web3.eth.accounts[0], - data: "0x60606040818152806101c4833960a0905251608051600080546c0100000000000000000000000080850204600160a060020a0319909116179055600181905550506101768061004e6000396000f3606060405260e060020a6000350463d22057a9811461001e575b610002565b34610002576100f4600435602435600154604080519182526020808301859052815192839003820183206000805494830181905283517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390529351879592949193600160a060020a03909316926302571be3926024808201939182900301818787803b156100025760325a03f11561000257505060405151915050600160a060020a038116158015906100ea575033600160a060020a031681600160a060020a031614155b156100f657610002565b005b60008054600154604080517f06ab5923000000000000000000000000000000000000000000000000000000008152600481019290925260248201899052600160a060020a03888116604484015290519216926306ab59239260648084019382900301818387803b156100025760325a03f11561000257505050505050505056", - gas: 4700000 - }, function (e, contract){ - console.log(e, contract); - if (typeof contract.address !== 'undefined') { - console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); - } - }); - -Once that transaction is mined, you can transfer ownership of the root node to the newly created registrar: - -:: - - ens.setOwner(0, registrar.address, {from: web3.eth.accounts[0]}); - -Users can now register names with the registrar; for instructions read :ref:`fifs`. diff --git a/docs/dns.rst b/docs/dns.rst deleted file mode 100644 index 6d7e5094..00000000 --- a/docs/dns.rst +++ /dev/null @@ -1,21 +0,0 @@ -*************************** -Hosting a DNS domain on ENS -*************************** - -Experimental support is available for hosting DNS domains on the Ethereum blockchain via ENS. This works by configuring the domain's nameserver records to point to gateway DNS servers; these DNS servers resolve lookups by consulting an ENS registry which points to resolvers containing the zone data for the relevant domain. - -The steps to host your own domain on the blockchain are: - - 1. `deploy your own ENS registry`_ - 2. Deploy an instance of `DNSResolver`_ - 3. Update your ENS registry to set your newly deployed DNSResolver as the resolver for your domain name (eg, by calling setSubnodeOwner and setResolver; see :ref:`interacting` for details). Don't forget to set the TTL on this record to a reasonable value, or your DNS data may not get cached. - 4. Write a zonefile. The zonefile must include an NS record for your domain that specifies the resolver as *address*.ns1.ens.domains, where *address* is the address of the ENS registry you deployed in step 1, without the leading '0x'. An `example zonefile`_ is available for reference. - 5. Clone and build `ensdns`_. Start a local node, and run 'ensdns upload --keystore=path/to/keystore zonefile' to upload the zone to the blockchain. - 6. Update your NS records with your registrar to point to the name above (*address*.ns1.ens.domains). - -Please note that this feature is still experimental, and shouldn't be used for anything production critical; the DNS gateway is lightly tested, and only a single instance is running at present, providing no backup or failover in case of server issues. The API and configuration may change in backwards-incompatible ways, breaking your nameserver! - -.. _`deploy your own ENS registry`: deploying.html -.. _`DNSResolver`: https://github.com/ethereum/ens/blob/master/contracts/DNSResolver.sol -.. _`ensdns`: https://github.com/arachnid/ensdns/ -.. _`example zonefile`: https://github.com/ethereum/ens/blob/master/ens.domains.zone diff --git a/docs/ethregistrar.rst b/docs/ethregistrar.rst deleted file mode 100644 index 0a642acf..00000000 --- a/docs/ethregistrar.rst +++ /dev/null @@ -1,239 +0,0 @@ -**************************** -The .eth permanent registrar -**************************** - -Introduction ------------- - -The Permanent Registrar is the code that will govern allocation and renewal of names in the .eth TLD. Presently this is governed by the legacy auction registrar, which uses a Vickery Auction process to allocate names to registrants. The new registrar aims to simplify this process, while providing a stable platform for future improvements that will minimise API changes. - -The target deployment date for the permanent registrar is the 4th of May, 2019. Documentation provided here is preliminary, and intended to provide developers wanting to integrate .eth domain registration or renewal into their platforms or tools with a starting point. - -This document assumes you have a basic understanding of the architecture of ENS. :ref:`introduction` gives an overview of this. - -Terminology ------------ - - - *Name*: An ENS identifier. Names may consist of multiple parts, called labels, separated by dots. - - *Label*: An individual component of a name. - - *Labelhash*: The keccak-256 hash of an individual label. - - *Namehash*: The algorithm used to process an ENS name and return a cryptographic hash uniquely identifying that name. Namehash takes a name as input and produces a *node*. - - *Node*: A cryptographic hash uniquely identifying a name. - - *Owner*: The owner of a name is the entity referenced in the ENS registry's `owner` field. An owner may transfer ownership, set a resolver or TTL, and create or reassign subdomains. - - *Registry*: The core contract of ENS, the registry maintains a mapping from domain name (at any level - x, y.x, z.y.x etc) to owner, resolver, and time-to-live. - - *Resolver*: A resolver is a contract that maps from name to resource (eg, Ethereum account address, public key, content hash, etc). Resolvers are pointed to by the `resolver` field of the registry. - - *Registrar*: A registrar is a contract responsible for allocating subdomains. Registrars can be configured at any level of ENS, and are pointed to by the `owner` field of the registry. - - *Registration*: A registration is the system's record of a user's ownership of a name. This is distinct from name ownership; registrations are maintained in the registrar contract and additionally store information on expiry date, rent paid, etc. - - *Registrant*: The owner of a registration. The registrant may transfer the registration, pay rent ('renew' the name), and reclaim ownership of the name in the registry if required. - -System architecture -------------------- - -Code for the permanent registrar can be found in the ethregistrar_ repository. - -The registrar itself is called BaseRegistrar_. This contract implements several key functions: - -- The owner of the registrar may add and remove 'controllers'. -- Controllers may register new domains and extend the expiry of (renew) existing domains. They can not change the ownership or reduce the expiration time of existing domains. -- Name owners may transfer ownership to another address. -- Name owners may reclaim ownership in the ENS registry if they have lost it. -- Owners of names in the legacy registrar may transfer them to the new registrar, during the 1 year transition period. When they do so, their deposit is returned to them in its entirety. - -In addition, the registrar is an ERC721_ compliant nonfungeable token contract, meaning that .eth registrations can be transferred in the same fashion as other NFTs. - -Users will interact directly with this contract when transferring ownership of names, or recovering ownership in the ENS registry of a name (for example, one whose ownership was previously transferred to a contract). Users can also query names to see their registration status and expiry date. For initial registration and for renewals, users will need to interact with a controller contract. - -This separation of concerns reduces the attack surface for the registrar, and provides users with guarantees of continued ownership of a name so long as the registrar is in place. Simultaneously, it provides for improvement and innovation over registration and renewal mechanisms. A future update may transfer ownership of the root and the .eth TLD to a contract with restricted permissions, thus preventing even the root keyholders from modifying a .eth registraion, while still providing for future updates to the set of controllers. - -Initially, one controller is implemented, the ETHRegistrarController_. This controller provides a straightforward registration and renewal mechanism for domains that are 7 or more characters long, implementing the following functionality: - -- The owner of the controller may set a price oracle contract, which determines the cost of registrations and renewals based on the name and the desired registration or renewal duration. -- The owner of the controller may withdraw any collected funds to their account. -- Users can register new names using a commit/reveal process and by paying the appropriate registration fee. -- Users can renew a name by paying the appropriate fee. Any user may renew a domain, not just the name's owner. There is no limit on renewal duration. - -By allowing anyone to renew a domain, users concerned with the longevity of a name they interact with can ensure it remains registered by paying for the registration themselves, if necessary. - -By allowing renewal for arbitrarily long periods of time, users can 'lock in' a desirable registration fee. Names can be made effectively 'immortal' by renewing for a long period, ensuring that stability of the name can be guaranteed by smart contract. - -Users will interact with this controller for registering domains 7+ characters long, and for renewing any domain. After the restriction on name length has been relaxed and an auction has been conducted for initial allocation of shorter names, a revised version of this controller will be deployed, allowing registration of shorter names as well. - -Initially, a single pricing oracle will be deployed, the StablePriceOracle_. This contract permits its owner to set prices in USD for each permitted name length, and uses a USD:ETH price oracle to convert those prices into Ether at the current rate. Users will not have to interact with this oracle directly, as the controller provides functionality to determine pricing for a candidate name registration or renewal. - -Registrar Interface -------------------- - -This section documents the parts of the registrar interface relevant to implementers of tools that interact with it. Functionality exclusive to the registrar owner or to controllers is omitted for brevity. - - event ControllerAdded(address indexed controller); - event ControllerRemoved(address indexed controller); - -The ``ControllerAdded`` and ``ControllerRemoved`` events allow watchers to determine the list of currently valid controllers. - -:: - - event NameMigrated(uint256 indexed hash, address indexed owner, uint expires); - -The ``NameMigrated`` event is emitted when a registration is migrated over from the legacy registrar. - -:: - - event NameRegistered(uint256 indexed hash, address indexed owner, uint expires); - event NameRenewed(uint256 indexed hash, uint expires); - event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); - -The ``NameRegistered`` event is emitted when a new registration is made. ``NameRenewed`` is emitted when a registration's expiry is extended. ``Transfer`` is part of ERC721_ and is emitted when the owner address of a name is changed. - -:: - - bytes32 public baseNode; - -``baseNode`` is the namehash of the name that this registrar handles registrations for - ``namehash('eth')`` for the deployed registrar. - -The registrar works exclusively with label hashes - the ``keccak256`` of the first component of the label (eg, ``keccak256('ens')`` for ``ens.eth``). For compatibility with ERC721, these are expressed as `uint256` values rather than `bytes32`, but can be cast backwards and forwards transparently. The namehash of a name can be derived by computing ``keccak256(baseNode, labelHash)``. - -:: - - uint public transferPeriodEnds; - -``transferPeriodEnds`` documents the unix timestamp at which it is no longer possible to migrate over registrations from the legacy registrar, and any non-migrated registrations become available for registration by anyone. - -:: - - mapping(address=>bool) public controllers; - -``controllers`` allows callers to check if the supplied address is authorised as a registrar controller. - -:: - - function ownerOf(uint256 label) external view returns(address); - -``ownerOf`` returns the address that owns the registration identified by the label hash, or reverts if the registration does not exist. Registrations that have not yet been migrated from the legacy registrar are treated the same as registrations that do not exist. This function is part of ERC721_. - -:: - - function nameExpires(uint256 label) external view returns(uint); - -Returns the unix timestamp at which a registration currently expires. Names that do not exist or are not yet mirated from the legacy registrar will return 0. - -:: - - function available(uint256 label) public view returns(bool); - -Returns true if a name is available for registration. Takes into account not-yet-migrated registrations from the legacy registrar. Registrar controllers may impose more restrictions on registrarions than this contract (for example, a minimum name length), so this function should not be used to check if a name can be registered by a user. - -:: - - function transferFrom(address from, address to, uint256 tokenId) public; - function safeTransferFrom(address from, address to, uint256 tokenId) public; - - function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; - -These functions transfer the registration. They behave as specified in ERC721_. - -:: - - function approve(address to, uint256 tokenId) public; - function getApproved(uint256 tokenId) public view returns (address operator); - - function setApprovalForAll(address operator, bool _approved) public; - function isApprovedForAll(address owner, address operator) public view returns (bool); - -These functions manage approvals as documented in ERC721_. - -:: - - function reclaim(uint256 label) external; - -Sets the owner record of the name in the ENS registry to match the owner of the registration in this registry. May only be called by the owner of the registration. - -Controller Interface --------------------- - -This section documents the parts of the ETHRegistrarController_ relevant to implementers of tools that interact with it. Functionality exclusive to the registrar owner is omitted for brevity. - -The controller works exclusively with plaintext labels (eg, 'ens' for 'ens.eth'). - -To prevent frontrunning, the ETHRegistrarController requires a commit/reveal process for new name registrations (but not for renewals). To register a name, the user must: - -1. Generate a commitment hash from the name they want to register and a secret value. -2. Submit the commitment hash from #1 to the controller. -3. Wait for at least 10 minutes, but no longer than 24 hours. -4. Submit a registration request for the name, along with the secret value from #1. - -This process ensures that registrations cannot be frontrun unless the attacker is able to censor the user's transactions for at least 10 minutes. - -:: - - uint constant public MIN_COMMITMENT_AGE; - uint constant public MAX_COMMITMENT_AGE; - uint constant public MIN_REGISTRATION_DURATION; - -These public constants set the minimum and maximum age of commitments, and the minimum valid duration for a name registration. - -:: - - event NameRegistered(string name, bytes32 indexed label, address indexed owner, uint cost, uint expires); - event NameRenewed(string name, bytes32 indexed label, uint cost, uint expires); - -These events record when a name was registered or renewed. In contrast to the corresponding events on the Registrar, these are only triggered for registrations and renewals made using this controller. However, they contain additional information not available to the Registrar: The plaintext label (eg, 'ens' in the case of 'ens.eth') and the cost of the registration or renewal. - -:: - - mapping(bytes32=>uint) public commitments; - -``commitments`` stores a mapping from each submitted to commitment to the timestamp at which it was made. Callers wishing to validate that a commitment is valid before submitting a registration transaction should check this map first. - -:: - - function rentPrice(string name, uint duration) view public returns(uint); - -``rentPrice`` returns the cost, in wei, to register or renew the provided name for the provided duration. Callers should note that this price may vary over time, particularly if the pricing oracle is relying on a fiat price conversion. - -:: - - function valid(string name) public view returns(bool); - -``valid`` returns true iff name is valid for registration with this controller (eg, it meets length requirements). - -:: - - function available(string name) public view returns(bool); - -``available`` returns true iff the name is both valid and available for registration by this controller. - -:: - - function makeCommitment(string name, bytes32 secret) pure public returns(bytes32); - -``makeCommitment`` generates a commitment hash from a name label (eg, 'myname', not 'myname.eth') and secret value. - -:: - - function commit(bytes32 commitment) public; - -``commit`` submits a precommitment generated by calling ``makeCommitment`` locally. - -:: - - function register(string name, address owner, uint duration, bytes32 secret) public payable; - -``register`` registers a name. A valid registration request must meet the following criteria: - -1. ``available(name) == true``. -2. ``duration >= MIN_REGISTRATION_DURATION``. -3. ``secret`` identifies a valid commitment (eg, ``commitments[keccak256(keccak256(name), secret)]`` exists and is between 10 minutes and 24 hours old. -4. ``msg.value >= rentPrice(name, duration)``. - -Because the rent price may vary over time, callers are recommended to send slightly more than the value returned by ``rentPrice`` - a premium of 5-10% will likely be sufficient. Any excess funds are returned to the caller. - -:: - - function renew(string name, uint duration) external payable; - -``renew`` renews a name. This function can be called by anyone, as long as sufficient funds are provided. Because the rent price may vary over time, callers are recommended to send slightly more than the value returned by ``rentPrice`` - a premium of 5-10% will likely be sufficient. Any excess funds are returned to the caller. - -.. _ethregistrar: https://github.com/ensdomains/ethregistrar -.. _BaseRegistrar: https://github.com/ensdomains/ethregistrar/blob/master/contracts/BaseRegistrarImplementation.sol -.. _ETHRegistrarController: https://github.com/ensdomains/ethregistrar/blob/master/contracts/ETHRegistrarController.sol -.. _StablePriceOracle: https://github.com/ensdomains/ethregistrar/blob/master/contracts/StablePriceOracle.sol diff --git a/docs/faq.rst b/docs/faq.rst deleted file mode 100644 index b0f787e6..00000000 --- a/docs/faq.rst +++ /dev/null @@ -1,147 +0,0 @@ -***** -FAQ -***** - -Why are names registered as hashes? ------------------------------------ - -Hashes are used for two main reasons. First, to prevent trivial enumeration of the entire set of domains, which helps preserve privacy of names (for instance, so you can register the domain for your startup before you publicly launch). Second, because hashes provide a fixed length identifier that can easily be passed around between contracts with fixed overhead and no issues around passing around variable-length strings. - -How do the DApp and the twitter bot know what names people are auctioning? --------------------------------------------------------------------------- - -The DApp and the twitter bot have built in lists of common names, drawn from an English dictionary and Alexa's list of top 1 million internet domain names. They use these lists to show you when common names are being auctioned. We do this because if the app didn't reveal these names, anyone with a little technical skill could find them out anyway, giving them an advantage over those who don't have the capacity to build their own list and code to check names against it. - -What is the disguise amount / extra amount? -------------------------------------------- -Although it's difficult for someone to determine what name you are bidding on, in some circumstances it's possible to either determine the exact name, or narrow it down to one of several. The disguise amount allows you to send extra ether along with your bid, to disguise the true amount of your bid. This ether is returned to you as soon as you reveal your bid. - -Which wallets and DApps support ENS so far? -------------------------------------------- - -MyEtherWallet supports both registering names via the auction process and sending funds and interacting with contracts identified by their names. - -Metamask supports sending funds to ENS names. - -Mist is working on ENS support and should announce it soon. - -LEth is working on ENS support and should announce it soon. - -Status is working on ENS support and should announce it soon. - -Why does it say my name isn't available yet? --------------------------------------------- - -ENS names are released gradually over a 'slow start' period of 8 weeks starting on May 4th 2017. The time at which any given name becomes available for auction during that period is effectively random. If you enter your desired name into the DApp, it will let you know when the first time you can auction it is. - -How is the start time for each name determined? ------------------------------------------------ - -Internally, we hash the name using keccak256, and express the result as a number between 0 and 1. Then, we multiply that by the duration of the launch period (8 weeks) and add that to the start date (May 4th 2017 1100 UTC) to generate the time at which that name can first be auctioned. You can see the code for this here_. - -Why is my reveal transaction failing? -------------------------------------- - -Confirm all the values you put in during the bid, and try using a blockchain explorer to confirm the state of the ENS auction. These are situations that cause errors during the reveal transaction: - -* You never successfully bid -* You're trying to reveal too early -* The domain name is wrong -* The amount is wrong -* The secret phrase is wrong -* You already revealed - -I bid on an auction and didn't win; why don't I see the refund in my transaction list? --------------------------------------------------------------------------------------- - -Refunds are sent as part of reveal transactions - when you reveal, if someone already outbid you, or when you're outbid later, if not - and as part of finalise transactions. They're not separate transactions, so they don't show up as such. If you're using etherscan, check the 'internal transctions' tab to find your refund information. - -I bid on one name, but Etherscan shows me as bidding on other name(s)! Why? ---------------------------------------------------------------------------- - -The registrar DApp opens up to three randomly selected auctions as 'chaff' every time you place a bid, to make it more difficult for people to guess what you are bidding on. The names you see are not necessarily the one you're bidding on; that's contained in the sealed bid hash that was submitted. - -Once I own a name, can I create my own subdomains? --------------------------------------------------- - -Yes! You can create whatever subdomains you wish, and assign ownership of them to other people if you desire. You can even set up your own registrar for your domain! - -Can I change the address my name points to after I've bought it? ----------------------------------------------------------------- - -Yes, you can update the addresses and other resources pointed to by your name at any time. - -How much do I have to deposit if I'm the only bidder? ------------------------------------------------------ -If only one bid is revealed, that bidder deposits 0.01 ether, the minimum bid. The remainder of their bid is refunded as soon as they finalise the auction. - -Can I register a TLD of my own in the ENS? ------------------------------------------- - -No, TLDs are restricted to only .eth (on mainnet), or .eth and .test (on Ropsten), plus any special purpose TLDs such as those required to permit reverse lookups. There are no immediate plans to invite proposals for additional TLDs. In large part this is to reduce the risk of a namespace collision with the IANA DNS namespace. - -Instead of burning funds in the auction for bidding costs and penalties, shouldn’t they be donated to the Ethereum Foundation? ------------------------------------------------------------------------------------------------------------------------------- - -Burning is fairly rare in the current registrar; it only burns fees if you reveal an illegal bid, or fail to reveal a bid during the reveal period. In all other circumstances they’re refunded to users, either when you’re outbid or when you relinquish the name. A small portion (0.5%) of the bids are burned with the intent of creating a cost for a large amount of domains or for highly valuable domains without the intention of buying them. - -Burning fees is impartial, and avoids both political concerns over the destination of the funds, and perverse incentives for the beneficiary of the fees. The value of the ether burned is not destroyed, but rather equally distributed among all ether holders. - -Who will own the ENS rootnode? What powers does that grant them? ------------------------------------------------------------------ - -The root node will initially be owned by a multisig contract, with keys held by trustworthy individuals in the Ethereum community. The exact makeup of this has not yet been decided on. We expect that this will be very hands-off, with the root ownership only used to effect administrative changes, such as the introduction of a new TLD, or to recover from an emergency such as a critical vulnerability in a TLD registrar. - -In the long term, the plan is to define a governance process for operations on the root node, and transfer ownership to a contract that enforces this process. - -Since the owner of a node can change ownership of any subnode, the owner of the root can change any node in the ENS tree. - -What about foreign characters? What about upper case letters? Is any unicode character valid? ----------------------------------------------------------------------------------------------- - -Since the ENS contracts only deal with hashes, they have no direct way to enforce limits on what can be registered; character length restrictions are implemented by allowing users to challenge a short name by providing its preimage to prove it’s too short. - -This means that you can in theory register both ‘foo.eth’ and ‘FOO.eth’, or even .eth. However, resolvers such as browsers and wallets should apply the nameprep algorithm to any names users enter before resolving; as a result, names that are not valid outputs of nameprep will not be resolvable by standard resolvers, making them effectively useless. DApps that assist users with registering names should prevent users from registering unresolvable names by using nameprep to preprocess names being requested for registration. - -Nameprep isn't enforced in the ENS system, is this a security/spoofing/phishing concern? ------------------------------------------------------------------------------------------ - -It’s not enforced by the ENS contracts, but as described, resolvers are expected to use it before resolving names. This means that non-nameprep names will not be resolvable. - -How was the minimum character length of 7 chosen? -------------------------------------------------- - -By an informal survey of common ‘high value’ short names. This restriction is intended to be lifted once the permanent registrar is in place. - -What values will the permanent registrar try to optimize for? --------------------------------------------------------------- - -This is something that the community will have to decide as part of the standardisation process for the permanent registrar. A few possible principles to consider include: - - - Accessibility: Registering a new name should be as easy and straightforward as possible. - - Correct valuation: registering a known or popular name should be costly and intentional, not a matter of luck - - Fairness: The system should not unduly favor people who happen to be in the right place at the right time. - - Stability: Names should only be reallocated with the express will of the owner or according to objective rules that will be discussed and set with the whole community. - - Principle of least surprise: Wherever possible, names should resolve to the resource most users would expect it to resolve to. - -What kinds of behaviours are likely to result in losing ownership of a name? ----------------------------------------------------------------------------- - -This is the most important aspect to be decided on the Permanent registrar and the one we want more open debate. At minimum we want the owner of a name to have to execute some periodical transaction, just to prove that name hasn’t been abandoned or keys have been lost. This transaction would probably also require additional ether to be locked or burned. The method to which that amount is calculated is yet to be determined but would probably be dependent on some (but not necessarily all) of these factors: - - - The amount of ethers the domain was bought for originally - - The average cost of a domain back when it was first bought - - The average cost of a domain at the moment of renewal - - The current market value of the domain (to be calculated with some auction method) - - Other factors to be discussed - -Just like the current model, this “fee” would not go to the Ethereum Foundation or any third party, but be locked or burned. Ideally, this financial (opportunity and liquidity) cost will make name squatting unprofitable – or at least make the name reselling market a dynamic and competitive one, focused on quick turnout and not on holding names long term for as much money as possible. - -Another very possible option creating some sort of dispute resolution process for names, to ensure the “principle of least surprise” but this is a controversial idea and there are no clear ideas on how this process could be achieved in a fair way without risks of centralization and abuse of power. - -.. _here : https://github.com/ethereum/ens/blob/13f3aa431f1e90ace80c510251a906f018fc7cc1/contracts/HashRegistrarSimplified.sol#L263 - -Can the bids be revealed during the auction period? ---------------------------------------------------- - -No, you can’t reveal during the auction period, only during the reveal period. Bids revealed during the auction period will have no effect and wouldn't count for the reveal period. diff --git a/docs/img/ens-architecture.png b/docs/img/ens-architecture.png deleted file mode 100644 index 131fdde717920b27e6aae5aac41bdbd088b6123c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22940 zcmbTd2|QHq+dqD0Qb=V<$u_nKS&C#|5{4)t$?lUZ8IpY&%e32b&U0YhR^5uKL6+WKEL1d`ZcfWoO7RZFV}V5*Y&=ZJM#K9_|d~WhXDXM zYM`%U3II?P_}8835ctHykYf-4EFBGWF5L(moF6fanKSPOp#p z(SBPQVVDE~pxP69>UYagCWnY0vS*!!o`2@5%8}8u&yyN^^d7h9I-g&syvPbtsym1D z!pOpPOEoZ|}w; ztO_^HG#G)VN5`8IyFIR+>=!{{QgOyJ>o7lBk!@>Xiev3c*LPXf$LlR+;mnk`v}-oFwV3dUz!Qw(I5YzdJ~=LAF=p@-#b7dp*da^ul!PN*?FL9 z4xb7%c#vSWW3I}Xg(=G+!?b#uO&̕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 Pv$cP(yG!Ms6RH0P>?iCy diff --git a/docs/img/ens-logo.png b/docs/img/ens-logo.png deleted file mode 100644 index 23688dbac2dc27423471d6e291b61161107ec1b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92538 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

YNNDpU8LnU$C%n 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 z�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Â91xY5Yy(Ms~U6~wI_1hjO;yw71l3NW;liNyK;2TQAd`g=V1jOiviak5F z+}p>~bVKbD_lvrG1g?AXGQ(HYw~_;pd2!nyEBSz5@8V&{qcB=t@C|+-p*+*SY=C3; z%D-N-h;|T~DzEdD30A3LG-?BpFlx7Y9~ZIL6rn+-GHWd_sh@?i{wM?r4?Ob&SF@y< zuPcW9E|xU|#~GX750gHYw)AV`fuB7+WSjq4rz}$>z`{CUqIIz#a2{x?DktKP^Tb zW(@sN<|p_*^q?O(LgUTfHWnlg2RAFWXgP*x<9LX6R;L=dOs)d;3E;t&6pFraEJOW3 z*PdhMz$Lar1=`;1a0q=ZlWn5?;p?YR>oSM>fO35WD)ZyB3Z%P1tb=03slrP>Q!e*i z4RJql=b?269K-W2CK*9C?uJTEt)AB1pf{ja$Q-2sUD#w)3}~ z_VC}bPwY~|wf}WSk6rzW41d|f@o-pn_^)dvn9;TxHhv<%#W_6C6pPr)kD%tGFGE?t zvqA_Ib$Qd{?pLvb&;U5h*LsrMlCpb+xhuD1jY7?{&dVd(Xjc*t^>)ZST7ei4#^CvY z>Xu7^x$7CD8)NAsCs0=OxUp?%_P=e$^GF-!$RytX`d;0#!C^0^#f%tuU1P_}%>MM5 zo}O2zKTc5ItA9$oCd}DZ`4>#l^yUw}bP#TFjzkEsBf~7uMkf6V`d$1UenLy}3r0=& zknc(R?7D#{<*8P@O&NGwm#XvpPucV8Ndy zWoQ6rn8D=oe--OFNjcuCkB7}ZHcv(;A0ZlMzz~=&f*iu(WOKp*^!zED+Lp^`MpY7k zT*Ii#;K>2jIX1s8jovnAyLO1)FWTG?;g}@`Ge*J-ARBz;G2FNTwKUgD74({9Ds!SwA`7!e@JuTY! z_~SzJGXw8A8?lqB^=i1U<9dqpohwOC&N~Z|M(RM(ise4x_x@Jr{u-vWoKaQ=m~$># z`&YANEgIZp6*;!kzaCR`n)O^=`be6pX)?7CcXM`=ee?ndYcUr;&L_!~i#6xXgp^tP zIv~9XZv!nMF5r!B4*Ifx^Mud00;C*OZpw91MzrQ?C556hkoVC{FFF&@!@$#f(8wYOP>ecCM5dha*0c&Q zDLAy8d!oCR)UBJ`@l@ptA{q&dZjRM* zeHs9glL-<4!=nLx@mm11zr|As^3Kjr;2Q5)O&r9;L zm8^v^XNy6Y6GV&=xa&c!@c(#arLbpketPy6S7FB=L9V}V@EAT+dqJ-P&b?-}lbekI z(zD3#_OV5|jZc3!1B50DG@&01{oZi)Z-`pYCN@>bVbAUdadAm7Xa#?NouqvdC8x4j z$2`b9?G_(T-X6!gf#*-n;`31#D$cTx`s~xKzWRFc$yeJKJ$L4JsZ>~3{z??f-JU32}jjg!8{J zsA&o}nBDYYqbcz7-&mG6oLc;RGHB1S=mavKz?$omezK5z!Zgp{JL=2giHEf@W><1Q z)~DF?oPA2ggOSiZiQ&sEPH^;i zzW1u%X*JV1UJbSQ429ufi|-%oV!4<8JxOru;NY${AL**gl*xhu zZvEWG`gw14cjx=Q3@09mv3DmOyCQX>hTo-d+)EEVcq;Sxem2*66s9+pbNgMNGVk*7 zX<^LJJZXd^v@BFz_Q~|~5;-(dTy&6O-dRj~Oozc9sSWV(cZ)9_GoCb#wM9&SB+?XX2y{CI^Bs1iwG~7%?fxQon$y|KGcLzXel(Dco4< z5U*wi;KQkFC|P82)zQ_&gbN<}ku;Gw2fNL^c-ykiXFph$jr#q0oooY@$sShe6hQ4- zyJWMV%ta&F4A_rU?smB*q?m!x0XCSOkH%9eKJ&}@3Nb<1M}x<_T}8;s=@|1ax#g{9 zzB`uajhLLRx$Zo7j)^|9Nlei4Oy>@S%`LL{{M*Oq(r0?6jk~?Txj`R4sztZQj48!f`3LRl}R!c)kPN5yRHrJd`;t&^j zc^}Y8AI!Ec`q8mh{_qy)eQbQAC^-20ql||Ir@DpDRvt2u-d5#Nk^Ni;^UI+}F8e*o zCT`xv$8oL6aqT*bmL(?iDrIPTAW}=Zvh|TTl0f|^}W3Nm(z)mXu{iUTP>-d~E zUYe;y-7hysZWst}r|DEXd(+N!bOd`j&NP{Z%`lp!A5iJMW0#E9=ZR#)!bTab>@%TZ z^nJ7H^rbirDTKgU5^|dQ+=gUtq1vrmUCCKKCd8N(B1keVG{u!9jRq?9wkIMxcEF9I z?Z$%z;>>=L2L}O#-hHdyFB?AzDjL%AFZWz`m-p3aq9I=^PGgiu6(y7`%8d#G&%{kq zbSUx!DaYRtEw4@Opv8Y4vAzFif92O{)|tA8hnug$L|*okw^9qD?RPxnY)iVh^jge- z5^uR;(*qwuA7Dn=EtRBMZk`4LYLU_GFuebE42G-aUpr&1hGR1y#ehd1*W;6zTz`Z% zG@zK7zuI`;D7xMEF_ri_gi&*e#~k07CAzJa)_-kkayDR%rR=fr_Sb_2Y*8GL?v?*$V?$Cw^HF=-egxY&3Vsj} zcHX|+$C7koekUsHVPa`d>GpQJPd-M|0um_z^rGvw}w3$(q;YWtJAzP*l;uRh}%I_G(z%yCK5w_hdjo}`S%)vE}46#2{< zMnsG8lB#f-ybiYorT3h!Xb5O?n}q?(WeYhLH;?xIPqtPaW8Znbs!@iQ03E{7o@pM>q@u?2F4=%Wxm0vjmWsqNT59AMaNO5Y#9P8M)`9TEGvTfV@ zl{m&T_j`%4kR^Eoyk1Y*3@BF%^FX zO2IHnjdc~m-H>!WTZz(-*cL^`i& zi$l;vrZ|QmPemK3Ic{$EBSsSVl4{;(kQKVGbG9KyWy$qaFK@Ak-cgS!HZ2n1a<wVY@A zg)xhyLF80|==M$;afrI0&Dpj31+TSs%s)mHLWs!pb;k8$z#!pi<0yO>5a zLl#;YrbTZUC`Ab#VF05djfIlN9jN}ZqTv2-cy?hlUb4&<^~-=#I;tu4gC)D#jdXxc9U*xjkD+j2@oS}An3m)Hw`xk zsAEjB4Xed~Zc~734Kp5qZb>)kKb)hiLcxPcAYI8zJK zcDGVjhx3PhH=dnyxHVvh=eDsp8#18bZ&}V=)BRy_W7HyU@@X&@_r9$=_zUi%Jv{)L zH)IqnIM^S<=GVUs&i7Y;)4z8;x6TgnMZ^&jDu!RYa40Q3MZb|oJVj8$s9f#d*f<*p z7p<>_M=1G>whKl!C0}50i>q!k^X?g81(x6+b)H%(sV5$G@3r%)3n6wB9_WpXQ`=3M zBGu|4f?hvrY#!`yib0czNaNCU`Up5%&e4NV zB)MQ6T%TX=wJ~|M!Drh}Xw9sNA63E7f-*Ly%70Z3BdPA%=*{5z(EOoQQ=i?2j$xQ^ z=8xD0ucRTK1nMvnp-Rvml}-Mqc86g(*t$?m0&!{v_++qB`rnlrQ^87G=|HRgu4Gj< z>bny<2v&)D4v16=4)R8Zbrd+P$Zs$!jsn$M|Li*!!dLA--DYvEkg)T7tX_0mQlvLH zSt6C_A=4f};7AJ-(|7;g4AUOxhjkvwHyT*8+$eLgW5P}Ep~qF;v(#kY~W{$Q`(?xmz5)NcIzy zK%^6S=@xAncQOnqiA$JYu4j!AfpW!I4)bPqbAma{w+}KWLGkZ+kK>a~`-jz|m(O20k3L%cZG7Vsa@J0JStFq_!^R;Kg=Sr+eh8orx}!+XtUF z!oKjocJgC5ia!df-mhGmZW)DQHSlT12ov8`-z#6svt+~_&=sp+gC}ZlK1-Hsd(pmN z`P*kV=H2G@RZO{q@sx)1G1G|Mxn$s2J3ko|F!>D!3Q67Ir`e}KwvztXl{3;%C*#g; z!rVQ(%7o894buabMXGb@h9>3fiKw^jnS50)KY}Vwf*gXWa+vI$@7l8Q)+c{;S8z*_ z@%9Dh%OVi5imYb)MusnysP(FHAFQP01Zt7_%9Dod(n7JHRlljm`)rGXMetf+k$SL*z#-E=jHLQYTi3avNW`;-8F`LqT3I%DAjEf~ zRy0H|26oh@29%3py`JM5I~$prDr*-Gbl&KWyaElPrh;pK#+9D{|H}|Wc9DoJIyZWx z@%t))vF6;fsSwmWLi&a^nwBoR+jckCwOiThnWbYYu|D4ixLXZK(rZWT0Mz#3xG44! zbu6bJ%?#SrYrQdMivPsrwU}PlM*A61Lgpnh599~a7ZM@@=e~-uL+H~$z)pajm7kSc z#D$CVX&Fs`v;!*8@V#FLLfq3SuGfJ;_L5pgL#CUHaSUnKlS-eP+1* z5-4EEtSYR4>XwB@g-l*AQVHU3z*|SM!Lrz&i>X{GIx>72Ix=tVJ>~M1>(9nbW(JTf zh0bL;(J!IKp!dcgFjZGDC?v;&&LmvK{+%Xi5F4hGqE?yW?Y>tS;9JHrbn*kFbloC2 z+nCo2FQMqQC=a#$l`kDF@@oc6o$^35D1$&Wl0G%&s%r7O14Ps8vVc)#_lQzT)&#tQ z)s>CU8(Y5dt$1UU%&F?)8=P(LxXM*He9tfMth3mZ`w{9r$CV{+7z!7x-j{ofe564SVS3MG!0t z(Fclj%dTj0G8aTu!6$kU?0XE5wfnl#OC|Rm>L@pYE(zFEG5kO(l{leah*{^8{`q!W zAo6OE))6Sgr{S1L9r@O&qXpOceCLL<^}%h@SVwJo>R!z4%-nSFTe-7MRY|(;9=hzGw@;IFoofF>3&v7u4pZ*O2U^ZDYMqD< zfG88zJxJ!Mqd@fOcKgdkU)n*adKX1AV*e+b9+os9-g>e4I5Kr$hfEWgGK&XfhpD#$4mERN3_bK(yT${)T0 zGP(ZYla}ERzU7*$d$zCe&7Z_HWuzw}unCASAK2GZ2%xToKy$xGoeyTyvhGGge*JGA zn{x`fz1pa5zv-cS6nY?>_968`3)lHwqHXbptGxjwJsX7ICrDAEA#HhhA zkYXIyGSu2*?I_uRUyRm=q*8@;3@XRCVxv@KtjpD-s>^i}eUk4|xr9JrVl z+ydMSA0nD5GIV>f+Om+TvSxh(lcRay0Q6gRq8h!?*nE}~JqrBqI_lx1(HFyY`SlRj zIA?xwEVqB6i%)*N>G;KvX#*hTipk)~_GQo1rz$5wYcgB=_R@{0Q&8vK`=STFy?<{= z0r^epx`X&Yu*1_|;@EZZIc^29kQ4K|KHF4x`e&~x$^xWy0w~>s*W~cGKcAI@bkg<; zY_}dbpu(l9taJ+zi~5D5Bll2azT3}re6$~jf@qPi{3v-^akGs%GCEc3@a;1A+tuPj zZYkfY_nKjtqoDenU@%puFu3d-R-t6DDrel}A>b5kX6&E zmb({xz5BEvJ|n=K`xoLIqGbUc4qDhVKy8!}$4ro_NpXI&M#O=9lh_0@3%aCSoJQS^ z_P1Moukt#pJn5j9CIxV#S;d5@AZBJXr?OGyI9Q?TTDaCBh?vHIWl$&`U?bfi1Yryt z3++|z?h^oMkMAGtQ=1bcBxu+fAWc!Kg(Ityun-ZZqQ2=7p92Pd1%hx|5OO9dl#2KG zhm-UjL@_swIn`Z-4JeDFvR?UTJ1|9#dzl?PTbb-y);+Ee<%Ouq;OQp?>8cQb-*^3A zcB@Zu#03D)xL) zP?gG17~PDjuD%f0egmX|?*KHYUufMPea?>1QeUodxIhUn4`s!{yTN+tH!|z=@3j=S zj+|MFF5osnK##L6&v{tMF}N#rmK!vev1v&F5Yi0(g0nmgahU;XCPs7k#fWaJC&_7R zS$(YX*)pKG(@(ziX+LP-2jsFg`hW_QZcxZ1^??TXQ2q&Q(>p8j?<0LbqgSa!30}g5 z|AaD?7;LZ?Ad0>9vubz3BA;on>;n%pe1~B5avs-mikn%ypwz_s{z*@Gfmzj`|5SM& zM&<|F+6?TC)yR`KhXPc~r|n$2Lth3+xnzY`(loqng7bmJ>xIY)Mmw?*O zW^iLU1?JVvcSjrg6|7nXdjADXh_O%p37!nrjpBTle!Aw{cJ0wsGi?cKBJIYkMIq*7 z*PZ3{bb`Pcn%XtZp0m#B;Swqo8Q#c?AjT}P0@jx0&$Y5T@H~t}lIst=hq>tXYeT?b zp|y(HfOleX4*mn{IrXbF&46`WUBjF}W@EI^-kRqAm(qwYP;DF_P+gkNVLoX~_X!T5 zGL`3sTzN4RW9w8Rf<9}PAQ}R4g)@~n2DdX{Hr@Ocz~e@Ln8{p5_^d~=6w^6TIHA*a z;6xplnj*Z^@wtMg)r(?feiE7^>Y&<({a}Pw|Ii!x87n(05Xfaw3NRzROqvknwUwk4 zTdsN<>*HcGUH7tDQ$isr%{SNO%lhme2ur6eFrcCS<$`mO<&GIm?u+lHGtRlHI+;k0wrS|aKr z?vray$-5vaiJH%EzPddDmg1mb(VEiJ#Zg3^)Na0G#HMD)CVBVJ0WD8pzTR{A7!?Y~ z9U81ne%I>X;QA3l&?xUHc(uVFK?sAPwhl(YG4H{&nhe0O4+(amq0w!#DC{PI#Vs&jp1l z|LcS%S`#3!;xrGUx*D%CS%=z8_?CQsbM%N74g}w~FIW^ZUE6U3xH{yvsH}S=>)!En zqQ7Nq^=wW_R(Rf>zTjp%*l^~Eud7tyy>R9uTS*adkl!O9Pevg2dd1D+7Ju1}3Sd3A z)ZANt1L^~ad)N4;>fVWNZ)qUN#qR>7&?beL7W>d;xy2wEUR=i(I6~r%#DM|{XK`?! zk>u1QXkh_;`vBerfN2p+HY`;gAl+U@N-wmcf}`@55mLj*fs~=E>gA_GrM#xmyw2F2 z01~TmPp?e-N{Z6{8bmw_^i6UC8{&Jic8f6^-#y#o0UolXP!hw&z#p>hN-z~5@nRxSfkD!b1j_J3!@^`8rkfx6fpwJZ0s(VU zxqnK5G;jnWGM61pAGW;BAe&zR+J4nh;QBW`M2%E>wTfWs$x8 z(yAe54i3f=PWA{}KVC%6-=2gkJ(A*a;q92=bzqfSqjUFHw<0dB$*@G4B)xhHMV?c! zl>wQNMV!V-*4uG6BxsM|1q32M7$z&rZka}uU^OZ|fz4=!(K z9?&Z3F}ecAa|u@FV@mzcb9Say_^=yk-erOk3j9@Bu7d;woVj-CSSrz90B_H{@^UI7 zo2Hg{t08~e8vfc4e0}RaJDOC$dGclwg$X-`4UywK3U$&1n+qlJH>NjSUDOH6uL2T# zearGnj`7l8%pLQUlpqg1b-vpgP9T_uZGP<#fSOIfl$uK4T8B3>?xn>oV!4lWjnn)Y9F216Mx3iI&(jM4Z`f|+ozTVmGTGU&MGGW6!ra^9? z*0p`$6vyzQ+xm);2Zw-CWo5R>hTmrAk}kQnt^07^qWVl+IL*#-%4jH!2=M;A(8NH* z*47E(i(~}U#wX06wPY-==>5gT5`1qcC|e~|$*lrZ+#l6olONXbsJPEPEqr@D=6kXhxR1mH=)+$;I|9V%e2*7fgYJQw&n4y> z)9D!itn*h+m~yvh9OTgjvFx&E0uWVJg815eV25m+U4Irxxr8s}Xg)BL-sLf`&+qQ? z(FgypOXN6IiyP{aKZ~uiJjCS=x_oAC@<5UCQ!d|WJjnbZW!HpvI@Qz4h|%B-|8FDZ zZ3O@EgI3v7=mCtT>m(A|)&pUaNl?g5?-*ap^PQ)28sx&PV40zkW!-JdRR0|(C|VSY zhP*3{3ITyKCkZjy`bIRwo{*=_xw}Hh2LU^@TYLHdrOQPWfJ#)s8U~?78sPI&N;~h=VZ#TT8NZup(bu=NZv6(OP1Qz1Dy}sZC=a8K)*Sa}yr!NnIEIvFui7)9)oC8Mg9B#-*Je2@Z zLXU}pGxWa6UAtD?Gjn$yHC zM5Jx%fi1IN=p>^}Rz54rM*N42KVMpK3WlTK#}{obtd;f3gzOHZ-rmO;bQ9{6s?Wx0 zXshw%>6jX<=jN;LiS#0&kZKM_sQJ%AX5Tm2ypo$y=VeX#F&a0H0o){OZC4Z}(}brp zds$}qmac5qBy#7EJji+Yu+p6NayuMth%0ZcN~R|ZK9Q+)JI~uVoZ~RmsP8f1-LK{O?Pkz!#<(G+aK@L*CQif1h<3=T(8nN;sZ+J* z3^eEtHh&}Y=t5k$BwuIFv6+Y0fLPFjw~HUDSJmr2u9x5%98ec)%1zU8w9(>J56ll1 zXn5=VXXlTPrXuAMKQxKB3Pnx^Z5OX^9b(sE%u1{4)dp|jkoTlhZ5!Bi9#?(+EA2zpeGe3B;G?Ri(ByB z)Z*;nhfpNa_r7dwxlil?`{5S=%P>)Bcu(Fb z@P^Zgzz*biV)?a{f~5gI@b?MIz;4u3HC5E2@_ImzCDwE=nf=cuKMO=F0czn8N=>nop47x66*%pGGrJY?T&+aRs?4fz^oEGW?tcpe2d5KH4M+vEK?pn_a3SP8)Enia z_+YGM0;4}jJN+9VNX(0yGbwaEH~j^3f^qxLi7FiCpln4y)6rX3dEJ(k)0yC5+?#hQsO1@c!YxsoN3~3Av)V)Dq6{v`v)rgS&s*V)sxhXKR ztqB>+TF-uf+H$1BnwE51CP*7~_*D0_uOTe~J-m>?m;* zA7Xb*b<{dl;%ftwNc1E$m_X)O^7S_oy)Ai4&-%jE>LN}+UBL<+)86$n5ljrf*ML*L z9besQ;oUv*tl;s1tcjISz!5FscGWlJW2OFdEydp$aWSl?O3yDw&RPFu^XW!a%`H=5 z<+V%f(7mE4Rmga?O)nnbXq$jGQ;g)TG!^OwNr;qxHQy1YR`W$!2aEG_w!P{-wfMWW z9{FQj8hP)M0!THrei*eXaC!^D7Ep1TrS}C%38nV)f(h)Z@bfn&48;j9oQHitZM5vq)^nI@jd%=y6Mg}rbrJU(w%3+$SE_jiRD<7 z$U$j|I=?nh0v)tjUYFG^n=iW&=kRplloMiPSpqS#h#0N;Y)A=gGg%XWJcMc>NMW+Sx&GsWlf)-OJs!;r^ndL{;U@vR3%qLAV4 z&&|oMFJ?SY!N?TDAzyzz(SmGHOCjW(DYsR}+p(1CXol>4IIQ-Z1wwuV9>Xk|tRALO zvO3auOqc2F1H6Pxrcfh8WX2RG3M#u*YBulR(AT<%7)Um^(6qj8+>z~0H~!Tw0kjM$ z^a}8Dm=Ma&UE=#o-_flrD9<^P&imQL6zraR4m{td%eZ)52_(N=2-r+_$o)~<|H%}y zR}XcDxle-?QLm_?KSk=KS0Aq zb(xO9rs71;p9O{n+-U}Mpw)C8Yn6_s+Fn1sKadS#ea#5=`vdkXYP|nh(}A1yAKP8< zHHf>liUf`@C~Bt**J32F3T6G)T-I@UD&I*Uc+#o?%_fnDURu<@@$i$%c~ri@!0!Zx zHYZ~n#GL&KE{j_h#w=LQ69`#8XG8dwd?v3U3MaJrtsMo!x9uc3<% zyF<5|zCWoqACtZo8fV$tYQM7S~*ueuSz5>Xg+k3L6T~4=) z1gbYL?AM{~xn*rdsB;FC-)psxms!S-T!(}D-Ak`(ro+7a}Rmq*Xsw$?i2`Dy})1m zcncu3>;6_xpIliJu&vHfN^rQ_TA!7zrRi{?Ye2J9<#41GfFK|#>ab=e-O2758>Q<9 zy9P?5mmD1R#|PoC=AX&s&t$z> z5Bp6$E7@zZIDQyfNB(nQkhS#T{o*TIH&f)Mwp!-xg}Ys@!6Y$-NwR!6UnAetOG;X= zkRdlSm2e4U*NZf8iqXdxQVWn=FLb7Mv1h(qwYz$n4I-5Qf93bpeBTbd^78Onl(^q3 zz%DbgvdXi3GLN2iV6LS*L1-DrwkImBx=+#fJ^cw96a*#O0_}6mb>+S(H=lUJnTkhy z!=YXzvDPr12>$Dy^yvOV${qMjD$3p<+$3gz|Dya1ZMB2<29>%4Dh9xoz3VmaxG)N1 zQ3Z4lkj2h?Ts2KTNk4rQns@`B>L>Ual+hKk(8rrS@Q3roqXDp%-rW!TV9^3i@mi#2 zJbD?KFRfO=1__=6#8zJ!_UYSg96P~G%(-s&BYfq8=5K~bU-<{T?k4L-v)G}aP(ssc ztvjUE1KU>hl_#dT4H>r*5}JM$+&c7c@*X6cX3+2!1Zxy?kDfdm`-_QaOAs;>*@0am z#tDa&>G!TbYZQn-U-Yo6EqLPn z*XI6~_dde#z`9IcV$aSaV7JMX+Y>m~LGlL%Xwcbo_w6{_nDrIw`^G}g8K7m&y$N<9 zHKs{Vi|F_3`+TNMT4aDVK?{1HFY{PWS0o&&9Xsy^0>h#1wuUD$dXEBC64Cy6H|QVi zCqYPGYC_NVS8T-iDOR_-%XU?u;buH@z^D^f{B+A|N23*XW#h#_xPoFz!p*DT0J+Rf z%d=SA4|$OhMDb0peEmVkW*olpkA4mlM22}WJ_Oij?w@36eHw^fB+Ioj{~JcMYuLyiaBC6%*VKzAjm>8`2SZC2!yG~O;4TDY?)T}mt>5)| z0vO(xoD0@E2W`*nz8dKR!Llm<6#Jt+zG8AMCiwkH=qoI2&*z#udQGTajSOce=pmv>Qw7xG*G;8hTktr8Y{Km4S%QQhH|T1E5}Q;bIdH z)wIL^GCwl7ra^s;_?j|E0RJa&prr)3Tc`#$5f<|9>}_J4 zgF!86F^*6HyYnyzjgK=E(=GhNC$hMqcZOgsvtDGrIJK*h4<*Vs=oXrGml2};%PJD- zz#F|f2dI99e;qL6YSvMF2e!+ z?F)>wy%zr7_>`u#4ild{ttrN09vb}h!Hw_9q#Re2gK`|&L;#m}fX*&hJs;y=xhE7-8y?Yji`5G51<0lgVZ5c*4|2?77X zW9}XY(?g)z$+YSh%kG2rU9#cCb^Y^Dq%Hu(A+GtRnD`fJrt8we@&Bj2?|#I(3;%zY zqMk@g38kVG$%yRHQ%Ev0BAbT2Wsh5wlJS&`l$A|JMfQl0WQCNS8@Ih~>vkL8>%9AX z{)+GC`Jv|r=RW6L^L1URR=%ac6SI82qAc)1X=W7BX34`KHqIp&C-##Lt z&rycwy8Lagwq6>i_Qd4KW3oNSrt^Q?-E4f>tMOZ0&M?Z- zVELg?v2N7`#;|>9``$EIuNj?o^IF6eUyW$#ZG@3v%I3)W=LVYRgj>vy1+7yoiUJ_e zK&J-@OBIWJBR;K`ETiLdfxdV8uVayd%}RZbXLc9_CXB0BuY0gvJPtB$br}WvbY}y7 zHKyu2b(yulZC@%~PVp6s_dJXpo|gYlGB8zQw?#KQ5*`N6^97_L(C+5C&Cwv zC`=rC!@jBfzt*kB0};Q@6SvCWjKsh~!l>9k#OAA4(9mmpT(N|9M3T$V>dXADXFBdJ zs`_f^GtpwBBbDo)*a8H5FZuY_iShpX>y>04$~2MQkh}#pc1hT7E4jd;_H0sSE!ia& z`))Jkaxv$U+;*0G%u(5*v_e{ku~v69+Rkgfkd!Uk^oM>)huX%44)PO5=ez&X7W|T5 zl~EPv*b&4rk2~rDrH79w%B0Uc-iHltZjX(u5XnZq)tdu+>*BX$Qx}d4K06*--r_QV zE|bII)Nc?y>{st}zaAF`Vj5#b&aFQtf0weB3QZf~6_ih8j}boz9WOl=1<9fkFsisY zWEN^n$XPG`43oZ1UsIGqeQ#d%J--{;&5>zE@;(?}u;;{DJwczbYWL3e`^;S1H|+OB zMd^CY?4iM!>P$rBwnvT%U662)Bz-o;2+%PP_@+473JuUl7>a~C;n5Vq&FhSOsXwP- zA1T)q$uA{knEt^C07l5Q)p~;HNm8D|i6MRd)eu2^kfuJ&qS4D>{`z$JPafP%IT%m$B#} zg?PAuwBT?QqzoCiDpz|JV)!w88NEuW(gWIbr?%~JVvb@kcnEjNA#=0e4S!JTRL`hh z4l=Luj;*^lJ<6pm|L?XcsX7hn=R;z7=>orRv4t~0H{6MMM3Pbwr6B@0<~wZ!>UG9w z2xY1~tv8mf_i?tE>~F3tgft1$k3(aR+H5SJFUU}l!LsB7J$uUGmvGKCXhTfXgBmfv zYFfC!FN7E0k=`dfRAlOGDtZ@0TNVf$DD&>kKjwVa&z+_2Uj45!Fo7ky@!*V= z8#$bZ6{272d-aK5PF!QXG-OAq(BfsNndU{~Hk&8?Y6hOOzBtYB zyvKP`3Hy)uchXJz^76>{TJGHh+1?dW(%A84ZQ z?!yhAl`J8YiuTXeZuwc`X6qbri~mv?WjC0nhxmmOCg_yfR-m|>oGto^1^kEX2IOuq zx*_Z~j?nhD-jiA|cI}K0JlxRW1eZ1YIH0`A*ata}@4trwiT(*J=-_{>i}`Gb_Y5=5 zWgB98tZ3*00UF%iAa@)6@pZh8SWs306h8dply<*F^s{<`zEAvDq3{l=-1*0d=R3PS zmaJuheQ!LL28KUH3?EyJHWSVPl9)vxi3-6-mB616mdosC@UXUzgiR1KkJbzU@S58RMBZ**|Cho#&4(-oUtG_qXvq846Y(jO&)iOB|Vs-d$N$>wyo z*HY6Gf80Tj6D*6Z>ISuAKB(EK5(aSj+4Vr}&!l^5OGsYS82vsQ}K4a5`pPG*Y*O z{TZ#4GrwX!)|%L|e8PS2MQ`D21ACA{N20ok>=o;ZwbA>`+DX*5SJGnAn_sA(0=6X_ zyz>h0cd^myA4}WOA0TKHPh>&~dBip9_S?A!0LM zI%PQrdAo>i_aIroN-m>KghsEM7ap$bDeuiWoiRq;*zOGqh7II0-ePCePuW#{P_v1Ce zbbb|??9(pvzi?@>eMxlY*AZH9W&&_EglvoC);yj1WJ3XePO9Ih-|N*@zJhdoRYTF+ zA4{{O%zpqImX$#^JocWiY&i`YJe4`kkAk`#zNm7I@qFK*-5zJ8tUdZfX|RM!q$VCS zdvZ4{q=K^=Y2RLc25y~yVE%HZc%_Y(Y*=ytMTO0XZ4Y?2N|dj+I-&iUFc&(@9AMDB z>$ETj<&fv%9rOWyae$Ut5c^@Ah+S@t$y!;(Di-kBQj2P4Ew^kr(GSn5JWhn1ggA8w zkza&rRhZo?%|87QDAb$72xvq|a1jY09KS~FL+K{guZ+g5EI#Vme5qTQIt=x<7~4C7 zOxv)|*{uxLCgtY|#GLx~HR#;jo)3Z-theikA+_C-SvxU1h?e0J3d}kj22>fFP(+zl zsxtK9U_Ct-)Q+k)5ENEdK15smpXJdxiDtc0rRSicMrA6$?}{~O=OG6Ke1jj5jG`Noe~4`SsyN3Y^t~=jW^*%C;+bAi&e>BgJ0{E)rhA{3Qj*5_B^|Jhm9L0!F!&i2KJJj%9^XTr3g`4S^sM+4Ht z+S+@^uCyhbq%~Prqr;A@u3P!)GrS-<*C;Z}NEV{LaZOZ$Aar|e7Rb!dJynXi0*d`? zwg>-O#=N-3t#Sb3P;3I+DJGkJrqkNOc2TR%xB(Sk2-LpZLar4nbF#NjeT^er=Y|{v zq1zkgGJML>r1><5_k5!Zup;9+ja$9C0^YFUA)!=YQ6zN-z6?CP9zqQjgm7N3OnmT?1)%4(nhD&c0_Y9H%ss508d-5OPf4{;|~ zI-L2+iE-Djq-2sO=MB9Om6>IO{n&lYXIu89ab^(IPdR-{(J+f)na) zB3-$o+})gdtH)>E%y6&o!h6Q4e`s1idye4=2g}*ND2ge=hY?VumzpmXfnfS#bY%nu zBI2>34e}>XE{2OijiH_w;MNT;G>S(OMxkQOv58ATjopY*8i|;=W6OZc7d<=LOm3Ihs^eJdC2Ff{sU94Ltlm2)M`Jeg z;bGo`oH;)c5Oqv-->onvd{T-aLHokxzo!ydf(^3r*6ZPS%`)YqI1?@;L7!&prYDj2 zxpBh}??sQYcn^s1{}!lac{Yacurt?ncJk-gJ`~5lyOn*`w{LsoRGHp?;LkCeRAeeY zJ%?QFtm$~IGFs|}w=obd_3c^l4vPkj7|8Oz-7~@&Z52usiKSZ1GXQd2}#?I?Z{P=KiHXLVC7s~xxZ>yGV z%4dEpJ#*l@`5_2#V|;T<57xzAG`^|+!>fJ+XwN}a3PST*gFid85_kNBvf6j!eK3?| z>S@;iXgKM-%Jt~ky7|sX!~+AI2hE;COCmqY@-kAWspkANU{q(|wp94iE1LSI_L|e1 zv@aBdEMwxxO?VJtqHDVsUtWu{KB0H?8?>BkEPiIp{6xb-bjsc8$v$;x^3><;`derV zfUwxwzlhIY4O6vC>{3uFX&kzj=xDIQ1S^=!0alD9#Y?Y# zUaXmuXV%uf9LgI0g{ev~g{}&E-QFYzxO*5|Ya`pJfOcstp-^4vN71`lbW|k>a<$r4 zrG6vzJ zGSM1eUP*D5DLLk>m}uBVEVo8s8{V*iRh6y-Pvcs)vD7*FRhR3(&flQZ`D&&Dy${k{ z5TjQh+?X>&LBZhmc+ZUi^&h5u>GGsp=}v8E88Q!HhTCxY2?u;?`K#k6pAmprb3uzAoFO?;xAWVlthal+)AXG*{q zHD-cXuj?n&%&&Gc=EZ%5AvQ>RkycinzM(swdbcjqoL>ON1xo{VKRQmjK0J3d+Mt9l zl}%(VG5qNwZr}#4JKbZP*1x{PS;VN(`^7W%cGqd%ZJ|`@8pluJ7g=p zxyCMeV_OGQrK2xTy!eO`6|56ESOSYA{OwbX=%15*-FEe8O1)}Kvn;-M-|h?J{QbTz zknv)fDDNl4prH_MF6tZ!G3;6U?a%%r0*fAzesR3I12e08s*oM{>k$xO^lG>Pbxp*u2Qj>_YslBtTAgZB(vzWDH87l@`aFL@I$mNLV{*17oP@NF zK!Fb*;oBz9^%Y+oMxy1SpZVhT%zb5RA1gOoA^*~tIXHefi{`oUH>nYivNSfxrLpf( zVu)MKKFeJsr|_Id^ZF@^3NiJo@LBZ{cbMl|Jd@|C&pRQQJBir#44vv?hsWjz;2opj z@J#KiNg}Z83nhHXp4FeO*|YyWmcWc1ki8mzKGXSFg!thCOF6h@`%3EN62{&GyJt)e zMa3!}f$L9<{ZJ}T*s1ii10532z`eK~MG5lbP9xvt3XoGU)ZX_Q^?2=WFs196Z|!jSFe+L^lIdL7rk zu_n`(68V$2`x^qKS{82gsK}9ucXPr>lkMOi()|S8p5}~HSPDJ9In$a$S}pg|(R%t* zdbX=v2sCKPH~@OkI;vKDx2$8jPHYuru!NYvbYGf`1{TBT%Ch$s-rWxlPu6=3x1(ap zMqTdlW~l63`kJTPU)GdL8+(qGMPZT{wDf6Lmpb#8#( z74};f_qA1xvU&XUANQUw1MO09X(QGVjt_qCc;0?0i-(Y17>j-uBPdIZYm4>zMGm%& z7!$|ef$oUL_a`+DxB0uOSR2TG;+S0EgJ(YDeDZZ^{J-8wZ zTz~5gT&#%|ur6n=A@}nA6lqgNs>C;}U}V!K$AR0>z62kqkB{4FEA7#)Dwp1VGo<^; zUIjiG+48u8EQ-DAX%>r%GT{o}&<)@4z5!H0ieP=`OLijr=;&I^>5TxxuCEIbJ^h zfrg3RC~3=@aXH$&t@EDlRi~-pf>X#!mwzBP!K?lFV_QhSR>(J&C_YK7)AMmoWQ*Da zui=?zPuX43>(||I6Eudgq2+@Y{(QQw842r_lkQswzK@#nHgqMH{Ul#>$pn@X_Jf0{ zLhDMyHLQjjo#~vwdyh*XqnV+RWWPDUrd7DN9saFh)RvAd$NF?){Y{D?bq%V+PFn(p6y3ls=Ro&q&}SiUSgsDLJ0)3KY!2OQ|~l42wi82oco&5llvwsQPVkA74cD& z`xrn|)%$h(5%Nv$lD3_Njb@DZb>8uwP7g8Jq*|W9CsM+ht@nFL@~f4eaO5|b>OZgC zzHfmQ*EJ2-Hx9Lnt#5!ce)9z9bw;n-Vo7|E%2=r7dF9!99;4`87}>MAHjYGX=qG6v zzKVauaSt?86@VEGZLBah2)ECy!uqC$=t6;g^`|N9}^JG(XUv;40BUY zePfq7)DcbUHCb-S-_=se zeN$|IbS}v(Zk!9Ky>avpD9`tfFzt%yQQ@yLdo}jk=ZV77^nGrN9vr({vdrIf1tG?Ko=mNgP3KOYjM@r>)x(qs_OI3c%Gp4;y*%867TzfU- zIby)Gw}@3bMXX^)xvAiA`>VXuK5mKJ0iR2cn6Zx6^c7Nyq-3|P{hPxm?Gi*lJq_RdP04ITZMd0@{$>Ki+cy%0KT z-9y-@cKcr8;&nrbOo4;*r>c+LBm7Hw0b39_#UGYKPDHwrE{JqRmRH|*ed3n1_36H` zkNZwWMje>bcVD-ZVHf8XaGfu^eFPd#um`xRS|;^oiHfIFGab0)i;3 zNQ~;bDy(9?v_{lk_DRjQrV}t~dm#NJDh>%WofT)OZYj{c!-SRF;go!Fd!3oQ47-b# z>4l+`)L)amjmkiU%{Ve9%jwOLk2PLT-p^=sie5_UwczMl_X5Pkoo2cOPA>n3Wz;ncb-5JPX zRvEj3C`P1#)I#}U4XdtY!<;jJD2mh2vKWJN)+Py=o_V&FC!g;C*;7ln-)c2sCFSN! z$5Ma4(kCm?9JdT}seu&r&{kNJqH({g*{%DYu09$+sB@A9Y!V?-)HxB+)ZVpzPrjpMK1EXRIjWj^;{ECFT~ zdkTHh`=#-eF{n!NA^BJe3|bXM=7C9{ED1sistv~)`|Vw4`0nJ6Tyia! zKP%#L8p<8~sVApM_qeM|O!Bv|&gGWBBOB?Ff#VRfKv%U3EW#nebu=G;E_LGg$1aTyu<^((W$0_Ur_vusi+{0v%k(*VzifR z@?Q{^r3`nR9E>zk+Pw*I5N8857EGlD?hb|CdG%1CFtyoR&nlLMm_GOU@ep?QTd^t< zjt^BlD{pp1oHV|K6MoUfX2DUIeI|K%s>y5R@=D_av$&moMh-^PT%Pe^WL@$C1k+X4 zINkhr?um?D=iZ)ksYt6r2zv&$V6(S{gP(nr^j#LYE`CoG$YP`EY{K3W!ZLHuPT0vM z)W4Zc1K{{nv?E+I*gC!lPzxKygM}(KsWG48SVn)%9Y)HB`F8a>)V=z6Y1XsiRXi7- zNK|>@j!Wl1tMI6#!tv?p$G%Mk@g+vnqCMZcUBd@VW3I5$ERMf&zOQT#%jYp8#3t-q zvt7^=VV@c4v>4NtWE5=eJMfCi|A&GQ!qZ>&h{AB_F6oQ&Ep(U_R&+8`_=o!*nT5zM%y*^-hKP{MY2hu zoRNE4nePq~P^N_YMxD2gLJtDQvKXkA`!|(<-9~F+2KL0#RCbs z!iWBG45FIw3H#2HA)OKgmyTTzv8r`_hv}B>R`tnwjE^i;V)a{+=1`daUcW zdkl!-U)9}p4(#7q##!(NP0~2j1kXO4o zpkjD+l`VFRm0?x9Ca}*5w%TFkD3i`$!-v6OTmIXzq!4z~j%yt)$$4Np(40qI`V-X>Yk^@TOhR zuJ3oY*BF>V$t_`R3f}`wTR}{h?xw&k0|}kdd#(arUvF97a+6l69ez}*0){6mg>o54 zRX-?+l(bQWH~x_?CRa>~=aBkny;GXJV#D6t2GM)KE8>8)9fjdXSTn|cWwR#rQYH)7 z3`hbcY1I?Xn>cOe|ra%HqwClR9)SR6H6*cvIg& zRr3Ae7HB}-;Xf%(NnT?qrc=bjCcq&<2x+GwycrSfXqTCtsegxk zwTpj%kp{&xvZc818f@+4qAOH?FY`dFq%Ba!NW60TyU=KN=7iGz_bHz}Dt?}6h6olz zOv5(qml`f}F8CH$SgIyl7~(5qz9|Un2`eRQ!wIj0u+q}uFc5BeZen?m_q);&;Rl2Cz{@#p zd{OC%iE#g4N4)PeuqT;?P3Rg*lxDE>YzqL(%OxK(1Dz!>;%<@ZU|4y%>@X?+Kw#yR`>?+B0d0IGl#;dB&4}H-b z0g*-v|J~)Y4;Q^oGu`<_I$ceX$Sjuxwpl0FJ|eX}=*Mk@pYQL|rGj@uq#8+`A+|56 zj?GqYS~i5X%3IP##NyJCSjc!VNGRr6$(%_sU0;^$Jy)ZDm}j{J-o9nbJ%-Er8J^J- z9<9~4`-Z8vg-BZwjV|~|sr`8rTMww;JRkPNd%BA(CJas&BRs-!r0U-d$N9;dF{&aS zTkNV^<%!jMF1D1D{+BU%=J@V(f_x=6T!S}5RTghQ?r$sTrH%}BX)wi27PF>MZtQN^!b9+m39?w{7eAu6Mc5Ofc{s}_(($ZSVQ zD{Dg^CmptbNZ`i?r{7FfMGse|Yq0I?o4LX~Iw>Ho;IEZ;KM|O6&mLjFbIg^K8Y{SO zbj;M+hqPl$e@bisS2i^fT%74CHT>&0g361j^{e$RE_`gXb6%MhEpe_3CR;nU#$0md z)pjB-aNwrX@xw%9?U9|S(c&(vuk_p(AC=$>zYk@)uqJ+}m4su+0$8d%6dPY06l zcbU5AWya~oV<)M{Iz8&sCIl2~mHz4ri{jsLw_K7G_{-M(jNZO3N!REg^(*)^xKPxQ zHxP-;Zl3qPbcrXoKtAc=3Q{cjp-&%3C@lP z`?UD>E#I7B_jqs2#l&|c*x)k!E#D7UbzQT$Dau)<#QAue8N=249o4$dWRqFGEr%&c z?ct$linT=x*BaZkA zDc62o@Q?J`(i^WNP7)>TB9mr7#t9KP^yeEo$5krZ&8C>L&rQ!is$_V*8B1;1WEyx- zx!xRpas0;rW((#Qakpk(-nVBUm~3)7mszi(&38H1XHSKTbH9RHg;>R0VH~R3p#KQ2 zi}4#)!nqqCu9RjByw~%oueb>6jBVklh;82W`eWDjNcwBmz+moCKDxyP*JBby{Fndt n&;N1Y|2Xh}9Qgl(1KH#)SFMFbGPQ<`2v(F+xtjB@@x%WI#(?OV diff --git a/docs/implementers.rst b/docs/implementers.rst deleted file mode 100644 index eed35782..00000000 --- a/docs/implementers.rst +++ /dev/null @@ -1,286 +0,0 @@ -******************* -Implementer's Guide -******************* - -This section is intended to provide guidance for anyone wanting to implement tools and applications that use ENS, or custom resolvers within ENS. - -3 steps to add ENS to your application -====================================== - -ENS integration in an application encompasses several critical features, each of which can be implemented independently. While comprehensive ENS integration is ideal, even basic support can be a huge benefit to users. Below, we outline the three main ways you can add ENS support to your application, starting with the simplest and highest impact. - -1. Accept ENS names anywhere your app accepts addresses -------------------------------------------------------- - -The first step to supporting ENS in your application is making your application understand ENS names, and accepting them anywhere an address is accepted. To understand how to do this, see :ref:`resolving`. - -If possible, when a user enters an ENS name instead of an address, remember the ENS name, not the address it currently resolves to. This makes it possible for users to update their ENS names and have applications they used the name in automatically resolve to the new address, in the same way that you would expect your browser to automatically direct you to the new IP address if a site you use changes servers. - -If your application deals with user funds or other critical resources, you may want to keep track of the address a name resolves to and warn them when it changes, to ensure they are aware of the change. - -2. Display ENS names anywhere your app shows addresses ------------------------------------------------------- - -The second step is to display ENS names wherever your app currently displays addresses. - -If a user entered an ENS name in step 1, you should retain this name and show it to them whenever you would normally show the address. - -If a user entered an address, or the address was obtained from elsewhere, you may still be able to show an ENS name, by doing :ref:`reverse`. This permits you to find the canonical name for an address and display that when possible. If no canonical name is provided, your application can fall back to displaying the address as it did previously. - -3. Permit users to register names for their resources ------------------------------------------------------ - -The final step for comprehensive ENS integration is to facilitate associating ENS names with resources created by or managed with your application. This can take two forms: - - 1. Providing users with an easy way to register an ENS name and associate it with their resources (eg, wallet address); see :ref:`registrars`. - 2. Providing users with an easy way to update a name they own to point at your application's resources; see :ref:`record-updates`. - -ENS libraries -============= - -The following sections describe how to interact with ENS directly. Chances are, there is already an ENS library for your language of choice, that will do the heavy lifting for you. To find one, see :ref:`libraries`. - -.. _resolving: - -Resolving Names -=============== - -Resolving names in ENS is a three step process: - - 1. Normalise and hash the name you want to resolve (see :ref:`namehash`). - 2. Query the ENS registry for the address of the resolver responsible for the name. - 3. Query the resolver for the resource you want to look up. - -.. image:: img/ens-flow.png - -To query the registry, call the `resolver(bytes32)` method on the ENS registry contract (see :ref:`deployments` for details on where to find the registry), passing it the namehash of the normalised name you are querying for. The registry will return the address of the resolver responsible for that name, or 0 if no resolver is configured or the name does not exist. - -If the registry returned a nonzero resolver address, you can then query the resolver for the resource you want to resolve. For instance, to look up the Ethereum address associated with the name, you would call the resolver's `addr(bytes32)` method, again passing in the namehash. The resolver will then return the resource requested, if it's available. - -A list of currently recognised resource types are defined in EIP137_, but you can also define your own if you need. For details on how to do that, see :ref:`writing-resolvers`. - -.. _reverse: - -Reverse Resolution -================== - -In addition to mapping names to resources (forward resolution), ENS also supports mapping from addresses to names and other metadata (reverse resolution). - -Reverse records are named `.addr.reverse` - for instance, the official registry would have its reverse records at `314159265dd8dbb310642f98f50c066173c1259b.addr.reverse`. - -Reverse resolution follows the same three-step process as forward resolution; the only change is that the name you are resolving has the special format defined above. To find the canonical name for an address, then, you would first query the ENS registry for the resolver responsible for `(address).addr.reverse`, then call `name(bytes32)` on that resolver in order to obtain its canonical name. - -`addr.reverse` has a registrar with `claim(address)`, `claimWithResolver(address, address)`, and `setName(string)` functions. - -The claim function takes one argument, the Ethereum address that should own the reverse record. - -This permits a very simple pattern for contracts that wish to delegate control of their reverse record to their creator; they simply need to add this function call to their constructor: - -:: - - reverseRegistrar.claim(msg.sender) - -External accounts can also call this function to claim ownership of their reverse record. For simplicity, the `setName(string)` function permits claiming a record and configuring a canonical name all in one step. - -.. _writing-resolvers: - -Writing a resolver -================== - -Resolvers are specified in EIP137_. A resolver must implement the following method: - -.. code-block:: solidity - - function supportsInterface(bytes4 interfaceID) constant returns (bool) - -`supportsInterface` is defined in EIP165_, and allows callers to determine if a resolver supports a particular record type. Record types are specified as a set of one or more methods that a resolver must implement together. Currently defined record types include: - -+------------------+-------------+--------------+------------+ -| Record type | Function(s) | Interface ID | Defined in | -+==================+=============+==============+============+ -| Ethereum address | `addr` | 0x3b3b57de | EIP137_ | -+------------------+-------------+--------------+------------+ -| ENS Name | `name` | 0x691f3431 | EIP181_ | -+------------------+-------------+--------------+------------+ -| ABI specification| `ABI` | 0x2203ab56 | EIP205_ | -+------------------+-------------+--------------+------------+ -| Public key | `pubkey` | 0xc8690233 | EIP619_ | -+------------------+-------------+--------------+------------+ - -`supportsInterface` must also return true for the `interfaceID` value `0x01ffc9a7`, which is the interface ID of `supportsInterface` itself. - -Additionally, the `content()` interface is currently used as a defacto standard for Swarm hashes, pending standardisation, and has an interface ID of `0xd8389dc5`. - -For example, a simple resolver that supports only the `addr` type might look something like this: - -.. code-block:: solidity - - contract SimpleResolver { - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == 0x3b3b57de; - } - - function addr(bytes32 nodeID) constant returns (address) { - return address(this); - } - } - -This trivial resolver always returns its own address as answer to all queries. Practical resolvers may use any mechanism they wish to determine what results to return, though they should be `constant`, and should minimise gas usage wherever possible. - -NOTE: If you are resolving `addr()` records, you MUST treat a return value from the resolver of `0x00...00` as that record being unset. Failing to do so could result in users accidentally sending funds to the null address if they have configured a resolver in ENS, but not set the resolver record! - -Resolving names onchain -======================= - -Solidity libraries for onchain resolution are not yet available, but ENS resolution is straightforward enough it can be done trivially without a library. Contracts may use the following interfaces: - -.. code-block:: solidity - - contract ENS { - function owner(bytes32 node) constant returns (address); - function resolver(bytes32 node) constant returns (Resolver); - function ttl(bytes32 node) constant returns (uint64); - function setOwner(bytes32 node, address owner); - function setSubnodeOwner(bytes32 node, bytes32 label, address owner); - function setResolver(bytes32 node, address resolver); - function setTTL(bytes32 node, uint64 ttl); - } - - contract Resolver { - function addr(bytes32 node) constant returns (address); - } - -For resolution, only the `resolver()` function in the ENS contract is required; other methods permit looking up owners, and updating ENS from within a contract that owns a name. - -With these definitions, looking up a name given its node hash is straightforward: - -.. code-block:: solidity - - contract MyContract { - ENS ens; - - function MyContract(address ensAddress) { - ens = ENS(ensAddress); - } - - function resolve(bytes32 node) constant returns(address) { - var resolver = ens.resolver(node) - return resolver.addr(node); - } - } - -While it is possible for a contract to process a human-readable name into a node hash, we highly recommend working with node hashes instead, as they are easier to work with, and allow contracts to leave the complex work of normalising the name to their callers outside the blockchain. Where a contract always resolves the same names, those names may be converted to a node hash and stored in the contract as a constant. - -.. _registrars: - -Writing a registrar -=================== - -A registrar in ENS is simply any contract that owns a name, and allocates subdomains of it according to some set of rules defined in the contract code. A trivial first in first served contract is demonstrated below, using the ENS interface definition defined earlier. - -.. code-block:: solidity - - contract FIFSRegistrar { - ENS ens; - bytes32 rootNode; - - function FIFSRegistrar(address ensAddr, bytes32 node) { - ens = ENS(ensAddr); - rootNode = node; - } - - function register(bytes32 subnode, address owner) { - var node = sha3(rootNode, subnode); - var currentOwner = ens.owner(node); - - if (currentOwner != 0 && currentOwner != msg.sender) throw; - - ens.setSubnodeOwner(rootNode, subnode, owner); - } - } - -You may wish to set custom rules for the allocation of new names to your users; the rules you set are entirely up to you. - -You should also bear in mind that as long as you retain ownership of the parent name - either directly or through another contract - your users have no guarantee that you will not take back ownership of their names and change what they resolve to. You may wish to consider committing ownership of the name to a contract that restricts your ability to control it. For an example of this, see ENSNow_. - -.. _record-updates: - -Updating ENS records -==================== - -Your application may wish to provide users with a means of updating names they own to point to resources your application provides or manages. Doing so follows a similar process to :ref:`resolving`: - -1. Normalise and hash the name you want to resolve (see :ref:`namehash`). -2. Query the ENS registry for the address of the resolver responsible for the name. -3. Call the appropriate update method on the resolver. - -Steps 1 and 2 are the same as in :ref:`resolving`. If step 2 fails to return a valid resolver address, you will need to inform your user and offer them alternatives - for instance, you can check if they own the name in question, and if they do, offer to configure a default resolver for them by calling `setResolver` on the ENS registry. - -In step 3, call the method defined by the resolver profile - standard profiles are listed in EIP137_. For instance, to set the address associated with the name, call `setAddr(bytes32, address)`, passing in the name hash of the name to update and the address you wish it to point to. - -.. _namehash: - -Namehash -======== - -Names in ENS are represented as 32 byte hashes, rather than as plain text. This simplifies processing and storage, while permitting arbitrary length domain names, and preserves the privacy of names onchain. The algorithm used to translate domain names into hashes is called namehash. The Namehash algorithm is defined in EIP137_. - -In order to preserve the hierarchal nature of names, namehash is defined recursively, making it possible to derive the hash of a subdomain from the namehash of the parent domain and the name or hash of the subdomain label. - -Terminology ------------ - - - **domain** - the complete, human-readable form of a name; eg, `'vitalik.wallet.eth'`. - - **label** - a single component of a domain; eg, `'vitalik'`, `'wallet'`, or `'eth'`. A label may not contain a period ('.'). - - **label hash** - the output of the keccak-256 function applied to a label; eg, `keccak256('eth') = 0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0`. - - **node** - the output of the namehash function, used to uniquely identify a name in ENS. - -Algorithm ---------- - -First, a domain is divided into labels by splitting on periods ('.'). So, 'vitalik.wallet.eth' becomes the list ['vitalik', 'wallet', 'eth']. - -The namehash function is then defined recursively as follows: - -:: - - namehash([]) = 0x0000000000000000000000000000000000000000000000000000000000000000 - namehash([label, …]) = keccak256(namehash(…), keccak256(label)) - -A sample implementation in Python is provided below. - -:: - - def namehash(name): - if name == '': - return '\0' * 32 - else: - label, _, remainder = name.partition('.') - return sha3(namehash(remainder) + sha3(label)) - -Normalising and validating names --------------------------------- - -Before a name can be converted to a node hash using Namehash, the name must first be normalised and checked for validity - for instance, converting `fOO.eth` into `foo.eth`, and prohibiting names containing forbidden characters such as underscores. It is crucial that all applications follow the same set of rules for normalisation and validation, as otherwise two users entering the same name on different systems may resolve the same human-readable name into two different ENS names. - -Applications using ENS and processing human-readable names must follow UTS46_ for normalisation and validation. Processing should be done with non-transitional rules, and with `UseSTD3ASCIIRules=true`. - -The ethereum-ens_ Javascript library incorporates compliant preprocessing into its `validate` and `namehash` functions, so users of this library avoid the need to handle this manually. - -Handling of ambiguous names ---------------------------- - -Because of the large number of characters in unicode, and the wide variety of scripts represented, inevitably there are different Unicode characters that are similar or even identical when shown in common fonts. This can be abused to trick users into thinking they are visiting one site or resource, when in fact they are visiting another. This is known as a `homoglyph attack`_. - -User agents and other software that display names to users should take countermeasures against these attacks, such as by highlighting problematic characters, or showing warnings to users about mixed scripts. `Chromium's IDNA strategy`_ may serve as a useful reference for user-agent behaviour around rendering IDNA names. - -.. _EIP137: https://github.com/ethereum/EIPs/issues/137 -.. _EIP165: https://github.com/ethereum/EIPs/issues/165 -.. _EIP181: https://github.com/ethereum/EIPs/issues/181 -.. _EIP205: https://github.com/ethereum/EIPs/pull/205 -.. _EIP619: https://github.com/ethereum/EIPs/pull/619 -.. _ethereum-ens: https://www.npmjs.com/package/ethereum-ens -.. _UTS46: http://unicode.org/reports/tr46/ -.. _`homoglyph attack`: https://en.wikipedia.org/wiki/Internationalized_domain_name#ASCII_spoofing_concerns -.. _`Chromium's IDNA strategy`: https://www.chromium.org/developers/design-documents/idn-in-google-chrome -.. _ENSNow: https://github.com/ensdomains/subdomain-registrar diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 1aa56d0b..00000000 --- a/docs/index.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. ENS documentation master file, created by - sphinx-quickstart on Thu Dec 15 16:45:41 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to ENS's documentation! -=============================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - introduction - quickstart - userguide - implementers - libraries - deploying - dns - faq - - -This document is licensed under the @emph{Creative Commons Attribution License}. To -view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/ - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/introduction.rst b/docs/introduction.rst deleted file mode 100644 index 2531c93d..00000000 --- a/docs/introduction.rst +++ /dev/null @@ -1,77 +0,0 @@ -******************* -Introduction -******************* - -.. image:: img/ens-logo.png - :height: 351px - :width: 300px - :scale: 50% - :alt: ENS logo - :align: right - -ENS is the Ethereum Name Service, a distributed, open, and extensible naming system based on the Ethereum blockchain. - -ENS's job is to map human-readable names like 'alice.eth' to machine-readable identifiers such as Ethereum addresses, content hashes, and metadata. ENS also supports 'reverse resolution', making it possible to associate metadata such as canonical names or interface descriptions with Ethereum addresses. - -ENS has similar goals to DNS, the Internet's Domain Name Service, but has significantly different architecture, due to the capabilities and constraints provided by the Ethereum blockchain. Like DNS, ENS operates on a system of dot-separated hierarchial names called domains, with the owner of a domain having full control over the allocation of subdomains. - -Top-level domains, like '.eth' and '.test' are owned by smart contracts called registrars, which specify rules governing the allocation of their subdomains. Anyone may, by following the rules imposed by these registrar contracts, obtain ownership of a second-level domain for their own use. - -ENS in 5 minutes -================ - -ENS has two principal components: the registry, and resolvers. - -.. image:: img/ens-architecture.png - -The ENS registry consists of a single smart contract that maintains a list of all domains and subdomains, and stores three critical pieces of information about each: - - - The owner of the domain - - The resolver for the domain - - The time-to-live for all records under the domain - -The owner of a domain may be either an external account (a user) or a smart contract. A registrar is simply a smart contract that owns a domain, and issues subdomains of that domain to users that follow some set of rules defined in the contract. - -Owners of domains in the ENS registry may: - - - Set the resolver and TTL for the domain - - Transfer ownership of the domain to another address - - Change the ownership of subdomains - -The ENS registry is deliberately straightforward, and exists only to map from a name to the resolver responsible for it. - -Resolvers are responsible for the actual process of translating names into addresses. Any contract that implements the relevant standards may act as a resolver in ENS. General-purpose resolver implementations are offered for users whose requirements are straightforward, such as serving an infrequently changed address for a name. - -Each record type - Ethereum address, Swarm content hash, and so forth - defines a method or methods that a resolver must implement in order to provide records of that kind. New record types may be defined at any time via the EIP standardisation process, with no need to make changes to the ENS registry or to existing resolvers in order to support them. - -.. _deployments: - -ENS on Ethereum -=============== - -ENS is deployed on mainnet at 0x314159265dd8dbb310642f98f50c066173c1259b_, where users may register names under the eth TLD, which uses an auction based registrar. - -ENS is also deployed on the Ropsten testnet at 0x112234455c3a32fd11230c42e7bccd4a84e02010_. Users may register names under two top level domains: - - - .eth, which uses an auction based registrar with the same functionality as the main network, and allows users to keep names indefinitely; see :ref:`auctions`. - - .test, which allows anyone to claim an unused name for test purposes, which expires after 28 days; see :ref:`fifs`. - -ENS is also deployed on the Rinkeby testnet at 0xe7410170f87102df0055eb195163a03b7f2bff4a_, where only the .test top level domain is supported. - -Resources -========= - - - EIP137_ - Ethereum Name Service - - EIP162_ - Initial ENS Registrar Specification - - ethereum-ens_ Javascript library - - Nick's talk on ENS at DevCon 2: https://www.youtube.com/watch?v=pLDDbCZXvTE - - DevCon 2 talk slides: https://arachnid.github.io/devcon2/#/title - - Web interface for Ethereum enabled browsers: https://registrar.ens.domains - - - .. _0x112234455c3a32fd11230c42e7bccd4a84e02010: https://ropsten.etherscan.io/address/0x112234455c3a32fd11230c42e7bccd4a84e02010 - .. _0x314159265dd8dbb310642f98f50c066173c1259b: https://etherscan.io/address/0x314159265dd8dbb310642f98f50c066173c1259b - .. _0xe7410170f87102df0055eb195163a03b7f2bff4a: https://rinkeby.etherscan.io/address/0xe7410170f87102df0055eb195163a03b7f2bff4a - .. _EIP137: https://github.com/ethereum/EIPs/issues/137 - .. _EIP162: https://github.com/ethereum/EIPs/issues/162 - .. _ethereum-ens: https://www.npmjs.com/package/ethereum-ens diff --git a/docs/libraries.rst b/docs/libraries.rst deleted file mode 100644 index 093d21fc..00000000 --- a/docs/libraries.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _libraries: - -******************* -ENS Library support -******************* - -This page lists libraries that support ENS in different languages, for your convenience. If you know of a library that is not listed here, please `send us a PR`_. - -Javascript -========== - - - ethereum-ens_ - - ethjs-ens_ - -Python -====== - - - ens.py_ - - web3.py_ - -Command-line -============ - - - ethers-ens_ - -.. _ethereum-ens: https://www.npmjs.com/package/ethereum-ens -.. _ethjs-ens: https://www.npmjs.com/package/ethjs-ens -.. _ethers-ens: https://github.com/ethers-io/ethers-ens -.. _ens.py: https://github.com/carver/ens.py -.. _web3.py: https://github.com/ethereum/web3.py -.. _`send us a PR`: https://github.com/ensdomains/ens/compare diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 322d7b56..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=ENS - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docs/quickstart.rst b/docs/quickstart.rst deleted file mode 100644 index 69c6112b..00000000 --- a/docs/quickstart.rst +++ /dev/null @@ -1,95 +0,0 @@ -********** -Quickstart -********** - -Just want to get a name and make it resolve to something? Here's how. - -**NOTE**: This quickstart uses 'ensutils.js', a simple Javascript file that facilitates getting started with ENS. You should *NOT* use this in production code - it exists purely for interactive experimentation with the console! - -First, make sure your client is in **sync with a network** (mainnet, ropsten, rinkeby, etc.). You can use eth.syncing in your Ethereum console to track progress. - -You can utilize geth: https://github.com/ethereum/go-ethereum to connect a network and begin the process of syncing the chain. - -Next, start an Ethereum console: - -:: - - Mainnet: geth attach - Ropsten: geth --testnet attach - Rinkeby: geth --rinkeby attach - -Download `ensutils-testnet.js`_ to your local machine, and import it into an Ethereum console on a node synced to ropsten or rinkeby: - -:: - - loadScript('/path/to/ensutils-testnet.js'); // This will connect to the ropsten testnet - -If you want to use Rinkeby, you'll need to change in ensutils-testnet.js: - -:: - - contract address: 0xe7410170f87102df0055eb195163a03b7f2bff4a (line 220) - publicResolver address: 0x5d20cf83cb385e06d2f2a892f9322cd4933eacdc (line 1314) - -If you need to unlock your account to execute certain transactions: - -:: - - // Careful as this will record your password in your history. - // You can unlock accounts with geth as well to avoid this. - - web3.personal.unlockAccount(web3.personal.listAccounts[0],"", 15000) // 15,000 seconds - -Before registering, check that nobody owns the name you want to register: - -:: - - new Date(testRegistrar.expiryTimes(web3.sha3('myname')).toNumber() * 1000) - -If this line returns a date earlier than the current date, the name is available and you're good to go. You can register the domain for yourself by running: - -:: - - // This uses the .test registrar and will let you register the sub-domain myname under .test - testRegistrar.register(web3.sha3('myname'), eth.accounts[0], {from: eth.accounts[0]}) - -Next, tell the ENS registry to use the public resolver for your name: - -:: - - ens.setResolver(namehash('myname.test'), publicResolver.address, {from: eth.accounts[0]}); - -Once that transaction is mined (you can use `etherscan `_ to do so), tell the resolver to resolve that name to your account: - -:: - - publicResolver.setAddr(namehash('myname.test'), eth.accounts[0], {from: eth.accounts[0]}); - -...or any other address: - -:: - - publicResolver.setAddr(namehash('myname.test'), '0x1234...', {from: eth.accounts[0]}); - -If you want, create a subdomain and do the whole thing all over again: - -:: - - ens.setSubnodeOwner(namehash('myname.test'), web3.sha3('foo'), eth.accounts[1], {from: eth.accounts[0]}); - ens.setResolver(namehash('foo.myname.test'), publicResolver.address, {from: eth.accounts[1]}); - ... - -Finally, you can resolve your newly created name: - -:: - - getAddr('myname.test') - -which is shorthand for: - -:: - - resolverContract.at(ens.resolver(namehash('myname.test'))).addr(namehash('myname.test')) - -.. _ensutils.js: https://github.com/ethereum/ens/blob/master/ensutils.js -.. _ensutils-testnet.js: https://github.com/ethereum/ens/blob/master/ensutils-testnet.js diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index dc6b1803..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -sphinx -sphinx_rtd_theme -pygments-lexer-solidity diff --git a/docs/userguide.rst b/docs/userguide.rst deleted file mode 100644 index 925bee52..00000000 --- a/docs/userguide.rst +++ /dev/null @@ -1,312 +0,0 @@ -********** -User Guide -********** - -This user guide is intended for anyone wanting to register, configure, and update ENS names using a Javascript console and web3.js. Before starting, open up a geth console, download ensutils.js_ or `ensutils-testnet.js`_ to your local machine, and import it into a running Ethereum console: - -:: - - loadScript('/path/to/ensutils.js'); - -.. _fifs: - -Registering a name with the FIFS registrar -========================================== - -The public ENS deployment on Ropsten uses a first-in-first served registrar for the '.test' top level domain. Domains on this TLD are configured to expire, allowing anyone else to claim them, 28 days after registration. - -ensutils.js defines an object `testRegistrar`, for interacting with the registrar for the `.test` TLD. If you want to interact with a different first-in-first-served registrar, you can instantiate it with: - -:: - - var myRegistrar = fifsRegistrarContract.at(address); - -Before registering, check that nobody owns the name you want to register: - -:: - - new Date(testRegistrar.expiryTimes(web3.sha3('myname')).toNumber() * 1000) - -If this line returns a date earlier than the current date, the name is available and you're good to go. - -The FIFS registrar's interface is extremely simple, and exposes a method called `register` that you can call with the (hashed) name you want to register and the address you want to own the name. To register a name, simply call that method to send a registration transaction: - -:: - - testRegistrar.register(web3.sha3('myname'), eth.accounts[0], {from: eth.accounts[0]}); - -Once this transaction is mined, assuming the name was not already assigned, it will be assigned to you, and you can proceed to :ref:`interacting`. - -.. _auctions: - -Registering a name with the auction registrar -============================================= - -Once deployed on mainnet, ENS names will be handed out via an auction process, on the '.eth' top-level domain. A preview of this is available on the Ropsten testnet, and you can register names via it right now. Any names you register will persist until launch on mainnet, at which point the auction registrar on Ropsten will be deprecated and eventually deleted. - -This registrar implements a blind auction, and is described in EIP162_. Names are initially required to be at least 7 characters long. - -Registering a name with the auction registrar is a multi-step process. - -Starting an auction -------------------- - -Before placing a bid, you need to check if the name is available. Run this code to check: - -:: - - ethRegistrar.entries(web3.sha3('name'))[0]; - -This will return a single integer between 0 and 5. The full solidity data structure for this can be viewed `here `_ in the Registrar contract. The numbers represent different 'states' a name is currently in. - -- 0 - Name is available and the auction hasn't started -- 1 - Name is available and the auction has been started -- 2 - Name is taken and currently owned by someone -- 3 - Name is forbidden -- 4 - Name is currently in the 'reveal' stage of the auction -- 5 - Name is not yet available due to the 'soft launch' of names. - -If the returned value is `5`, and is in the 'soft launch' is in effect; you can check when it will be available for auction with: - -:: - - new Date(ethRegistrar.getAllowedTime(web3.sha3('name')) * 1000); - - -To start an auction for a name that's not already up for auction, call `startAuction`: - -:: - - ethRegistrar.startAuction(web3.sha3('name'), {from: eth.accounts[0], gas: 100000}); - -You can also start auctions for several names simultaneously, to disguise which name you're actually interested in registering: - -:: - - ethRegistrar.startAuctions([web3.sha3('decoy1'), web3.sha3('name'), web3.sha3('decoy2')], {from: eth.accounts[0], gas: 1000000}); - -Auctions normally run for 5 days: 3 days of bidding and 2 days of reveal phase. When initially deployed, there's a "soft start" phase during which names are released for bidding gradually; this soft start lasts 4 weeks on ropsten, and 13 weeks on mainnet. - -When a name is under auction, you can check the end time of the auction as follows: - -:: - - new Date(ethRegistrar.entries(web3.sha3('name'))[2].toNumber() * 1000) - -Placing a bid -------------- - -Bids can be placed at any time during an auction except in the last 48 hours (the 'reveal period'). Before trying to place a bid, make sure an auction is currently underway, as described above, and has more than 48 hours left to run. - -To bid on an open auction, you need several pieces of data: - - - The name you want to register - - The account you are sending the bid from - - The maximum amount you're willing to pay for the name - - A random 'salt' value - -In addition, you need to decide how much Ether you want to deposit with the bid. This must be at least as much as the value of your bid, but can be more, in order to disguise the true value of the bid. - -First, start by generating a secret value. An easy way to do this is to use random.org_. Store this value somewhere secure - if you lose it, you lose your deposit, and your chance at winning the auction! - -Now, you can generate your 'sealed' bid, with the following code: - -:: - - var bid = ethRegistrar.shaBid(web3.sha3('name'), eth.accounts[0], web3.toWei(1, 'ether'), web3.sha3('secret')); - -The arguments are, in order, the name you want to register, the account you are sending the bid from, your maximum bid, and the secret value you generated earlier. Note that the bidding account will become the owner. You will lose funds if you seal with one account and send the bid with another! - -Next, submit your bid to the registrar: - -:: - - ethRegistrar.newBid(bid, {from: eth.accounts[0], value: web3.toWei(2, 'ether'), gas: 500000}); - -In the example above, we're sending 2 ether, even though our maximum bid is 1 ether; this is to disguise the true value of our bid. When we reveal our bid later, we will get the extra 1 ether back; the most we can pay for the name is 1 ether, as we specified when generating the bid. - -Now it's a matter of waiting until the reveal period before revealing your bid. Run the command to check the expiration date of the auction again, and make sure to come back in the final 48 hours of the auction: - -:: - - new Date(ethRegistrar.entries(web3.sha3('name'))[2].toNumber() * 1000) - -Revealing your bid ------------------- - -In order to win an auction, you must 'reveal' your bid. This is only possible during the 'reveal' phase, the last 48 hours of the auction, at which point new bids are prohibited. If you don't reveal your bid by the time the auction ends, your deposit is forfeit - so make sure you store your salt in a safe place, and come back before the auction ends in order to reveal your bid. - -To reveal, call the `unsealBid` function with the same values you provided earlier: - -:: - - ethRegistrar.unsealBid(web3.sha3('name'), web3.toWei(1, 'ether'), web3.sha3('secret'), {from: eth.accounts[0], gas: 500000}); - -The arguments to `unsealBid` have the same order and meaning as those to `shaBid`, described in the bidding step, except that you don't need to supply the account - it's derived from your sending address. - -After revealing your bid, the auction will be updated. - -If your bid is less than a previously revealed bid, you will be refunded the whole amount of your bid. - -If your bid is the largest revealed so far, you will be set as the current leading bidder. The difference between the actual amount of your bid and the amount you sent will be refunded immediately. The remainder - the actual bid - will stay locked. If you are later outbid it will be sent back to you. - -Checking auctions ------------------ - -At any time, you can check the current winning bidder with: - -:: - - deedContract.at(ethRegistrar.entries(web3.sha3('name'))[1]).owner(); - -and the value of the current winning bid with - -:: - - web3.fromWei(ethRegistrar.entries(web3.sha3('name'))[4], 'ether'); - -Finalizing the auction ----------------------- - -Once the auction has completed, it must be finalized in order for the name to be assigned to the winning bidder. Only the winning bidder can do this. To finalize, call the `finalizeAuction` function like so: - -:: - - ethRegistrar.finalizeAuction(web3.sha3('name'), {from: eth.accounts[0], gas: 500000}); - -Once called, the winning bidder will be refunded the difference between their bid and the next highest bidder. If you're the only bidder, you get back all but 0.01 eth of your bid. The winner is then assigned the name in ENS. - -If you are the winning bidder, congratulations! - -.. _managing-ownership: - -Managing Ownership ------------------- - -After finalizing, your account now owns both the name in ENS and the deed in the Auction Registrar. - -As the name owner, your account can manage the name using examples in "Interacting with the ENS registry". For example, you can use :code:`ens.setOwner` to transfer administration of the name to another account. The new name owner can manage that domain and all subdomains now. None of those actions affect your ownership of the deed. - -As the deed owner, your account has the right to reset name ownership back to itself at any time, by using :code:`ethRegistrar.finalizeAuction` again. You can also choose to transfer the deed to another account with: - -:: - - ethRegistrar.transfer(web3.sha3('name'), newDeedOwnerAddress, {from: currentDeedOwnerAddress}) - -.. CAUTION:: - Transferring the deed is **irrevocable**. Be sure that you have verified the correct address for the new owner. Additionally, the ether you paid to win the auction will be transferred with the deed to the new owner. - -.. _interacting: - -Interacting with the ENS registry -================================= - -The ENS registry forms the central component of ENS, mapping from hashed names to resolvers, as well as the owners of the names and their TTL (caching time-to-live). - -Before you can make any changes to the ENS registry, you need to control an account that has ownership of a name in ENS. To obtain an ENS name on the Ropsten testnet, see :ref:`auctions` for '.eth', or :ref:`fifs` for '.test'. Names on '.test' are temporary, and can be claimed by someone else 28 days later. - -Alternately, you can obtain a subdomain from someone else who owns a domain, or :doc:`deploying`. Note that while anyone can deploy their own ENS registry, those names will only be resolvable by users who reference that registry in their code. - -Getting the owner of a name ---------------------------- - -You can retrieve the address of a name's owner using the `owner` function: - -:: - - > ens.owner(namehash('somename.eth')); - "0xa303ddc620aa7d1390baccc8a495508b183fab59" - -Getting the resolver for a name -------------------------------- - -You can retrieve the address of a name's resolver using the `resolver` function: - -:: - - > ens.resolver(namehash('somename.eth')); - "0xc68de5b43c3d980b0c110a77a5f78d3c4c4d63b4" - -Setting a name's resolver -------------------------- - -You can set the resolver contract for a name using `setResolver`: - -:: - - > ens.setResolver(namehash('somename.eth'), resolverAddress, {from: eth.accounts[0]}); - -A resolver is any contract that implements the resolver interface specified in EIP137_. You can deploy your own resolver, or you can use a publicly available one; on the mainnet, a simple resolver that supports 'address' records and is usable by anyone is available; ensutils.js exposes it as `publicResolver`. To use it, first set it as the resolver for your name: - -:: - - ens.setResolver(namehash('somename.eth'), publicResolver.address, {from: eth.accounts[0]}); - -Then, call the resolver's `setAddr` method to set the address the name resolves to: - -:: - - publicResolver.setAddr(namehash('somename.eth'), eth.accounts[0], {from: eth.accounts[0]}) - -The above example configures 'somename.eth' to resolve to the address of your primary account. - -Transferring a name -------------------- - -You can transfer ownership of a name you own in the ENS registry to another account using `setOwner`: - -:: - - > ens.setOwner(namehash('somename.eth'), newOwner, {from: eth.accounts[0]}); - -.. NOTE:: - - If the name was acquired through a registrar, such as through a '.eth' auction process, this will not transfer ownership of the locked bid. It will also not perform any administrative tasks that a registrar might want to do. - - In general, to perform a complete transfer of a name acquired through a registrar, that particular registrar should be used as the interface. For the '.eth' registrar, see :ref:`managing-ownership`. - -Creating a subdomain --------------------- - -You can assign ownership of subdomains of any name you own with the `setSubnodeOwner` function. For instance, to create a subdomain 'foo.somename.eth' and set yourself as the owner: - -:: - - > ens.setSubnodeOwner(namehash('somename.eth'), web3.sha3('foo'), eth.accounts[0], {from: eth.accounts[0]}); - -Or, to assign someone else as the owner: - -:: - - > ens.setSubnodeOwner(namehash('somename.eth'), web3.sha3('foo'), someAccount, {from: eth.accounts[0]}); - -Note the use of `web3.sha3()` instead of `namehash()` when specifying the subdomain being allocated. - -The owner of a name can reassign ownership of subdomains at any time, even if they're owned by someone else. - -**Note:** When you first create your registry, the only domain is '.' (the root domain) and the root domain creates subdomains like the 'test' and 'eth' top-level domains. - -Resolving Names ---------------- - -Now you're ready to resolve your newly created name. For details how, read :ref:`resolving`. - -Interacting with ENS from a DApp --------------------------------- - -An NPM module, ethereum-ens_, is available to facilitate interacting with the ENS from Javascript-based DApps. - -Interacting with ENS from a contract ------------------------------------- - -The `ENS registry interface`_ provides a Solidity definition of the methods available for interacting with the ENS. Using this, and the address of the ENS registry, contracts can read and write the ENS registry directly. - -A Solidity library to facilitate this will be available soon. - -.. _ethereum-ens: https://www.npmjs.com/package/ethereum-ens -.. _EIP137: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-137.md -.. _`ENS registry interface`: https://github.com/ethereum/ens/blob/master/contracts/ENS.sol -.. _EIP162: https://github.com/ethereum/EIPs/issues/162 -.. _ensutils.js: https://github.com/ethereum/ens/blob/master/ensutils.js -.. _ensutils-testnet.js: https://github.com/ethereum/ens/blob/master/ensutils-testnet.js -.. _random.org: https://www.random.org/strings/?num=1&len=20&digits=on&upperalpha=on&loweralpha=on&unique=off&format=html&rnd=new