0x Meshというネットワークがβ版から正式版にそろそろなるということで使ってみました。
公式ドキュメントでは明記されておらずハマったところがあったので簡単に整理してメモしておきます。
0x Meshとは
簡単に0x Meshがどういうものなのかまとめておきます。環境構築だけ知りたい方は次の章へ。
0x
まず、0xはEthereum上に配置されたスマートコントラクト、手軽にEthereum上のアセットを交換できるプロトコルです。
0x単体ではあくまでプロトコルなので、実際のユーザーが目にするのはこのプロトコルを使って取引機能を提供するサービスとなります。そのサービス主体はRelayerと呼ばれています。
取引をするということは如何にすぐに取引が成立するかということがユーザーにとってもサービス提供者にとっても重要となります。そのため、より多くの注文が出される必要があるのだが、現状では注文は各Relayer内に閉じてしまい、各Relayerがある程度の注文量を確保しなければなりませんでした。
0x Mesh
そこで、Relayerを越えてすべての注文情報が共有できれば、流動性が上がりすぐに取引することができるようになるのでユーザーにとっても便利になります。これを実現するための機能として、0x Meshというものが生まれたというのが僕の理解です。
雑な例えですが、メルカリで出品すれば同時にヤフオクでも出品されたことになる機能が提供しやすくなり、買われやすくできるイメージです。
これを各Relayerが独自実装で共有するのではなく、プロトコルを用意している0xがやっています。こうしたエコステムがどんどん生まれているのはとてもいい世界だなと思いました。
これのおかげで個人でもRelayerを介さずに注文を指したり取ったりすることができるようになるはずです。
開発環境を整える
そんな0x Meshの開発環境を整えたときのメモです。基本的にはドキュメントを見れば良いのですが、ハマったところを中心に書いておきます。
全体像
0xに限らず、ブロックチェーンに関連する開発には登場人物が多く自分はこんがらがってしまうので最初に全体像を整理します。
用意する必要があるものは以下の3つです。
- Ethereumのノード
- 0x Meshサーバー
- 自分のアプリケーション
関係性としては、
という感じになります。これらを1つずつ用意していきます。
Ethereumのノード
Ethereumのノードを用意する必要があります。ローカルでGanacheでもEthereumは立てられますが、0xのスマートコントラクトがないので使えません。
実際に稼働しているメイン・テストネットに接続するのが一番楽で、今回はInfuraを使ってテストネットに接続しました。
Infuraはnode運用を代行してくれるSaaSみたいなもので、1日10万リクエストなら無料で使えるのでとりあえず開発するにはお手軽に使えます。
Infuraでアカウント作って、エンドポイントだけメモしておきましょう。
これでEthereumのノードの準備は終わりです。
0x Meshサーバー
2つ目は0x Meshのサーバーです。
https://0x-org.gitbook.io/mesh/getting-started/deployment
上記のドキュメントを見れば基本的にはできます。0x Meshを動かすDockerイメージが既に用意されているようなので、それをそのまま使います。
docker run \ --restart unless-stopped \ -p 60557:60557 \ -p 60558:60558 \ -p 60559:60559 \ -e ETHEREUM_CHAIN_ID="3" \ -e ETHEREUM_RPC_URL="https://ropsten.infura.io/v3/[YOUR ACCESS TOKEN]" \ -e VERBOSITY=5 \ -e RPC_ADDR=0.0.0.0:60557 \ # <- 追加 -v /Users/[YOUR USER]/0x_mesh:/usr/mesh/0x_mesh \ 0xorg/mesh:latest
変更箇所は以下の通りです。
まず、僕はテストネットのropstenを使いましたが、用途に合わせてETHEREUM_CHAIN_ID
とETHEREUM_RPC_URL
を変更しました。
先程Infuraを作った時にメモしていたエンドポイントを使いましょう。これで0x MeshのサーバーはアクセスすべきEthereumのノードを知ることができます。
chain idは以下から参照しました。
また、RPC_ADDR
を環境変数として追加指定しました。これを設定しておらず、なかなかクライアントやPostmanからアクセスできずしばらく困ったので注意してみてください。設定することでws://localhost:60557
でアクセスできるようになります。
自分のアプリケーション
アクセス可能な0x Meshのサーバーが建ったのでここへアクセスするアプリケーションを作ります。
今回はとりあえず疎通を確認するためのスクリプトだけ用意しました。
0xからTypeScript用のクライアントも用意しているのでそちらを使うと簡単に0x Meshにアクセスできます。
以下パッケージを追加して、
yarn add @0x/mesh-rpc-client
簡単なスクリプトを実行してみます。
import { WSClient } from "@0x/mesh-rpc-client"; const main = async () => { const client = new WSClient("http://localhost:60557"); const res = await client.getStatsAsync(); console.log(res); }; main() .then(() => { console.log("OK"); }) .catch(error => { console.error(error); });
OK
が表示されれば正常に繋がっているはずです。
最後に
0xにはDiscordがあります。
質問したり、過去の質問を遡ることができるので、原因不明のエラーに遭遇したら見てみると解決策が見つかるかもしれません。
自分のRPC_ADDR
でハマったところもDiscordを辿ったら似たような状況の人が居たので解決することができました。