https://zenn.dev/softgate/articles/8ee1e3e3f1ce33
めちゃいい記事見つけた。
年利8%FTXのearnもおすすめ!!
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 のトークンプログラムというコントラクトを利用して、独自トークンの発行やトークンの転送を行うことができます。
トークンにはひゅう順化されたフォーマットがあるのでそれをもとに作ればすぐ出来ると。
Solana Program Libraryとは?
ソラナプログラムライブラリ
Solana Program Library(SPL)は、Sealevel並列ランタイムを対象としたオンチェーンプログラムのコレクションです。これらのプログラムは、SolanaのSealevelの実装、solana-runtimeに対してテストされ、メインネットにデプロイされます。他の人がSealevelを実装しているので、ここのプログラムがすべての実装間で移植可能であることを保証するために、パッチを丁寧に受け入れます。
完全なドキュメントはhttps://spl.solana.comで入手できます。
発達
環境設定
- https://rustup.rs/から最新のRust安定版をインストールします
- https://docs.solana.com/cli/install-solana-cli-toolsからSolanav1.6.1以降をインストールします
- ディストリビューションの
libudev
開発パッケージをインストールします(libudev-dev
Debianから派生したディストリビューション、libudev-devel
Redhatから派生したディストリビューション)。
建てる
通常のカーゴビルドは、ホストマシンに対してプログラムをビルドするために使用できます。
$ cargo build
Solana BPFターゲット用に、SPLトークンなどの特定のプログラムを作成するには:
$ cd token/program
$ cargo build-bpf
テスト
すべてのプロジェクトに含まれる単体テストは、次のコマンドで実行できます。
$ cargoテスト # <-ホストベースのテストを実行します
$ cargo test-bpf # <-BPFプログラムテストを実行します
SPLトークンなどの特定のプログラムのテストを実行するには:
$ cd token/program
$ cargo test # <-- runs host-based tests
$ cargo test-bpf # <-- runs BPF program tests
統合テストは、プロジェクトごとの.jsバインディングを介して実行できます。例については、トークンプログラムのjsプロジェクトを参照してください 。
Clippy
$カーゴクリップ
カバレッジ
$ ./coverage.sh #助けてください!XCodeの `grcov`の不一致が原因で、現在MacOSでカバレッジビルドが失敗しています...
マックOS
grcovバージョンを固定してから、apple-darwinの夜間ツールチェーンでラストアップする必要がある場合があります。
$ cargoインストールgrcov--バージョン0.6.1 $ rustupツールチェーンを毎晩インストール-x86_64-apple-darwin
このように、SPL は本来 Solana のコアな機能の外側に実装されたプログラム群を指すわけですが、事実上、SPL は Solana の標準仕様の一部と考えてもよいくらい、Solana と密接な関係にあります。
特に、SPL のトークンプログラムは、Solana のトークン実装のデファクトスタンダードであり、ほぼ標準的な機能として Solana の RPC(後述)にも情報取得系のメソッドが組み込まれているため、Solana 上でトークンを扱う場合は素直に SPL トークンプログラムを利用するのが適切でしょう。
RPCとは?Remote Procedure Callの略。「遠隔手続き呼び出し」とも呼ばれる。ネットワーク上に接続されたほかの端末のプログラムを呼び出し、実行させるための手法。
なお、SOL は Solana ブロックチェーンのネイティブトークンであり、SPL トークンではありません。しかし、それでは少々不便なので、SOL をラップして Wrapped SOL という SPL トークンにすることで、それ以外の SPL トークンと同様に統一的に扱えるようになっています。
情報取得とアカウント
Solana を利用する上では アカウント という概念をよく理解する必要があります。
アカウントは、一言で言えば、PC におけるファイルのようなもので、プログラムが利用するデータは基本的にアカウントに格納されています。
ここでは Solana のアーキテクチャにまで踏み込むつもりはないので、必要に応じて Solana の公式ドキュメントなどを参照して、随時情報を補って下さい。
取引 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 で取得し、これらのアカウントのデータをパースして、それぞれのアカウントから売り板と買い板の情報を抽出する必要があるのです。
なるほど。取引所みたいなAPIはないから、Dappsがもってるアカウントっていうファイルの中にある情報を読み取らなきゃならないわけだ、しかもその形式が決まっていないからなん7日を把握した上で開かないと中身を見つけても見れないと。
また、そもそも 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 を使用します。
まて、そもそもRPCサーバーとはなんだ?こちら
JSON RPC を直接利用するなら、プログラミング言語はあまり関係ありませんが、通常は、Solana の JSON RPC をもっと扱いやすい形にラップしたライブラリを使います。
- solana-web3.js (TypeScript)
- solana-py (Python)
これ以降で紹介するプロジェクトごとに用意されたライブラリは、TypeScript なら solana-web3.js
に、Python なら solana-py
に依存したものが多いため、TypeScript / Python では基本的にこれらのライブラリの利用は必須と考えてもよいでしょう。
Dappを使うためのライブラリがpythonだったら、同じようにソラナへのリクエストもpythonを使ったほうが効率よくコードが書きやすいよねっていう話だね
また、SPL トークンは Solana の標準機能に近い位置付けといってもよく、これらのライブラリには、一部、SPL トークンに関する機能も盛り込まれています。
さらに、spl-token という npm パッケージも公開されているので、SPL トークン関連のインストラクション/トランザクションを作成するときには便利に使えるかもしれません。
板取引
Solana 上の板取引は、ほぼ例外なく Serum を利用して実現されています。
したがって、
- 板の情報を取得する
- 板に注文を出す
- 注文をキャンセルする
といった処理を行うには、Serum のアカウントを取得してパースしたり、あるいは、Serum プログラムのインストラクションを呼び出したりすることになります。
Serum を操作するためのライブラリとしては、以下の二つがデファクトスタンダードです:
これらは、さきほどの Solana のライブラリと組み合わせて利用します。したがって、Serum を扱う BOT を作りたいのであれば、TypeScript ならば solana-web3.js
+ serum-ts
、Python ならば solana-py
+ pyserum
を利用すると考えて構いません。
ただし、serum-ts
も pyserum
も使いやすさを優先して設計されているため、実行時の効率に関しては不満が残る面もあります。Serum にアクセスする高頻度 BOT を開発するのであれば、最終的にはこれらのライブラリを参考にしつつ、自前でもっと高速な Serum クライアントライブラリを作る必要が生じるかもしれません。
なお、Serum は板取引のインフラを提供するだけで、原則として UI は独立しており、数多くの Serum UI フロントエンドが存在します。
BOT の動作を確認したり手動で注文/ポジションの操作を行う場合には、これらの Serum UI フロントエンドのうち、お好きなものを利用すると良いでしょう。
スワップ
Solana でスワップを提供するプロジェクトは多数ありますが、有名どころをいくつか挙げるとすれば、
などが Solana では広く利用されています。
たとえば裁定取引の BOT を作りたいのであれば、こうした AMM の価格とペアをよく調べ、価格の乖離が頻繁に発生する組み合わせを見つけたら、その乖離を収益化する BOT を実装するとよいでしょう。
残念ながら、Solana エコシステムの中で、API や SDK を提供しているプロジェクトは多くありませんが、今後時間が経つにつれて、徐々に開発環境は充実していくでしょう。
それまでの間は、
- もし公開されていれば UI のソースコードからトランザクションの構築方法を読み取る
- ウェブサイトの JavaScript を解読してトランザクションの構築方法を分析
- トランザクションを実行してみて、Solana Explorer や solscan で内容を精査する
といった地道な作業によって、プログラムを利用するトランザクションの生成方法を見つけ出す必要があります。
この記事を執筆している時点で、AMM プロジェクトが提供している SDK や UI のソースコードには、以下のようなものがあります:
レバレッジ取引/デリバティブ
最近では Solana 上のオンチェーンデリバティブプラットフォームが充実してきました。
デリバティブ(先物やオプション)取引を提供するプロジェクトには以下のようなものがあります(一部はまだ devnet でテストしている段階):
中でも Mango Markets は古参だけあって、ドキュメント類も充実しています。
レンディング
あるアセットを担保として他のアセットを借り入れることができるレンディングサービスを活用することで、資産にレバレッジをかけたり、金利差のアービトラージを行うことができます。
Solana のレンディングプロトコルには、例えば
などがあります。
現時点では、開発者向けのドキュメントやサンプルはあまり用意されていないようです。Parrot Finance は基本的な Vault の機能にアクセスできる TypeScript SDK を(積極的にアナウンスはしていないものの)提供しています。