新着:HeliusがLight Protocolを買収
TypeScriptでSolanaプログラムを構築するPoseidon
ブログ/開発

Poseidon:TypeScriptでSolanaプログラムを構築

Solanaの人材エンジン。XのTeam Turbin3LinkedInのTeam Turbin3
読了時間:8分

Poseidonは、世界中の何百万人もの開発者に馴染みのあるTypeScriptだけを使って、Web開発者がSolanaオンチェーンプログラム(スマートコントラクト)を作成できる新しいトランスパイラーフレームワークです。このフレームワークはオンチェーン開発への参入障壁を大幅に引き下げ、より幅広い開発者がSolanaを利用できるようにします。PoseidonはTypeScriptコードを、Solanaで最も広く採用されているプログラムフレームワークであるAnchorへ直接変換します。

この記事では、Poseidonの成り立ち、アーキテクチャ設計、主な機能、そしてSolana開発環境にもたらし得る好影響を詳しく解説します。さらに、Poseidonで記述したシンプルなトークン保管庫プログラムの実例を通して、フレームワークの機能の一部をご紹介します。

背景

2023年末頃、Turbin3チームはSolana Foundationから、ある意欲的な課題を持ちかけられました。「開発者がTypeScriptを使ってSolanaプログラムを作成できるフレームワークを構築できますか?」当然、最初の返答は「なぜですか?」でした。

TypeScriptはJavaScriptの静的型付けスーパーセットであり、開発者がエラーを早期に発見し、保守しやすいコードを記述するのに役立ちます。現代のWeb開発における事実上の標準として、TypeScriptとJavaScriptは世界最大級の開発者コミュニティを形成してきました。TypeScriptによるプログラム開発を導入することは、新たなSolana開発者の裾野を広げ、ブロックチェーン開発への参入障壁を下げる大きな機会となります。

Solanaプログラム開発の習得は、ほかの多くのブロックチェーンと比べて困難です。新しい開発者は、Solanaのアカウントモデルの理解とRustの学習という2つの課題に同時に取り組む必要があり、学習曲線は急峻になりがちです。Turbin3ほどこのことを理解しているチームはないでしょう。新しいSolana開発者の15%が、私たちのプログラムを経て参入しています。

TypeScriptフレームワークを導入すれば、開発者はこれらの課題を切り分け、すでに知っている言語を活用して、最初のプログラムをより早くテストネットへデプロイできます。オンチェーンプログラム開発向けのTypeScriptベースのフレームワークにより、開発者は初めて、単一の言語でフルスタックのSolanaアプリケーションをシームレスに構築できます。

解決策:Poseidon

このプロジェクトは基本的な型ライブラリとトランスパイラーの構想として始まりましたが、初期プロトタイプの開発とSolanaおよびTypeScriptの専門家からの詳細なフィードバックを経て、急速にはるかに堅牢なものへと成長しました。数か月にわたる構築、テスト、トラブルシューティング、そして業界の専門家からの貴重な意見を経て、Poseidonは今年初めのBreakpoint 2024で重要な節目を迎え、関心を寄せる開発者たちに成果を初公開しました。 

ライブプレゼンテーションでは、Poseidonのリード開発者であるShrinathが、TypeScriptでSolanaプログラムを記述する様子を実演しました。1つのビルドコマンドだけで、PoseidonはTypeScriptコードを完全なAnchor構文へと変換しました。しかも、観客の目の前でです。会場は興奮に包まれ、「本当に動くのだろうか?」というささやきが広がりました。

それ以来、Poseidonのオープンソースリポジトリは、XとDiscordで拡大を続けるPoseidon Armyの貢献によって急速に成長しています。コミュニティメンバーは問題に取り組み、プルリクエストを送信し、新しいパッケージの構築に協力することで、Poseidonの成熟を日々後押ししています。改善点には、CLIの強化、トークンプログラム関数のサポート追加、エラーメッセージの改善などがあります。まだ初期段階ではありますが、Poseidonの可能性は明らかです。

技術的な観点では、Poseidonの開発過程を4つの段階で捉えています。最初の打ち合わせ、ブレインストーミング、アーキテクチャ設計を経て、いくつかの重要な決断を迫られました。特に重要だったのは次の点です。 

  • 必要なライブラリについて前提を設けること
  • メソッドチェーンによってインストラクション本体でアカウントを導出すること
  • プロシージャルマクロ(多くの開発者にとって新しい概念)

その後は、Breakpointでの発表に向けて、構築と反復改善の段階に集中して取り組みました。大きな反響を呼んだ発表を機に現在の段階へ進み、早期導入者が自由に試し、発見し、改善できるようフレームワークを提供しています。

2024年の終わりを迎えるなか、私たちは引き続きフレームワークの成長を支えています。コア機能の改善、サポート範囲を広げるためのコミュニティ参加、必要なSPL関数とAnchorライブラリのサポートの特定に注力しています。これらの取り組みにより、主要な開発者はコア部分の改善に集中できるようになります。

2025年に向けて、第1四半期後半に初のTurbin3 Poseidon Cohortを開始し、開発を加速させます(近日発表予定)。この取り組みでは、フレームワークを進化させるとともに、公開パッケージ、チュートリアル、その他の教育リソースの作成に注力します。目標は明確です。Poseidonを、TypeScriptによるSolanaプログラム開発を加速させる決定版ツールにします。

主な機能

Poseidonには、次のような優れた機能があります。

  • 開発の簡素化: TypeScriptベースのインターフェースにより、Web開発者の学習負担を最小限に抑え、Rustの習得に苦戦する代わりにアプリケーションロジックへ集中できるようにします
  • 生産性の向上: 使い慣れたツールとワークフローを活用して開発者がより効率的に作業できるようにし、開発プロセスを加速します
  • セキュリティとパフォーマンスの強化: 変換されたRustコードがSolanaの厳格なセキュリティおよびパフォーマンス基準に準拠するようにし、オンチェーンプログラムの整合性を維持します
  • シームレスな統合: PoseidonはSolanaエコシステムとシームレスに統合され、開発者は既存のツールやライブラリを活用できます

システムアーキテクチャ

Poseidonのアーキテクチャは、いくつかの主要コンポーネントで構成されています。

  • TypeScriptベースのプログラミングインターフェース: 開発者がSolanaプログラムを記述するための使い慣れた構文とツールを提供するレイヤーです
  • トランスパイルエンジン: TypeScriptの型システムと言語機能を活用し、TypeScriptコードを同等のRustコードへ変換するエンジンです
  • Anchorコード生成: 変換されたRustコードをさらに処理して、有効なAnchorプログラムを生成します。生成されたプログラムはコンパイルしてSolanaネットワークへデプロイできます
  • アカウント管理: Poseidonは、アカウントと関連データを効率的に管理する方法を提供し、Solanaブロックチェーンとのやり取りを容易にします

ユースケース

Poseidonは、開発者によるSolanaのアカウントモデルの理解を加速し、新しい開発者が最初のプログラムをテストネットへデプロイするまでの時間を大幅に短縮するよう設計されています。ブロックチェーンアプリケーションには厳格なセキュリティ要件があるため、現時点のPoseidonは本番環境向けのメインネットアプリケーションの構築には適していません。Solanaプロトコルエンジニアを目指す方は、最終的にはAnchorとRustを学び、Solanaの基盤アーキテクチャをより深く理解する必要があります。

このフレームワークを使用すると、次のような幅広い分散型アプリケーションを調査し、試作できます。

  • 分散型金融(DeFi): レンディングプロトコル、分散型取引所、イールドファーミングプラットフォームなど、革新的な金融アプリケーションを開発できます
  • 非代替性トークン(NFT): Solanaブロックチェーン上でデジタル資産を作成、管理できます
  • ゲーム: ブロックチェーンベースのゲームや仮想世界を開発できます
  • サプライチェーン管理: 製品や資材の出所を追跡、検証できます

私たちはまず、ほぼすべてのブロックチェーンアプリケーションを支える基盤プログラムであるCounter、Vault、Escrowに注力しました。これらの中核的な構成要素は無数のプロトコルの基礎となるため、出発点として最適です。

Poseidonプログラムのサンプル

コードを詳しく見ながら、Poseidonを使用してTypeScriptで構築した保管庫プログラムの例を構成要素ごとに分解して解説します。このプログラムとほかのプログラムの完全なコードは、Poseidon GitHubリポジトリで確認できます。

インポートとプログラム宣言

プログラムはTypeScriptクラスとして定義され、静的なPROGRAM_IDでプログラムIDを指定します。@solanaturbine/poseidonパッケージは、Rust型(u8、u64、i8、i128、boolean、string)、SPL型(Pubkey、AssociatedTokenAccount、Mint、TokenAccount、TokenProgram)、Anchorアカウント型(Signer、UncheckedAccount、SystemAccount)など、インストラクションの定義に必要な型を提供します。

コード
import { Account, Pubkey, Result, Signer, SystemAccount, SystemProgram, UncheckedAccount, u64, u8 } from "@solanaturbine/poseidon";

export default class VaultProgram {
    static PROGRAM_ID = new Pubkey("11111111111111111111111111111111");

インストラクション

Poseidonでインストラクションを定義する際は、通常、プログラムクラス内にメソッドを定義します。各インストラクションのコンテキストは、メソッドのパラメータに暗黙的に含まれます。@solanaturbine/poseidonを使ってアカウントをプログラム派生アドレス(PDA)として定義するには、deriveメソッドを使用し、配列内の最初のパラメータとしてシードを指定します。

コード
    initialize(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount
    ): Result {

        auth.derive(['auth', state.key])
        state.derive(['state', owner.key]).init(owner)
        vault.derive(['vault', auth.key])

        // assign an argument of type Pubkey by calling the key property
        state.owner = owner.key;

        // to store bumps in the custom_Acc(state), we can simply call getBump
        state.stateBump = state.getBump()
        state.authBump = auth.getBump()
        state.vaultBump = vault.getBump()
    }

    deposit(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount,
        amount: u64
    ) {
        state.deriveWithBump(['state', owner.key], state.stateBump)
        auth.deriveWithBump(['auth', state.key], state.authBump)
        vault.deriveWithBump(['vault', auth.key], state.vaultBump)

        SystemProgram.transfer(
            owner, // from
            vault, // to
            amount // amount to be sent
        )
    }

    withdraw(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount,
        amount: u64
    ) {
        state.deriveWithBump(['state', owner.key], state.stateBump)
        auth.deriveWithBump(['auth', state.key], state.authBump)
        vault.deriveWithBump(['vault', auth.key], state.vaultBump)

        SystemProgram.transfer(
            vault,
            owner,
            amount,
            ['vault', state.key, state.authBump]
        )
    }
}

アカウントの状態

カスタム状態アカウントは、Accountを拡張するインターフェースとして定義します。カスタム状態アカウントのフィールドは、@solanaturbine/Poseidonパッケージの型を使用して定義できます。

コード
export interface Vault extends Account {
    owner: Pubkey
    stateBump: u8
    authBump: u8
    vaultBump: u8
}

Poseidonがもたらす影響

Poseidonは、次の方法でブロックチェーン開発環境に影響を与える可能性があります。

  • Solana開発者コミュニティの拡大: より多くの開発者をSolanaエコシステムへ呼び込みます
  • 開発の加速: Solanaプロジェクトの開発時間と労力を削減します
  • 開発者体験の向上: より直感的で効率的な開発体験を提供します

今後の展望

今後、Poseidonは次の取り組みによって機能をさらに強化することを目指します。

  • 対応言語の拡大: JavaScriptやPythonなど、追加の言語をサポートします
  • パフォーマンスの改善: トランスパイル処理と生成されるRustコードを最適化します
  • セキュリティの強化: フレームワークと生成コードに脆弱性がないかを厳格にテストします

まとめ

Poseidonは、より幅広い人々がSolanaプログラム開発に取り組めるようにする大きな進歩です。Web開発とブロックチェーンプログラミングの隔たりを埋めることで、開発者はSolanaブロックチェーン上に革新的で影響力のあるアプリケーションを構築できます。ブロックチェーン分野が進化するなか、Poseidonは新たにSolana開発を始める開発者にとって不可欠なツールになる可能性を秘めています。

その他のリソース

‍

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像