---
title: "Solanaスマートコントラクト完全ガイド"
description: "Solana上でネイティブスマートコントラクトを開発するために必要な情報"
---

# Solanaスマートコントラクト完全ガイド

Solanaはスマートコントラクト開発に重点を置くブロックチェーンプラットフォームであり、既存のブロックチェーンが抱える課題への対応を目指している。NFTやDeFiプロジェクトを含む、さまざまなブロックチェーンプロジェクトをホストしている。

[Solanaエコシステム](https://www.alchemy.com/dapps/solana)は、非常に低い取引手数料と高いスケーラビリティにより、近年人気を集めている。Solanaを際立たせているのは、プルーフ・オブ・ステークのコンセンサスアルゴリズムと独自のプルーフ・オブ・ヒストリーメカニズムを組み合わせている点であり、開発者に[NFTプラットフォーム](https://www.alchemy.com/list-of/nft-marketplaces-on-solana)や[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)などを構築するための汎用性の高いネットワークを提供している。

この記事では、Solanaスマートコントラクトの仕組み、Solanaプログラムの作成とデプロイの方法、および必要なツールについて説明する。さらに、Solanaスマートコントラクトのチュートリアル、サンプル、リポジトリ、開発者ツール、リソースをいくつか確認し、始める際の助けとする。

## **Solanaスマートコントラクトとは**

Solanaスマートコントラクトはプログラムとも呼ばれ、命令を解釈し合意の条件を確立するコードである。多くの開発者は、比較的低い取引手数料により、Solanaスマートコントラクトを[Ethereumスマートコントラクト](https://www.alchemy.com/overviews/solidity-smart-contract)の実用的な代替手段と見なしている。

スマートコントラクトにより、開発者はブロックチェーンのセキュリティ、信頼性、アクセシビリティを活用しつつ、融資や保険からロジスティクスやゲームに至るまで、高度なピアツーピア機能を提供するアプリを作成できる。

Solanaスマートコントラクトはさまざまなプログラミング言語で記述できる。[Rustがネイティブなソラナのスマートコントラクト言語](https://www.alchemy.com/dapps/rust)である一方、プロトコルはサードパーティのJSON RPC API SDKクライアントを介してC++、Solidity、その他の言語でのスマートコントラクト開発もサポートしている。

### **Solanaスマートコントラクトのアーキテクチャ**

[Solana](https://www.alchemy.com/solana)は、従来のEVMベースのブロックチェーンとは異なるスマートコントラクトモデルを使用している。従来のブロックチェーンではコードと状態が単一のコントラクトに統合されているのに対し、Solanaスマートコントラクトはステートレスであり、プログラムロジックのみを含む。

[Solanaのアーキテクチャ](https://www.alchemy.com/overviews/solana-evm)は、ブロックチェーンの実装に組み合わせた際にソフトウェアがパフォーマンスのボトルネックとなることを排除し、トランザクションスループットがネットワーク帯域幅に比例してスケールできるようにする、一連のソフトウェアアルゴリズムの存在を示すことを目指している。

アプリとの連携を強化するため、Solanaはコマンドラインインターフェース（CLI）とJSON RPC APIも備えている。アプリは既存のSDKを使用して、ブロックチェーンやSolanaプログラムと連携することもできる。

_Solanaの検証プロセスの図_

### **Solanaのプルーフ・オブ・ヒストリーメカニズム**

Solanaは、[プルーフ・オブ・ステークとプルーフ・オブ・ヒストリーを組み合わせる](https://www.alchemy.com/docs/what-are-blockchain-consensus-mechanisms)ことでブロックチェーンのスケーラビリティを向上させることを目指している。Tower Byzantine Fault Tolerant（BFT）システムを使用しており、ノード同士がリアルタイムで通信する必要をなくすことで、効率性を高め、毎秒50,000トランザクション（TPS）という高いトランザクションレートを実現している。

その結果、Solanaは分散性を維持しながら高い取引量を処理できる。Solanaは200の[検証ノード](https://www.alchemy.com/overviews/dedicated-vs-shared-nodes)の助けを借りて400ミリ秒ごとに新しいブロックを作成し、その間も取引手数料を1ドル未満に保っている。

Solanaはスケーラビリティの高さと取引速度の速さで知られている。Solanaネットワークはコアレベルでスケーラブルであるため、スケーラビリティを高めるためにレイヤー2ソリューションを必要としない。

Solanaネットワークの技術はデータをより小さなチャンクに分割し、ネットワーク上でのデータ転送を容易にする。Solanaはまた、GPUやSSDにわたるトランザクション処理を支援するためにSealevelを使用し、効率的なブロックチェーンネットワークを実現している。

‍

_画像提供：Solana Labs_

‍

### **SolanaプログラムとEthereumスマートコントラクトの違いとは**

Ethereumのスマートコントラクトは[Solidityプログラミング言語](https://www.alchemy.com/overviews/solidity)で記述されるのに対し、Solanaのスマートコントラクトは主にRustで記述され、プログラムと呼ばれる。これらはステートレスであり、プログラムロジックのみを表す。

両者の最も重要な違いは、採用されているコンセンサスメカニズムにある。**Ethereumはプルーフ・オブ・ステーク（PoS）を使用しており、より分散化された省エネルギーなネットワークを目指している。一方、Solanaはプルーフ・オブ・ヒストリー（PoH）を利用しており、これは速度と効率性を優先する独自のアプローチで、高速かつ低コストなトランザクションを実現する。**

Solanaプログラムは完全にコードのみで構成されており、データを含まない。すべてのデータは入力として供給される。この分離された設計により、Solanaプログラムの多くのコピーが異なる入力に対して並列に実行できるようになり、高いパフォーマンスが実現される。言い換えると、複数のユーザーアカウントから同一のSolanaプログラムへのトランザクションを同時に発生させることができる。これは、Solanaを高度にスケーラブルにしている特徴の一つである。

## **Solana上でスマートコントラクトを作成する方法**

このセクションでは、Solana上でスマートコントラクトを作成するために必要な手順を詳しく説明する。プロセスを順を追って案内し、始めるために必要なすべての情報を提供する。

### **前提条件**

- Solanaの仕組みについての最低限の知識
- 下記のセットアップセクションに従ってインストールされたAnchorとRust
- 学ぶ意欲

### **ステップ1：Rust、Solana、yarn、anchorをインストールする**

Solanaの開発環境をセットアップすることから始めよう。

#### Rustのインストール

まず、Solanaプログラムで使用されるプログラミング言語であるRustをインストールする。

以下のコマンドを使用して、RustとRustコンパイラが正しくインストールされたかを確認する。

Rustのパッケージマネージャーであるcargoもインストールされているはずである。以下のコマンドを実行し、cargoが正しくインストールされたことを確認する。

RustupはRustをインストールおよび更新するツールである。

RustcはRustプログラミング言語のコンパイラであり、Rustプログラムを現行のすべてのオペレーティングシステムで実行可能にする。

Cargoは、Rustプログラミング言語のビルドシステムおよびパッケージ管理を行うツールである。

#### Solanaのインストール

インストールがパスの変更を求めてきた場合は、指示に従うこと。

#### node.jsのインストール

[公式サイト](https://nodejs.org/)にアクセスしてNode.jsをダウンロードし、使用しているオペレーティングシステムに適したバージョンを選択すること。

以下のコマンドを実行して、Node.jsがインストールされたことを確認できる。

#### yarnのインストール

Yarnはnpmのようなパッケージマネージャーである。

Yarnのバージョンを確認する。

#### anchorのインストール

[Anchor](https://www.alchemy.com/overviews/solana-anchor)は、Solanaの Sealevel ランタイム向けのフレームワークであり、いくつかの有用な開発者ツールを提供する。

Anchorをインストールするには、以下のコマンドを実行する。

その後、インストールを確認する。

### **ステップ2：プロジェクトをセットアップする**

このセクションでは、Solana CLIをdevnetに設定し、anchorフレームワークを使ってプロジェクトを初期化する。実際のデプロイをシミュレートするため、[Solana Devnet](https://www.alchemy.com/overviews/solana-devnet)にデプロイする。

続行するには、ターミナルで以下のコマンドを実行する。

次のステップでは、プログラムの実行と配布に必要なウォレットを作成する。

以下のコマンドで公開鍵（pubkey）を取得する。

その後、以下のコマンドを実行してアドレスを照会できる。

続いて、開発用の[testnet SOL](https://www.alchemy.com/overviews/solana-faucet)が必要になる。以下のコマンドを使用して、ウォレットにエアドロップできる。

以下のコマンドを実行すると、残高が表示される。

以下のコマンドを実行してAnchorプロジェクトを初期化しよう。このコマンドにより、プロジェクトに必要なすべてのフォルダと追加の依存関係が作成される。

### ステップ3：最初のHelloWorldプログラムを書く

プロジェクト構造には、以下のファイルとフォルダが表示される。

- **program** — すべてのSolanaプログラムを含むディレクトリ
- **test** — JavaScriptのテストコード用フォルダ
- **migrations** — プログラムのデプロイスクリプト
- **app** — フロントエンドを構築するための場所

lib.rsはSolanaプログラムの出発点となるメインファイルであることを覚えておいてほしい。以下に示すように、いくつかのスターターコードが含まれている。

Rustの動作を見ていこう。
Rustの最初のコード行は依存関係やライブラリをインポートする。この場合はanchorライブラリをインポートしている。

Solanaはアドレス、つまりプログラムIDをdeclare_Id変数に格納する。Anchorはデフォルトでプログラムのために プログラムID を作成する。

次はプログラムセクションで、プログラムのロジックが存在する場所である。

最後のセクションはderive Accountsセクションで、アカウント構造体が存在する場所である。

initialize構造体はinitialize関数のコンテキストを定義しており、構造体は構造を宣言するために使用される。Rustでメソッドを定義する方法は、他のプログラミング言語とは異なる。コードとデータを分離できることは、Solanaの主要なセールスポイントの一つである。

Hello World Solanaプログラムに踏み込んでみよう。Solanaプログラムは、Solanaネットワーク上でデータを保存し命令を実行できる特殊なアカウントに過ぎないことを念頭に置いてほしい。Solanaプログラム向けの標準ライブラリのようなsolana-programクレートを使用する。基本的なプログラムを作るには、solana-programクレートからいくつかの要素を使う必要がある。

最初のセクションでは、Binary Object Representation Serializer for hashingの略であるBorshを使用している。Borshは、デプロイされたプログラムとの間でやり取りされるパラメータのシリアライズおよびデシリアライズに使用される。AccountInfoはaccount_infoモジュール内の構造体で、アカウント情報へのアクセスを提供する。entrypointはプログラムのエントリーポイントを宣言する。

entrypointモジュール内のProgramResultは、ProgramReportまたはProgramErrorを返す。最後に、もう一つのマクロであるmsgは、プログラムログにメッセージを出力する機能を持ち、一方でpubkey構造体はアドレスを公開鍵としてアクセスすることを可能にする。

上記のコードスニペットは、アカウントに格納される状態の種類と、挨拶の回数を参照する32ビット符号なし整数型であるcounter u32を定義している。

上のコードの最初の行に見られるように、Solanaプログラムはプログラム命令を処理するためにentrypointマクロを必要とする。entrypointには、hello worldプログラムを生成するアカウントの公開鍵であるprogram_id引数を持つprocess_instruction関数が必要である。accounts引数は挨拶を送る対象のアカウントであり、instruction_data引数には追加の入力が含まれる。ProgramResultは「Hello World Rust Program」というメッセージを出力する。

'let'文は挨拶対象のアカウントを取得する。'if'文は、データが変更されるためにはプログラムがそのアカウントを所有していなければならないという条件を示している。

'let'文は挨拶対象のアカウントを取得する。'if'文は、データが変更されるためにはプログラムがそのアカウントを所有していなければならないという条件を示している。

## **Solana上でスマートコントラクトをデプロイする方法**

このセクションでは、Solana上でスマートコントラクトをデプロイする手順を概説する。

### **ステップ1：Solanaプログラムをテストする**

テストを実行するには、以下のコマンドを実行する。

これにより、特定のクラスタに対してプログラムがビルド、デプロイ、テストされる。

### **ステップ2：Devnetへのデプロイ**

ライブネットワークへのデプロイは簡単だが、まずDevnet上にいることを確認する必要がある。

Anchor.tomlを見つけ、クラスタをdevnet（_cluster = "devnet"_）に更新する。

以下のコマンドを実行してプログラムをビルドする。

最後に、プログラムをデプロイする。

### **ステップ3：Solana explorerで確認する**

次に、[Solana Devnet explorer](https://www.alchemy.com/dapps/solana-explorer)でプログラムを認証し、プログラムIDを入力することでデプロイが正常に行われたことを確認する。history セクションの下にデプロイログが表示されるはずである。

## **Solanaスマートコントラクトのチュートリアル**

スマートコントラクトの仕組みについてしっかりと理解できたところで、Solana開発アーキテクチャの動作を習得するための実践プロジェクトに取り組もう。ここで構築するプロジェクトは、NFTをミントするためのSolanaスマートコントラクトである。NFTをミントする方法はいくつかあり、その一つが[Metaplex candy machine](https://www.alchemy.com/overviews/metaplex)の使用である。NFTはスマートコントラクトの最も人気のあるユースケースの一つである。

このセクションでは、以下の内容を学ぶ。

- Solana CLIユーティリティをDevnetで使用するよう設定する方法や、その他のSolanaで有用なコマンド
- Rustでより複雑なプログラムを書く方法
- anchorフレームワークでプロジェクトを初期化する方法
- Rustの変数と構文の理解

必要な要件は以下のとおりである。

- [NodeJS v14](https://nodejs.org/)
- [NPM](https://nodejs.org/)
- 最新の安定版[Rust](https://rustup.rs/)ビルド
- [Solana CLI](https://docs.solana.com/cli/install-solana-cli-tools) v1.7.11以降
- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)

### **クイックセットアップ**

以下のコマンドを使用して、SolanaがDevnetネットワークで動作するように開発環境を設定する。

次に、以下のコマンドを使用して、プログラムの実行とデプロイに必要なウォレットを生成する。

ウォレットを保護するためのパスワードの入力を求められる。その後、12個の単語の組み合わせであるニーモニックが表示される。

続いてアドレスを確認できる。

その後、以下のコマンドを実行し、アドレスに4 testnet SOLをエアドロップする。

4 testnet SOLをエアドロップした後、以下のコマンドを実行して残高を確認する。

SolanaをDevnetネットワークで動作するように設定し、新しいウォレットを作成したところで、Anchorプロジェクトを作成し、すべてのフォルダと煩雑な設定を管理させよう。ターミナルで以下のコマンドを入力する。

### **Solanaスマートコントラクト**

スマートコントラクトに入る前に、SPLトークンとやり取りするために使用するspl-token CLIをセットアップする必要がある。ターミナルで以下のコマンドを実行することで行うことができる。

solana sdkとsolana-programをインストールする。

programsフォルダ内にlib.rsファイルがあることに気づくはずである。ここにSolanaプログラムを書いていく。前述の通り、lib.rsに与えられているデフォルトのものをベースに構築していく。以下のようなものが表示されるはずである。

ここでは、コードの冒頭で使用するツールをインポートした。

### **プログラムのロジックを定義する**

mint（_mint_nft_）を作成するために_mint_authority_を使ってプログラムに権限を与え、それにトークンアカウント（_mint_token_account_）を割り当てる。次に、先ほどインポートしたtoken_programとassociated_token_programを使用する。

Authorityとは、そのアカウントがより多くのトークンをミントしたり、より多くの通貨を発行したりできることを意味する。通常はウォレットアカウントによって作成される。mint authorityが自身の権限を放棄することでmintアカウントを不変にできるため、これはオプションである。

### **mintアカウントの作成**‍

### tokenアカウントの作成‍

### **mint関数を書く**

次に、上で作成したトークンアカウントにNFTをミントする。

### **プログラムのデプロイ**

これで、[Anchorフレームワーク](https://book.anchor-lang.com/chapter_1/introduction.html)を使用してNFTミント用のSolanaプログラムをビルドする準備が整った！

ビルドプロセスは、プログラムのアカウント用の鍵ペアを生成する。プログラムをデプロイする前に、この公開鍵をlib.rsファイルに追加する必要がある。これはAnchorを使用するプログラムに必須である。これを行うには、以下のコマンドを使用して、Anchorによって生成された*keypair.json*ファイルから鍵ペアを取得する必要がある。

次のステップは、lib.rsファイルを編集し、declare_id!()定義内の鍵ペアを、前のステップで取得した値に置き換えることである。

次に、取得したProgram IDの値を、Anchor.tomlファイル内のchainlink_solana_demo devnetの定義に挿入する必要もある。

鍵ペアを新しいIDに置き換えたため、Anchorを使ってプログラムを再度ビルドする必要がある。

最後に、プログラムをデプロイできる。

プログラムが正常にデプロイされると、ターミナルの出力にプログラムIDが表示される。これは、lib.rsおよびAnchor.tomlファイルに入力した値と一致するはずである。

デプロイされたコントラクトは、[Solana Devnet Explorer](https://explorer.solana.com/?gclid=Cj0KCQjwrs2XBhDjARIsAHVymmSWzZUrpjd-p9ig67Yk6KUWGlQQxDzcQjrtthpJOeQzpbyncko35AMaAs22EALw_wcB&cluster=devnet)でも確認できる。

_Solana Devnet explorer上に表示されたデプロイ済みコントラクト。_

## **Solanaスマートコントラクトのサンプルとリポジトリ**

Solana開発の道のりで大いに役立つ、Solanaスマートコントラクトのサンプルやリポジトリが数多く存在する。以下にその一部を紹介する。

### **1. Hello worldスマートコントラクト**

[Hello Worldスマートコントラクト](https://www.alchemy.com/docs/how-to-deploy-a-smart-contract-to-the-sepolia-testnet)は、AnchorとRustを使用した実践的なSolanaプログラムのサンプルを提供する。Solanaでスマートコントラクトやアプリを構築するための段階的なアプローチに従っている。また、オンチェーンプログラムの使用、ビルド、デプロイのためのサンプルコードも提供している。

### **2. シンプルなSolanaプログラム**

[Simple Solana Program](https://github.com/ezekiiel/simple-solana-program)はHello Worldの例と機能的に関連している。Solanaブロックチェーン上でプログラムを作成し呼び出す方法を示している。この例では、Solanaプログラムが実行された回数をカウントし、その情報をオンチェーンに保存する。

### **3. Awesome Solana**

[Awesome Solana](https://github.com/avareum/awesome-solana)は、初心者から上級のSolana開発者向けのリソースを含む詳細なライブラリである。Solana開発、Solanaトランザクション、Solanaライブラリに関するリソース、Solanaプログラムの動作についての解説、学習を助ける動画例を提供している。

### **4. Break Solana**

[Break Solana](https://github.com/solana-labs/break)は、Webクライアントのフロントエンド、Webサーバーのバックエンド、およびオンチェーンのSolanaプログラムから構成されるゲームである。Break Solanaゲームでは、プレイヤーがシンプルなスマートコントラクトのトランザクションをできる限り速く送信し、Solanaの速度を実証できる。

## **プログラムを書くためのSolana開発者ツールとリソース**

Solana上でプログラムを書く際に役立つ、学習リソースと[開発者ツール](https://www.alchemy.com/overviews/solana-developer-tools)のコレクションがある。

### **1. Solana playground**

[Solana Playground](https://beta.solpg.io/)は、独自のニーズに応じてSolanaトランザクションを完全にカスタマイズできる非常に簡単な方法をユーザーに提供し、ブロックチェーンシステムとのやり取りを可能にする。コンピュータプログラム開発の経験がない人でも、Solana Playgroundを使ってブロックチェーンの動作をより深く理解できる。[プロジェクトのリポジトリ](https://github.com/Solana-Playground-Labs/solana-playground-app)はGithubで公開されている。

### **2. Start on Solana**

[Start on Solana](https://www.startonsolana.com/)は、Solana上での構築や[Solanaエコシステム](https://www.alchemy.com/dapps/ecosystem/solana)への貢献に関するガイダンスを提供する。JavaScriptでのSolana上のNFT作成から、JavaScriptを使った暗号通貨のミントや作成まで、JavaScriptとRustでのさまざまなクエストを提供している。

### **3. Solana cookbook**

[Solana Cookbook](https://solanacookbook.com/)は、Solana上でアプリケーションを構築するための基本的な概念やリファレンスを提供する開発者向けリソースである。Solana開発に重点を置きつつ、開発者向けに数多くの例を提供している必須のリソースである。

### **4. Sol dev course**

[Sol Dev Course](https://soldev.app/course)は、Solana開発の体験を簡素化するために設計されており、Solanaでの構築を始める初心者にとって最良の場所の一つとなっている。活発なコミュニティも備えており、メンバーが他のweb3開発者を助けるコンテンツを投稿できる。

### **5. buildspaceによる、reactとRustでSolana上にWeb3アプリを構築する**

[Buildspace](https://buildspace.so/p/build-solana-web3-app)は、Solana開発の旅を始めるとともに、マイルストーンを完了することでNFTを獲得できる素晴らしいコミュニティである。インタラクティブなコースは、Solana上で素早く何かを構築したい初心者に最適である。

## **Solanaプログラムを書き始める**

ブロックチェーンとスマートコントラクトの世界を進んでいくのは複雑になり得るが、Solanaのようなプラットフォームは、より効率的でスケーラブル、かつ費用対効果の高いソリューションへの道を切り開いている。このガイドでは、Solanaのスマートコントラクト開発への独自のアプローチについて包括的に概説し、その独特なアーキテクチャ、コンセンサスメカニズム、そして開発者が利用できるツールに焦点を当てた。

経験豊富な開発者であっても、ブロックチェーンの世界に足を踏み入れたばかりであっても、Solanaはイノベーションのための有望な道を提供する。ブロックチェーンの状況が進化するにつれ、Solanaのようなプラットフォームは、分散型アプリケーションとより広いweb3エコシステムの未来を形作る上で、間違いなく重要な役割を果たすだろう。ぜひ飛び込み、実験し、次のプロジェクトでSolanaの力を活用してほしい。
