Solana 開発まとめ
- 🐥Solana Specs: Solana開発の基礎知識.
- 🤖Solana MEV: MEV
Languages
- 📝Rust: スマートコントラクト.
- 📝Python/📝JavaScript: web3 library.
Hello, Solana World!
memo program
solanaチェーンにメモを残すだけのプログラム.
- https://solscan.io/account/Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo
- Memo Program | Solana Program Library Docs
🔧SPL
Solana Program Library(SPL). Solanaのカスタムトークンのための📝トークン規格.
機能
エコシステムをいじるためのAPIの集合.
- トークンの作成: 🔧SPL Token Program
- 交換
- 貸付
- ステークプールの生成
- オンチェーンネームサービスの維持
Serialized/Deserialized
SPLにおけるシリアライズ/デシリアライズについて.
📝シリアル化(直列化)とは, オブジェクトのバイト配列化. SolanaではBorthというライブラリが使われる.
たとえばweb3.jsのTransactionクラスには compileMessageとserializedMessageがある. serialiedすることでバイナリ形式にデータ変換して, compileで署名をする.
Liralies
- typescript: 🔧solana/spl-token
- CLI: Command-line Guide | Solana Docs
Libraries
JSON RPC HTTP methods
素のAPIを叩くよりもweb3ラッパーをつかうのがいい.
- Python: solana-py
- JavaScript: 🔧solana-web3.js
- Java: https://github.com/skynetcap/solanaj
🔧solana/web3.js
JavaScript/TypeScript.
- repo: https://github.com/anza-xyz/solana-web3.js
- Web3 API Reference | Solana Docs
- Web3 JavaScript API | Solana Docs
- Intro | Solana Web3 Example: 基本操作のサンプルコード集, わかりやすい.
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するといい.
getProgramAccounts
Programに紐づくPDAをすべて取得.
- プログラムアカウントの取得 | Solana Cookbook
- https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getProgramAccounts
- Alchemyはpagenationをサポート. Solana API Quickstart
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.
- https://www.npmjs.com/package/@solana/spl-token
- https://solana-labs.github.io/solana-program-library/token/js/index.html
🔧Token22
Token-2022 Program. Token v2. 通常のToken Programではないことに注意.
- site: Token22 | Solana
- program: https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
- Token-2022 Program | Solana Program Library Docs
- How to use Solana’s Token-2022 Program to Collect Transfer Fees | QuickNode
- Extension Guide | Solana Program Library Docs
- Solana’s New Token Standard: Introducing Token-2022 | by FluxBeam | Medium
- https://solana-labs.github.io/solana-program-library/token/js/variables/TOKEN_2022_PROGRAM_ID.html
- SolanaのToken-2022 ProgramのMetadataを検証してみた - GMOインターネットグループ グループ研究開発本部
従来との比較
- 拡張可能なmetadata.
transfer fee extention
token22にはtransfer feeが設定できる.
- Fee = (token_amount * fee_basis_points) / 10000
- Maximum fee: The cap on transfer fees.
- Fee basis points: This is the fee assessed on every transfer. For example, if 1000 tokens with 50 basis points are transferred, it will yield 5 tokens.
- Fee basis points for transfers (100 = 1%)
- Transfer Fee Extension | Solana
- How to use the Transfer Fee extension | Solana
Solana Fungible tokens
- https://solanafoundation.notion.site/Fungible-Tokens-4b45a92f37994461af58e172fbc91d51
- XCOPE: https://solscan.io/token/3K6rftdAaQYMPunrtNRHgnK2UAtjm2JwyT2oCiTDouYE
create ATA with spl-token
- blockchain - How can I create a associated token address in solana from connected wallet address? - Stack Overflow
- Create Token Account | Solana Web3 Example
- createAssociatedTokenAccount | @solana/spl-token
- getOrCreateAssociatedTokenAccount | @solana/spl-token
- getAssociatedTokenAddress
- getAssociatedTokenAddress | @solana/spl-token
- ownerに紐づくATAがすでにあればそれを返す. なければ新規作成のためのアドレスが返される.
- createAssociatedTokenAccountInstruction
- createAssociatedTokenAccountInstruction | @solana/spl-token
- ATA作成のためのInstruction取得
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を自力で発行する方法もある.
- How to Burn SPL Tokens on Solana | QuickNode
- burn
- createBurnCheckedInstruction
- createBurnCheckedInstructionはdecimalチェック機能があるのでオペミスを防ぐ.
- https://solana-labs.github.io/solana-program-library/token/js/functions/createBurnCheckedInstruction.html
💭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
- Coder Classが担う. これは🎨Facadeであり, 実体はBorshというバイナリ解析ライブラリの呼び出し.
- https://coral-xyz.github.io/anchor/ts/classes/BorshCoder.html
- BorshAccountsCoder
- program.coder.accountsみたいにアクセスできるオブジェクト.
- https://coral-xyz.github.io/anchor/ts/classes/BorshAccountsCoder.html
- jupiter instruction解析がtsの参考になる. parseだけならconnectionはいらない(通信不要ならば).
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
- https://github.com/coral-xyz/anchor
- Introduction - The Anchor Book
- ts:
- npm: https://www.npmjs.com/package/@coral-xyz/anchor
- doc: https://coral-xyz.github.io/anchor/ts/index.html
- かつてはserum-project/anchorだったが名前がcoral-xyzに変わった.
- 🏢Serum
- Anchor - Introduction
- SolDev - Intro to client-side Anchor development
- SolMeet Book
- errors:
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. 自前ではなくてレンタルするもの.
無料枠あり
- 🏢Helius:
- 💻Alchemy: https://www.alchemy.com/solana
- 25/02より従量課金になり突然高くなった. もう第一候補ではない.
- 300 requests per second, スループットはいいんだけどサーバ自体が不安定.
- Solana CUsの一覧: Compute Unit Costs
- getMultipleAccounts: 11
- getTransaction: 40
- websocketのaccountSubscribeがない.
<2025-03-31 Mon 16:06>
そもそもしれっとendpoint自体がなくなってCursorがおこです.
- Quicknode
- 50 M per month
- 330 credits per sec
- https://www.quicknode.com/pricing
- https://www.quicknode.com/docs/solana
- https://www.quicknode.com/api-credits/sol
- すべてのmethods callは 30 credits.
- getMultipleAccountsの無料枠は5まで(普通は100).
- getTransaction=30CU
- SHYFT: https://shyft.to/
- 2024から. Solana専業.
- 10M credits/month 49ドル. Heliusと同じ. 1RPC=1credit
- 100M credits/momnth 199ドル
- ERPC: https://erpc.global/ja/rpc/
- 日本人開発.
- 1credit=1RPC
- 10M credits 42ドル.
<2025-03-31 Mon 16:05>
課金した.
not free
- Triton: https://triton.one/solana-rpc/
- starter planで $500.
🏢Helius
Solanaチェーン専業のRPCプロバイダなのが特徴かつ差別化ポイント.
- pricing
- https://www.helius.dev/pricing
- https://docs.helius.dev/welcome/pricing-and-rate-limits
- 1 RPC call = 1 credits
- free
- 500k Credits per month
- 10 RPC calls per seconds.
- dev
- 10 M Credits per month
- 50 RPC calls per sec
- websocketでaccountSubscribeがつかえる.
<2024-02-29 Thu 11:22>
Developerプランに課金した.- nodejs sdk: https://github.com/helius-labs/helius-sdk/
Private RPC Endpoints
Refs
- RPC Infrastructure | Solana
- Top Solana RPC Node Providers (2023) - Alchemy
- RPCノードプロバイダについて - INTP型のブログ
- Solana の RPC プロバイダ比較|yugure.sol, 2023年末の比較記事, ありがたい🙏.
🔧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みたいな)を下げる.
- Geyser Plugins | Solana Docs
- Intro To Geyser
- What is the Solana Geyser Plugin?
- Solana Geyser Plugins: Streaming Data at the Speed of Light
- GitHub - rpcpool/yellowstone-grpc: solana geyser grpc service
- Geyser as a Service - Helius Docs, $1100 per month…
- ホーム | ERPC - Solana Enhanced RPC
🔧Solana Webhooks
Topics
💡Solana Wallet 残高取得
getBalance/getTokenAccountBalance
- getBalance
- Connection | @solana/web3.js
- 取得できるのはSOL単位, lamportで割る必要あり.
- getTokenAccountBalance
- Connection | @solana/web3.js
- SOL以外のSPLトークンはこっち
🔍Solanaオンチェーン分析
🔧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でもない.
- エラーとして検出できる場合と, 消失してわからない場合がある.
- 📝Prioritization fee(Solana)の改善
- 📝Solana Compute Budgetの改善.
- カスタムブロードキャスト実装
- transaction sender 検討
<2024-03-08 Fri 16:14>
くそ, このエラーが多すぎる.- transactions - TransactionExpiredBlockheightExceededError - how should we handle this on the front-end - Stack Overflow
- トランザクションの再試行 | Solana Cookbook
- Solana Transaction Propagation - Handling Dropped Transactions | QuickNode
- V6 Swap API | Jupiter Station
- Troubleshooting | Jupiter Station - Transaction Confirmation Timeout.
- TransactionExpiredBlockheightExceededError | @solana/web3.js
- How to Improve Solana Transaction Performance | QuickNode
原因
原因の切り分けが必要.
- blockhashの期限切れ: 2分くらいでタイムアウト.
- Signature X has expired: block height exceededエラーで検出はできる.
- TransactionExpiredBlockheightExceededError.
- 何らかの理由でRPC Nodeにおくったtxが他のRPC Nodeにbroadcastされない.
- not propavation
- ネットワーク負荷集中しすぎで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
- 🏢Soland
- FlashLoan Mastery: Flash Loan Mastery
✅Solana Program Errors(custom errors)
Solanaトラブルシューティング. Custom Program Errorsのコードは各Programごとに設定するもの.
- 16進法と10進法の表記に注意. ログだと0xだが定義だと10digits.
SPL errors
- https://github.com/solana-labs/solana-program-library/blob/master/token/program/src/error.rs
- https://github.com/solana-labs/solana/blob/master/sdk/src/transaction/error.rs
0x1: insufficient fund
0x11/17: account is frozen
凍結しているaccountを利用しようとしている.
Anchros Erros
- 🔧coral-xyz/anchorの共通コードもある.
-
= 100 Instruction error codes
-
= 1000 IDL error codes
-
= 2000 constraint error codes
-
= 3000 account error codes
-
= 4100 misc error codes
- = 5000 deprecated error code
- 6000
- 6001=0x1771
- 6023=0x1787
Jupiter Errors
Custom Error
- Marketごとのcustom errorは📝Solana IDLに定義されている.
- orca: https://github.com/orca-so/whirlpools/blob/462877debe1bc9616740fa415939d76103beb1ad/programs/whirlpool/src/errors.rs
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
- web3.js - Is there an instruction limit or total size limit for the instructions array for versioned transactions? - Solana Stack Exchange
- 📝パニック(OS)
Transaction loads an address table account that doesn’t exist
- ref. python - “Solana Transaction Error: Invalid Transaction due to Missing Address Table Account” - Solana Stack Exchange
- mainnetではなくdevnetをつかっている?
<2024-04-04 Thu 11:51>
deactivateLookupTableされたテーブルを参照で発生. https://solscan.io/tx/64TWnH6mLu6vs84bDgmZCyPzjGBY1KuHkwd9RfNjP4jj129YUyCbKLFG9hDSYcCKh7g8zGHGmsf4ezuqhL5JGCX5
🔗References
- Cooking with Solana | Solana Cookbook
- SolDev
- チュートリアル: https://www.soldev.app/course
- QuickNode Solana RPC Overview | QuickNode
- https://github.com/helius-labs/solana-awesome, Heliusがいろいろまとめてる.
日本語資料のリンク集があるのでわたしのリンクは不要かも.
GitHub - k-kinzal/solana-materials-in-japanese: Solanaの開発に関わる日本語資料
- Solana での BOT 開発の概要: Solana DeFiのエコシステムまとめ. おすすめ.
- SolanaのWeb3.jsサンプル実装 – myMemoBlog by 256hax
- SolanaのNFTをMintするまで解説 1/4 NFTのデータ構成を把握してToken情報からNFT画像まで辿れるようにする
- SolanaのSPLの書き方を知ろう, Rust.
- Solanaを理解する上で重要な用語5つを噛み砕いてみる
- RustでSolanaのオンチェーンプログラムをデプロイする|cml_2010
- Solana の開発環境の紹介, 2024/12
- squads: https://v3.squads.so/
- 開発支援. Squads simplifies management of developer and treasury assets for on-chain organizations.
- https://solmeet.gen3.network/
- 台湾の教育用資料, ALL FREE!
Clockwork
Solanaのチェーン操作を自動化.
Tour de Whirelpool(2022)
ref. Tour de Whirlpool|yugure.sol
とTypeScriptの日本語チュートリアル.
- https://yugure-sol.notion.site/Tour-de-Whirlpool-afd21607a4b94e3b8e70696ed5e3d8e7
- orca-so/common-sdk: https://github.com/orca-so/orca-sdks/
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
- Learn Rust Basics
- Understand the Solana Programming Model (1/2)
- Learn Anchor
- Skim Open-Source Protocols
- Complete The Full-Stack Guide
- Join the Anchor community
Solana Down
<2024-02-06 Tue>
SOL Slumps Then Recovers as Solana Network Suffers Outage
Insights
✨SolanaのTransactionは状態をもたない抽象データ型に似ている
Solanaの構成要素は, list of instructionsとlist of accounts. これってどっかで見たことがあると思ったら, 📝クラス(OOP)に似ている.
かつてC言語でオブジェクト指向プログラミングをやろうという無謀な試みをしたとき, クラスとは操作抽象のセットとデータ抽象のセットのペアでしかないことを知った.
ただ, Txは状態をもっているわけではない. Explicite Stateではない. するとStateless ADTといえるかもしれない.
✨Solanaのコードとデータを完全に分離するところに強い関数型の野望を感じた
Solanaブロックチェーンの設計思想であるコードとデータを完全に分離する, 不浄なものと聖なるものを分ける思想, これには関数型プログラミングへの強い意志を感じた.
他のほとんどのブロックチェーンとは異なり、Solanaはコードとデータを完全に分離します。 プログラムがやり取りするすべてのデータは個別のアカウントに保存され、instructionsを介して参照として渡されます。