作者:Magicblock
翻译:MetaCat
排版:MetaCat

BOLT v0.1 已于 2024 年 3 月 5 日上线。BOLT 是一个链上开发框架,它简化了无需许可、可组合性且可以永久存在于区块链上的游戏的开发。BOLT 的设计包括一个与 SVM 兼容的加速层,使全链上游戏的性能与传统多人游戏服务器相当,同时又不影响 Solana 全局状态的可组合性。在当前这个早期版本中,我们将介绍 BOLT CLI 和实体组件系统 (ECS),介绍最近的更新并展示如何在 Solana 上开发简单的链上游戏。

ECS 模式

虽然 Bolt 不仅是一个实体组件系统 (ECS) 框架,但我们鼓励使用这种强大的设计模式来增强可组合性。ECS 是一种组织代码和数据的方式,以实现模块化和可扩展的游戏,这是我们在全链上构建时寻求的关键功能。顾名思义,ECS 中有:

  • Entities(实体) 是代表游戏世界对象的实体。它们是唯一标识符,不保存任何数据或行为,而只是充当容器

  • Components (组件是可以“附加”到实体的基础数据结构

  • System(系统通过作用于持有组件的,实体来执行游戏逻辑或行为

这种关注点分离(separation of concerns实现了高度灵活的模块化架构。你可以下面的链接中查看 ECS 模式的所有优点👇

https://github.com/SanderMertens/ecs-faq?tab=readme-ov-file#what-is-ecs.

BOLT CLI

BOLT CLI 是 Anchor 框架的扩展。它包括流行的 Solana 开发框架的所有功能,以及用于创建世界实例( world instances)、组件(components)和系统(systems)的功能超集。

安装 BOLT CLI

npm install @magicblock-labs/bolt-cli

你可以通过以下方式验证 BOLT CLI 的安装:

bolt -h

初始化基于 BOLT 的项目请运行:

bolt init 

组件(Components)

文件夹中的示例 programs-ecs/components 定义了一个包含 x、y、z 坐标的 Position 组件。请记住,组件是简单的数据结构,其中包含与实体的特定属性相关的数据。它们不包含任何逻辑或方法。

use bolt_lang::*;
declare_id!("Fn1JzzEdyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ");
#[component]#[derive(Copy)]pub struct Position { pub x: i64, pub y: i64, pub z: i64,}

[component] 宏负责处理所有 Solana 底层特定行为。除了定义数据结构之外,你不必了解帐户如何工作、如何分配字节或任何其他内容。

组件本身就是部署在链上的程序。

declare_id!("Fn1JzzEdyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ");

id 定义了 Position 上面组件的唯一地址。

系统(Systems)

系统(Systems)包含操作组件(Components)的逻辑。系统通常将在具有一组特定组件的所有实体上运行。该 system_movement 示例封装了更新组件的逻辑 Position

use bolt_lang::*;use component_position::Position;
declare_id!("FSa6qoJXFBR3a7ThQkTAMrC15p6NkchPEjBdd4n6dXxA");
#[system]pub mod system_movement {
pub fn execute(ctx: Context, args_p: Vec) -> Result { let position = &mut ctx.accounts.position; position.x += 1; Ok(ctx.accounts) }
// Define the input components #[system_input] pub struct Components { pub position: Position, }}

每个系统(Systems)都实现一条执行指令,该指令负责将系统逻辑应用到任意数量的组件上。

 #[system_input]  宏标记的结构,指定系统将接收作为输入的组件包。

执行指令返回修改后的组件,World Program 在检查权限和业务逻辑后,将其更新在数据结构中。

同样,你无需通过定义 CPI、检索 IDL 或其他任何内容来关注底层区块链层。只需定义你希望系统(Systems)运行的组件包(the bundle of components)即可!

将所有东西与 World Program 结合在一起

现在我们已经掌握了组件(components)和系统(Systems)的运行方式,接下来让我们使用 TypeScript SDK 中的 World Program 创建一个游戏实例。World Program 是创建世界实例、实体、附加组件和执行系统的入口点。SDK 提供了与BOLT交互的便捷接口和方法。

安装

要安装 Bolt sdk,请运行以下命令:

npm install @magicblock-labs/bolt-sdk --save-dev
创建一个世界实例(world instance)
const initNewWorld = await InitializeNewWorld({    payer: provider.wallet.publicKey,    connection: provider.connection,});const tx = new anchor.web3.Transaction().add(createEntityIx);await provider.sendAndConfirm(initNewWorld.transaction);

添加新实体(entity)

const addEntity = await AddEntity({    payer: provider.wallet.publicKey,    world: initNewWorld.worldPda,    connection: provider.connection,});await provider.sendAndConfirm(addEntity.transaction);
将 Position 组件附加到实体
const initComponent = await InitializeComponent({    payer: provider.wallet.publicKey,    entity: addEntity.entityPda,    componentId: positionComponent.programId,});await provider.sendAndConfirm(initComponent.transaction);
在位置组件上执行运动系统
const applySystem = await ApplySystem({    authority: provider.wallet.publicKey,    system: systemMovement.programId,    entity: addEntity.entityPda,    components: [positionComponent.programId],});const tx = new anchor.web3.Transaction().add(applySystemIx);await provider.sendAndConfirm(applySystem.transaction);

在这个简单的示例中,我们创建了一个实体 Player,它包含具有 x、y、z 坐标的 Position 组件。我们可以执行运动系统来改变它的状态。这是最好的部分,通过使用 BOLT ECS 定义你的游戏数据结构,你不仅能够重用现有的系统和组件,而且还可以轻松地允许对游戏进行修改或扩展。让我们考虑一个稍微复杂的运动动力学,其中一个改变位置的速度组件定义为:

use bolt_lang::*;
declare_id!("CbHEFbSQdRN4Wnoby9r16umnJ1zWbULBHg4yqzGQonU1");
#[component]#[derive(Copy)]pub struct Velocity { pub x: i64}

有人可能想引入新的能力来加快移动速度。他们只需添加一个使用 Velocity 作用于 Position 组件的新系统即可做到这一点。

#[system]pub mod system_apply_velocity {
pub fn execute(ctx: Context, _args: Vec) -> Result { ctx.accounts.position.x += ctx.accounts.velocity.x; Ok(ctx.accounts) }
#[system_input] pub struct Components { pub position: Position, pub velocity: Velocity, }}

请注意这段代码是多么简单。这个新系统将位置和速度组件作为输入,并定义加电的逻辑。没有 Solana 帐户或 CPI 的概念,代理World 程序正在处理这里的一切。

通过几行代码和几乎不需要任何区块链知识,我们刚刚引入了一种新的游戏行为!

总结

BOLT 利用 ECS 模式,使游戏开发人员能够创建高度模块化、高效且可组合的游戏。实体充当组件、原始数据结构的容器,允许动态定制而不改变底层代码库。系统与这些组件交互,将逻辑和行为注入游戏实体。这种关注点分离不仅简化了开发过程,而且使游戏逻辑更加可重用,并增强了在发布后以无需许可的方式扩展和修改游戏的能力。

原文链接:https://blog.magicblock.gg/bolt-v0.1/