Solana 開発まとめ

⛓Solana📱DApps開発について.

Languages

Hello, Solana World!

🔖Hello world

memo program

solanaチェーンにメモを残すだけのプログラム.

🔧SPL

Solana Program Library(SPL). Solanaのカスタムトークンのための📝トークン規格.

機能

エコシステムをいじるためのAPIの集合.

  • トークンの作成: 🔧SPL Token Program
  • 交換
  • 貸付
  • ステークプールの生成
  • オンチェーンネームサービスの維持

Serialized/Deserialized

SPLにおけるシリアライズ/デシリアライズについて.

📝シリアル化(直列化)とは, オブジェクトのバイト配列化. SolanaではBorthというライブラリが使われる.

たとえばweb3.jsのTransactionクラスには compileMessageとserializedMessageがある. serialiedすることでバイナリ形式にデータ変換して, compileで署名をする.

Liralies

Libraries

JSON RPC HTTP methods

素のAPIを叩くよりもweb3ラッパーをつかうのがいい.

🔧solana/web3.js

JavaScript/TypeScript.

1.x

25/01/26にpublic archived

v2 migration

Solana SDK migration Guide (v1 → @solana/web3.js 2.x)

Payer/Signer

Payerはトランザクション手数料を支払うアカウント. 通常はownerと同じだが, 別のアカウント指定することも可能.

SingerはKeypair型となる. PublicKeyではないので注意.

https://solana-labs.github.io/solana-web3.js/interfaces/Signer.html

web3.js/Connection Class

1番よくつかうクラス.

ref. Connection | @solana/web3.js

getAccountInfo

publicKeyに紐づくaccount情報取得.

https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getAccountInfo

dataにbufferが入っているのでdeserializeが必要.

getMultipleAccountsInfo

https://solana.com/docs/rpc/http/getmultipleaccounts

最大100までを1回のcallで取得できる. 100ごとのchunkでbatch Requestするといい.

https://github.com/raydium-io/raydium-sdk/blob/3601f7f827aec90db49efaba3b1f1dcaec018d51/src/common/web3.ts#L53

getProgramAccounts

Programに紐づくPDAをすべて取得.


getProgramAccountsから最新のaccountのみを取得することはできないので, すべて取得してからlamportsでsortする.

accounts.sort((a, b) => b.account.lamports - a.account.lamports);

raw データ取得できるget IFとgetParsed IFがある

たいていのよくある操作はgetXとgetParsedXという2種類のIFが用意されている.

raw Data(Buffer)は不具合のもと(エディタで表示するとハングしたりする)ので, デバッグ用途ならばParsedをつかうほうが適切.

getParsedTransactionよりもgetTransactionの方が通信コストが低い.

🔧solana/spl-token

🔧SPLにおけるTypeScriptのSDK.

🔧Token22

Token-2022 Program. Token v2. 通常のToken Programではないことに注意.


従来との比較

  • 拡張可能なmetadata.

transfer fee extention

token22にはtransfer feeが設定できる.

https://github.com/raydium-io/raydium-sdk-V2/blob/86d5b110c3d337af151f809cbeda70001b63f532/src/common/transfer.ts#L65

Solana Fungible tokens

create ATA with spl-token


close ATA with spl-token

不要なATAはcloseすることでrent料金をredeemすることができる(1つ30円くらいだけどたくさんあるとバカにできない).

📊Step Financeには一括close機能がある(balance 0 only). 2022がcloseできない.

balanceがある場合はburnする

balanceがあるATAはcloseできないので📝Token Burning(Burn)する必要あり.

手数料1割くらいはらってもサイトを使うのは楽.

https://sol-incinerator.com/, token22対応してないようだ.


tokenProgramをつかってtxを自力で発行する方法もある.

💭Solanaで9万円を間違えてバーニング(burn)した(24/11/28)

🔧coral-xyz/anchor

Solanaのスマートコントラクト(Program)を記述するためのデファクトスタンダードフレームワーク.

  • Rust/TypeScriptどちらも.
  • 🔌Solana CPIを操作するにもこれをつかうのが便利.

IDL

📝Solana IDLを読み込んでクライアントライブラリを生成.

parser/decoder

getAccountInfoで取得したbuffer(binary)をフォーマット(Typescriptだとtypeで定義されてる)でdecodeして必要な情報にアクセス.

  • accounts
  • instruction

Address Constraint is violated(custom program error: 0x7dc)

アドレス制約違反. IDLに定義されているフォーマットに従ってない場合など.

Invalid account discriminator

anchorのエラー, ヘッダ情報不正.

https://stackoverflow.com/questions/70748390/what-does-invalid-account-discriminator-mean-in-anchor

v0.30.0 > では破壊的変更あり

IDLのフォーマット変更やIFの変更あり.

  • IDLがcamelCaseからsnake_case.
  • decode時のnameの指定がPascalCase

  • anchor idl convert コマンドで変換して利用する.
  • 外部npmとプロジェクトの互換性がないときは、npm配下のnode_moduleにあるanchorを利用する.

Refs


Solana Testnet/Devnet

  • アドレスは共通.

Testnet

デモネットワーク. バリデータ用.

<2025-03-29 Sat 09:59> どうしてもTestnetのSOLが手に入らない. airdropは失敗する.

Devnet

開発用ネットワーク.

  • 他のチェーンはTestnetしかない.

SOL取得

エアドロとFaucetsの二種類.

開発用ウォレット

Solana Programming

Solana Rust Programming

SolanaのスマートコントラクトはC/Rust.

💡Solana ガチるならRust一択

;; https://twitter.com/regolith1223/status/1515224377000095745

DeFi/DEX Bot開発にプロトコル実装と同じ言語を選択すると、利用できるコード資源が豊富でその機能の解像度も高く、さらにアップグレードにすぐ対応したり色々試したりできるので、かなり機動力が高まるな。

これまで実行効率とか速度みたいな性能面しかみてなかったけど、これは無視できない恩恵だ。

Ethereumは複数言語の実装があるので自分の目的とか好みに応じて比較的自由に選べそうだけど、Solanaは現状Rustのみなので、まあBot開発も(ガチでやるなら)Rust一択かなという気はしている。

Solana RPC nodes

Solanaにおける📝RPCノードまとめ.

sharedとdedicatedの2種類がある. 俗にシェアノードとフルノード.

Dedicated nodesは private node serverをレンタルするようなもので高額.

Solana公式RPCエンドポイント

無料だがRate Limitがある.

Solana RPC ノードプロパイダ

aka. public RPC endpoints for Solana. 自前ではなくてレンタルするもの.

無料枠あり

not free

🏢Helius

Solanaチェーン専業のRPCプロバイダなのが特徴かつ差別化ポイント.

https://www.helius.dev/

Private RPC Endpoints

Refs

🔧Solana Websocket

programSubscribe

https://solana.com/docs/rpc/websocket/programsubscribe

accountSubscribe

accountの変更通知.

https://solana.com/docs/rpc/websocket/accountsubscribe

sample: anchor - How to Listen to Account Changes in a Solana program? - Solana Stack Exchange

💻AlchemyはaccountSubscribeがない. ref. Plans for support `accountSubscribe` for Solana WS endpoint?


大量のaccount監視をするにはwebsocketを開いてaccount分をsubscribeする必要がある. 一括でsubscribeを登録するならば, 🔧Solana Geyserが必要.

connection.onAccountChange

🔧Solana Geyser

データへのアクセスには, 📝gRPCを利用する. Websocketような感じで リアルタイムStreamingなオンチェーンデータを取得できる. websocketのパワーアップ版と思えばいい.

利用には高額なDedicated RPCの契約が必要なので覚悟が必要.


Solanaオンチェーンデータをオフチェーンに転送する技術.

Validators under heavy RPC loads, such as when serving getProgramAccounts calls, can fall ssbehind the network. To solve this problem, the validator has been enhanced to support a plugin mechanism, called a “Geyser” plugin, through which the information about accounts, slots, blocks, and transactions can be transmitted to external data stores such as relational databases, NoSQL databases or Kafka.

これによってオンチェーンに直接データを問い合わこと回避. 🔖Solana Validatorsへのオンチェーンデータ取得による負荷(getAccountInfoみたいな)を下げる.


🔧Solana Webhooks

Topics

💡Solana Wallet 残高取得

getBalance/getTokenAccountBalance

🔍Solanaオンチェーン分析

📈Dune Analytics

🔧Solang

SolanaとPolkadotのための📝Solidityコンパイラ.

  • https://github.com/hyperledger/solang
  • 2023/07/19 Released.
  • .solファイルを.soに変換.
  • これによってC or Rustを知らなくてもSolidityが分かればSolana開発ができる.

💡tx成功率改善/drop tx対策

txのdropとはexploreにすら表示されない現象.

  • successでもfailureでもない.
  • エラーとして検出できる場合と, 消失してわからない場合がある.

  1. 📝Prioritization fee(Solana)の改善
  2. 📝Solana Compute Budgetの改善.
  3. カスタムブロードキャスト実装
  4. transaction sender 検討

原因

原因の切り分けが必要.

  1. blockhashの期限切れ: 2分くらいでタイムアウト.
    • Signature X has expired: block height exceededエラーで検出はできる.
    • TransactionExpiredBlockheightExceededError.
  2. 何らかの理由でRPC Nodeにおくったtxが他のRPC Nodeにbroadcastされない.
    • not propavation
  3. ネットワーク負荷集中しすぎでUDP Protocol的に処理不能.
    • At the validator network pipeline: too many txns coming thru, validator only accepts certain amount
    • Rpc: rpc too slow, doesn’t forward fast enough or to the right leader etc

検証方法

  • preflight checkを有効化してデバッグ.
    • これで検出できるのはblockhash not found error.
  • maxRetiresを調整するとleaderに送りつける回数を指定できる.
  • 失敗したtxをリトライして検証: txがチェーンに乗らない場合, 失敗したtxをリトライしてみる. それで乗るならばblockhashが古かった, そうでなければ何らかの理由であるleaderが別のleaderに送信しなかった.
  • priority Feeを積んで検証.

💡トランザクション一括送信

How to Send Bulk Transactions on Solana | QuickNode

Tx解析

getTransactionでバイナリデータを取得してInspectorで解析

🔍Solana Exploreのinspector活用.

https://explorer.solana.com/tx/inspector

Solana Flashloan

✅Solana Program Errors(custom errors)

Solanaトラブルシューティング. Custom Program Errorsのコードは各Programごとに設定するもの.

SPL errors

0x1: insufficient fund

0x11/17: account is frozen

凍結しているaccountを利用しようとしている.

Anchros Erros


Jupiter Errors

Custom Error

Transaction simulation failed: Blockhash not found

message: Transaction simulation failed: Blockhash not found.

{"jsonrpc":"2.0","error":{"code":-32002,"message":"Transaction simulation failed: Blockhash not found","data":{"accounts":null,"err":"BlockhashNotFound","logs":[],"returnData":null,"unitsConsumed":0}},"id":"8dead0ba-f4a2-487d-a4bb-f0690b0a7c47"}

sendRawTransactionでリトライ処理をしたらfixできた.

const txid = await connection.sendRawTransaction(rawTransaction, {
  skipPreflight: true,
  maxRetries: 2
});

Transaction simulation failed: Transaction contains a duplicate instruction (1) that is not allowed

computeBudgetInstructionsをinstructionsに2つ含めると 発生.

Transaction simulation failed: Transaction locked too many accounts

Transactionに含めることができるaccount数が多すぎる.

BPF program panicked

おそらくFatal Error, メモリ獲得失敗とか. RustにおけるPanic.

Program log: Error: memory allocation failed, out of memory

Program returned error: BPF program panicked

Transaction loads an address table account that doesn’t exist

🔗References



日本語資料のリンク集があるのでわたしのリンクは不要かも.

GitHub - k-kinzal/solana-materials-in-japanese: Solanaの開発に関わる日本語資料


Clockwork

Solanaのチェーン操作を自動化.

Tour de Whirelpool(2022)

ref. Tour de Whirlpool|yugure.sol

とTypeScriptの日本語チュートリアル.


orca developer portalの一部としてコンテンツを発見した.


  • 最新versionで動かなかったので旧versionをつかった.
    • package.jsonに追加.
    • “@orca-so/whirlpools-sdk”: “^0.5.1”,
  • 2023では@project-serum/anchorは@coral-xyz/anchorになってる.

There is clearly an unsatisfied need for a 0-to-1 curriculum on solana development -@aushumenon_

step by stepのsolana開発ガイドのツイートスレッド.

https://twitter.com/ayushmenon_/status/1476294409205526534

  1. Learn Rust Basics
  2. Understand the Solana Programming Model (1/2)
  3. Learn Anchor
  4. Skim Open-Source Protocols
  5. Complete The Full-Stack Guide
  6. Join the Anchor community

Solana Down


Insights

✨SolanaのTransactionは状態をもたない抽象データ型に似ている

Solanaの構成要素は, list of instructionsとlist of accounts. これってどっかで見たことがあると思ったら, 📝クラス(OOP)に似ている.

かつてC言語でオブジェクト指向プログラミングをやろうという無謀な試みをしたとき, クラスとは操作抽象のセットとデータ抽象のセットのペアでしかないことを知った.

ただ, Txは状態をもっているわけではない. Explicite Stateではない. するとStateless ADTといえるかもしれない.

✨Solanaのコードとデータを完全に分離するところに強い関数型の野望を感じた

Solanaブロックチェーンの設計思想であるコードとデータを完全に分離する, 不浄なものと聖なるものを分ける思想, これには関数型プログラミングへの強い意志を感じた.

他のほとんどのブロックチェーンとは異なり、Solanaはコードとデータを完全に分離します。 プログラムがやり取りするすべてのデータは個別のアカウントに保存され、instructionsを介して参照として渡されます。

ref. プログラム | Solana Cookbook