data structure:
mapping(uint=>mapping(address=>bool)) public registrars; // Maps IANA IDs to authorised accounts
mapping(bytes32=>uint) public nonces; // Maps namehashes to domain nonces
keep track mapping of user id and ethereum address, and domain nonce
All name registeration is hash, using namehash algorithm, or just request to namehash API
namehash, hash of domain
about nonce, domain change index
roles
- owner: ENS team
- authoriser: IANA
- transactor: pass address owner with signation to bind a domain
call setRegistrar to bind user and ethereum address
setRegistrar(uint id, address registrar)
associateWithSig to set owner to ens
associateWithSig(bytes32 node, bytes32 label, address owner, uint nonce, uint registrarId, bytes32 r, bytes32 s, uint8 v)
// get nonce first
const nonce = JSON.parse(await fetch('https://example.api/v2/nonce'))
// generate signation
const dataToSign = web3.eth.abi.encodeParameters(['bytes32','address', 'uint'], [namehash("example.luxe"), "0xcccccccccccccccccccccccccccccccccccccccc", nonce]);
const signature = web3.sign(web3.utils.sha3(dataToSign))
// request to associate owner address and domain
fetch('https://example.api/v2/associate', {
method: 'POST',
body: JSON.stringify({
domain: "example.luxe",
owner: "0xcccccccccccccccccccccccccccccccccccccccc",
nonce: nonce,
signature: signature,
})
}).then(resp => { console.log(resp) })
After registration, user could set address to a ens domain, by setAddr($namehash)
http://docs.ens.domains/en/latest/userguide.html#setting-a-name-s-resolver
const ENS = require('ethereum-ens')
const ens = new ENS(window.web3)
ens.owner(namehash('example.luxe')).then(addr => {
if (addr == web3.accounts[0]) {
// be able to set address
}
})
// ---
web3.eth.ens.setAddress('example.luxe', 0xcccccccccccccccccccccccccccccccccccccccc').then(result => console.log(result))