# Technical application

기술적인 방식은 다음과 같은 형태를 띄고 있다.

1. **Blockchain 위의 데이터베이스용 NFT와 게임 로직 컨트랙트**
2. **WebGL에 기반한 2D/3D 게임 엔진**
3. **React 기반의 WebGL과 Blockchain 통신 중계 모듈**

이 세 가지는 독립적으로 작동되는 모듈이며, 이를 합쳐서 하나의 게임을 만들 수 있다. 당연하게도, 개발자와 사용자들은 각 모듈이 마음에 안 들거나, 추가적인 개발을 하고 싶으면 포크를 하거나, 신규 개발을 하여 모듈을 갈아끼우거나 업데이트 할 수 있을 것이다.

Blockchain 위에서 NFT 컨트랙트는 onchain에 최대한 데이터를 저장하는 형태로 구현되었다. 각 NFT의 Metadata는 온체인에 저장되어있으며, 데이터를 압축해서 저장하는 일종의 압축 DB contract 모듈을 통해서 접근하고 관리가 가능하다. 즉, smart contract 들은 DB contract에 contract call을 통해서 접근이 가능하고, 일반적인 web3 어플리케이션은 NFT 컨트랙트를 일반적인 방식으로 사용하듯이 접근하면 된다.

이러한 NFT 컨트랙트들을 onchain에서 logic contract들을 통해서 접근하고 관리 가능하다. Uniswap이나 다양한 Yield Farming 들이 ERC20 토큰의 approval 등을 이용한 것과 같이, logic contract들을 이용하여 NFT들을 Staking하고 logic contract 내에서 state transition과 event들을 발생 시킬 수 있다. 이를 통해서, 작은 단위의 logic들을 이용하여 게임을 구현한다.

대표적으로 Nexon에서 개발한 모바일 게임, Blue Archive에서 이런 시스템의 힌트를 볼 수 있다. 플레이어들은 유니크한 캐릭터들을 루트 박스 시스템을 통해서 회득할 수 있으며, 이렇게 획득한 유니크한 캐릭터들의 강화나 장비 셋팅등을 진행한다 (강화 logic), 그리고 이 캐릭터들을 AP (Action Point)를 사용하여 전투에 참여시키고, 전투의 승/패에 따라 보상을 받는다(일반 전투 logic). 또한, 경쟁전이라는 특이한 형태의 로직이 존재하는데, 플레이어들은 캐릭터들을 선택하여 방어팀을 구성할 수 있다. 그리고 다른 사람이 선택한 방어팀을 플레이어가 공략 할 수 있는데, 공략 할 때마다 공격팀 캐릭터들을 선택하고, 100% 자동전투로 승패가 나뉘며 보상을 받게 된다. 강화/일반전투/경쟁전 logic은 각각 구획이 나뉘어진 서로 간섭하지 않는 부분이며, 오직 캐릭터와 각 logic만이 서로 상호작용을 한다.

캐릭터들을 NFT라고 생각해보자. NFT의 강화로직은 onchain metadata의 state 변화로 구현할 수 있음을 빠르게 눈치 챌 것이다. 또한, 이 일반 전투 시스템과 semi-PvP 시스템인 경쟁전의 구현은 자동 전투이기 때문에 블록체인에 그대로 구현하기 상당히 난이도가 쉬운 편이다. 즉 일반 전투 logic contract와 PvP logic contract를 만들어 블록체인에 올리고, 업데이트 일정에 따라 (신규) 보스전 logic contract를 주기적으로 만들어서 올리고, 탐험 logic contract를 올리는 등의 장기적인 게임 확장도 손쉽게 가능하다.

또한, 여기서 더 재미있는 부분은 전투 logic contract는 NFTWAR 규격에 맞는 어떠한 NFT 컨트랙트도 사용할 수 있다는 것이다. 개발자가 원하면, 비슷한 장르의 다른 형태의 게임을 구현하는 등의 일을 할 수도 있으며, 이렇게 구현된 타 서비스들의 NFT들끼리 전투를 하는 전투 logic contract를 만들어, 멀티버스 아레나 같은 것도 운영할 수 있다. (밸런스 문제는 나중에 생각하도록 하자)

많은 게임 플레이어들은 미려한 그래픽과 상호작용에 대해서 엄청나게 깐깐한 평가를 한다. 그렇기에, NFTWAR는 WebGL이라는 기술 사용으 방향을 잡았다. 이는 2가지 이유가 있다. 첫째, 현존하는 많은 메타버스를 비롯한 Web3 서비스는 최종적으로 언제 어디서나 사용할 수 있어야 한다. 또한 이 상황에서 NFT는 3D 파일 처리와 2D 파일 처리를 동시에 해야 할 때가 많다. 즉, WebGL를 통하여 모바일/웹/콘솔 환경에서 어떤 것을 사용하더라도 접근이 가능하며, 2D/3D를 가리지 않는 클라이언트를 만들어야할 필요가 있었다. 둘째, 게임은 일반적으로 그래픽 퀄리티를 많이 따진다. 이 때문에 Unity의 WebGL Build Export를 통해서 빠른 개발과 그래픽 퀄리티 이슈를 잡아야 할 필요가 있었다. 이를 통하여서, 기존의 많은 게임 개발자들이 NFT에 기반한 게임을 만들 기회를 열고, 블록체인 개발자들과 협업할 수 있도록 하였다.

하지만, WebGL과 Blockchain은 어떻게 연결하는가? 많은 사람이 질문하고 도전하고 좌절한 부분이다. 우리는 Unity WebGL용 브라우저 통신 Plugin과 ethersjs, caverjs와 같은 웹 브라우저와 블록체인을 연결하는 라이브러리에서 힌트를 찾았다. 웹 브라우저, 정확히는 React에서 event bus를 이용하여, Unity WebGL과 블록체인이 실시간 통신을 하며, 필요에 따라 사용자의 전자 지갑 서명 (로그인, 아이템 구매, 전투 등의 액션) 을 받아서 블록체인과 WebGL를 동기화하는 작업을 진행할 수 있도록 SDK를 만들었다.
