Rosetta APIとはなにか

2021/12/07に公開

株式会社CauchyE CEO, CTOの 木村優 です。
今回はSymbol Advent Calendarの記事を、株式会社CauchyEのテックブログとして書かせていただきます。

内容はRosetta APIの説明になります。

Rosetta APIとは?

ブロックチェーンSymbol,NEMは今後Rosetta APIへの対応を行うことが、コアデベロッパーより言及されました。

Rosetta APIの概要を三行で要約しますと、

  • 暗号資産取引所の1つであるCoinbaseが主導する、ブロックチェーンノードがホストする共通API群の規格のことである
  • 様々なブロックチェーンは、Rosetta APIに準拠したい場合、Rosetta APIの規格に従ってAPIを実装する
  • 暗号資産取引所など、ブロックチェーンのAPIを利用する側は、Rosetta APIを扱うだけで、様々なブロックチェーンのAPIを統一的に扱うことができる

というものです。

https://www.rosetta-api.org/

実際に、GitHubのNemProject組織には、以下のようなリポジトリが作られており、Rosetta APIへの対応の取り組みが動き始めていることが読み取れます。

https://github.com/NemProject/rosetta-nem

Rosetta APIの中身

Rosetta APIは、JSON-RPCベースのAPIから構成されています。そしてAPIはOpenAPI 3.0に基づいて定義されます。
選択肢としてはgRPCによるAPI定義などもありましたが、なぜJSON-RPCベースを採用したかというと、gRPCによるAPI定義は一部のプログラミング言語ではまだ難しい現状、Rosetta APIは使えるプログラミング言語を制限しないことを原理原則として持っているから、と説明されています。

また、Rosetta APIはすべてHTTP POSTメソッドで利用することになります。ここは要注意です。

Rosetta APIは、以下の三種類に大別されています。

  • Data API
  • Construction API
  • Indexer API

それぞれ説明します。

Data API

Data APIはデータ参照系のAPIです。現在のところ、ブロックチェーンにおけるブロック情報、トランザクション情報、トークン残高情報、Mempool(ブロックに取り込まれる前のトランザクションを置くところ)情報を扱うことができるようです。

オペレーションフローを以下に引用します。

                                  Caller (i.e. Coinbase)                              + Data API Implementation
                                 +------------------------------------------------------------------------------------+
                               X                                                      |
                               X      Get Supported Networks +---------------------------------> /network/list
                               X                                                      |                +
                               X  +-----------+--------------------------------------------------------+
      Get supported networks,  X  |           v                                       |
      their supported options, X  |   Get Network Options +------------------------------------> /network/options
      and their status         X  |                                                   |
                               X  +-----------+                                       |
                               X              v                                       |
                               X      Get Network Status +-------------------------------------> /network/status
                               X                                                      |
                                                                                      |
                                   X                                                  |
                                   X  Get Block +----------------------------------------------> /block
                                   X                                                  |             +
                        +---------+X                +-----------------------------------------------+
                        |          X                v                                 |
Ensure balance computed |          X  [Optional] Get Additional Block Transactions +-----------> /block/transaction
from block operations   |          X                                                  |
equals balance on node  |                                                             |
                        |                                                             |
                        +-----------> Get account balance for each +---------------------------> /account/balance
                                      account seen in a block                         |
                                                                                      |
                                                                                      |
                                   X                                                  |
                                   X  Get Mempool Transactions +-------------------------------> /mempool
      Monitor the mempool for      X                                                  |              +
      broadcast transaction status X                 +-----------------------------------------------+
      and incoming deposits        X                 v                                |
                                   X  Get a Specific Mempool Transaction +---------------------> /mempool/transaction
                                   X                                                  |
                                                                                      +

https://www.rosetta-api.org/docs/data_api_introduction.html

わりと普通ですね。

Construction API

Construction APIは、ブロックチェーンに書き込みを行う(=トランザクションを発生させる)ためのAPIです。
Rosetta APIの統一的な形式でブロックチェーンにトランザクションを送ることができるようです。

オペレーションフローを以下に引用します。

                               Caller (i.e. Coinbase)                + Construction API Implementation
                              +-------------------------------------------------------------------------------------------+
                                                                     |
                               Derive Address   +----------------------------> /construction/derive
                               from Public Key                       |
                                                                     |
                             X                                       |
                             X Create Metadata Request +---------------------> /construction/preprocess
                             X (array of operations)                 |                    +
    Get metadata needed      X                                       |                    |
    to construct transaction X            +-----------------------------------------------+
                             X            v                          |
                             X Fetch Online Metadata +-----------------------> /construction/metadata (online)
                             X                                       |
                                                                     |
                             X                                       |
                             X Construct Payloads to Sign +------------------> /construction/payloads
                             X (array of operations)                 |                   +
                             X                                       |                   |
 Create unsigned transaction X          +------------------------------------------------+
                             X          v                            |
                             X Parse Unsigned Transaction +------------------> /construction/parse
                             X to Confirm Correctness                |
                             X                                       |
                                                                     |
                             X                                       |
                             X Sign Payload(s) +-----------------------------> /construction/combine
                             X (using caller's own detached signer)  |                 +
                             X                                       |                 |
   Create signed transaction X         +-----------------------------------------------+
                             X         v                             |
                             X Parse Signed Transaction +--------------------> /construction/parse
                             X to Confirm Correctness                |
                             X                                       |
                                                                     |
                             X                                       |
                             X Get hash of signed transaction +--------------> /construction/hash
Broadcast Signed Transaction X to monitor status                     |
                             X                                       |
                             X Submit Transaction +--------------------------> /construction/submit (online)
                             X                                       |
                                                                     +

https://www.rosetta-api.org/docs/construction_api_introduction.html

ブロックチェーンごとに異なるトランザクションの仕様を抽象化し、差異を吸収するために、preprocessなど様々な段階が用意されていますね。
その分、1つのブロックチェーンを扱うだけなら、ブロックチェーン固有の機能を使ってトランザクションを発生させたほうが間違いなく簡単になっています。差異を吸収するためのpreprocessなどの手順を踏まなくて良いためです。

複数のブロックチェーンを扱う暗号資産取引所(のうち分散型のDEXではないCEX)にとっては、差異を吸収するためのpreprocessなどの手順を踏んでもなお、複数のブロックチェーンを統一的に扱うことができるというメリットが上回るということでもあります。このような規格が、このような規格を最も必要とするCEXから登場したことは必然でもあります。

裏を返せば、CEXにとってはRosetta APIに適合したブロックチェーンは上場させやすいということになりますので、ブロックチェーンそのものの開発者にとっても、Rosetta APIに適合することは、CEXに上場しやすくなるというメリットがあります。

Rosetta APIがSymbol,NEMに与える影響の考察

Rosetta APIをつくったのがCEXであること、そしてRosetta APIの恩恵を最も受けるのがCEXであることから、Rosetta APIのData API現状サポートしているのはCEXの入出金に必要な情報に関する処理にとどまっています。
ブロック、トランザクション、トークン残高、Mempoolと、明らかにCEXの入出金にクリティカルにかかわる情報です。

また、Construction APiはMetadataというフィールドがあるために、単なるトークン残高送信のトランザクション以外のトランザクション、例えばステーキングを行うトランザクションなどを実行する方向へ拡張する余地があるようには見えますが、前述のとおりpreprocessなど、本来ブロックチェーン1つだけを扱うのであれば不要だったかもしれない手続きを、抽象化されているがゆえに踏まなければならないことになり、手間が増えます。

したがって、取引所関係者以外の、ブロックチェーンのAPIを利用した開発者(ブロックチェーンそのものの開発者ではない)が、Rosetta APIを使ってなにかを開発するということはあまり想定しにくいのではないかと思われます。

しかしながら、Rosetta APIのように「ブロックチェーンのAPIに関する開発者体験を向上する」という流れは確実にきており、さらにRosetta APIに適合するブロックチェーンが増えるとなると(実際に増えています)、「APIが使いやすい」というSymbol,NEMの優位性は埋没していく可能性があるかもしれません。「APIが使いやすい」に留まらず、「APIを使えるノードがCORS対応HTTPS対応つきで解放してくれているものが多い」というのも現状のSymbol,NEMのエコシステムの特徴ではありますが、これはプロトコルレベルでのインセンティブ設計に裏打ちされた結果ではなくあくまでボランティア精神の賜物です。そのような現状を踏まえ、プロトコルレベルでAPIに関する他のブロックチェーンとのさらなる差別化をする必要がある、というプレッシャー(?)がSymbol,NEMのコアデベロッパーに届けば、Rosetta APIへの適合のみならずAPIに関する様々な改善がSymbol,NEMにみられるかもしれません。

少なくとも、Rosetta APIへの対応が、Symbol,NEMにプラスの影響があることは間違いないでしょう。

以上、Symbol,NEMに実装されるRosetta APIの紹介でした。

CauchyE は一緒に働いてくれる人を待ってます!

ブロックチェーンやデータサイエンスに興味のあるエンジニアを積極的に採用中です!
以下のページから応募お待ちしております。
https://cauchye.com/company/recruit

Discussion