翻译:pxwluffy
原文作者:Nick Johnson
在DevCon3上,我宣布即将支持在以太坊域名服务(ENS)上声称DNS域名。这将使得几乎所有的互联网域名都可以导入到ENS中,并且可以像使用.eth域名一样进行交互。很快,你就可以告诉人们“你可以在myname.com上向我付钱”。
目前,这只能在Ethereum Ropsten测试网络上部署一个互联网顶级域名(TLD) — .xyz。在以太坊主网络和更多的互联网顶级域名(TLD)上的支持也即将到来。一旦一切就绪,我们希望能够支持绝大多数互联网顶级域名(其中约96%)。
这是一个全新的功能,整个四步过程是要手动完成的,并且有一点复杂:
1,为您的域名设置DNSSEC签名。
2,将指定您的以太坊地址的TXT记录添加到您的DNS域。
3,将此TXT记录的内容证明给DNSSEC oracle
4,致电DNS注册机构.xyz 声明您的域名在ENS中的所有权。
我们将按顺序完成这些步骤
1 ,建立DNSSEC签名
根据您的DNS提供商,这个步骤可能很容易,也可能相当复杂。
如果您的DNS提供商已经支持DNSSEC签名的域名,那太棒了!按照他们的说明设置DNSSEC。
如果他们不能这样做,你需要迁移到EasyDNS 或Google云端DNS 。EasyDNS的DNSSEC设置指南就在这里(https://fusion.easydns.com/Knowledgebase/Article/View/18/7/dnssec ),而Google就在这里(https://cloud.google.com/dns/dnssec-config )。
无论您需要什么供应商,请确保您选择RSA签名和SHA256散列。
一旦你设置了DNSSEC,你的DNS提供商会给你一些数据— DS or RRSIG 记录。您需要将这些记录提供给您的注册商。这样做可以让他们插入相关的“glue”,以确保一切工作顺利。
完成此步骤后,请在进一步操作之前使用Verisign的DNSSEC调试器来验证所有工作正在进行。
2 ,添加一个TXT记录
DNS通过寻找一个具有特定的名称和格式的TXT等记录来验证什么验证以太坊地址具有哪个域名所有权。
比如,要声明mydomain.xyz的所有权,请在您的DNS中创建一个主机记录为ens.mydomain.xyz的TXT解析,记录值为为a=0x1234… ,其中0x1234...是控制ENS域名的以太坊地址。
3 ,与DNSSEC oracle交互
接下来,您需要向DNSSEC oracle证明您设置的TXT记录的内容。为此,你可以使用这个dnsprove 工具。
首先,将工具下载到golang 工作区并编译。
然后运行
dnsprove --address=0xd7296b6044ffd0565062345c2eaa4017024b2d22--keyfile=/path/to/keyfile TXT _ens.mydomain.xyz.
要使用该命令,您需要启动一个正在运行的以太坊节点localhost:8545或者,您可以使用指定自定义位置rpc=http://host:port。
这里的地址是Ropsten上的DNSSEC oracle的地址,密钥文件是要用来发送交易帐户的一个JSON keystore file的路径。
在你问之前,是的,这个命令还不支持指定DNSSEC oracle地址的ENS名字。
DNSSEC将执行一系列DNS查询来建立一个信任链。然后,DNSSEC将与oracle进行核对,以确定哪些步骤尚未得到证实或过时。
dnsprove然后会提示您允许发送交易验证剩余的记录。一旦获得您的许可,交易即被发送,而以太坊将正式审理您的DNS记录!
4, 在ENS声明您的域名
最后,您可以在ENS中声明您的域名。从geth控制台执行以下操作:
varregistrar = web3.eth.contract([{"constant":true,"inputs":[],"name":"ens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rootDomain","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rootNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_dnssec","type":"address"},{"name":"_ens","type":"address"},{"name":"_rootDomain","type":"bytes"},{"name":"_rootNode","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]).at("0xf8d18b3c5de9892681998076bebcba32e62e0835");function encodeName(buf, off, name){if(!name.endsWith(".")) name = name +".";if(name ==".") { buf.writeUInt8(0, off++);returnoff; }for(varpartofname.split(".")) { buf.writeUInt8(part.length, off++); buf.write(part, off) off += part.length; }returnoff;}function hexEncodeName(name){varbuf =newBuffer(name.length +1);varoff = encodeName(buf,0, name);return"0x"+ buf.toString("hex",0, off);}registrar.claim(hexEncodeName('myname.xyz'), {from: myaddress})
好了,对应的ENS记录myname.xyz现在由您的帐户所有,您可以像配置其他任何名称一样对其进行配置 。
下一步
很显然,这是一个相当程序化、相当复杂的过程,因此还是需要改进。我们会提供更好方法,甚至开发专用的dapps使这一切变得更直接; 我们甚至乐观地认为,注册商或DNS服务提供商可以通过一次点击就能完成彼此的支持
当然,你如果想帮助改进过程,请加入我们的gitter频道 。我们将在未来几个月内寻找(付费和志愿者)帮助,只要您热衷于帮助。