見出し画像

RustからSolanaへの転換

原題:https://solana.com/ja/news/rust-to-solana
24 May 2024, by Solana Foundation

Rustをすでに知っているSolana開発に参入しようとしている開発者は、素晴らしいスタートを切ることができる。Rustは、Solanaのオンチェーンプログラムを書くために公式にサポートされている言語だ。しかし、この言語の使い方にはいくつかの重要な違いがあり、混乱する可能性がある。

この記事では、これらの違いのいくつか、特にセットアップの詳細、制限、マクロの変更、計算の制限について説明する。さらにこの記事では、Solanaを使い始めるために必要な開発環境とフレームワークについても取り上げる。

この記事が終わる頃には、Rust開発者はSolanaの旅を始めるために知っておくべき違いを理解しているだろう。

コアの違いを理解する

まず、この記事の目的は、Solanaで作業する際に言語としてRustを使用することの違いを理解することであることに注意してほしい。ブロックチェーンやSolanaの基本については触れない。

また、Solanaでプログラミングするために理解しておかなければならない、以下のようなSolanaの中核となる概念もカバーしない:

  • プログラム- Solana版スマート・コントラクト

  • アカウント- データを保持する(データアカウント)か、実行可能なプログラムであるSolana元帳のレコード。

  • 各種料金- 基本料金、優先料金、賃料など

  • トランザクション- 指示、署名などを含むネットワークとのやりとり。

これらのコアコンセプトの詳細については、Solana開発者向けドキュメントをご覧ください。

では、プロジェクトのセットアップの違いを見てみよう。

キー設定の詳細

RustのSolana用オンチェーンプログラムは、基本的にRustプログラムのままです。ルートには/srcフォルダとCargo.toml ファイルがあり、標準的なRustプロジェクトに従います。とはいえ、いくつかの重要な違いがあります。

プロジェクトの依存関係

はじめに、Rustで書かれたすべてのオンチェーンSolanaプログラムには、solana-programクレートが必要です。これは、すべてのオンチェーンRustプログラムのベースライブラリです。このライブラリは、必要なプログラムエントリーポイント (下記参照)、コアデータ型ロギングマクロなどのマクロを定義しています。

プログラムのエントリーポイント

メイン関数の代わりに、Solanaプログラムはエントリポイント!マクロを使用する。このシンボルはエクスポートされ、プログラム実行時にSolanaランタイムによって呼び出される。エントリーポイントマクロは、指定された関数を呼び出すが、その関数は以下の型シグネチャを持たなければならない:

   pub fn process_instruction(
        program_id: &Pubkey,
        accounts: &[AccountInfo],
        instruction_data: &[u8],
    ) -> ProgramResult {

        //program code goes here

    }

これら3つのパラメーターは、すべてのオン・チェーン・プログラムに渡される。

  1. program_idは、現在のプログラムの公開鍵である。

  2. 口座とは、指示を処理するために必要なすべての口座である。

  3. instruction_dataは、その命令に固有のデータである。

そして、すべてのプログラムは、次のように、その命令でエントリーポイント!マクロを呼び出さなければならない:

entrypoint!(process_instruction);

建設とテスト

Solanaコマンドラインツールをインストールした後、 cargo buildで通常通りプロジェクトをターゲットホストマシンにビルドできる。

しかし、Solanaランタイムをターゲットにするには、cargobuild-bpfまたはcargo build-spfを 使用します。cargo build-bpfは、Solanaランタイム上で実行するために必要なバイトコードにプログラムをコンパイルします。

ユニットテストは、標準的な#test 属性を持つカーゴテストで実現できる。より統合されたテストのために、solana-program-testクレートは、トランザクションを送信する外部のテストと組み合わせて使用できるローカルSolanaランタイムインスタンスを提供します。

最後に、Solana CLIと一緒にインストールされたsolana-test-validatorを使用して、完全なテストクラスタを開始することができます。これにより、ローカルマシン上に完全な機能を備えたテストクラスタが作成され、プログラムをデプロイしてテストを実行できるようになる。

制限の理解

ほとんどの標準的なRustクレートはSolanaランタイムで利用可能で、サードパーティのクレートもサポートされているが、いくつかの制限がある。Solanaランタイムにはリソース制約があり、決定論的に実行する必要があるため、以下に注意すべき相違点を示す:

パッケージの制限

以下のパッケージは使用できません:

  • rand

  • std::fs

  • std::net

  • std::future

  • std::process

  • std::sync

  • std::task

  • std::thread

  • std::time

以下のパッケージは機能が制限されています:

  • std::hash

  • std::os

Randの依存関係

プログラムは決定論的に実行されなければならないので、rand木枠は使用できない。randに依存する追加クレートを使用すると、コンパイル・エラーも発生する。

しかし、使用するcrateが単にrandに依存しているだけで実際には乱数を生成していない場合は、プログラムのCargo.tomlに以下を追加することで回避することができる:

getrandom = { version = "0.1.14", features = ["dummy"] }

マクロの変化

いくつかの標準マクロが置き換わったり、動作が変更されたので注意が必要です。まず、 println!マクロは、計算がより単純なmsg!マクロに置き換えられました。msg!マクロはプログラム・ログに出力され、以下のように使用できます:

msg!(“Your message”);
msg!(0_64, 1_64, 2_64);
msg!(“Your variable: {:?}”, variable);

デフォルトでは、panic!しかし、これはカスタムパニックハンドラで変更することができます。

予算を計算する

Rust開発者として、効率的なコンピューティングは目新しいものではない。Solanaでは、各トランザクションには超過してはならない固定の計算バジェットがある。トランザクションが計算バジェットを超えると、停止してエラーを返す。

プログラムは、sol_remaining_compute_unitsシステムコールを使って残りの計算ユニット数にアクセスすることができ、sol_log_compute_unitsを使って残りの計算ユニット数を記録することができます。

開発環境とフレームワークを学ぶ

Solana CLIとsolana_programcrateが使い始めるのに必要なものすべてだが、学習を加速させる便利なツールがいくつかある。

Solana Playground

Solana PlaygroundはブラウザベースのIDEで、開発者はSolanaプログラムを開発し、デプロイすることができる。

Solanaで開発を始める最も簡単な方法で、Solana Rustプログラムのビルド、テスト、デプロイをサポートする。さらに、学習の手引きとなる組み込みのチュートリアルが多数用意されている。

Anchorの使用

Anchorは、セキュアなSolanaプログラムの構築を加速するフレームワークである。標準的な定型コードを処理することで、開発サイクルをスピードアップすることができる。さらに、デフォルトでいくつかのセキュリティチェックを提供し、Solanaプログラムをよりセキュアにします。

新しいプログラムを作成するには、Solana Playgroundで新しいアンカー・プロジェクトを作成するだけだ:

あるいは、Anchor CLIをローカルにインストールし、anchor init <プロジェクト名>を使って新しいAnchorプロジェクトを作成します。

オフ・チェーン・プログラムの作成

ここまでの記事で、RustでオンチェーンのSolanaプログラムを開発するための主要な詳細を説明した。しかし、RustでオフチェーンのSolanaクライアントを開発することも可能だ。これには、solana_sdkクレートを使用します。このクレートにはsolana_clientクレートが含まれており、RustプログラムがJSON RPC APIを介してSolanaノードとやり取りできるようになっている。

Anchorで書かれたSolanaプログラムとRPCでやりとりするanchor_clientクレートを使う方法もある。あるいは、オンチェーンのプログラムをRustで書き、オフチェーンのクライアントをJS/TSで書くことも検討しよう。

まとめ

この記事では、セットアップの詳細や制限事項から、開発環境やフレームワークまで、Rustを使ったSolana向け開発の基本を解説した。すべてを実践する準備はできましたか?最初のSolanaプログラムを書くRust開発者向けのガイドをチェックしてください。

Rust関連のSolanaリソースについては、Developing with Rustのページをご覧ください。Rustで書かれた他のSolanaプログラム例については、GitHubのこれらの例をチェックしてください。

Solana開発についてもっと知る

開発入門

開発コース

ブートキャンプ

その他の開発者ツール


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