"다음 할 거 진행해줘"
아직은 "뭘 만들지"가 아니라 "뭐부터 할지"를 묻는 단계. 적어 둔 우선순위를 믿고 큰 그림째 맡기면서 시작했다.
2026년 7월 18일 오후에 빈 저장소 하나로 시작해서 7월 29일까지 커밋 77개, 온체인 컨트랙트 10종. 이 글은 그동안 뭘 만들었는지보다 어떤 질문을 던지면서 왔는지를 git 기록 그대로 되짚어 본 것이다.
시간을 어떻게 셌나 — 예전 판에는 "43시간", "70시간"이라고 적었었다. 사실 그건 첫 커밋과 마지막 커밋 사이의 경과 시간이었다. 쉬지 않고 달리던 초반에는 실제 작업 시간과 얼추 비슷했는데, 지금은 아니다. 7/22와 7/26 사이에만 92.9시간이 비어 있어서, 같은 식으로 세면 "258시간"이 된다. 대부분 쉰 시간을 실적처럼 적을 수는 없으니 부풀지 않는 값, 커밋이 찍힌 날의 수(9일)로 바꿨다. 참고로 3시간 넘게 비면 쉰 걸로 보고 세션을 잘라 합치면 약 26시간(세션 14개)인데, 세션 첫 커밋 전에 한 작업은 안 잡히니 이건 하한선이다. 어느 값이든 git log로 직접 다시 세면 된다.
커밋 시각을 구간별로 잘라 보면 언제 몰아서 했는지가 그냥 보인다. 막대에 마우스를 올리면 구간별 수치가 뜬다.
7/18 밤(21–24시)과 7/19 밤(21–23시), 밤에 몰아친 구간이 두 번 뚜렷하다. 그 사이 새벽 1시부터 7시까지는 커밋이 없는데, 초반에 제대로 쉰 건 그 6시간뿐이다. 가장 큰 봉우리는 7/19 낮(12–15시). 랜덤박스·모닥불·문양 공방이 한꺼번에 쏟아진 구간이다. 7/20·7/21은 리듬이 확 다르다. 커밋 수는 줄었는데 삽입 라인은 5,600줄 넘게 늘었다. 커밋 하나가 무거워졌다는 얘기고, 기능을 쌓는 단계에서 기반을 다지는 단계로 넘어간 흔적이다. 7/22와 7/26 사이의 92.9시간 공백은 굳이 지우지 않았다. 내리 달리는 구간과 한참 있다 돌아와 다시 손대는 구간은 성격이 다른데, 결정론 코어와 검증 가능한 공정성은 후자에서 나왔다. 돌아온 뒤 나흘(7/26 밤 ~ 7/29)은 짧은 구간이 여럿이다. 소리와 에셋 원장, 공개 프로토콜, 첫 방문자 온보딩. 한 번에 몰아치는 대신 하루에 한 겹씩 덮어 두는 작업으로 성격이 바뀌었다.
공개 저장소 56개 커밋의 누적 삽입 라인. 점을 지나가면 그때 무슨 커밋이었는지 뜬다. 초반에 가파른 건 최초 스캐폴드(9,845줄)와 풀온체인 전환(+2,341줄) 때문이고, 그 뒤로는 완만하지만 꾸준한 계단이다.
현재 코드베이스: 컨트랙트 1,601줄(Solidity 12개 파일, 현행 10종) · 클라이언트 14,567줄(72개 파일) · 서버 829줄 · MCP 서버 879줄 · SDK 200줄 · 결정론 코어 184줄 · 스크립트 25개.
공개 저장소 56개 커밋을 일곱 갈래로 나눠 봤다(비공개 저장소의 21개는 뺐다). 제일 큰 덩어리가 기능이 아니라 문서·온보딩인 게 좀 의외인데, 기능 하나 넣을 때마다 설명과 시연을 다시 맞추는 일이 따라붙었다는 얘기다.
전부 GIWA Sepolia에 올라가 있고 Blockscout에서 소스까지 검증됐다. 나온 순서가 곧 기능이 늘어난 순서다.
| # | 시각 | 컨트랙트 | 역할 | 상태 |
|---|
개발에 쓴 AI에게 이번엔 감사자 역할을 시켜 코드를 다시 읽혔다. 그때 나온 결함들이고, 고친 것도 아직 못 고친 것도 전부 열어 뒀다 (audit.html).
| 심각도 | 결함 | 조치 |
|---|---|---|
| 높음 | ERC-1155 스펙 위반 — batch 함수 누락 | 복원·재배포 |
| 높음 | 던전 settleRun 권한 검증 누락 | 입장자 기록·검증 추가 |
| 높음 | 비컨-거래 tx nonce 경합 (실측 소실) | 지갑 쓰기 직렬화 큐 도입 |
| 중간 | 결정론 던전 결과의 오프라인 탐색 가능성 | 한계로 공개 + 메인넷 커밋-리빌 설계 확정 |
| 낮음 | 비컨 좌표 무검증 | 월드 반경 클램프 |
| 낮음 | 자체 도입 RPC 배칭이 GIWA 노드에서 거부됨 | 롤백·금지 주석 |
이 글에서 정작 하고 싶은 얘기는 커밋이 아니라 질문이 달라진 방식이다. 아래는 실제로 오간 요청을 시간순으로 그대로 뽑은 것이고, 각 단계에 짧은 메모를 붙였다.
"다음 할 거 진행해줘"
아직은 "뭘 만들지"가 아니라 "뭐부터 할지"를 묻는 단계. 적어 둔 우선순위를 믿고 큰 그림째 맡기면서 시작했다.
"실시간으로 키조작 없이 서버/클라이언트 열고, 상점 열고 등등 작업 → 테스터가 별다른 설명 없이 보고만 있어도 필요한 작업을 바로 하게"
말로 된 결과 보고 말고 손 안 대도 굴러가는 걸 직접 보고 싶다는 얘기. 이후로 기능마다 자동 시연(showcase)과 E2E 검증이 따라붙는 습관은 여기서 시작됐다.
"audit 을 스스로 한다고 생각하고 코드 보고 한번 수정필요하면 해줘. tech 문서등에서는 라그나로크 언급할 필요없을듯 … 업비트와 협업이 필요하거나 서버가 필요한 부분은 배제하려고 해. 외부 의존도를 줄여서 최대한 개발"
기능을 더 얹는 대신 뭘 안 할지부터 그었다. 자체 감사, 상표·IP 리스크, 외부 의존성. 성격이 다른 세 가지를 한 번에 짚은 자리다.
"위치는 1초에 1번 정도 받아서 방향 예측해서 움직여 보면 어떨까? 대충 어느 상점으로 향한다는 걸로 받아도 좋고."
요청이라기보다 설계다. 멀티플레이 게임에서 흔히 쓰는 데드레커닝(위치 예측 보간)을 그대로 꺼내 놓았다. 가스비와 트랜잭션 빈도라는 낯선 제약 위에 20년 게임엔진 경력이 그대로 얹힌 대목.
"왜 지갑에서 친구 목록 대신 여기에 와서 즐기고 놀고 하는지 … 마비노기 모닥불 같은 예시도 검토해주고 … 리니지 온라인 … 로블록스나, 마인크래프트 추가로 더 필요한 내용들도 검토해줘"
기능 말고 "왜 다시 오는가"를 물었다. 세대가 다른 MMO 넷을 온체인이라는 새 제약 위에 겹쳐 놓고 재미가 어디서 나오는지를 뜯어봤고, 거기서 모닥불·장날·길드 깃발·도깨비 토벌이 나왔다.
"길드시스템을 좀 더 확장해서 온체인 저장되어있으니까 외부에서도 길드원들의 정보를 읽을 수 있는등 확장 가능한 시스템으로 … 시스템적인 구현 SDK 구현에 가까울수도"
온체인에 저장한다는 건 곧 누구나 읽을 수 있다는 뜻인데, 그걸 짚어내고 이름(SDK)까지 정확히 붙였다. GiwaProfile 애그리게이터와 @giwa-village/sdk가 여기서 나왔다.
"UI 등이 편리한지, 줄일부분은 없는지 … RPG 의 퀘스트 형식 어떨까?"
기능이 쌓이면서 생긴 진입장벽(HUD 버튼 7개)을 알아채고, 익숙한 UX 어휘로 답까지 같이 냈다. HUD는 4버튼으로 줄었고 온보딩은 촌장의 부탁 7단계가 됐다.
"문서 정리된 건지? 아니면 정리해줘~" — 그리고 "내가 어떻게 공부하고, 학습하고, 결과적으로 좋아졌는지 중점"
코드보다 지도(문서)가 먼저 낡지 않았는지 확인하는 습관, 그리고 그 과정을 한 번 되짚어 보려는 습관. 이 글 자체가 여덟 번째 단계인 셈이다.
"최근에 이런 걸 만들었는데, 참고해서 giwa 에 넣을만한 게 있을까? 분석하고 리스트로 정리해줘."
남이 만든 걸 가져오되 그대로 따라 하지 않고 이 마을에 맞는 것만 골라내는 단계. 제일 큰 수확은 기능이 아니라 관점이었다. 다른 데서는 "에이전트와 사람을 동등하게 대한다"가 설계 목표인데, 지갑과 서명만으로 들어오는 이 마을에서는 그게 이미 구조적 성질이다. 특권 API를 안 만든 게 아니라 만들 자리가 없다. 그 위에 MCP 서버와 자기 지갑을 든 LLM 상인 NPC를 얹었고, 값은 모델이 부르되 하한선은 코드가 막도록 안전선을 코드 쪽에 뒀다.
"테스트 가스비를 쓰니까 테스트가 어려운 면이 있는데 … 가스비 없는 로컬 서버 테스트 / 가스비 있는 테스트 이렇게 나누어주고 … local giwa backend 설정등이 가능한가?"
포셋이 24시간에 0.005 ETH라는 제약을 불평 대신 테스트 설계 문제로 바꿔 물었다. 답은 로컬 EVM 노드를 GIWA와 같은 chain-id(91342)로 띄우는 것. 코드의 체인 가드가 그대로 통과하니 프로덕션과 같은 길로 도는 진짜 E2E인데 가스만 무한하다. (GIWA 자체 노드는 500GB짜리 테스트넷 동기화라 개발용으로는 안 맞았다.) 그래서 검증 25건이 체인 없이 1초 안에 돌고, 컨트랙트 E2E도 공짜가 됐다. "어떻게 만들까"에서 "어떻게 계속 확인할까"로 질문이 옮겨간 자리다.
(외부 2D 웹3 게임엔진을 살펴본 뒤) "이거 어떨까? 분석 좀 해줘. … 여기에 적용할만한 게 있을까?" — 그리고 "웹3 게임 만드는 플랫폼 같은 거 만들어보면 어떨까?"
남이 만든 걸 들이기 전에 먼저 판단했다. 스택이 안 맞는 것(렌더러·언어·체인)은 버리고 설계 원칙 하나만 가져왔다. 결정론이면 남이 재현할 수 있다는 것. 같은 자리에서 "플랫폼을 만들까" 하는 더 큰 유혹도 스스로 접었다. 히트 없는 플랫폼은 채택은 안 되고 유지보수만 남고, 지금 필요한 건 인프라가 아니라 쓰이는 게임이라서. 그래서 나온 게 판정 로직을 순수 함수 한 벌로 모은 core/다.
"코드도 설정해줘" — 그리고 마무리로 "현행화해줘"
판정을 한 곳으로 모았더니 생각 못 한 문이 하나 열렸다. 부작용 없는 순수 함수라 남이 온체인 등반 기록을 그대로 재현할 수 있다. npm run verify 한 줄로 실체인 원정 3/3이 바이트 단위까지 맞았고, 게임 안에서도 귀환하자마자 "🔒 이 결과 검증하기"를 눌러 볼 수 있다. 확률을 공개하는 것과 결과를 재현하게 해 주는 건 신뢰의 층이 다르다. 마지막 "현행화해줘"는 자기가 쓴 숫자를 다시 세라는 얘기였는데, 덕분에 문서에 남아 있던 죽은 컨트랙트 주소 두 개와 이 글의 "70시간"이라는 셈법 자체가 잘못됐다는 것이 드러났다. 위의 "시간을 어떻게 셌나"가 그 답이다.
작업 9일 동안 바뀐 건 코드량이 아니라 질문의 위치다. 초반엔 "다음에 뭘 할까"를 맡겼고, 중반엔 "이건 하지 말자"고 선을 그었고, 후반엔 "이게 왜 재밌어야 하는가"를 스스로 따졌다. 라그나로크에서 시작해 마비노기·리니지·로블록스까지 훑어본 것도, 온체인 저장이 곧 SDK라는 것도, 결국 20년 게임엔진 경력이 새로운 제약(가스비, 소울바운드, 서버 없는 신뢰) 위에서 다시 돌아간 결과다.
중반에는 남이 만든 걸 보면서 베낄 것과 골라낼 것을 구분했고, 포셋 제약도 불평 대신 테스트 설계 문제로 바꿔 물었다. 기능 쌓는 속도는 느려졌는데 커밋 하나의 무게는 늘었다. 만드는 단계에서 지탱하는 단계로 넘어가는 구간이 git 기록에 그대로 남아 있다.
후반에는 한 겹 더 갔다. "이 결과를 남이 믿을 이유가 있나". 시작은 판정 공식을 한 곳으로 모으는 정리였는데, 끝내고 보니 그게 신뢰 문제였다. 결정론이면 재현할 수 있고, 재현할 수 있으면 믿어 달라고 할 필요가 없다. 같은 날 자기가 쓴 숫자를 다시 세라는 요청이 이 글의 셈법까지 고치게 만들었다.
다음에 할 것들은 이미 정해져 있다.