見出し画像

Breakpoint 2023: Program Runtime v2セッションのまとめ

この記事はSolana Advent Calendar 2023 11日目の記事です。

本記事ではBreakpoint 2023のProgram Runtime v2セッションの動画をChatGPTでテキスト化を行った記事になります。動画を見る時間がない、視覚優位で動画が苦手、動画の補助としてテキストと両方みたいという方向けになります。

元のTranscriptの品質、ChatGPTの精度により不正確な記述がありえることにご注意ください。

セッションの概要

本セッションは、Solana Labsが取り組むProgram Runtimeのv2開発に関する説明です。Runtimeチームのメンバーであるアレクサンドロとアレックスが、コンパイラや仮想マシンの管理、技術的負債の解消、APIの改善および効率化、さらにはエコシステム内でのプログラムの組み合わせ可能性を高めるための取り組みについて詳しく解説します。

また、プレゼンテーションにおいては、新たなProgram Runtime機能のデモンストレーションやCargoワークフローの最適化、計算効率の向上、インターフェースの支援、後方互換と移行戦略に焦点を当てます。参加者はこれらのRuntime機能に関する深い理解を深めると同時に、将来の開発がどのような影響を及ぼすかを学ぶ機会を得られます。このセッションの目的は、開発者やコミュニティがプログラムRuntimeの次世代進化に関する知識を共有し、交流を深めることにあります。

セッションのハイライト

  1. Runtimeの次世代化: Solana LabsのRuntimeチームがProgram Runtime v2の開発に取り組んでおり、技術的負債の解消とAPIの改良が目的で、開発は今後1年以上予定されている。

  2. 実行効率と開発者エクスペリエンスの向上: 新しいRuntimeでは実行速度の大幅な向上やAPIの最適化が図られ、開発者は複雑なプログラムを容易に作成できるようになる。Cargoワークフローの強化により、プログラムのビルドとブロックチェーンへのデプロイが効率化される。

  3. 後方互換性および移行計画: 新しいRuntimeは既存の環境と共存可能であり、徐々に移行が行われる予定。プログラミング言語Moveの機能のRustへの移植など、構造変更が適用され、プログラム間の相互作用が円滑になることが期待される。

セッション内容

イントロダクション

私の名前はアレクサンドロで、現在アレックスと共におります。本日はSolana LabsのRuntimeチームのメンバーとしてご説明いたします。当チームは、コンパイラやLLVM、Cargoなどのツールチェーン全般に加え、BPF仮想マシンの管理に力を注いでいます。そして、バリデータでの仮想マシンの起動コードの担当、トランザクションの実行設定も行っております。

本日のご案内は、当チームが過去1年間携わってきた大規模プロジェクトであり、現在も進行中のProgram Runtime v2に関するものです。このプロジェクトは、Runtimeコンポーネントの次世代進化を目指しており、今後1年以上の開発が予定されています。

Program Runtime v2開発の概要

本プロジェクトは、多くの実装に関する詳細が変更される大規模であることを特徴としています。私たちの目標は、Runtimeで蓄積された技術的な負債を解消することです。これに加え、外部に公開されているAPIの一部についても変更を計画しています。

今回は限られた時間内で、API変更の側面に焦点を当てて説明しますが、さらに詳細な情報が必要な場合は、私またはアレックスまでご連絡いただけますと幸いです。

私たちはDiscordの仮想マシンチャンネルを利用して活発にコミュニケーションを取っていますので、議論を希望される際はいつでもお気軽にご参加ください。

実行効率の向上

新たにリリースされるRuntimeの最初の主要なアップデート内容は、実行速度の大幅な向上に関するものです。これまで開発が進められてきた機能強化、とくにAPIの最適化やアカウントの効率的な再配分などが、計算効率を高めるべく改良されました。これらの機能は従来、CPUやメモリバンド幅など、相当量のコンピューティングリソースを消費していました。本アップデートの目的は、これらのリソースの消費を抑え、システム全体の効率を向上させることです。

APIの強化と汎用インターフェイスのサポート

私たちのチームは、複雑な処理を簡素化することで、処理速度の向上と人工的な制約の削除を目指しています。アレックスによる当社手法の細部に関する説明が予定されています。現在のCPI深度には制約があり、過度なネストされたプログラム呼び出しや広範なメモリ操作を抑制しています。

提案する簡素化により、これらの操作の計算コストが下がり、開発者は計算資源を大きく節約可能になります。結果として複雑なプログラムが作りやすくなり、ブロックチェーン上でのより高度なユースケースの実装が可能になることを期待しています。

さらに、古いAPIの見直しを進め、冗長なコードを排除しています。例として挙げると、廃止が進んでいるエントリーポイントのマクロや扱いにくいアカウント情報の構造があります。

特筆すべきは、汎用インターフェースのサポート導入です。これまで特定のAPIに依存していた拡張可能なプログラムも、インターフェイスやトレイトを言語に組み込むことで実装が可能になり、組合せの幅が広がります。

これらの向上により、私たちのエコシステムの組合せ可能性が大幅に向上することを目的としています。

強化された組み合わせ性とCargoワークフロー

本コンセプトでは、トークンに関するプログラムをインターフェースの集合体として再設計することで、ユーザーが自身のロジックを組み込み、動作をカスタマイズできるようになります。ユーザーはCargoの標準ワークフローを用いて、一連のプロセスを管理できます。さらに、プロジェクトのビルドの一環として、ユーザーのコードからバイトコードを生成すると同時に、サードパーティが使用するための公開関数、メソッド、型の型情報も作成されます。

サードパーティのプログラムは定義済みの公開APIを通じてユーザーのプログラムと通信できます。これらはcargo publishを実行するだけでブロックチェーンに公開できますし、APIを利用したいサードパーティプログラムはユーザーのプログラムのアカウントアドレスを指定し、`Cargo.toml`ファイルに依存関係を追加するだけです。

この効率化により、インターフェースやAPIの手作業による作成を省略でき、開発ツールチェーンがこれを自動的に処理します。ユーザーはCargo.tomlに依存関係を記載することで、Cargoビルドシステムが型情報を取り出し、型チェック、リンキング、およびプログラムビルドに必要なその他のプロセスを実施します。

結果として、ユーザーのプログラムをビルドしブロックチェーン上で実行する際、Program Runtimeが型の互換性を保証し、リンキングに成功し、未定義のメソッドの呼び出しを防ぐための動的リンクが可能となります。これによって、開発の効率を大幅に向上させることが目的です。

新しいRuntime機能のデモンストレーションとCargoの公開

本デモンストレーションでは、まもなくリリースまたはデプロイされる新規コードを公開するのではなく、速やかに作成された概念実証のプロトタイプを示し、提案されたアイデアが機能するかを評価することを目的としています。とくに、Registryアダプタの開発者であるパナグ氏の功績に注目いただくことになるでしょう。デモンストレーションはビデオによって行われ、その演出中の停止は不可能であり、私のナレーションに沿って進行します。

デモ作業の内容としては、3つのクレートの定義が行われ、その内1つが指定された価格で指定されたアドレスに型の値を移動させる機能を1つだけ持つトレイトを実装しトレイト抽象化を提供します。

さらに、`cargo publish`を使用して、このトレイトをSolanaのレジストリに公開したい旨をCargoシステムに伝達し、結果としてチェーン上へとデプロイされるプロセスを実演します。

デプロイが成功したことを確認するために、構築したプログラムの公開キーを取得し、Explorerを使用してブロックチェーン上での存在を検証します。具体的には、公開キーをコピーし、Explorer上でのアドレスの入力を通じて、プログラムが実際にちょうど数瞬間前にデプロイされたのを見ることができます。

また、今回のプログラムは新しいローダーv4と連携して使用されることも付記されています。このプレゼンテーションを通じて、開発の過程とプロトタイプの可能性をご理解いただければと思います。

CPIとオンチェーンインタラクションの変更

本文では、既に部分的に実装されているインターフェースの機能と将来の展望について説明しています。このインターフェースは、NFT間の取引時にロイヤリティを収集し、指定された受取人への支払いを行った後に資産の実際の交換を実施するものです。この例は動作の一例を示すものにすぎず、本文中ではその詳細は省略されています。

インターフェースは取引メソッドを介して実装され、同一の手法で他のトランザクションにも応用されます。呼び出し側がインターフェースを使用する方法は、具体的なNFTタイプとは無関係に、汎用性を持たせて設計されています。プログラムは、インターフェースを提供するようソースアカウントに要求し、実装されていない場合は呼び出しが失敗します。成功した場合には、インターフェース経由でアカウントに操作を行うことができます。

この抽象化をプログラムが利用するために必要な手順として、Cargo.tomlファイルに依存関係を追加します。現在の版ではアカウントアドレスの具体的な指定はできませんが、将来的にはオンチェーンのアカウントアドレスを直接指定して依存を表現することが可能になります。

文書中では、タイプミスがないことの重要性にも触れており、その後に正しいコンパイルを確認して、プログラムがデプロイ準備完了となることを表しています。

最後に、本文は情報提供の締めくくりとしてアレックスに次の発表の場を渡す旨述べ、聴衆に感謝を示しています。

移行計画と後方互換性

我々は、小規模な改良ではなく、大幅な構造変更の段階に差し掛かっており、これは設計フェーズの完了を意味しています。追加を希望する要素があれば、ぜひ私たちにご相談ください。

昨年のBpointでSolanaへのMoveプログラミング言語の組み込みを発表したことに引き続き、今年はMoveの特徴的な機能がRustにも移植されることをご報告できることを嬉しく思います。Moveの型システムがアカウントと関数シグネチャへ応用され、シリアライズやデシリアライズなしで構造体を直接利用可能になり、他プログラムとの共有も想定されています。

所有権モデルを改善し、アカウントごとに設定されていた所有者を、より柔軟なタイプ指定の所有者に変更しています。この変更は、コンポジションの取り扱いやCPIの改良にも影響を及ぼし、CPIはアカウントメタデータを型システムに統合することで合理化され、プログラム間の関数呼び出しが容易になりました。

外部関数と内部関数の呼び出しにも区分が施され、ダイナミックリンクが導入されました。Runtimeはアカウントタイプの一致を確認し、不一致時にはトランザクションが失敗します。

また、大きな更新として、CPIでは命令ごとやネスティングレベルごとにVMインスタンスを複数用いるのではなく、トランザクション全体で1つのVMを使用するように変更され、トランザクション間でのデータの受け渡しや関数再帰の再考が可能になりました。

Solanaにおけるコンポーザビリティの新たな視点を提供します。CPIは高価なものではなく、プログラム間の円滑な相互作用と構造体の自由な受け渡しを可能にし、エコシステム内での共同作業を促進します。

現在見ているのはプロトタイプであり、質問はプレゼンテーション終了後に受け付けます。新機能が現行のRuntimeと共存すること、そしてProgram Runtime v1の段階的廃止ではなく、互換性を持ちつつも制限を設けた運用が可能です。アップグレードを推奨しつつ、旧Runtimeを急に中断することなく、徐々に移行させる予定です。

ご清聴ありがとうございました。

セッションのまとめ

Solana LabsのRuntimeチームメンバーであるアレクサンドロとアレックスは、Program Runtime v2の開発進捗について説明しました。彼らのチームは、実行効率を上げるための改善、APIの改善、Cargoワークフローの最適化を含む技術的課題の解決に力を入れています。

これにより、開発者はより少ない計算リソースでより複雑なプログラムを実装することが可能になると期待されています。さらに、インターフェースとトレイトの統合を強化し、システム全体の組み合わせ可能性を向上させることを目標に掲げています。

彼らはデモンストレーションを行い、新しいRuntimeの機能とCargoを用いた公開・デプロイプロセスを展示しました。将来的には、Move言語の特徴をRustに取り入れ、所有権モデルの改善やCPIの効率化を図ることで、プログラム間のスムーズな相互作用を促進します。

新機能は現行のRuntimeと共存し、段階的に古いRuntimeからのアップグレードを計画しています。この進化により、開発者がより効率的にプログラムを実装できるよう支援することが目的です。

先日のSolana Japan MEETING 12月のイベントでも@ryoqunからRuntime v2の紹介がありました。

そちらでも、すごい楽しみ!と思っていたのですが、こちらのセッションを見て早く・・・!!という思いに変わりました。

個人的には型周りと、Cargoのワークフローの変更はいっそ自分でフレームワーク作ってしまうか・・・?でも、どうせメンテが途中で飽きるしなぁ・・・と思っていたのですごい嬉しいです。

早く実際に書いてみたいですね!

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