blog.tawa.me

東京から福岡移住したWeb開発の人のブログ。適当に何でも置きます。

0x Meshの開発環境を整える方法をメモしました

f:id:tawachan39:20191127212410p:plain

0x Meshというネットワークがβ版から正式版にそろそろなるということで使ってみました。

公式ドキュメントでは明記されておらずハマったところがあったので簡単に整理してメモしておきます。

0x Meshとは

簡単に0x Meshがどういうものなのかまとめておきます。環境構築だけ知りたい方は次の章へ。

0x

まず、0xはEthereum上に配置されたスマートコントラクト、手軽にEthereum上のアセットを交換できるプロトコルです。

0x: Powering the decentralized exchange of tokens on Ethereum

0x単体ではあくまでプロトコルなので、実際のユーザーが目にするのはこのプロトコルを使って取引機能を提供するサービスとなります。そのサービス主体はRelayerと呼ばれています。

取引をするということは如何にすぐに取引が成立するかということがユーザーにとってもサービス提供者にとっても重要となります。そのため、より多くの注文が出される必要があるのだが、現状では注文は各Relayer内に閉じてしまい、各Relayerがある程度の注文量を確保しなければなりませんでした。

0x Mesh

f:id:tawachan39:20191127153152p:plain
https://blog.0xproject.com/0x-roadmap-2019-part-3-networked-liquidity-0x-mesh-9a24026202b3

そこで、Relayerを越えてすべての注文情報が共有できれば、流動性が上がりすぐに取引することができるようになるのでユーザーにとっても便利になります。これを実現するための機能として、0x Meshというものが生まれたというのが僕の理解です。

Introduction - 0x Mesh

雑な例えですが、メルカリで出品すれば同時にヤフオクでも出品されたことになる機能が提供しやすくなり、買われやすくできるイメージです。

これを各Relayerが独自実装で共有するのではなく、プロトコルを用意している0xがやっています。こうしたエコステムがどんどん生まれているのはとてもいい世界だなと思いました。

これのおかげで個人でもRelayerを介さずに注文を指したり取ったりすることができるようになるはずです。

開発環境を整える

そんな0x Meshの開発環境を整えたときのメモです。基本的にはドキュメントを見れば良いのですが、ハマったところを中心に書いておきます。

全体像

0xに限らず、ブロックチェーンに関連する開発には登場人物が多く自分はこんがらがってしまうので最初に全体像を整理します。

用意する必要があるものは以下の3つです。

  • Ethereumのノード
  • 0x Meshサーバー
  • 自分のアプリケーション

関係性としては、

f:id:tawachan39:20191127211912p:plain
関係性

という感じになります。これらを1つずつ用意していきます。

Ethereumのノード

Ethereumのノードを用意する必要があります。ローカルでGanacheでもEthereumは立てられますが、0xのスマートコントラクトがないので使えません。

実際に稼働しているメイン・テストネットに接続するのが一番楽で、今回はInfuraを使ってテストネットに接続しました。

Ethereum API | IPFS API & Gateway | ETH Nodes as a Service | Infura

Infuraはnode運用を代行してくれるSaaSみたいなもので、1日10万リクエストなら無料で使えるのでとりあえず開発するにはお手軽に使えます。

Infuraでアカウント作って、エンドポイントだけメモしておきましょう。

f:id:tawachan39:20191127173109p:plain

これで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_IDETHEREUM_RPC_URLを変更しました。

先程Infuraを作った時にメモしていたエンドポイントを使いましょう。これで0x MeshのサーバーはアクセスすべきEthereumのノードを知ることができます。

chain idは以下から参照しました。

EIPs/eip-155.md at master · ethereum/EIPs · GitHub

また、RPC_ADDRを環境変数として追加指定しました。これを設定しておらず、なかなかクライアントやPostmanからアクセスできずしばらく困ったので注意してみてください。設定することでws://localhost:60557でアクセスできるようになります。

自分のアプリケーション

アクセス可能な0x Meshのサーバーが建ったのでここへアクセスするアプリケーションを作ります。

今回はとりあえず疎通を確認するためのスクリプトだけ用意しました。

0xからTypeScript用のクライアントも用意しているのでそちらを使うと簡単に0x Meshにアクセスできます。

TypeScript client - 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があります。

https://discord.gg/HF7fHwk

質問したり、過去の質問を遡ることができるので、原因不明のエラーに遭遇したら見てみると解決策が見つかるかもしれません。

自分のRPC_ADDRでハマったところもDiscordを辿ったら似たような状況の人が居たので解決することができました。