2021.10.08

ソラナ(Solana)ブロックチェーン及び ソラナ上のトークンの発行について

はじめに

こんにちは、次世代システム研究室のB.M.Kです。
ブロックチェーンテクノロジーにてスケーラビリティは最大の課題の1つです。 ネットワークが成長するにつれて、トランザクションの処理速度とブロック承認時間は制限に直面することがよくあります。 ソラナ(Solana)は、セキュリティや分散化を損なうことなく、これらの制限に取り組むことを目指しています。

ソラナブロックチェーンの概要

ソラナは2017年に設立された高速トランザクションと高スループットに重点を置いたブロックチェーンネットワークです。 ビットコイン、イーサリアム、および他の多くのプロジェクトが悩まされているスケーラビリティの問題に対してソラナはトランザクションを順序付ける独自の方法(Proof of History)を使用して、速度を向上させることを図っています。その手法を利用することによって、ソラナブロックチェーンは1秒あたり数万のトランザクションを処理できるようになっています。また、ソラナは自分のネットワークのネイティブ暗号通貨であるSOLを持って、ネットワークのユーザがSOLを利用して、トークンの生成、送受信、そしてスマートコントラクトとのやり取り等の取引の手数料を支払うことができます。

ソラナの特徴

ソラナブロックチェーンの特徴と言えば以下の通り主な三つの特徴があります。

処理速度が速く、取引コストも安い

トランザクション処理速度や取引コストが多くのブロックチェーンよりも大幅に優れています。例えば、主要な仮想通貨であるビットコインやイーサリアムと比較すると、次のようになります。


表1: 主要な仮想通貨との比較  (出典:インターネット)

レイヤー1ブロックチェーン

イーサリアムなどでは、スケーラビリティ問題の解決策の一つとして、レイヤー2ソリューション(基盤となるメインブロックチェーンネットワーク(レイヤー1)の上にあるオーバーレイネットワーク(レイヤー2)で取引を実行する)という方法を取る場合があります。ビットコインやイーサリアムなどではスケーラビリティ問題を抱えており、レイヤー1だけで取引とその記録をしようとすると、時間と手数料がかかり過ぎてしまいます。そこで取引の一部をレイヤー2で行うことで、スケーラビリティ問題の解決を図っています。
ソラナの場合は、トランザクション処理速度やブロック生成速度が非常に早く、コストも安いため、基盤となるメインブロックチェーンネットワークのみ(レイヤー1)で処理を完結させることができます。

他のブロックチェーンとの相互運用

ソラナでは、他のブロックチェーンと連携してインターオペラビリティ(相互運用性)をつくろうと画策しています。まず(ソラナ)のSPLトークンとイーサリアムのERC20を交換できるように最近、クロスチェーンブリッジである「Wormhole(ワームホール)」プロジェクトが発表されました。これはソラナとイーサリアムの相互運用を実現するソリューションであり、イーサリアム上の分散型金融(DeFi)エコシステムとソラナエコシステムを橋渡しする役割を担います。


図1:(ソラナ)のSPLトークンとイーサリアムのERC20を交換するフロー  (出典:インターネット)

上図表は示したように例えば、ERC20からSPLに交換した場合、まずユーザーが保有するERC20トークンをイーサリアムブロックチェーン上でBridgeコントラクトにロックします。バリデータはユーザーがロックしたERC20トークンを監視し、その結果を確認します。ロック状態を確認できたらバリデータがソラナブロックチェーン上のWormholeコントラクトにSPLトークンの発行を指示し、WormholeコントラクトがSPLトークンをソラナブロックチェーン上に発行するとの流れになります。

ソラナのコンセンサスアルゴリズム

ソラナはタワー BFTコンセンサスによって強化されたプルーフオブステーク(PoS)コンセンサスモデルを使用しています。タワー BFTコンセンサスは、悪意のあるノードからの潜在的な攻撃にもかかわらず、ネットワークがコンセンサスに到達することを可能にします。
ソラナのコンセンサスアルゴリズムに支える最も注目されるコア技術機能は Proof of History (PoH)だと言えます。まず、PoHはコンセンサスアルゴリズムではないことを理解することが重要です。 PoHの実質はトランザクションの順序を確認する時間を改善する方法の一つです。
PoHは2つのイベント(トランザクション)間の時間の経過を暗号で検証できる方法を提供します。 ハッシュ関数を利用して実施します。ハッシュ関数は最初に任意な文字列等を入力データとしてハッシュ化します。そして、出力したハッシュ値を入力データとして同じハッシュ関数でハッシュ化します。この作業を繰り返し、定期的に出力と呼び出された回数を記録します。ハッシュ関数が呼び出された回数値によって出力したあるハッシュ値が他のハッシュ値と比べて先に若しくは後に生成されたかどうか判断できますし、またその判断の結果を簡単に検証することができます。


図2:Proof of Historyのシーケンス  (出典:ソラナホワイトペーパー)

あるタイミングでイベントがあった場合、そのイベントのデータとPoHハッシュ関数の直前の出力したハッシュ値を合わせて新しい出力ハッシュ値と関数の呼び出された回数値を記録します。この出力ハッシュ値、イベントデータ及びハッシュ関数が呼び出された回数値を公開し、他のバリデータで簡単に対象イベントの発生したタイミングを検証することができます。つまり、PoHが提供するプロセスで各トランザクションの順序付けとその順序の検証を行うことができます。


図3:Proof of History にイベントデータの挿入(出典:ソラナホワイトペーパー)

ソラナのブロック処理プロセスはビットコイン等が使っているコンセンサスアルゴリズム(PoW)の処理プロセスと違います。 ビットコインのブロックは、順序付けられていないトランザクションの大きなグループだと言えます。 各ビットコインマイナーは、ローカル時計に基づいて、マイニングするブロックに時刻と日付を追加しなければなりません。 時間は他のノードによって異なる場合があり、誤っている場合もあります。 そのため、ノードはタイムスタンプが有効かどうかを判断する必要になり、ブロック承認時間が増えます。
ソラナは一連のハッシュでトランザクションを順序付けることによりバリデーターは各ブロックにてトランザクションの処理時間および他のノードに送信する情報を減らすことができます。これによって、ブロック生成時間が短縮され、次のブロックのバリデータの選択も早くなります。

ソラナクラスター

ソラナクラスターは、トランザクションの処理及び台帳の整合性を維持するために連携して機能する一連のバリデーターです。 多くのクラスターが共存することができ、 2つのクラスターが共通のジェネシスブロックを共有する場合、それらは収束しようとします。 そうでなければ、単に他のクラスターの存在を無視します。 トランザクションが間違って違うクラスターに送信された場合、そのトランザクションが単に拒否されます。

現時点ソラナは、さまざまな目的でいくつかの異なるクラスターを維持しています。

Devnet

Devnetは、アプリ開発者そしてユーザー、トークンホルダーまたはバリデーターとしてソラナを試乗したい人のための遊び場として機能します。
  • Devnetトークンは本物ではありません
  • Devnetは通常、MainnetBetaよりも新しいソフトウェアバージョンを実行します
  • Devnetのエントリポイント:entrypoint.devnet.solana.com:8001

Testnet

Testnetは、特にネットワークパフォーマンス、安定性、バリデーターの動作に焦点を当てた、ライブクラスターでの最近のリリース機能のテストを強調する場所です。Devnetと同様、Tesnetの特徴は以下の通りです。
  • Testnetトークンは本物ではありません
  • Testnetは通常、DevnetとMainnetBetaの両方よりも新しいソフトウェアリリースを実行します
  • Testnetのゴシップエントリポイント:entrypoint.testnet.solana.com:8001

Mainnet Beta

ソラナブロックチェーンの基盤となるメインネットワークであり、まだベター版ですが初期のトークン所有者とパートナーのためのパーミッションレス永続的なクラスターです。
  • Mainnet Betaで発行されるトークンは本物のネイティブトークンSOLです。
  • Mainnet Betaのエントリポイント:entrypoint.mainnet-beta.solana.com:8001

ソラナのスマートコントラクト

ソラナでは、スマートコントラクトがプログラムと呼ばれます。 Rust、C、C++を利用してソラナのスマートコントラクトを作成することができます。これらのプログラムは、JSON RPC APIまたはこのAPI上に構築されたSDKを介してネットワークに指示付きのトランザクションを送信することにより、これらのプログラムとのコミュニケーションを取ることができます。 Java、C#、Python、Go、Swift、Dart-Flutter、Kotlinなど、JSON RPC APIの上に構築されたサードパーティのSDKが多数あります。

ソラナでのプログラムは二つの種類があり、ネイティブプログラムとソラナプログラムライブラリ(SPL)です。 ネイティブプログラムはソラナの中核であり、その中で最も一般的なものの1つはシステムプログラムです。 システムプログラムは、アカウントの作成やSOLの送受信等に使用されます。 他の人気のあるネイティブプログラムにはステーキングプログラムと投票プログラムがあります。 一方、ソラナプログラムライブラリには多くの異なるプログラムが含まれており、トークンプログラムはソラナのイーサリアムERC-20に相当し、最も人気のあるものの1つです。 トークンプログラムを使用すると、NFTを含むソラナブロックチェーン上のトークンの作成と操作をすることができます。


図4:アプリとプログラムとネットワークの関係

ソラナ上のトークン発行について

ソラナには、Rust言語で記述されたトークンプログラムがあり、このプログラムを利用することにより独自のトークンを作成できます。SDKの経由でトークンプログラムとのやり取りをして、トークンの作成、送受信等の操作ができますが、より簡単と効率的な方法としてはコマンドラインインターフェイス(CLI)を利用することです。今回はソラナのCLIを利用して、トークンの作成と操作を行ってみます。

ソラナCLIのインストール
ターミナルアプリを開いて、以下のコマンドでソラナCLIツールの最新安定版をインストールします。
sh -c "$(curl -sSfL https://release.solana.com/v1.8.0/install)"
もし、ソラナCLIツールが既にインストールされた場合、以下のコマンドで最新安定版に更新することができます。
solana-install update
ソラナクラスターの設定
次に目的によってどのクラスターで取引を行うかを設定します。今回はテストのため、Devnetクラスターを利用します。
solana config set --url https://api.devnet.solana.com
トークン発行アカウントの作成
トークンを発行(ミント)する前に、発行(オーナー)アカウントを設定する必要があります。 以下のコマンドで秘密キーを含む新しいシステムアカウントを作成することができます。
solana-keygen new --outfile <TOKEN_KEYPAIR>
solana-keygen new --outfile issue_account.json

Wrote new keypair to issue_account.json
==========================================================================
pubkey: 6QbbNt2mu1JxzHHgUA32aJABZuPNSG6vBGY9aWjsW2uj
==========================================================================
Save this seed phrase and your BIP39 passphrase to recover your new keypair:
トークン発行アカウントの登録
複数のアカウントを持った場合、どのアカウントを発行アカウント(つまりオーナーになり、トークン発行手数料等を支払うアカウント)にするかを設定します。
solana config set --keypair <KEYPAIR>
(base)  usr$ solana config set --keypair issue_account.json
Config File: .config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: issue_account.json
Commitment: confirmed
無料SOLの取得
トークン発行等のトランザクションの実施、そしてトークン送受信等を行う時、ネイティブトークン(SOL)で手数料を支払う必要があるのでまずはネットワークから無料のSOLを取得します。
solana airdrop <AMOUNT> [RECIPIENT_ADDRESS]
solana balance [ACCOUNT_ADDRESS]
usr$ solana airdrop 1 6QbbNt2mu1JxzHHgUA32aJABZuPNSG6vBGY9aWjsW2uj
Requesting airdrop of 1 SOL
1 SOL
usr$ solana balance 6QbbNt2mu1JxzHHgUA32aJABZuPNSG6vBGY9aWjsW2uj
1 SOL
新しいトークンの作成
SPLトークン用のコマンドラインで簡単に新しいトークンを作成することができます。
ソラナの場合、任意なトークン名ではなく、トークンアドレスが返されます。
usr$ spl-token create-token
Creating token 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr
トークンカウントの作成
オーナーアカウントは複数のトークンを発行することができますので特定のトークンの発行に対してオーナーアカウントに紐付ける対象トークンのトークンアカウントを生成する必要です。 トークンアカウントアドレスはオーナーアカウントアドレスとトークンアドレスから暗号され生成されます。
spl-token create-account <TOKEN_ADDRESS>
(base) usr$ spl-token create-account 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr
Creating account EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
トークンをミントする
オーナーは実際に手数料を払い、オーナーの対象トークンアカウントでミントするトークンを受け取ります。
spl-token mint <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_TOKEN_ACCOUNT>
usr$ spl-token mint 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr 100 EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
Minting 100 tokens
  Token: 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr
  Recipient: EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
トークンを送受信する
トークンを受け取るために、受け取り先のアカウントは対象トークン用のトークンアカウントを持つ必要があります。もし、対象トークン用のトークンアカウントを持たない場合、
transferコマンドにて「- -fund-recipient」フラグを追加するだけで受け取り先アカウントの対象トークンアカウントを作成してくれます。
spl-token transfer --fund-recipient <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
(base) usr$ spl-token transfer --fund-recipient 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr 15 BC9XZQQF5QzRXWuNRRvrynYrw1qvvLcvrsJuAaRdcHRK
Transfer 15 tokens
Sender: EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
Recipient: BC9XZQQF5QzRXWuNRRvrynYrw1qvvLcvrsJuAaRdcHRK
Recipient associated token account: FZPTwMDh58ds65afhTx5wE9gbLtckz1zxXXj5n45XxMb
Funding recipient: FZPTwMDh58ds65afhTx5wE9gbLtckz1zxXXj5n45XxMb (0.00203928 SOL)
トークンをバーンする
オーナーアカウントで簡単に所有したトークンをバーンすることができます。
spl-token burn <SOURCE_TOKEN_ACCOUNT_ADDRESS> <TOKEN_AMOUNT>
(base) usr$ spl-token burn EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN 20
Burn 20 tokens
  Source: EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
(base) usr$ spl-token account-info 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr
Address: EN99M6KMUfbK7r7s6eAYg6xunNCaxLXsNip92rDh2TQN
Balance: 80
Mint: 6YPjUh5gxezsvzwzTaZiTkVA2FVkdamL6S8HHAQU2Tgr
Owner: 6QbbNt2mu1JxzHHgUA32aJABZuPNSG6vBGY9aWjsW2uj
State: Initialized
Delegation: (not set)
Close authority: (not set)

ソラナの主な応用

Solanaは高速、低コストなブロックチェーンプラットフォームであり、その性能を必要とする 400以上ものプロジェクトと提携しています。またそれによって、まだ公開から1年半ほどしか経っていないにもかかわらず、急速にエコシステムを拡大しています。以下はソラナ上作成された注目されているプロジェクトです。
  • Serum(分散型取引所(DEX))
  • Chainlink(ブロックチェーンプラットフォーム)
  • USDC(ステーブルコイン)
  • USDT(ステーブルコイン)
  • Arweave(データストレージを提供するプロダクト)
  • Terra(ステーブルコイン)
  • Akash Network(分散型マーケットプレイス)
  • Civic(ウォレットプロバイダー)
  • dFuse(ブロックチェーンAPIを提供するプロジェクト)
  • LoanSnap(住宅ローン業者)
  • Audius(イーサリアムから移行してきた音楽プロジェクト)

図5:ソラナエコシステム (出典:インターネット)

おまとめ

ソラナは、以前のブロックチェーンテクノロジーが経験した多くの従来の問題を解決します。 Solanaは、トランザクションを検証するための新しい構造と、より効率的なコンセンサスアルゴリズムを表示します。 ネットワークの速度、低コストのトランザクション、業界をリードするスループットにより、Solanaエコシステムが将来さらに多くのプロジェクトを引き付け、グローバルなブロックチェーンの採用を促進しても驚くことではありません。

最後に

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。

皆さんのご応募をお待ちしています。

 

Pocket

関連記事