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