Captain's Log
← Observatory
Observatory·

온체인 입항 — 학습 수료를 NFT 배지로, Base 메인넷 발행

백서 학습 서비스에 Web3 돛을 올렸다. 퀴즈 만점 시 ERC-721 배지를 Base 메인넷에 실제 민팅 — 부정 발급을 막는 EIP-712 서버 검증까지. 다른 프로젝트(project-EF)의 지갑·Firebase 모듈을 이식해 학습을 온체인 인증으로 이었다.

UnderwayWeb3NFTSmart ContractBase

항해 기록

정적인 학습 서비스였던 widigg에 온체인 인증이라는 두 번째 돛을 올렸다. 백서 퀴즈를 모두 맞히면 학습 수료 배지를 실제 NFT로 발급한다.

  • 컨트랙트: WhitepaperBadge (ERC-721, OpenZeppelin) — Base 메인넷 배포, Basescan·Sourcify 이중 소스 검증. 배지 이미지(SVG)·메타데이터를 완전 온체인 저장
  • 부정 발급 방지: 퀴즈 정답을 클라이언트에 노출하지 않고, 서버가 채점 후 EIP-712 바우처 서명을 발급 → 컨트랙트는 그 서명이 있어야만 민팅. "퀴즈를 안 풀고 민팅"이 원천 차단된다
  • 지갑·저장소: MetaMask 연결, 발급 기록은 서버 전용 경로로만 Firestore에 기록(클라이언트 직접 쓰기 차단). 배지 공유용 OG 카드도 추가
  • 부가 기능: 목표가 도달 시 브라우저 웹푸시로 알리는 가격 알림
  • 출처: NFT 플랫폼 뼈대만 있던 다른 프로젝트(project-EF)의 지갑·Firebase 모듈을 이식해 재활용

판단

학습 서비스에 왜 NFT인가 — "수료했다"는 사실을 위·변조 불가능하게 증명하기 위해서다. 서버 DB의 기록은 우리가 마음대로 바꿀 수 있지만, 온체인 배지는 그렇지 않다. 다만 그 신뢰는 "아무나 민팅하면" 무너지므로, 서명 기반 서버 검증이 이 기능의 핵심이었다. 온체인(소유 증명)과 오프체인(빠른 조회·검증)의 역할을 나눠, 컨트랙트는 발급·소유만 맡고 채점·자격 판단은 서버가 맡는 구조로 정리했다.

가장 많은 시간을 쓴 건 코드가 아니라 무료 티어의 현실이었다. 가스비는 "교육 수료 비용" 명목으로 학습자가 부담하도록 설계하되 부담이 적은 Base(L2) 를 골랐고, 15분 주기 알림 체크는 Vercel 무료 크론이 "하루 1회"만 허용해 GitHub Actions로 우회했다. 배포가 조용히 실패하던 원인도 바로 이 크론 제약이었다 — 대시보드 필터에 가려진 실패를 걷어내고서야 보였다.

남은 항로

  • 백서 콘텐츠 4종(Chainlink·Uniswap·Aave·Cosmos) 추가 — AI 생성 파이프라인 대기 중
  • Sepolia 테스트넷 병행 운영 → 메인넷 안정화 관찰