見出し画像

【完全保存版】Rustエンジニアさん、Solana始めませんか?

当記事は、こちらの記事を翻訳・編集したものです。

0 はじめに

Solana開発に取り組もうとしているRustを知っている開発者は、すでに大きなアドバンテージを持っています。

RustはSolanaのオンチェーンプログラムを書くための公式にサポートされている言語です。

しかし、言語の使用におけるいくつかの重要な違いがあり、これが混乱を招くことがあります。

この記事では、セットアップの詳細、制限、マクロの変更、コンピュート制限について、それらの違いを詳しく説明します。また、Solanaでの開発を始めるために必要な開発環境とフレームワークについても触れます。

この記事を読み終える頃には、Rust開発者はSolanaでの開発を始めるために知っておくべき違いを理解できるでしょう。

1 核心の違いを理解する

まず、この記事はSolanaでRustを使う際の違いを理解することを目的としています。ブロックチェーンやSolanaの基本については触れません。

また、Solanaでのプログラミングに必要な以下の基本概念についてもカバーしません:

  • プログラム:Solanaのスマートコントラクト

  • アカウント:Solanaの台帳に記録されたデータを保持するデータアカウントまたは実行可能なプログラム

  • 各種手数料:基本手数料、優先手数料、レンタル料など

  • トランザクション:命令、署名などを含むネットワークとのやり取り

これらの基本概念については、Solanaの開発者ドキュメントを参照してください。

それでは、プロジェクトのセットアップの違いを見ていきましょう。

2 セットアップの重要な詳細

Rustで書かれたSolanaのオンチェーンプログラムも、基本的にはRustプログラムです。

標準のRustプロジェクトと同じく、/srcフォルダとルートにCargo.tomlファイルがあります。しかし、いくつかの重要な違いがあります。

1 プロジェクト依存関係

まず始めに、solana-programクレートが必要です。

https://crates.io/crates/solana-program

これはすべてのオンチェーンRustプログラムのための基本ライブラリです。

必要なプログラムエントリポイントのマクロ、コアデータタイプロギングマクロなどを定義しています。

2 プログラムエントリポイント

main関数の代わりに、Solanaプログラムはentrypoint!マクロを使用します。

このシンボルはエクスポートされ、プログラムが実行されるときにSolanaランタイムによって呼び出されます。

entrypoint!マクロは以下のような型シグネチャを持つ関数を呼び出します。

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

  • program_idは現在のプログラムの公開鍵です。

  • accountsは命令を処理するために必要なすべてのアカウントです。

  • instruction_dataは、その命令に固有のデータです。

すべてのプログラムは、以下のように命令にentrypoint!マクロを呼び出す必要があります。

3 ビルドとテスト

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

しかし、Solanaランタイムをターゲットにするためには、cargo build-bpfまたはcargo build-sbfを使用して、Solanaランタイムで実行するためのバイトコードにコンパイルする必要があります。

補足 こちら、参考です。

https://stackoverflow.com/questions/74246140/difference-between-cargo-build-cargo-build-bpf-and-cargo-build-sbf

単体テストは、標準の#test属性を持つcargo testで実行できます。

より統合されたテストのために、solana-program-testクレートローカルのSolanaランタイムインスタンスを提供し、外部のテストでトランザクションを送信することと組み合わせて使用できます。

https://crates.io/crates/solana-program-test

最後に、solana-test-validatorを使用してフル機能のテストクラスターを開始できます。

これはSolanaCLIと共にインストールされ、ローカルマシンで完全なテストクラスターを作成し、プログラムをデプロイしテストを実行できます。

3 制限事項の理解

Solanaランタイムでは、ほとんどの標準Rustクレートが利用可能であり、サードパーティクレートもサポートされていますが、いくつかの制限があります。

Solanaランタイムにはリソース制約があり、決定論的に実行される必要があるため、次の違いに注意する必要があります:

1 パッケージ制限

以下のパッケージは利用できません。

  • rand

  • std::fs

  • std::net

  • std::future

  • std::process

  • std::sync

  • std::task

  • std::thread

  • std::time

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

  • std::hash

  • std::os

2 Rand依存関係

プログラムは決定論的に実行される必要があるため、randクレートは使用できません。

randに依存する追加のクレートを使用すると、コンパイルエラーが発生します。

ただし、使用するクレートがrandに依存しているが実際には乱数を生成しない場合、次のようにプログラムのCargo.tomlに追加することで回避可能です。

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

3 マクロの変更

いくつかの標準マクロが置き換えられたり、動作が変更されています。

まず、println!は計算コストが低いmsg!マクロに置き換えられています。

msg!マクロはプログラムログに出力し、次のように使用できます。

panic!、assert!、および内部のパニックデフォルトでプログラムログに出力されますが、カスタムのパニックハンドラでこれを変更することも可能です。

4 コンピュートバジェット

Rust開発者にとって効率的なコンピューティングは珍しいことではありません。しかし、Solanaでは、各トランザクションには超えてはならない固定のコンピュートバジェットがあります。

トランザクションがコンピュートバジェットを超えると中断されてエラーが返されます。

プログラムはsol_remaining_compute_unitsシステムコールを使用して残りのコンピュートユニット数にアクセスできます。

https://github.com/solana-labs/solana/blob/27eff8408b7223bb3c4ab70523f8a8dca3ca6645/sdk/program/src/program_stubs.rs#L33

sol_log_compute_unitsを使用して残りのコンピュートユニット数をログに記録できます。

https://github.com/solana-labs/solana/blob/27eff8408b7223bb3c4ab70523f8a8dca3ca6645/sdk/program/src/log.rs#L160

4 開発環境とフレームワークの学習

SolanaCLIsolana_programクレートだけで開発を始めることはできますが、学習を加速するのに役立つツールがいくつかあります。

1 Solanaプレイグラウンド

Solanaプレイグラウンドは、Solanaプログラムの開発とデプロイを可能にするブラウザベースのIDEです。

https://beta.solpg.io/

Solana開発を始める最も簡単な方法であり、SolanaRustプログラムのビルド、テスト、デプロイをサポートします。さらに、学習をガイドするための組み込みチュートリアルがいくつかあります。

2 Anchorの使用

Anchorは、セキュアなSolanaプログラムの構築を加速するフレームワークです。

標準的なボイラープレートコードを処理し、開発サイクルを高速化するのに役立ちます。また、デフォルトでいくつかのセキュリティチェックを提供し、Solanaプログラムをよりセキュアにします。

新しいプログラムを作成するには、Solanaプレイグラウンドで新しいAnchorプロジェクトを作成するか

ローカルにAnchor CLIをインストールし、次に anchor init <project-name> を使用して新しいAnchorプロジェクトを作成します。

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

これまでに、RustでのオンチェーンSolanaプログラムの開発に関する重要な詳細を説明しましたが、オフチェーンのSolanaクライアントをRustで開発することも可能です。

これは solana_sdk クレートを使用することで行うことができます。

https://docs.rs/solana-sdk/latest/solana_sdk/

これには、JSON RPC APIを介してSolanaノードとやり取りするRustプログラムを可能にする solana_client クレートが含まれています。

もう一つのオプションは、anchor_client クレートを使用して、RPCを介してAnchorで書かれたSolanaプログラムとやり取りすることです。

また、オンチェーンプログラムをRustで書き、オフチェーンクライアントをJS/TSで書くことも検討できます。

6 まとめ

この記事では、Rustを使用してSolanaで開発するための基本をカバーしました。

セットアップの詳細や制限事項、開発環境とフレームワークについて説明しました。これらの知識を実践に移す準備ができましたか?

Rust開発者が最初のSolanaプログラムを書くためのガイドをチェックしてみてください。

Rust関連のSolanaリソースについては、「Developing with Rust」ページをチェックしてください。

また、Rustで書かれた他のSolanaプログラムの例については、GitHubのこれらの例を確認してください。

この情報を元に、Solana開発を進めてください。幸運を祈ります!

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊