免责声明:金色财经所有资讯仅代表作者个人观点,不构成任何投资理财建议。请确保访问网址为(jinse.cn) 举报

    Solana 链上开发框架 BOLT

    作者:Magicblock;来源: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 <new-workspace-name>

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

    jinse.cn 3
    好文章,需要你的鼓励
    jinse.cn 3
    好文章,需要你的鼓励
    参与评论
    0/140
    提交评论
    文章作者: / 责任编辑:

    声明:本文由入驻金色财经的作者撰写,观点仅代表作者本人,绝不代表金色财经赞同其观点或证实其描述。

    提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

    金色财经 > MetaCat > Solana 链上开发框架 BOLT
    • 寻求报道
    • 金色财经中国版App下载
      金色财经APP
      iOS & Android
    • 加入社群
      Telegram
    • 意见反馈
    • 返回顶部
    • 返回底部