콘텐츠로 이동

로드맵

무엇을 이미 검증했고, 다음에 무엇을 하며, 무엇을 하지 않기로 했는지 적습니다. "할 수도 있다"가 아니라 근거가 있는 것만 넣습니다. 각 항목에는 지금 무엇이 있고 무엇이 없는지를 함께 적어, 남은 일의 크기를 가늠할 수 있게 했습니다.

단계

단계 기간 목표 상태
MVP · 테스트넷 2개월 P0 기능을 테스트넷에 올립니다 완료
프로덕트화 · 출시 2개월 프라이빗 메인넷 배포, 초기 사용자 확보 진행 예정
성장 지속 트랜잭션 지표 기반 확장 이후

아래 "다음에 할 것"은 프로덕트화 단계, "결정이 필요한 것"은 성장 단계에 대응합니다.

지금까지 검증한 것

계획이 아니라 실제 네트워크에서 동작을 확인한 것들입니다. 근거는 P0 검증 기록과 MVP 최종 점검에 있습니다.

기능 검증 방법
지갑 로그인 브라우저 E2E → PostgreSQL 세션 행 생성 확인
XMTP 1:1 메시징 A↔B, B↔C 실제 왕복
3인 이상 그룹 대화 A/B/C 그룹 송수신. 아래 상세
Dojang 배지와 수신함 3분류 GIWA Sepolia 실조회
온체인 증빙 실제 GIWA Sepolia 트랜잭션
증빙 원문 암호화 아카이브 서명 지갑만 복원

3인 이상 그룹 대화

1:1도 내부적으로는 2인 MLS 그룹이라 코드 경로가 하나입니다. 그래서 인원이 늘어도 같은 경로를 탑니다. CreateGroup은 자신을 제외하고 두 명 이상을 요구하므로 그룹의 최소 구성은 3인입니다.

CreateGroup.execute(peerAddresses)
  자기 주소 제외, 중복 제거, 정렬
  peers.length < 2 이면 거부      -> 그룹은 최소 3인
  canMessage() 로 수신 가능 여부 확인
  XMTP MLS 그룹 생성

XMTP에서 메시지를 받을 수 없는 주소가 섞이면 UnreachableParticipantsError로 어느 주소가 문제인지 알려주고 만들지 않습니다. 절반만 들어간 그룹을 남기지 않기 위해서입니다.

검증 내용
messaging-three-users.spec.ts 실제 XMTP dev 네트워크에서 A/B/C 3인 그룹 송수신
app-three-users.spec.ts 3인 로그인, 1:1 왕복, 미인증 상대 요청함 분류와 증빙 차단 (3개 시나리오, 57.4초)
app-group-evidence.spec.ts 그룹 대화에서 증빙 제안부터 온체인 제출까지
late-group-stream.spec.ts 뒤늦게 합류한 참여자의 스트림 수신

증빙도 그룹에서 그대로 성립합니다. 오히려 그룹이 본래 목적에 가깝습니다.

계층 인원 제약
CreateGroup 자신 외 2명 이상 (최소 3인)
증빙 API participants 2~32명
증빙 컨트랙트 2명 미만이면 TooFewParticipants로 되돌립니다

수신함 분류도 그룹을 따로 다룹니다. 자신을 제외한 참여자가 전원 verified일 때만 메시지함에 두고, 한 명이라도 아니면 요청함으로 보냅니다. 증빙 역시 전원이 인증된 그룹에서만 제안할 수 있습니다.

다음에 할 것

전부 P0에서 한계로 기록해 둔 항목이고, 대부분 뒷단은 있고 화면 배선이나 경로 하나가 없는 상태입니다. 그래서 프로덕트화 단계의 첫 묶음으로 둡니다.

새로고침하면 로그인이 풀립니다

세션 쿠키는 7일간 유효한데 앱 상태가 메모리에만 있어서, 새로고침하면 온보딩으로 돌아갑니다. 사용자에게는 "로그아웃됐다"로 보입니다. 출시 전에 반드시 없애야 하는 마찰입니다.

증빙 거부 버튼이 없습니다

죽은 코드가 아니라 미완성 기능입니다. 백엔드 API(POST /:id/rejection), 도메인 상태 전이, 테스트가 모두 있고 화면 흐름의 Flow 5에도 [거부]가 들어 있습니다. UI 배선만 없습니다. 지금은 거부 대신 1시간 만료를 기다려야 합니다.

상대 서명을 5초 폴링으로 확인합니다

증빙 화면에서 상대가 서명한 사실이 최대 5초 늦게 반영됩니다. 서명 사실을 XMTP 제어 메시지로 알리면 폴링을 없앨 수 있습니다. 제어 메시지 경로는 증빙 제안에 이미 쓰고 있으므로 종류 하나를 더하는 일입니다.

인원이 늘 때의 서명 수집 경험

증빙은 참여자 전원이 서명해야 성립합니다. 그래서 인원이 많을수록 한 명만 미루어도 전체가 멈춥니다. 누가 남았는지 보여주고 재촉하는 흐름이 필요합니다. 3인 그룹까지는 검증했지만 이 문제는 인원에 비례해 커집니다.

기기를 바꾸면 과거 대화가 비어 보입니다

MLS 키가 installation마다 달라서 새 installation은 가입 이전 메시지를 복호화할 수 없습니다. 종단간 암호화의 결과이지 버그가 아니지만 사용자에게는 "대화가 사라졌다"로 보입니다.

XMTP가 기기 간 기록 이전 경로를 제공한다(historySyncUrl, syncAll). 다만 기존 installation이 살아 있어야 넘길 수 있어서, 저장소를 이미 비운 뒤에는 복구되지 않습니다. 어디까지 보장할지부터 정해야 합니다. 자세한 내용은 대화 기록에 있습니다.

installation 10개 한도 안내

브라우저 저장소를 비우고 재로그인할 때마다 슬롯을 소모하고, 한도에 닿으면 로그인이 멈춥니다. 지금은 증상이 "로그인 버튼을 눌러도 넘어가지 않는다"라 원인을 알 수 없습니다. 최소한 남은 슬롯과 폐기 방법을 안내해야 합니다.

결정이 필요한 것

기술 난이도보다 무엇을 포기할지 정하는 일이 먼저인 항목들입니다.

XMTP production 네트워크 전환

지금은 dev 환경이라 production 환경의 XMTP 앱과 통하지 않고, dev 네트워크의 데이터 보존을 XMTP가 보장하지 않습니다. 전환하면 앱 간 상호운용이 열리지만 환경 간에는 신원도 메시지도 넘어가지 않으므로 기존 대화가 이어지지 않습니다. 언제 끊을지가 결정 사항입니다. XMTP 자체도 탈중앙 네트워크로 이전하는 중이라 일정 변동을 지켜봐야 한다(네트워크 현재 상태).

다른 앱에서도 증빙 카드로 보이게 하기

지금은 커스텀 codec 대신 gasok:evidence:v1: prefix가 붙은 텍스트를 씁니다. 그래서 다른 XMTP 앱에서 이 대화를 열면 증빙 카드가 아니라 원문이 그대로 보입니다. 정식 content type을 정의하면 해결되지만, 그 타입을 다른 앱이 지원해야 의미가 있습니다.

스마트 계정 지갑 지원

P0는 EOA 서명만 지원합니다. EIP-1271 스마트 계정을 받으려면 컨트랙트 검증 경로를 늘려야 하고, 증빙 아카이브 복원도 함께 손봐야 합니다. 복원 키를 지갑 서명에서 유도하는데 그 방식이 서명의 결정성(RFC 6979)에 기대고 있어, 스마트 계정에서는 깨질 수 있습니다.

참여자 32명 상한

증빙 API가 정한 값이고 컨트랙트 가스 비용과 맞물립니다. 더 큰 그룹을 지원하려면 상한의 근거부터 다시 잡아야 합니다.

멤버가 바뀐 뒤의 과거 증빙

사람이 들고 나면 참여자 집합이 바뀌는데, 증빙은 제안 시점의 집합에 서명합니다. 멤버가 바뀐 뒤 과거 증빙을 어떻게 보여줄지 아직 정하지 않았습니다.

Dojang 인증 갱신

파우셋 attestation은 발급 30일 후 만료됩니다. 컨트랙트가 제출 시점에 Dojang을 다시 조회하므로, 만료되면 서명을 다 모아도 제출이 거부됩니다. 만료 임박을 알리고 재발급으로 유도하는 흐름이 필요합니다.

크로스 플랫폼

지금은 모바일형 웹입니다. 네이티브 앱으로 넓힐 때의 경계는 mobile/README.md에 기록해 두었습니다. 프론트엔드가 domain / application / infrastructure / presentation 4계층으로 갈려 있고 presentation이 SDK를 직접 호출하지 않으므로, 아래 세 계층은 그대로 옮길 수 있는 구조입니다.

수익 모델 방향

1순위는 가스비 수수료입니다. 앱 안에서 일어나는 transfer, 결제, 서명에 드는 가스비의 일부를 수취합니다. 사용자가 따로 결제하지 않고 이미 발생하는 트랜잭션 위에 얹히므로 초기 UX 마찰이 가장 적습니다.

다만 초기에는 트랜잭션 자체가 적어 매출이 제한적입니다. 그래서 단일 수익원보다 여러 층을 함께 쌓는 쪽으로 봅니다. 검토 중인 후보는 다음과 같고, 온·오프램프 스프레드를 2순위로 봅니다.

후보 내용
온·오프램프 스프레드 원화 결제 지원 시 환전 스프레드
프리미엄 구독 고도화된 스팸 필터링, 대용량 증빙 보관, 그룹 관리
B2B · API Dojang 기반 신뢰 라우팅과 리스크 필터링을 SDK로 제공
증빙 조회 서비스 증빙 내용 조회를 건당 또는 구독형으로
가스비 스폰서십 온보딩 가스비를 파트너가 대납하고 노출을 받는 모델

하지 않기로 한 것

이 단계에서는 착수하지 않습니다.

항목 이유
리스크 탐지 연동 메신저용 실시간 API 스펙 협의가 먼저입니다
송금·결제, 온·오프램프 구현 수익 모델 검증 후
증빙의 법적 효력 컨셉 제시까지만. 법률 자문은 이후 단계
메시징 프로토콜 선택 기능 XMTP 하나로 충분합니다

알려진 리스크

리스크 대응
탈중앙 메시징이 느리거나 비싸질 경우 사용자가 선택하게 해 UX 저하를 막습니다. XMTP는 메인넷 전환이 진행 중이라 일정 변동을 계속 봅니다
증빙의 법적 효력 불확실 이 단계는 컨셉까지. 이후 법률 자문
XMTP 세대 교체 비용 v2가 4년 만에 읽기 전용이 됐고 v2 대화는 이식되지 않았습니다. 교체를 따라갈 운영 비용을 감수합니다
초기 사용자 확보 별도 채널 전략 필요

정리해야 할 부채

로드맵과 별개로, 코드에 남아 있어 정리 여부를 정해야 하는 것들입니다.

  • 006_evidence_content.sql이 미사용입니다. 만든 테이블과 컬럼을 어느 코드도 쓰지 않고, 005의 evidence_archives와 목적이 겹칩니다. 005를 대체할 설계인지 별개 용도인지 정해야 한다 (데이터베이스).
  • PoC 모드(VITE_CHAT_POC=1)는 실제 앱이 같은 범위를 덮습니다. 쓰지 않기로 하면 약 1,000줄을 줄일 수 있습니다.
  • 컨트랙트의 EIP-712 도메인이 GasokConversationEvidence다. 이름을 바꾸려면 재배포해야 하고, 재배포하면 기존에 모은 서명이 전부 무효가 됩니다.