저자: Magicblock, 출처: MetaCat
2024년 3월 5일에 BOLT v0.1이 출시됩니다.BOLT는 라이선스가 필요 없고, 컴포저블하며 블록체인에 영구적으로 존재할 수 있는 게임 개발을 간소화하는 온체인 개발 프레임워크입니다. BOLT는 라이선스가 필요 없고, 컴포저블이 가능하며, 블록체인에서 영구적으로 사용할 수 있는 게임 개발을 간소화하는 온체인 개발 프레임워크입니다. BOLT는 솔라나의 글로벌 상태의 구성성을 손상시키지 않으면서도 기존 멀티플레이어 게임 서버에 필적하는 완전한 온체인 게임 성능을 구현하는 SVM 호환 가속 계층을 포함하도록 설계되었습니다. 이번 초기 릴리스에서는 BOLT CLI와 엔티티 컴포넌트 시스템(ECS)을 소개하고, 최근 업데이트 내용을 소개하며, 솔라나에서 간단한 온체인 게임을 개발하는 방법을 보여드립니다.
ECS 패턴
볼트는 단순한 엔티티 컴포넌트 시스템(ECS) 프레임워크 그 이상이지만, 구성성을 높이기 위해 이 강력한 디자인 패턴을 사용할 것을 권장합니다. ECS는 코드와 데이터를 구성하여 모듈화 및 확장 가능한 게임플레이를 구현하는 방법이며, 이는 체인 전반을 구축할 때 추구하는 핵심 기능입니다. 이름에서 알 수 있듯이 엔티티는 게임 월드의 오브젝트를 나타내는 엔티티입니다.
. 고유 식별자이며 데이터나 동작을 보유하지 않고 컨테이너 역할을 합니다
컴포넌트는 엔티티에 "첨부"할 수 있는 기본 데이터 구조입니다
. 시스템은 컴포넌트를 보유한 엔티티에 작용하여 게임 로직이나 동작을 실행합니다
이 관심사 분리는 게임을 더 효율적으로 만드는 방법입니다. 관심사 분리)는 매우 유연한 모듈식 아키텍처를 가능하게 합니다. 아래 링크에서 ECS 패턴의 모든 이점을 확인할 수 있습니다.
https://github.com/SanderMertens/ecs-faq?tab=readme-ov-file#what-is-ecs.
Adaptive Architecture는 세계에서 가장 유연한 아키텍처입니다. 왼쪽;">BOLT CLI
BOLT CLI는 Anchor 프레임워크의 확장입니다. 여기에는 널리 사용되는 Solana 개발 프레임워크의 모든 기능과 월드 인스턴스, 컴포넌트 및 시스템 생성을 위한 상위 기능이 포함되어 있습니다.
BOLT CLI 설치하기
npm install @magicblock-labs/bolt-cli
BOLT CLI 설치는 다음과 같이 확인할 수 있습니다.
bolt -h
BOLT 기반 프로젝트를 실행하여 초기화합니다:
bolt init <new-workspace-name>
컴포넌트
폴더의 예제 programs-ecs/components
에서는 x, y, z 좌표가 있는 Position 컴포넌트를 정의합니다. 컴포넌트는 엔티티의 특정 속성과 관련된 데이터를 포함하는 단순한 데이터 구조라는 점을 기억하세요. 여기에는 로직이나 메서드가 포함되어 있지 않습니다.
use bolt_lang::*;declare_id!("Fn1JzzEdyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ");#[component]#[derive(Copy)]pub 구조체 위치 { pub x: i64, pub y: i64, &&&&&&&&&&&&&&&&&&&&. 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<. Components>, args_p: Vec<u8>) - Result<Components>{ ... let position = &mut ctx.accounts.position; position.x position.x position.x position.x position.x position.x position.x position.x 위치.x 위치.x position.x position.x 위치. position.x += 1; Ok(ctx.accounts) } //ctx.accounts. 입력 컴포넌트를 정의합니다. #[system_input] pub #[system_input] pub 구조 구성 요소 { pub 위치: 위치, } }}
각 시스템은 시스템 로직을 임의의 수의 컴포넌트에 적용하는 Execute 명령어를 구현합니다.
#[system_input]으로 레이블이 지정된 구조는 시스템이 입력으로 받을 컴포넌트 패키지를 지정하는 매크로입니다.
실행 명령은 월드 프로그램이 권한 및 비즈니스 로직을 확인한 후 데이터 구조에서 업데이트하는 수정된 컴포넌트를 반환합니다.
유사하게, CPI를 정의하거나 IDL을 검색하는 등 기본 블록체인 레이어에 집중할 필요가 없습니다. 시스템에서 실행할 컴포넌트 번들만 정의하면 됩니다!
월드 프로그램으로 모든 것을 통합
구성 요소와 시스템의 작동 방식을 파악했으니 이제 시작해 보겠습니다. 타입스크립트 SDK의 월드 프로그램을 사용하여 게임 인스턴스를 생성해 보겠습니다. 월드 프로그램은 월드 인스턴스, 엔티티, 애드온 및 실행 시스템을 생성하기 위한 진입점이며, SDK는 BOLT와 상호작용하기 위한 쉬운 인터페이스와 메서드를 제공합니다.
설치
볼트 SDK를 설치하려면 다음 명령을 실행하세요.
npm install @magicblock -labs/bolt-sdk --save-dev
월드 인스턴스 생성
const initNewWorld = initNewWorld = initNewWorld = initNewWorld nbsp;= 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);
새 엔티티 추가(엔티티)
const&& nbsp;addEntity = await AddEntity({ payer: provider.wallet.publicKey, }) world: initNewWorld.worldPda, connection: provider.connection,});await provider. sendAndConfirm(addEntity.transaction);
엔티티에 위치 컴포넌트 연결
const . initComponent = await InitializeComponent({ payer: provider.wallet.publicKey, 엔티티:엔티티.엔티티Pda:엔티티.엔티티Pda,엔티티.컴포넌트아이디:엔티티.컴포넌트.프로그램아이디,});await& nbsp;provider.sendAndConfirm(initComponent.transaction);
포지션 컴포넌트에서 모션 시스템 실행
const& nbsp;applySystem = await ApplySystem({ authority: provider.wallet.publicKey, }) 시스템:시스템운동.프로그램아이디,시스템:시스템운동.프로그램아이디,시스템:엔티티:엔티티.엔티티Pda,엔티티:엔티티.엔티티피다,엔티티:엔티티.엔티티피다,엔티티:엔티티.엔티티피다 components: [positionComponent.programmeId],});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");# [컴포넌트]#[파생(복사)]pub 구조 속도 { pub x: i64}
새로운 기능을 도입하여 더 빠르게 움직이고 싶은 사람도 있습니다. Velocity를 사용하여 Position 컴포넌트에 동작하는 새로운 시스템을 추가하면 됩니다.
#[system]pub mod system_apply_velocity#[system]pub_apply_velocity system_apply_velocity apply_velocity { pub fn execute(ctx: Context<Components>, _args: Vec< u8>) - Result<Components { ctx.accounts.position.x&& += ctx.accounts.velocity.x; Ok(ctx.accounts) }&& nbsp; #[system_input] pub struct Components { } pub position: 위치, pub velocity: . 속도, }}
이 코드가 얼마나 간단한지 주목하세요. 이 새로운 시스템은 위치와 속도 요소를 입력으로 받아 전원을 켜는 로직을 정의합니다. 여기에는 솔라나 계정이나 CPI라는 개념이 없으며, 에이전트월드 프로그램이 모든 것을 처리합니다.
블록체인 지식이 거의 없이도 몇 줄의 코드만으로 새로운 종류의 게임 동작을 도입했습니다!
요약
볼트는 ECS 패러다임을 활용하여 게임 개발자가 고도로 모듈화되고 효율적이며 구성 가능한 게임을 만들 수 있도록 지원합니다. 엔티티는 기본 코드 기반을 변경하지 않고도 동적으로 커스터마이징할 수 있는 기본 데이터 구조인 컴포넌트를 위한 컨테이너 역할을 합니다. 시스템은 이러한 컴포넌트와 상호 작용하여 게임 엔티티에 로직과 동작을 주입합니다. 이러한 분리 방식은 개발 프로세스를 간소화할 뿐만 아니라 게임 로직의 재사용성을 높이고 출시 후 라이선스 없이 게임을 확장 및 수정할 수 있는 기능을 향상시킵니다.