Blockchain/Project

[Project] 누구(Who)가 아닌 기술을 신뢰하는 Klaytn 기반 티켓팅 서비스

beeimp 2022. 8. 2. 23:47

1. 프로젝트 개요

TT 란 ?

누구(Who)가 아닌 기술을 신뢰하는 Klaytn 기반 티켓팅 서비스

Trust Ticket, TT는 블록체인 기술을 이용한 티켓팅 서비스를 제공합니다.
TT 이용자는 이벤트를 기획할 수도 있고, 다른 이벤트를 참여할 수 있습니다.
이벤트 참여를 하면 각 이벤트에서 발행하는 토큰을 받을 수 있고, 이는 입장티켓 또는 응모당첨권으로 사용합니다.

배포 링크

2. 프로젝트 소개

토큰 이코노미

  • 왜 필요한가요?
    • 이벤트가 돌연 취소
      • 상황 - 소비자는 이벤트 기획측 또는 플랫폼에서 알 수 없는 이유로 콘서트 취소에 대해 일방적인 통보를 받았습니다.
      • 문제 - 소비자는 일방적인 통보를 받았음에도 보상을 받을 수 없습니다.
    • 티켓 사재기
      • 상황 - 암표상들은 개인의 이익을 위해 이벤트에서 티켓을 구매 후 몰래 재판매합니다.
      • 문제 - 암표상들은 공정한 티켓 획득 기회를 미리 사재기를 하여 웃돈을 붙여 표를 판매하기 때문에 위법하다고 할 수 있습니다.
    • 플랫폼의 서비스 종료
      • 상황 - 이용하던 거래 플랫폼이 어떠한 이유로 유지할 수 없어 서비스를 종료했습니다.
      • 문제 - 이용하던 거래 플랫폼 서비스가 종료되면서 소비자의 모든 기록이 삭제되면서 지금까지의 활동이 확인할 수 없습니다.
    • 각 플랫폼의 제약
      • 상황 - 이용하던 거래 플랫폼이 아닌 타 거래 플랫폼을 이용한다.
      • 문제 - 타 거래 플랫폼에서는 이전에 이용하던 거래 플랫폼에서 참여했던 콘서트 내역을 가져올 수 없거나 참여했던 실물 콘서트 티켓을 모두 등록해야하는 불편함을 가집니다.
  • 무엇을 얻을 수 있나요?
    • 소비자는 이벤트가 갑자기 취소되더라도 티켓 가격의 103%를 보상 받을 수 있습니다.
      • 이벤트 기획자는 이벤트를 등록하면서 티켓으로 판매하여 얻을 수 있는 총액의 5%(보증금 3%, 수수료 2%)를 지불합니다.
        • 보증금은 이벤트 성공시 이벤트 기획자에게 반환됩니다.
        • 수수료는 주로 컨트랙트 실행, 서버 유지비에 사용됩니다.
      • 이벤트가 최소되면 소비자는 대해 티켓의 103%를 보상 받습니다.
        • 이벤트 기획자의 보증금이 피해 보상금으로 사용합니다.
    • 소비자는 공정한 티 켓케득 기회를 얻을 수 있습니다.
      • 이벤트가 종료될 때까지 토큰 거래가 불가능합니다.
        • SBT와 NFT를 적절히 사용하여 참여에 대한 티켓의 주요 목적을 달성합니다.
    • 소비자는 이용하던 티켓 플랫폼이 종료되더라도 모든 기록을 잃지 않습니다.
      • 데이터베이스가 손상되더라도 Klaytn Network에서 복구 가능합니다.
      • 만약, 해당 플랫폼의 서비스가 종료되더라도 모든 기록은 Klaytn Network에 투명하게 저장되어 토큰형 티켓의 거래 또는 확인이 가능합니다.
    • 이벤트 기획자는 이용하던 여러 티켓 플랫폼이 통합적으로 VIP를 관리할 수 있습니다.
  • 누가 할 수 있나요?
    • 카카오 계정이 있다면 누구든 사용 가능하고 누구든 될 수 있습니다.
  • 언제, 어디서 사용할 수 있나요?
    • 모바일 기기에 종류에 상관없이 언제, 어디서든 이용 가능합니다.
      • React-Native로 앱이 제작되어 Android, ios에 상관없이 사용 가능합니다.
    • 언제, 어디서든 이벤트를 등록할 수 있습니다.
      • PC, Mobile 모두 지원합니다.
    • 언제, 어디서든 티켓을 구매, 응모, 인증, 확인 가능합니다.
  • 어떻게 사용할 수 있나요?
    1. 카카오톡 앱을 설치합니다. ( 이미 다 있으실 거에요 )
    2. 앱 서비스에서 클립을 가입합니다.
    3. TT 앱을 설치합니다. ( 앱 스토어, 플레이 스토어 등 배포 예정입니다! )
    4. TT 앱을 실행하여 이벤트 등록부터 티켓 구매, 응모, 조회, 인증, 확인까지 자유롭게 이용 가능합니다.

Klaytn 사용한 이유

  • 카카오 클립으로 누구나 간단하게 지갑 생성 가능합니다.
    • 복잡한 지갑 생성 과정을 거치지 않고, 국민 메신저 서비스로 자리 잡은 카카오톡 앱이 있다면 사용 가능한 클립을 사용하기 위해 채택했습니다.
  • 속도와 가격 측면에서 용이합니다.
    • 가격 - 트랜잭션에서 발생하는 가스비가 1~20원 수준으로 매우 저렴합니다.
    • 속도 - 이론적 측면이 아닌 실제 4000 TPS의 처리량을 가집니다

WorkFlow

다이어그램.png

기능별 시연 영상

  • 랜딩 페이지 (WEB)

  • Klip 로그인
    • Klip을 이용한 개발Klip에서 request key를 받아 서버로 전송하고, 서버에서 Klip과 통신해서 사용자를 인증합니다. 인증된 사용자에게 JWT 토큰을 발행하여, TT의 기능을 사용할 수 있도록 합니다.
      • ezgif.com-gif-maker (3).gif
    • 현재 Klip API에서 테스트 넷을 지원하지 않습니다. 그래서 Klip의 일부 기능들을 서버에서 구현하여 Klip API의 역할을 대체합니다.
  • 이벤트 등록(모바일)
    • 간편한 이벤트 등록
    • 스마트폰으로 간단하게 이벤트를 등록할 수 있고, 많은 데이터를 등록하는 사람들을 위해 웹으로도 등록할 수 있습니다.
    • 토큰 발행
      • enroll.gif
    • 이벤트가 등록되면, 컨트랙트는 토큰을 서버에 발행합니다. 발행된 토큰은 구매를 통해 얻을 수 있습니다.
  • 이벤트 등록(웹)
    • TT_3.gif
    • TT_2.gif
  • 이벤트 티켓 구매/응모
    • 티켓 구매
    • 서버는 티켓을 구매한 사용자에게 티켓을 전송합니다. 사용자가 쉽게 구매할 수 있도록 Klip API를 사용하여, 편의성을 높였습니다.
    • 티켓 응모
      • ezgif.com-gif-maker (4).gif
    • 응모한 사용자의 주소를 컨트랙트에 보관합니다. 이벤트 응모 가능 기간이 지나면 서버가 자동으로 이벤트 추첨을 컨트랙트에 요청합니다. 이벤트 추첨은 응모자 중 랜덤으로 당첨자를 선정합니다.
  • QRcode 생성
    • 간편한 티켓 생성
      • ezgif.com-gif-maker (5).gif
    • QR 코드는 앱에서 티켓을 클릭할 때 발행되고, 서버는 해당 QR에 유효 기한을 부여합니다. QRcode는 nonce 데이터를 가지고 있습니다.
  • QRcode 유효성 확인
    • 티켓 확인하기서버는 해당 이벤트의 QRcode인지, 유효 기한이 남았는지 검사합니다.
      • ezgif.com-gif-maker (6).gif
    • QR Reader는 QRcode에서 읽은 데이터(nonce, event_id)를 서버로 전송합니다.
  • 검색
    • 원하는 이벤트 찾기
    • 사용자는 Keyword가 포함한 이벤트를 검색할 수 있습니다.
    • 인기 있는 이벤트 (개발 진행 중)이후 같은 키워드가 들어오면 count값을 올려주고, count가 가장 많은 키워드를 인기 검색어로 정합니다.
      • ezgif.com-gif-maker (7).gif
    • 사용자가 검색한 키워드 중 검색 결과가 유효한 데이터를 DB에 저장합니다.
  • 내 주변
    • 나와 가까운 이벤트 찾기
      • ezgif.com-gif-maker (8).gif
    • 현재 위치의 좌표를 서버로 보냅니다. 서버는 Map API를 통해 사용자의 지역을 찾고, 이벤트의 좌표와 거리를 구해 사용자에게 출력해 줍니다.

3. 기술 스택

4. 관련 문서

시나리오 기반 WorkFlow

App Prototype

5. 내가 수행한 역할

Project Management

  • Notion을 통해 프로젝트 전체 work-flow 기획
  • Discord에서 Github Webhook를 연결하여 Github bot 연결

Blockchain

  • KIP17을 활용한 Solidity 컨트랙트 작성
    • 이벤트 생성
    • 이벤트 토큰 민팅, 거래, 응모
    • 이벤트 당첨자 추첨 - 랜덤함수 구현
    • 이벤트 종료

Back-End

  • DB 생성 및 원격 연결 - Mongo Atlas
  • JWT 인증 기능 구현 - Nest.js @Guard
  • DB 정보 추가 및 업데이트 Scheduling 구현 - Nest.js @Cron
  • 컨트랙트 실행 API 구현 - Caver-js
  • 서버 자동 배포
    • Azure VM 위에 Docker, Jenkins 설치
    • Github WebhookJenkins설정
    • Jenkins Pipeline 작성

Front-End (WEB)

  • Lending Page
  • Create Event Page
  • Created View Page

6. 회고

초기 목표(시작하게 된 목표)

  • 프로젝트 초기 목표
    • 투자에 과열된 NFT 또는 SBT에 대한 새로운 인식 제공
    • 누구나 이벤트 성공 여부에 대한 최대 보상 제도 도입
    • 누구나 이벤트를 생성 수 있고 혜택을 받을 수 있는 서비스 구현
  • 팀장으로써 목표
    • 팀원들 간의 심리적 갈등이 없이 프로젝트가 즐겁게 시작하여 마무리
    • 저를 포함한 팀원이 프로젝트에서 얻고자하는 방향 및 결과물 완성
    • 각 포지션의 개발
    • 프로젝트 이슈 관리
  • 개인 목표
    • 모두 피해 받지 않는 토큰 이코노미 설계
    • 티켓팅 컨트랙트 작성 및 배포

현실(실제 어떤 원인에 의해 문제가 발생했고 해결했는가?)

  • 각 포지션에만 집중할 수 있는 환경
    • 상황 - 백엔드에서 개발한 API를 통해 프론트에서 테스트를 진행해야 합니다.
    • 문제 - 프론트에서 API를 테스트하기 위해서는 백엔드 서버를 로컬에 다운받아 서버를 실행시켜 테스트해야하는 어려움이 있었습니다.
    • 해결 - 클라우드 서비스 중 Azure를 이용하여 VM을 생성하여 Docker와 Jenkins를 설치했습니다. Jenkins를 프로젝트 Github Webhook과 연결하여 push 이벤트가 발생하면 빌드하여 실행할 수 있도록 설정했습니다. 이를 통해, 서버에서는 API를 개발 후 push하면 프론트에서는 해당 API를 사용할 수 있었습니다.
  • 카카오 클립 메인넷만 지원
    • 상황 - 앱에서 로그인, 이벤트 등록, 티켓 구매, 응모 등 카카오 클립 지갑을 통해 컨트랙트에 요청해야 했습니다.
    • 문제 - 테스트 환경에서 진행하는 프로젝트에서 카카오 클립이 테스트넷을 지원하지 않았습니다.
    • 해결 - 가스비가 발생하지 않는 로그인 인증 부분만 카카오 클립을 사용하고, 이외의 클립 API는 서버에서 자체적으로 테스트용 지갑을 생성 후 매칭하여 서버 API를 통해 대체 했습니다.
  • 당첨자를 뽑기 위한 랜덤 함수 구현
    • 상황 - 이벤트 응모를 진행하면 당첨자를 뽑는 추첨을 진행해야 했습니다.
    • 문제 - 이중 반복문을 사용하여 suffle을 구현하게 되면 시간 복잡도 n^2으로 높은 가스비가 발생할 수 있었습니다.
    • 해결 - 해시 함수를 통해 랜덤한 값을 응모자 수의 나머지 값으로 랜덤한 인덱스를 생성하고 순차적으로 Swap했습니다. 이를 통해, 시간 복잡도 n을 달성하여 가스비 절감과 속도 성능을 향상 시킬 수 있었습니다.

후기(지속, 개선, 포기할 것은 무엇인가, 아쉬운 점)

  • 포기 - 개인적으로 설계했던 시나리오 수정
    • 내용 - 팀원을 뽑기 전, 개인적으로 설계했던 시나리오를 수정했습니다.
    • 포기한 이유 - 팀원 모두 프로젝트를 재밌게 진행하기 위해 시나리오를 수정했습니다. 포괄적으로 제시했던 아이디어에서 개인적으로 했으면 좋겠던 시나리오가 있었는데, 그 시나리오를 포함하여 다른 팀원들이 생각하는 시나리오를 수합하여 투표를 진행하여 최종적으로 하나의 시나리오를 채택하게 되었습니다.
  • 지속 - 각 포지션에 해당하는 독립적인 작업 부여
    • 내용 - POSTMAN의 Mock server 기능을 활용하여 프로젝트 진행 간 백엔드와 프론트에 대한 기능 개발 유무와 상관없이 테스트 API를 사용하여 간섭없이 각 개발을 진행할 수 있었습니다.
    • 지속하려는 이유 - 이전에 프로젝트를 진행할 때는 백엔드에서 API를 개발할 때까지 데이터를 가져올 수 없어 더미 데이터를 추가하고 진행했었습니다. 이 과정에서 더미 데이터 위치에 API를 연결해야하는 추가 작업이 필요 했었는데, 추가 작업을 진행하지 않아 생산성을 향상시킬 수 있었습니다.
  • 아쉬운점 - 진행 상황 관리 부족
    • 내용 - 일일 2회 회의를 진행하면서 이슈 사항을 정리하면서 프로젝트를 관리했습니다.
    • 아쉬운 이유 - 프로젝트 기한이 다가오면서 팀원들의 일일 프로젝트 작업을 제대로 확인하지 못했습니다. 또한, 다들 지쳐가고 와중에 팀장으로써 제대로 독려를 못한 것 같아 아쉬웠습니다.
  • 개선 - 지속적인 진행 상황 확인 및 관리
    • 내용 - 아쉬운점과 같습니다.
    • 개선하려는 이유 - 프로젝트 결과물이 개인적으로 기대하는 만큼 UI가 그려지지 못해 너무 아쉬웠습니다. 팀장으써 각 팀원의 컨디션과 진행 상황을 제대로 파악하지 못했기 때문이라고 생각합니다. 바쁠수록 돌아가라는 말이 있습니다. 추후 프로젝트를 진행하게 된다면, 다음 사항을 생각하면서 개선하려고 합니다.
      1. 기본 기능, 주요 기능, 고급 기능, 추가 기능 등 기능들을 단계별 세분화 개발
      2. 지속적으로 결과물을 평가하고 일정을 조정하여 프로젝트를 관리