2020.10.02
.xyzドメイン – webとブロックチェーンの架け橋 –
TL;DR
・ENS(Ethereum Name Service)は、Ethereumブロックチェーンのアドレスに名前をつけるサービス
・xyzドメインでDNSとENSの両方を名前解決できる
・ブロックチェーンアプリケーション開発での活用に期待
はじめに
初カキコ・・・ども・・・Y.Cと申します。皆さんxyzドメインってご存知ですか?なんとなく怪しいイメージをお持ちの方も多いでしょう。しかしxyzドメインには隠れた特技があるのです。それは、ブロックチェーンアドレスの名前解決ができること!本記事ではxyzドメインをENSというサービスに登録して、実際に名前解決を行ってみたいと思います。
ENSとは
ENS(Ethereum Name Service)は、ブロックチェーンアプリケーションのデファクトスタンダードであるEthereumブロックチェーンのアカウントアドレスに名前を対応付けるものです。DNSと同様に、覚えにくい数字列に名前を付けて扱いやすくするものです。
ENSには以下のメリットがあります。
- 通貨を送金・受け取りするためのウォレットのアドレスのみならず、コントラクト(ブロックチェーン上のプログラム実行環境であるスマートコントラクトのインスタンスのようなもの)のアドレスにも名前をつけられる
- サブドメインを登録可能
- 分散ファイルストレージIPFSのアクセスに必要なハッシュ値を登録することで、分散型webサイトにも名前でアクセス可能
- どこかにENSサーバーがあるわけではなくENS自体がスマートコントラクトで構築されているため、ブロックチェーンにさえアクセスできれば非中央集権的に名前解決できる
ENSに登録できる名前はxxxx.ethという形式になるのですが、この.ethというのは従来のwebの世界では正式なドメインではありません。しかし、実は以下のドメインはENSとしても登録できます。<fn>https://docs.ens.domains/ens-deployments</fn><fn>https://docs.ens.domains/ens-migration/technical-description</fn> つまりこれらはwebとブロックチェーンの両方を名前解決することができるのです。
- .xyz
- 汎用gTLD
- ENSの管理画面からDNSSECで認証して登録
- 安い
- .luxe
- 高級志向の利用を想定したgTLD
- 特定のレジストラの管理画面で登録<fn>https://nic.luxe/registrars</fn>
- ちょっと高い
- .kred
- ドメイン名をトークンとしてやりとりするブランドTLD
- 単一レジストラの管理画面で登録<fn>https://www.domains.kred/</fn>
- .art
- 現時点で登録方法不明
- .club
- 現時点で登録方法不明
.luxeは、ドメインを購入したレジストラがENS登録に非対応の場合、対応しているレジストラへ移管しなければENS登録ができないので要注意です。
.kredはトークンというブロックチェーン上で送受信できる形式でドメインを登録できるのがかなり胸熱です。ENSの利用だけなら無料らしいので挑戦してみましたが、UIが非常に分かりづらく無駄にSNS連携させられたりして心が折れました。
.xyzはレジストラがDNSSECに対応してさえいればENSに登録可能です。ENSを売りにしている.luxeや.kredよりも非中央集権的でブロックチェーンの理念を体現していると言えます。すごいぞxyz!今回は自腹を切って(税込28円)お名前.comで購入したjisedai-jedi.xyzというドメインでENSの登録をしてみたいと思います。
ENS登録
1. 公式サイトへ接続
ENS公式のwebアプリ(https://app.ens.domains/)へアクセスすると、Metamaskというブラウザの拡張機能との連携を求められます。ブラウザだけではブロックチェーンへアクセスできないので、Metamaskで橋渡しをします。
2. ドメイン名で検索
Metamaskと連携するとドメイン名で検索できるようになります。登録したい jisedai-jedi.xyz で検索すると、まずDNSSECを有効化せよとのこと。
3. DNSSECの有効化
DNSSECにより、DNSから送られてきたデータの送信元とデータの内容の正しさを保証します。
お名前.comでは、DNSSECを有効化する前にDNSレコードを追加する必要があるので、ここを参考に設定します。
このために追加するレコード自体は適当でいいと思いますが、次で必要になるTXTレコードをここで追加すると良いです。
その後DNS追加オプションの申し込みを行い、ここを参考にDNSSECを有効化します。有効化には最大72時間かかるようですが、今回は1時間強で反映されました。
あ、100円かかるのか
4. TXTレコードの追加
ENSでドメイン所有者であることを認証するため、TXTレコードに以下の情報を追加します。
ホスト名 : _ens.(登録するドメイン名).xyz
VALUE : a=(0xから始まるEthereumのアドレス)
nslookupコマンドやdigコマンドでTXTレコードが反映されているか確認できます。
nslookup -q=txt _ens.jisedai-jedi.xyz
dig -t TXT _ens.jisedai-jedi.xyz
5. ドメイン登録
ここまででドメインの所有者であると認められます。登録ボタンを押します。
またmetamask連携が求められました。
なんとここでEthereumの暗号通貨ethの支払いを求められてしまいました。よく考えてみればブロックチェーンへの書き込みを伴うわけで、どこかで手数料が発生するのは当然なのですが全く考えが至りませんでした。33ドルは高い…
ここで終了するのは悔しすぎるので、悪あがきで接続しているブロックチェーンをテストネットワークに切り替えて登録してみます。テストネットワーク用の通貨は無料で手に入ります。いけええ!
いけ!いけ!
エッッマジ?
わーなんかいけてるっぽい!続いてリゾルバを設定します!
6. リゾルバ設定
リゾルバの設定 -> パブリックリゾルバを使う -> 保存 で設定します。
ブロックチェーンへの書き込みを伴うのでまた費用が発生します。
無事登録できました。
ちなみにこの時点で、ドメイン名自体は有効ですがアドレスがまだ対応づけられていません。
先ほどTXTレコードで登録したアドレスはあくまで所有者のアドレスであって、名前解決には関係ないようです。
7. アドレス設定
レコードを追加して名前解決したいアドレスを設定します。
例のごとく通貨を支払い、登録完了です。せっかくなので所有者とは別のアドレスを登録しました。
せっかくなので他の項目も見てみましょう。
- OTHER ADDRESSES
あーすごい!他の通貨のアドレスを登録する仕組み、既に実装されていたんですね。かなり大量の通貨が選択できます。
- CONTENT
分散ファイルストレージIPFSでアクセスに必要となるハッシュ値を登録できます。
- TEXT
DNSのTXTレコードのように、任意のテキストメッセージを保存できます。keyによってテキストの種別も指定できます。
8. 確認
送金先のアドレス欄にドメイン名を入力して、アドレスが認識されるか確認します。
やりました!先ほど設定したアドレスが表示されています。
名前解決
手動で送金する際はアドレス欄にドメイン名を入力するだけですが、アプリケーションで名前解決する手法はあるでしょうか?3通りの方法を調べてみました。
1. webアプリ クライアントサイド
クライアントサイドで名前解決するには、Metamaskでブロックチェーンへ接続しライブラリweb3.jsを利用するのが王道でしょう。今回Metamaskはドメインを登録したテストネットワークに接続しておきます。
ローカルのファイルをブラウザで読み込んでもMetamaskが機能しないので、http-serverコマンドでサーブし、ローカルホストのIPアドレスを叩いてテストしました。このコードは、11月に予定されているMetamaskのinjecting Web3.js停止に対応しています。参考<fn>https://medium.com/@awantoch/how-to-connect-web3-js-to-metamask-in-2020-fee2b2edf58a</fn>
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script> <script> const ethEnabled = (() => { if (window.ethereum) { window.web3 = new Web3(window.ethereum); // window.ethereum.enable(); return true; } return false; })(); if (ethEnabled) { (async () => { console.log(await web3.eth.ens.getAddress('jisedai-jedi.xyz')); })(); } else { alert("Please install MetaMask to use this dApp!"); } </script>
結果
最高です
2. webアプリ サーバーサイド
サーバーサイドで名前解決するには、サーバーが何かしらの方法でブロックチェーンへアクセスできる必要があります。自前でブロックチェーンノードを立てるのは面倒なので、APIを提供しているinfura.ioというサービスを利用してみます。有料プランなら商用利用も可能です。
(async () => { const Web3 = require("web3"); const web3 = new Web3('https://ropsten.infura.io/v3/{自分の PROJECT ID}'); const addr = await web3.eth.ens.getAddress('jisedai-jedi.xyz'); console.log(addr); })();
結果
0xE6E0971f78e6A937c1F0C74c5816f57D3f8EC0dB
最高です
3. ブロックチェーンアプリケーション コントラクト
Ethereum上で稼働するプログラムであるコントラクトは、ブロックチェーンの性質により後から書き換えることができません。そのためコントラクトのデータとロジックを分割し、プロキシコントラクトを経由してアクセスさせることで修正を可能にしています(詳しくはこちら)。ENSのサブドメインを利用してコントラクト内で他のコントラクトのアドレスを名前解決できれば、プロキシ部分をよりスマートに実現し、開発を効率化できるのはと考えました。
、、、が、現状では難しそうです。公式ドキュメントによると現状ではまだライブラリがないものの、名前をハッシュ化 -> リゾルバに与えることで名前解決できるようですが、試した限りではうまくいきませんでした。またドキュメントには以下の記載があります(訳)。
人にとって読みやすい名前をコントラクトでノードハッシュ化することは可能ですが、初めからノードハッシュを使用することを強く推奨します。その方がより簡単かつ効率的に扱える上、名前の正規化という複雑な処理をブロックチェーン外に任せることができます。コントラクトが常に同じ名前を解決する場合、その名前はノードハッシュに変換され、定数としてコントラクトに格納されます。
うーんハッシュ化自体は組み込み関数で出来ますが、ドメイン名の分析やバリデーションは確かに複雑そうです。後半の定数を格納するコントラクトはどれを指しているんでしょうか?ここに踏み込むにはENSがどう構成されているのかについて理解を深める必要がありそうです。名前解決自体はブロックチェーンへの書き込みを伴わず手数料がかからないため、将来的には簡単に出来そうな気がします。
まとめ
実際に試してみて分かったことをまとめます。
- xyzドメインはメインネットに登録する際は結構な手数料がかかる。
- xyzドメインはテストネットにも登録できる(!!)。実験的にENSを利用する場合は最適な選択かもしれない。
- xyzドメインではENS公式の高機能な管理画面を利用できる。
- webアプリからの名前解決は可能。ブロックチェーンアプリケーションとwebアプリケーションを疎結合にできる。
- ブロックチェーンアプリケーション内での名前解決は難しい。今後に期待。
新たに湧いた疑問点です。
- 他のドメインでもテストネットに接続できるのか。
- 他のドメインでもENS公式の管理画面を利用できるのか。
- レジストラが提供する他のドメイン用の管理画面と、ENS公式の管理画面に機能の差はあるか。
機会があればluxeドメインも登録して、これらを検証できればと思います。
感想
テストネットに登録できるというのは非常に大きな収穫でした。テストネットのENS + スマートコントラクト + IPFS で無料で動的な分散型サイトを構築することにも挑戦してみたいです!
またENSに登録するために、実はよく知らなかったDNSについても知れて楽しかったです。
宣伝
次世代システム研究室では、 Web アプリケーション開発を行うアーキテクトを募集しています。募集職種一覧 からご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD