著者:Magicblock; 出典:MetaCat
2024年3月5日にBOLT v0.1が稼動します。BOLTは、ライセンス不要で、コンポーザブルで、ブロックチェーン上に永久に存在できるゲームの開発を簡素化するオンチェーン開発フレームワークです。BOLTは、ライセンス不要で、コンポーザブルで、ブロックチェーン上で永久に利用可能なゲームの開発を簡素化するオンチェーン開発フレームワークです。BOLTは、Solanaのグローバルステートのコンポーザビリティを損なうことなく、従来のマルチプレイヤーゲームサーバーに匹敵する完全なオンチェーンゲームのパフォーマンスを可能にするSVM互換アクセラレーションレイヤーを含むように設計されています。この現在の早期リリースでは、BOLT CLIとECS(Entity Component System)を紹介し、最近のアップデートを紹介し、Solana上で簡単なオンチェーンゲームを開発する方法を示します。
ECSパターン
Boltは単なるEntity Component System (ECS)フレームワーク以上のものですが、私たちはこの強力な設計パターンを使用して、コンポーザビリティを高めることを推奨しています。ECSは、モジュール式で拡張可能なゲームプレイを可能にするためにコードとデータを整理する方法であり、チェーン全体で構築する際に私たちが求める重要な特徴です。
エンティティは、ゲーム世界のオブジェクトを表すエンティティです。これらは一意の識別子であり、データや動作を保持しませんが、コンテナーとして機能します
コンポーネントは、エンティティに「アタッチ」できる基礎となるデータ構造です
The System executes game logic or behaviour by acting on the entities that hold the components
この懸念の分離は、ゲームをより効率的にする方法です。separation of concerns)は、非常に柔軟なモジュール式アーキテクチャを可能にします。以下のリンクで、 ECSパターンのすべての利点を見ることができますか?
https://github.com/SanderMertens/ecs-faq?tab=readme-ov-file#what-is-ecs。
適応型アーキテクチャは、世界で最も柔軟なアーキテクチャです。left;">BOLT CLI
BOLT CLIは、Anchorフレームワークの拡張機能です。人気のあるSolana開発フレームワークのすべての機能と、ワールドインスタンス、コンポーネント、およびシステムを作成するための機能のスーパーセットが含まれています。
BOLT-CLIのインストール
npm install @magicblock-labs/bolt-cli
bolt -h
BOLTベースのプロジェクトを実行して初期化します:
bolt init <new-workspace-name>
コンポーネント
を実行して、BOLTベースのプロジェクトを初期化します。text-align: left;">フォルダ programs-ecs/components
内の例では、x, y, z座標を持つPosition コンポーネントを定義しています。コンポーネントは、エンティティの特定のプロパティに関連するデータを含む単純なデータ構造であることを覚えておいてください。コンポーネントにはロジックやメソッドは含まれていません。
use bolt_lang::*;declare_id!("Fn1JzzEdyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ");#[component]#[derive(Copy)]pub ;構造体 位置 { pub x: i64, pub y: i64,  nbsp; pub z: i64,}
# [component] マクロは、基本的な Solana固有の動作のすべてを処理する役割を担っています。勘定科目の仕組みやバイトの割り当て方法など、データ構造を定義する以外のことを知る必要はありません。
コンポーネント自体は、連鎖的に展開されるプログラムです。
declare_id!("Fn1JzzEdydyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ");
idは、Positionの上にあるコンポーネントのユニークなアドレスを定義します。を定義します。
システム
システムには、コンポーネントを操作するロジックが含まれています。システムは通常、特定のコンポーネントのセットを持つすべてのエンティティで実行されます。system_movement の例では、コンポーネントの Position
を更新するロジックをカプセル化しています。
use bolt_lang::*;use component_position::Position;declare_id!("FSa6qoJXFBR3a7ThQkTAMrC15p6NkchPEjBdd4n6dXxA")。);#[system]pub mod system_movement { pub fn execute(ctx: Context<.;position.x += 1; Ok(ctx.accounts) } //ctx.accounts.nbsp; // define input components pub #[system_input] pubnbsp;struct Components { pub position: 位置, }。nbsp; }}
各SystemはExecute命令を実装し、任意の数のコンポーネントにシステムロジックを適用します。
#[system_input] マクロでラベル付けされた構造は、Systemが入力として受け取るコンポーネントのパッケージを指定します。
executeコマンドは、ワールドプログラムがパーミッションとビジネスロジックをチェックした後にデータ構造を更新した、変更されたコンポーネントを返します。
同様に、CPIの定義やIDLの取得など、基盤となるブロックチェーンレイヤーに注目する必要はありません。Systemsを実行させたいコンポーネントのバンドルを定義するだけです!
ワールドプログラムですべてをまとめる
コンポーネントとシステムがどのように機能するかを把握したところで、さっそく始めましょう。TypeScript SDKのWorld Programを使ってゲームのインスタンスを作成しましょう。World Program はワールドインスタンス、エンティティ、アドオン、実行システムを作成するためのエントリポイントであり、SDKはBOLTと対話するための簡単なインターフェイスとメソッドを提供します。
インストール
BoltのSDKをインストールするには、次のコマンドを実行します:
npm install @magicblock-labs/bolt-sdk --save-dev
ワールドインスタンスを作成する
const initNewWorld = initNewWorld = initNewWorld = initNewWorldnbsp;= await InitializeNewWorld({ payer: provider.wallet.publicKey, connection: provider.connection: provider.connection,});const tx = new anchor.web3.Transaction().add(createEntityIx);await nbsp;provider.sendAndConfirm(initNewWorld.transaction);
新しいエンティティ(entity)の追加
const addEntity = await AddEntity({ payer: provider.wallet.publicKey,  nbsp;world: initNewWorld.worldPda, connection: provider.connection,});await provider.sendAndConfirm(addEntity.transaction);
エンティティへの位置コンポーネントのアタッチ
const .initComponent = await InitializeComponent({ payer: provider.wallet.publicKey,  ;nbsp; entity: addEntity.entityPda, componentId: positionComponent.programId,});await&.nbsp;provider.sendAndConfirm(initComponent.transaction);
位置コンポーネントでモーションシステムを実行する
const&applySystem = await ApplySystem({ authority: provider.wallet.publicKey, system: systemMovement.programId, entity: addEntity.entityPda,  nbsp;components: [positionComponent.programId],});const tx = new anchor.web3.Transaction().add(applySystemIx);await provider.sendAndConfirm(applySystem.transaction);
この単純な例では、プレーヤーのエンティティを作成しました。エンティティPlayerを作成しました。その状態を変更するために、モーションシステムを実装することができます。BOLT ECSを使ってゲームのデータ構造を定義することで、既存のシステムやコンポーネントを再利用できるだけでなく、ゲームの修正や拡張も簡単にできるようになります。
use bolt_lang::*;declare_id!("CbHEFbSQdRN4Wnoby9r16umnJ1zWbULBHg4yqzGQonU1");#[コンポーネント]#[derive(コピー)]pub struct Velocity { pub x: i64}
より速く動くために新しい能力を導入したいと思う人もいるだろう。Velocityを使用してPositionコンポーネントに作用する新しいシステムを追加するだけで、これを行うことができます。
#[system]pub mod system_apply_velocity ">#[system]pub mod system_apply_velocityapply_velocity { pub fn execute(ctx: Context<Components>, _args: Vec<u8>) -> 結果<Components> { ctx.account.position.x += ctx.accounts.velocity.x; Ok(ctx.accounts) }&. pub position: 位置, pub velocity: .Velocity, }}
このコードがいかにシンプルであるかに注目してください。この新しいシステムは、位置と速度のコンポーネントを入力として受け取り、電源投入のロジックを定義します。SolanaアカウントやCPIの概念はありません。AgentWorldプログラムがここですべてを処理しています。
わずか数行のコードと、ブロックチェーンの知識なしで、私たちは新しい種類のゲーム動作を導入しました!
概要
BOLTはECSパラダイムを活用し、ゲーム開発者が高度にモジュール化された効率的でコンポーザブルなゲームを作成できるようにします。エンティティはコンポーネントのコンテナとして機能し、基本的なコードベースを変更することなく、動的なカスタマイズを可能にするプリミティブなデータ構造です。システムはこれらのコンポーネントと相互作用し、ゲーム・エンティティにロジックと動作を注入する。このような関係性の分離は、開発プロセスを単純化するだけでなく、ゲームロジックの再利用性を高め、リリース後にライセンスフリーの方法でゲームを拡張および変更する能力を強化します。