見出し画像

Solana の RPC プロバイダ比較

こちらは Solana Advent Calendar 2023 12/23の記事です。
https://adventar.org/calendars/8810

こんにちは、yugure というハンドルネームで Orca の DeveloperAdvocate として活動しています。

このポストでは、Solana でプロダクトを作る上で不可欠な RPC サーバを比較してみます。適切な RPC サーバを選択することで、RPC サーバに起因するトラブルを避けることができます。

Solana 対応を謳いつつ WebSocket はサポートしておらず、Solana の web3.js のトランザクション・ステータスチェックのメソッドが失敗する RPC プロバイダもありました。

コードは正しいのに動かない、というトラブルは避けたいですよね。

比較は基本的に無料プラン同士で行います。Solana で開発してみようかな、という段階では課金プランは検討しにくいと思うからです。

結論は以下の通りです。

  • Solana の Public RPC は開発では使わない

  • 最初の RPC は Helius がオススメ

  • Alchemy と QuickNode も用意しておくと心強い

  • [2024/02/05 追記] QuickNode は getMultipleAccounts 件数制限に注意

2024/02/05 追記
QuickNode の無料プランは getMultipleAccountsの最大数が 5 に制限されたようです。これはかなりきつい制限です。
getMultipleAccounts の上限は可変ですが、100 取れることを前提にしている実装もあるので、トラブルのもとになりそうです。

2024/04/03 追記
この比較には載っていませんが、Solana 専業の SHYFT も候補になってくると思います。2024年に入ってから存在感が増してきているように思います。

https://shyft.to/

RPC サーバとは

Solana では、執筆時点で約 2000 台のバリデータ・サーバの中からスケジュールに沿って選出されたリーダ・バリデータがブロックを生成し、リーダ以外のバリデータが検証しながらブロックが確定していきます。

チェーンからデータを取得したり、トランザクションの実行を依頼する際、直接バリデータやリーダ・バリデータとやりとりせず、RPC サーバが仲介することがほとんどです。

Validator / RPC

RPC サーバはリーダ・バリデータが生成したブロックを受信し、チェーンのデータのレプリカを同期・維持しています。クライアントからの問い合わせに対して、データを返してくれます。

また、RPC サーバはクライアントからトランザクション実行依頼を受け取り、リーダ・バリデータに送ります。リーダ・バリデータがどのバリデータなのかは RPC が判断するため、クライアントは常に同じ RPC に依頼するだけで済みます。

docomo / au / SB / 楽天など、どの通信業者と契約してインターネットにアクセスしようか、という感じに近いと思います。RPC のコール回数は「ギガ」の話です (笑

RPC サーバのインタフェース

RPC サーバがサポートする機能の一覧はこちらです。
ただ、プロバイダによって追加・非サポートがあるので注意は必要です。

比較

比較対象

  • Solana Public RPC

  • Helius

  • Alchemy

  • QuickNode

比較観点

  • レートリミット

  • 毎月呼べる回数

  • WebSocket 利用可否

  • getProgramAccounts 利用可否

  • [2024/02/05 追記] getMultipleAccounts 件数

毎月呼べる回数について、数字の規模感を確認しておきます。

一見すると大きな数字でも、Solana のスピードと量で考えると「大きくなかった」となったりします。

Solana はブロック生成速度が速い (400ms/block) ため、毎秒状態は変わっていきます。1 秒ごとに状態を取得するだけで、あっという間に 86,400 回/日  (2,678,4000回/月) という数字になります。

すべてのブロック (2.5block/秒) を取得したいと思うと、216,000 回/日 (6,696,000回/月) となってきます。

Solana Public RPC

Solana 公式が提供している RPC サーバです。

利用するエンドポイントがページに書いてあり、認証はありません。

公共リソースのため、Hello world 的なプログラムからの利用以上には使いません。重い処理は呼べないようにブロックされます。攻撃されやすいので、調子が悪いときもあると思います。

  • レートリミット: 下図の通り、厳しい

  • 毎月呼べる回数: そういうことを考えてはいけない🙅‍♂

  • WebSocket利用可否: ブラウザからは不可 / Node.js からは可

  • getProgramAccounts: 不可

  • [2024/02/05 追記] getMultipleAccounts: 100 件

Helius

Solana 専業の RPC プロバイダーです。Solana に関するディープなブログなどを公開しており、技術力がかなり高いチームだと思います。

  • レートリミット: 25 回/秒

  • 毎月呼べる回数: 1,000,000

    • getProgramAccounts 換算: 100,000

  • WebSocket利用可否: 可

  • getProgramAccounts: 可

  • [2024/02/05 追記] getMultipleAccounts: 100 件

特徴1: 1 Credit = 1 RPC コール

Helius のわかりやすい点は、1 Credit = 1 RPC コールであることです。
唯一の例外は getProgramAccounts = 10 Credit です。

他の RPC プロバイダをみると察せられるのですが、Solana 専業だからこそできるシンプルさだと思います。

なお、NFT 関連の DAS と呼ばれている高度機能は 100 Credit です。私は今のところ使ったことがないですが、NFT関連のプロジェクトにとって便利なのだと思います。

WebSocket は 1 通知 = 1 Credit なので通知が大量にくる条件の場合は注意が必要です。

特徴2: Solana ウォレットでログイン

Helius の RPC エンドポイント URL を取得するには、一般的なユーザ登録ではなくウォレットの署名によるログインを行います。

ウォレットで署名すると、ダッシュボードが表示され、エンドポイントの URL が書いてあります。即発行といえる手軽さです。

2024/04/03 追記
ウォレット接続で発行したフリープランでは記載されているより厳しい制限が適用されていされているようです。(2月ごろから始まったようです)
管理画面に注意メッセージが表示されており、メールアドレスを登録すると解除されます。

特徴3: USDC 払い可

無料プランとは関係ありませんが、課金するときには Solana 上の USDC での支払いが可能です。

クリプトの定期払いが少しむずかしいためか、サブスクではなく単発払いが可能なのも嬉しいところです(笑

ちなみに一番安い課金プランである Hacker は $49 ですが、10M Credits あるので、毎月すべてのブロックを取得しても余裕があります。

課金した経験もあり、Solanaの 1 トランザクションを署名するだけでお手軽でした。(49 USDC が何処かへ送られていきました)

特徴4: エンドポイント URL の API キーを秘匿できる

RPC のエンドポイント URL には API キーが含まれているため、そのまま Web アプリで利用するとキーが漏洩してしまいます。

キーが漏洩して利用されてしまうと Credit は減りますし、使い続けるわけにいかなくなります。

Helius では Cloudflare の Worker と呼ばれるサーバレス機能を使ったプロキシをセットアップすることで、Worker の機能で API キーを隠蔽し、かつアクセス制御をすることが可能になります。

Worker は 10万回/日 のコールが無料のため、プロキシをセットアップしてもゼロコストのままです。

プロキシはこちらのリポジトリに沿って Cloudflare を操作するとセットアップできます。


Alchemy

いくつものチェーンをカバーしている RPC プロバイダです。RPC がメインではなく、開発プラットフォームの基盤として RPC 機能を提供しているという感じだと思います。Ethereum では特に有名なのかな?という印象です。

  • レートリミット: 330 CU/秒

    • getMultipleAccounts 換算: 30回/秒

    • getProgramAccounts 換算: 2.82回/秒

  • 毎月呼べる回数: 300M CU

    • getMultipleAccounts 換算: 27,272,727

    • getProgramAccounts 換算: 2,564,102

    • getBlock 換算: 4,545,454

    • getTransaction 換算: 5,084,745

  • WebSocket利用可否: 可

  • getProgramAccounts: 可

  • [2024/02/05 追記] getMultipleAccounts: 100 件

特徴1: CU によるリミット

複数チェーンをサポートしているためか、リミットは CU (Compute Unit) という抽象的な単位で決まっており、Solana の RPC コールごとに消費する CU が定義されています。

後ろにいくほど高コストのコールになります(表の先頭のみ抜粋)

特徴2: 無料プランと課金プランの間の超えられそうな壁

Free の上限が 300M CU で、一番安い課金プランである Growth の上限が 400M CU です。

課金の意味とは?となるぐらい Free が強いです。CU による計算を考慮しても、呼び出せる回数は圧倒的に見えます。

特徴3: getProgramAccounts にページネーションがある

getProgramAccounts に Alchemy 独自の pageKey パラメータが追加されています。

https://docs.alchemy.com/reference/getprogramaccounts

getProgramAccounts がどの程度のレスポンスが返せるのかはよくわかっていません(どなたかご存知ですか?)。ページネーションがあるのは現実的な範囲で区切られるということであり、安心できます。

特徴4: accountSubscribe がない

アカウントがアップデートされたときに WebSocket で通知を受け取れるのが accountSubscribe です。

Alchemy はこれを受け付けません。

QuickNode

いくつものチェーンをカバーしている RPC プロバイダです。SolanaFM のバックにいる RPC プロバイダだと思っています。

Solana のあまり知られていそうにない部分をさらっと解説してくれてたりします。困って検索するとヒットすることがあります。RPC プロバイダは性能を引き出すために必然的に実装レベルで詳しくなるのだと思います。

  • レートリミット: 330 Credits/秒

    • getMultipleAccounts 換算: 6.6回/秒

    • getProgramAccounts 換算: 6.6回/秒

  • 毎月呼べる回数: 50M Credits

    • getMultipleAccounts 換算: 1,000,000

    • getProgramAccounts 換算: 1,000,000

    • getBlock 換算: 1,000,000

    • getTransaction 換算: 1,000,000

  • WebSocket利用可否: 可

  • getProgramAccounts: 可

  • [2024/02/05 追記] getMultipleAccounts: 5 件 😱

特徴1: Credit によるリミット

Alchemy と同様に、RPC コールごとに Credit の消費量が定義されています。Solana に生まれた時点で 50 以上という業を背負うモデルです(笑

ただ、現時点では以下の 2 コール以外は 50 Credits なので、細かく刻まれる複雑さはないです。これらを使わなければ Credits / 50 が呼べる回数です。

  • getSupply

  • getLargestAccounts

特徴2: $10 の課金プランが存在

$49 のプランの量は必要ないな、でもフリーでは足りないという場合には良さそうです。

クリプト支払いも受け付けると発表していましたが、今見るとクレジットカードの入力枠しかありません。

過去にクレジットカードの情報を入力して課金したことがないユーザはサポート窓口へご案内のようです…

https://support.quicknode.com/hc/en-us/articles/7435546301073-Can-I-pay-in-cryptocurrency-

特徴3: getMultipleAccounts の件数が 5 件 (2024/02/05 追記)

複数のアカウントを同時に取得する getMultipleAccounts という API があるのですが、無料アカウントでは 5 件しかとれないようになったようです。

"error":{"code":-32615,"message":"getMultipleAccounts is limited to a 5 range, upgrade from discover plan at quicknode.com to increase the limit"}}

最低でも 100 件は取得できることは暗黙の了解だと思っていましたので、やや衝撃の制限です。

結局どこを使えばいいのか?

Helius, Alchemy, QuickNode のどこもいろいろ試すぐらいでは全く心配がないコール回数を無料プランで提供してくれています。

2024/02/05 追記
QuickNode は getMultipleAccounts に厳しい制限を追加したため、全く心配がない RPC とは言えなくなったと思います。

最初の RPC としては Helius がよいかなと個人的には思います。

  • ウォレットの署名のみで発行できる

  • 1 Credit = 1 RPC コールのシンプルさ (除く getProgramAccounts)

    • getProgramAccounts 例外は最近追加され、歯切れの悪い説明にorz

  • 25 回/秒のレートリミット

    • 関連アカウントを連鎖的に取る場合に安心

  • Web アプリ公開時の RPC 保護

    • Cloudflare Worker によるプロキシ

    • (課金プランのみ)5 回/秒・IP に制限するエンドポイントも提供

  • いざとなれば Solana 上の USDC で単発課金できる

ただ、維持費がかかるものでもないので、Alchemy や QuickNode のエンドポイントも作っておき、使えるようにしておくと安心だと思います。

別の RPC を試せるようにしておくと、以下のシーンで役立ちます。

  • 万が一 RPC のサービスがダウンした場合

  • RPC のデータ同期がバリデータに対して遅れている場合

  • RPC のレスポンスに対するダブルチェック

最近のデータは大丈夫だと思うのですが、2022年のデータをひたすら遡っていたときに結果の不一致にぶち当たり、複数の RPC プロバイダの結果をみながら、正しいものを選ぶということが実際にありました。

それにしても、課金プランがみんな $49 というのは、そこまで携帯電話会社と似なくても・・・という感じですね(笑

Geyser や gRPC をサポートする RPC

より多くのデータを早く・大量に受信して解析・活用したいというニーズがある場合、Geyser as a service や gRPC によるデータ提供を行っているプロバイダの扉を叩くことになると思います。

基本的に Solana 専業のようなチームが強いと思います。

Helius

Triton

Solana の RPC プロバイダのなかで、比較に含まれない巨人が RPC Pool (Triton) です。無料プラン提供はないものの、本番環境利用では候補になってくるはずです。

Jito Labs



さいごに

最後まで読んでいただきありがとうございました。

🙇宣伝1: Orca とチュートリアル

Solana で多くのトレードを執行する流動性を提供している Orca は Typescript / Python / Rust などのプログラムからも利用可能です。

Typescript 向けに、Devnet でそのまま動かせるチュートリアルを用意していますので、Solana でトレード・流動性提供(マーケットメイク)してみたい方はぜひ年末にトライしてみてください。

Orca の Discord の日本語チャネルでは、技術サポート・相談を行っていますので、気軽にジョインしていただけると幸いです。

ソースコードは日本語・英語で提供されていますが、本文は日本語でしか完結していません。

英語圏のユーザが翻訳して読んでいる状況なので、ぜひ日本コミュニティーにはこの優位性?を活用していただければと思います(笑

チュートリアルのリポジトリに追加された PositionBundle は流動性を操作する強力なツールなので、過去にチュートリアルを見た方もリポジトリを覗いていただけると幸いです。(Wen 日本語本文)

🙇宣伝2: PubkeySollet & Account microscope

Orca での活動を通じてちょっとした便利ツールを作って公開しています。

既存のサービスだとちょっと痒いところに手が届かない、という状況で生まれたものなので、お役に立てば幸いです。

PubkeySollet

公開鍵を入力すると、その公開鍵のウォレットとしてアプリに接続できるウォレットです。

公開鍵のみ入力するため、署名はできません。

利用シーンは以下のようなものがあります。

  • 強いユーザにどんな画面が見えているのか覗いてみたい

  • ユーザサポートでユーザにどんな画面が見えているのか確認したい

  • スキャム疑惑があるサイトに突撃する (原理的に署名できないので安心)

  • どんなトランザクションなのかリバースエンジニアリングする

Account microscope

Solscan や SolanaFM がエクスプローラとしてとても便利です。

ただ、その便利さ故に表示されている情報がアカウント自体にあるのか、エクスプローラが関連付けて表示しているだけなのかがわからなくなります。

開発者向けの簡易エクスプローラとして以下のようなことができます。

  • 生データと導出したデータを区別して表示

  • アカウントのヘッダが見られる

  • HexDump 結果をバイナリエディタのようにデータ解釈できる

  • アカウントデータを JSON で保存

実際に Helius の RPC と Cloudflare Worker を利用しています! 👍


それでは、残りの 2023 年・2024 年が Solana コミュニティーにとってよい年になりますように! 🙂

この記事が気に入ったらサポートをしてみませんか?