Solanaブロックチェーン上でのプログラム開発には、いくつかの固有の制限があります。以下は、遭遇する可能性のある一般的な制限のリストです。
Rustライブラリ
Rustベースのオンチェーンプログラムは、リソースに制約のある単一スレッド環境で実行される際に決定論的である必要があるため、様々なライブラリに関していくつかの制限があります。
オンチェーンRustプログラムは、Rustのlibstd、libcore、liballocのほとんどをサポートしており、多くのサードパーティのクレートも利用できます。
これらのプログラムはリソースが制限された単一スレッド環境で実行され、また決定論的である必要があるため、いくつかの制限があります:
- アクセス不可:
randstd::fsstd::netstd::futurestd::processstd::syncstd::taskstd::threadstd::time
- 制限付きアクセス:
std::hashstd::os
- Bincodeはサイクル数と呼び出し深度の両方において計算コストが極めて高いため、使用を避けるべきです
- 文字列フォーマットも計算コストが高いため、使用を避けるべきです
println!、print!はサポートされていません。代わりにmsg!マクロを使用してください- ランタイムは、1つのinstructionの処理中にプログラムが実行できるinstructions数に制限を設けています。詳細は計算予算を参照してください
計算予算
ブロックチェーンの計算リソースの乱用を防ぐため、各トランザクションには計算予算が割り当てられています。この計算予算を超えると、トランザクションは失敗します。
より具体的な詳細については、計算制約のドキュメントを参照してください。
コールスタック深度 - CallDepthExceededエラー
Solanaプログラムは迅速に実行されるよう制約されており、これを容易にするため、プログラムのコールスタックは最大深度64フレームに制限されています。
プログラムが許可されたコールスタック深度の制限を超えると、CallDepthExceededエラーが発生します。
CPI呼び出し深度 - CallDepthエラー
クロスプログラム呼び出しにより、プログラムは他のプログラムを直接呼び出すことができますが、現在その深度は4に制限されています。
プログラムが許可されたクロスプログラム呼び出しの深度を超えると、CallDepthエラーが発生します
Rustの浮動小数点型のサポート
プログラムはRustの浮動小数点演算の一部のみをサポートしています。プログラムがサポートされていない浮動小数点演算を使用しようとすると、ランタイムは未解決のシンボルエラーを報告します。
浮動小数点演算はソフトウェアライブラリ、特にLLVMの浮動小数点ビルトインを通じて実行されます。ソフトウェアエミュレーションのため、整数演算よりも多くのコンピュートユニットを消費します。一般的に、可能な限り固定小数点演算が推奨されます。
Solana Program Library math テストでは、いくつかの数学演算のパフォーマンスが報告されます。テストを実行するには、リポジトリを同期して次を実行します:
cargo test-sbf -- --nocapture --test-threads=1
最近の結果では、浮動小数点演算は整数演算と比較してより多くの命令を必要とすることが示されています。固定小数点の実装は異なる場合がありますが、浮動小数点の同等の演算よりも少ない命令数になります:
u64 f32Multiply 8 176Divide 9 219
静的な書き込み可能データ
プログラム共有オブジェクトは書き込み可能な共有データをサポートしていません。プログラムは同じ共有読み取り専用コードとデータを使用して複数の並列実行間で共有されます。これは、開発者がプログラムに静的な書き込み可能変数やグローバル変数を含めるべきではないことを意味します。将来的には、書き込み可能データをサポートするためにコピーオンライト機構が追加される可能性があります。
符号付き除算
SBF命令セットは符号付き除算をサポートしていません。
Is this page helpful?