☀️

Solana での BOT 開発の概要

2021/11/03に公開

これは Solana Advent Calendar 2021 の 3 日目の記事です。

変更履歴

2022年1月23日 - SolDev と Solana Cookbook のリンクを追加。
2022年1月18日 - Raydium TypeScript SDK の記述を追加。
2022年1月8日 - Jupiter と Lifinity の記述を追加。

本記事について

この記事では、従来の仮想通貨取引所(bitFlyer など)で、取引所が提供する API を利用して取引 BOT を開発していた人が、Solana ブロックチェーンで稼働する BOT を作る際に

  • 最低限押さえておくべき知識
  • ここで説明できない事柄については情報源へのポインタ

をまとめたいと思います。

「この記事を読めばすぐ Solana で BOT が開発できる!」とはいかないでしょうが、どこから手を付けて調べれば良いか分からない方の道標として、お役に立てることを願っています。

通常の取引所における BOT 開発

いわゆる従来型の仮想通貨取引所で動作する BOT を開発しようと思ったら、大抵は取引所が何らかの API を提供しているはずです。

したがって、そのドキュメントを読めば、API の使い方、そして注文の発注方法やポジション管理の方法は大体分かるでしょう。

たとえプログラミングの経験がない方や、ウェブ API を利用するのが初めてという方であっても、

  • 注文関連の操作は /orders メソッドを利用すればよさそう
  • 現在の価格(板情報)を取得するには /api/orderBook メソッドを利用する

といったことは、ドキュメントを眺めていれば容易に想像が付きます

そこまで分かれば、プログラミング経験の少ない方でも、次はこのメソッドを「呼び出す」にはどうしたらいいのか、ということを調べていけば、API サーバに HTTP のリクエストを送る方法や、あるいは親切な第三者が作ってくれたオープンソースのライブラリを発見するなどして、少しずつ BOT 開発が進んでいくと思います。

Solana の BOT 開発のとっつきにくさ

ところが、同じようなノリで、 Solana で動作する取引 BOT を開発しようと思ったら、どこから着手すればよいかが分かりづらくて、途方に暮れるかもしれません。

何故分かりにくいのでしょうか? おそらく以下のような理由が挙げられます:

  • Solana 自体はスマートコントラクトを実行する基本的なブロックチェーンの機能しか持たないため、Solana のドキュメントを読んだところで、「注文」とか「ポジション」なんていう概念はどこにも登場しない
  • 取引は Solana に構築された各 DeFi プロジェクト上で行われるので、取引 BOT を作りたければ、Solana 本体のみならず、それらのプロジェクトの理解が必要になる
  • これらの DeFi プロジェクトがすべて API や SDK を提供しているわけではないし、そもそも開発者向けのドキュメントすら用意してないケースもある

したがって、Solana で BOT 開発を始めるには、ある程度 Solana および Solana 上のエコシステムを理解しているのはもちろんのこと、高い情報収集能力や、場合によってはウェブアプリ (Dapp) の解析スキルまで要求されます。

そういうわけで、従来の仮想通貨取引所における BOT 開発に比べて、より多くの前提知識やスキルが必要となり、これが Solana での BOT 開発がとっつきにくい一つの大きな要因だと思います。

それを踏まえて、ここからは、Solana で取引 BOT を作るために知っておきたい知識を、広く浅く駆け足で紹介していきます。

Solana と SPL

Ethereum には ERC-20 という規格があって、それにしたがって実装されたトークンが世の中には数多く存在します。

それと似たような位置づけで、Solana には SPL トークンというトークンの仕組みが用意されています。

Solana では、SPL (Solana Program Library) という豊富なプログラム群を標準で用意し、基本的には SPL が提供するトークンやスワップ/レンディングなどのプログラム群をそのまま(もしくは必要に応じて改変して)スマコンの開発者に使ってもらうことを想定しています。

したがって、SPL トークンを実装するために、わざわざコントラクトを開発する必要はなく、SPL のトークンプログラムというコントラクトを利用して、独自トークンの発行やトークンの転送を行うことができます。

このように、SPL は本来 Solana のコアな機能の外側に実装されたプログラム群を指すわけですが、事実上、SPL は Solana の標準仕様の一部と考えてもよいくらい、Solana と密接な関係にあります。

特に、SPL のトークンプログラムは、Solana のトークン実装のデファクトスタンダードであり、ほぼ標準的な機能として Solana の RPC(後述)にも情報取得系のメソッドが組み込まれているため、Solana 上でトークンを扱う場合は素直に SPL トークンプログラムを利用するのが適切でしょう。

なお、SOL は Solana ブロックチェーンのネイティブトークンであり、SPL トークンではありません。しかし、それでは少々不便なので、SOL をラップして Wrapped SOL という SPL トークンにすることで、それ以外の SPL トークンと同様に統一的に扱えるようになっています。

情報取得とアカウント

Solana を利用する上では アカウント という概念をよく理解する必要があります。

アカウントは、一言で言えば、PC におけるファイルのようなもので、プログラムが利用するデータは基本的にアカウントに格納されています。

取引 BOT を作る際、普通の仮想通貨取引所であれば、API を利用して板や注文/ポジションの情報を取得し、それらに基づいて売買の判断やポジション管理を行うと思います。

Solana で BOT を実装する場合は、こうした情報を入手するには

  • Solana の RPC メソッドで取得できる情報ならば RPC コールで取得する
  • それ以外の情報は、何らかのアカウントに含まれているのが一般的なので、アカウントをパースして取得する

のいずれかの方法によることになります。

ただし、Solana の RPC メソッドはこちらのドキュメントを見てもらうと分かりますが、主に Solana ブロックチェーンのプリミティブな情報(トランザクションやブロック、エポック、そしてアカウントなど)を取得するものが大半を占めており、いわゆる「トレード」に関連するような情報は手に入りません。

強いて言えば、SPL トークンに関するメソッド(メソッド名が getToken で始まる)がいくつか見つかる程度です。

そのため、BOT が必要とするほとんどの情報は、アカウントから取得することになります。

先ほど、アカウントはファイルのようなものだと言いましたが、PC 上のファイルであれば、そのファイルを作成したプログラムによって、中身のデータの種類やフォーマットはまちまちです。

ワードプロセッサアプリのデータファイルと、メールプログラムのデータファイルでは、当然ファイルの内容や形式は全く異なります。

同じように、Solana のアカウントも、そのアカウントを作成したプログラムによって、アカウントに含まれるデータの種類やフォーマットはまったく異なるわけです。

したがって、アカウントから自分が欲しいデータを抽出するには、そのアカウントのデータフォーマットを知っているか、少なくともそこから所望のデータを取り出す手段がなければいけません。

おそらく、ここが、Solana で BOT 作りにチャレンジする人の多くが躓くポイントでしょう。

どうやって取引 BOT で必要となるデータを入手すればいいのでしょうか? その方法については後ほど説明しますが、一つだけ具体例を挙げておきます。

たとえば、Solana 上には Serum というオーダーブック(板)をサポートする DEX プロジェクトがあります。この Serum の SOL/USDC の板情報が欲しければ、SOL/USDC という Serum マーケットの Asks アカウントと Bids アカウントのデータを Solana RPC で取得し、これらのアカウントのデータをパースして、それぞれのアカウントから売り板と買い板の情報を抽出する必要があるのです。

また、そもそも SOL/USDC マーケットの情報自体がアカウントに格納されているので、最初にマーケットアカウントを取得しておく必要があります。

getOrderbook のようなメソッドを呼び出すだけで済む従来型の取引所 API と比べると、非常に面倒くさいことがお分かりいただけると思います。

トランザクションとプログラム

先ほど Solana のアカウントは、PC におけるファイルのようなものだと説明しました。

そのたとえの延長で考えると、Solana 自体は、PC つまりコンピュータそのものと言ってもよいでしょう。リモートというかネットワーク全体で動作する仮想的なコンピュータのような存在です。

買ったばかりで何もアプリがインストールされていない PC はあまり大したことができませんが、ワードプロセッサアプリをインストールすれば文書の作成/編集ができるし、DTM アプリをインストールすれば作曲や楽曲の入力が可能になります。

Solana ブロックチェーンも PC のような存在なので、(こういうとちょっと語弊はありますが)それ自身にはあまり面白い機能は搭載されていません。少なくとも、注文やポジションのようなトレード関連の概念はまったくといってよいほど存在しません。

板取引を可能にする Serum、トークンのスワップサービスを提供する Raydium や Orca といったプログラムが開発され、それらが Solana 上にデプロイされてはじめて、私たちが普段利用している DeFi の機能が利用できるようになります。

再び、Serum の例で考えてみましょう。Serum では板取引が可能ですから、SOL/USDC というマーケットに買い指値注文を「発注」することにします。

しかし、この「発注」という処理を、誰に 対して どのように 指示すればよいのでしょうか?

Solana はコンピュータのような存在なので、最終的に処理を実行するのは Solana です。したがって、処理を指示すべき相手も Solana ということになります。この指示のことを トランザクション と呼びます。トランザクションには、どのプログラムどんなデータを与えて 処理を実行するべきかが記述されています。

もう少し具体的に言うと、Serum のマーケットに指値の買い注文を出すのであれば、以下のような情報を与えて、トランザクションを実行します:

  • Serum プログラムの ID(つまり実行するべきプログラム)
  • Serum マーケットアカウント ID
  • Serum OpenOrders アカウント ID
  • その他各種アカウント ID(10 個くらいのアカウント ID を渡します)
  • インストラクション(実行する命令 NewOrderV3 と引数がエンコードされている)

このトランザクションを引数として、Solana RPC サーバの sendTransaction というメソッドを呼び出すと、Serum の NewOrderV3 インストラクションを含むトランザクションが Solana によって実行され、結果として買い指値注文が Serum マーケットの買い板に追加されるというわけです。

Solana のエコシステムとライブラリ

既に説明したとおり、Solana には、ほぼ標準として用意された SPL というプログラムライブラリがあり、その中には

  • SPL トークン自体を実装するトークンプログラム
  • SPL トークンをスワップするトークンスワッププログラム
  • SPL トークンのレンディングを提供するトークンレンディングプログラム
  • 集合的なステーキングを可能にするステークプールプログラム

といったプログラムが含まれています。

Solana 上でトークンの取引を行う場と取引手段を提供する DeFi プロジェクトは、SPL のプログラムを利用したりカスタマイズしたり、あるいは完全に独自に処理を実装しながら、

  • 板取引
  • スワップ
  • レンディング

などの DeFi の機能を、ユーザが使いやすい便利な形で提供します。

Solana 上で何らかの取引 BOT を開発しようと思ったら、まずは、どのプロジェクト(プログラム)のサービスを利用するのかをよく検討し、次に、そのプログラムのインストラクションを呼び出す方法を調べる必要があります。

これ以降の解説では、Solana のエコシステムプロジェクトの紹介と共に、そのプロジェクトに関連する TypeScript や Python のライブラリを併記していきますので、それらのライブラリを活用して、アカウントから必要な情報を抽出したり、発注などの処理を実行するトランザクションを構築したりして、Solana で動作する BOT 開発に取り組んでみて下さい。

Solana の基本的な情報取得とトランザクション実行

Solana のブロックチェーン/ネットワークレベルの情報や、一部の SPL プログラムに関連する情報(たとえば SPL トークン残高など)を取得するには、Solana の RPC サーバが提供する JSON RPC を使用します。

JSON RPC を直接利用するなら、プログラミング言語はあまり関係ありませんが、通常は、Solana の JSON RPC をもっと扱いやすい形にラップしたライブラリを使います。

また、SPL トークンは Solana の標準機能に近い位置付けといってもよく、これらのライブラリには、一部、SPL トークンに関する機能も盛り込まれています。

さらに、spl-token という npm パッケージも公開されているので、SPL トークン関連のインストラクション/トランザクションを作成するときには便利に使えるかもしれません。

最近では Solana 上の開発者たちがデベロッパー向けの情報を提供するためのサイトを用意してくれているので、情報源の一つとしてそれらも押さえておくべきでしょう。

板取引

Solana 上の板取引は、ほぼ例外なく Serum を利用して実現されています。

したがって、

  • 板の情報を取得する
  • 板に注文を出す
  • 注文をキャンセルする

といった処理を行うには、Serum のアカウントを取得してパースしたり、あるいは、Serum プログラムのインストラクションを呼び出したりすることになります。

Serum を操作するためのライブラリとしては、以下の二つがデファクトスタンダードです:

これらは、さきほどの Solana のライブラリと組み合わせて利用します。したがって、Serum を扱う BOT を作りたいのであれば、TypeScript ならば solana-web3.js + serum-ts、Python ならば solana-py + pyserum を利用すると考えて構いません。

なお、Serum は板取引のインフラを提供するだけで、原則として UI は独立しており、数多くの Serum UI フロントエンドが存在します。

BOT の動作を確認したり手動で注文/ポジションの操作を行う場合には、これらの Serum UI フロントエンドのうち、お好きなものを利用すると良いでしょう。

スワップ

Solana でスワップを提供するプロジェクトは多数ありますが、有名どころをいくつか挙げるとすれば、

などが Solana では広く利用されています。

たとえば裁定取引の BOT を作りたいのであれば、こうした AMM の価格とペアをよく調べ、価格の乖離が頻繁に発生する組み合わせを見つけたら、その乖離を収益化する BOT を実装するとよいでしょう。

また、最近ではスワップアグリゲータや DEX アグリゲータと呼ばれるサービスも Solana 上で利用できるようになっています。これらは、上記の各スワップの価格をチェックし、最も有利な経路を自動的に選んでスワップをしてくれます。

現在のところは、API や SDK を提供しているプロジェクトは必ずしも多くはありませんが、今後時間が経つにつれて、徐々に開発環境は充実していくことでしょう。

それまでの間は、

  • もし公開されていれば UI のソースコードからトランザクションの構築方法を読み取る
  • ウェブサイトの JavaScript を解読してトランザクションの構築方法を分析
  • トランザクションを実行してみて、Solana Explorer や solscan で内容を精査する

といった地道な作業によって、プログラムを利用するトランザクションの生成方法を見つけ出す必要があります。

この記事を執筆している時点で、AMM プロジェクトが提供している SDK や UI のソースコードには、以下のようなものがあります:

レバレッジ取引/デリバティブ

最近では Solana 上のオンチェーンデリバティブプラットフォームが充実してきました。

デリバティブ(先物やオプション)取引を提供するプロジェクトには以下のようなものがあります(一部はまだ devnet でテストしている段階):

中でも Mango Markets は古参だけあって、ドキュメント類も充実しています。

レンディング

あるアセットを担保として他のアセットを借り入れることができるレンディングサービスを活用することで、資産にレバレッジをかけたり、金利差のアービトラージを行うことができます。

Solana のレンディングプロトコルには、例えば

などがあります。

現時点では、開発者向けのドキュメントやサンプルはあまり用意されていないようです。Parrot Finance は基本的な Vault の機能にアクセスできる TypeScript SDK を(積極的にアナウンスはしていないものの)提供しています。

Discussion