tech

토스 같은 Web3 앱을 만들고 싶었다

Web3 송금을 처음 써봤을 때 솔직히 당황했다. 지갑 주소가 이렇게 생겼다.

0x197f85BC41bD1BD6329AB02Dee66b155c2717aF2

이게 맞는 주소인지 틀린 주소인지 알 방법이 없다. 그냥 믿고 보내는 수밖에. 거기에 트랜잭션, 서명, 가스비까지. 처음 써보는 사람 입장에서는 첫 화면부터 벽이 느껴진다.

개발자로 일하면서도 이 문제를 직접 목격했다. 블록체인 기반 서비스를 만들던 회사에서 사용자 문의가 가장 많이 들어오는 주제는 항상 같았다.

"트랜잭션이 성공한 건가요?" "잘못 보낸 것 같은데 어떻게 하나요?"

기술은 분명히 좋은데, 사용자는 계속 막혔다. 결국 Web3 생태계가 더 커지고 개발자 생태계도 활발해지려면, 일반 사용자가 쓸 수 있는 UX가 먼저라는 생각이 들었다. 그때부터 머릿속에 하나의 질문이 생겼다.

"토스처럼 쉬운 Web3 앱을 만들 수 있을까?"


토스에서 배운 것

토스에서 가장 먼저 눈에 들어온 건 디자인이었다.

UX보다도 UI. 처음 화면을 열었을 때 느껴지는 그 깔끔함.

나는 개발하면서 항상 "Simple is the best"를 중요하게 여긴다. 도메인마다 추구해야 할 UI 방향이 다르겠지만, 기본적으로 깔끔한 것이 좋은 디자인이라고 생각한다. 복잡한 기능도 단순하게 보이게 만드는 것, 그게 프론트엔드 개발자가 해야 할 일이라고 느낀다.

그리고 토스가 처음 나왔을 때를 기억한다.

계좌번호를 몰라도 전화번호로 송금할 수 있다는 것. 그게 혁명이었다. 당연하게 여기던 것을 없애버린 순간이었다.

그 순간이 떠올랐다.

계좌번호 = 지갑 주소

토스가 계좌번호를 없앴듯이, Web3에서 지갑 주소를 없애면 어떨까. 특히 Web3는 지갑 주소가 더 길고 더 낯설다. 토스가 해결한 것보다 훨씬 더 큰 문제가 여기 있었다. 그래서 MVP는 하나로 정했다.

닉네임으로 송금한다. 그게 전부다.


기술 선택, 그 이유

Privy - 소셜 로그인이 곧 지갑이 되는 경험

Nuvo의 핵심 컨셉은 "Web2 사용자도 쓸 수 있어야 한다"는 것이었다.

그러려면 첫 번째 벽인 지갑 생성을 없애야 했다. MetaMask 설치, 시드 구문 저장, 개인키 관리. 이 과정을 일반 사용자에게 요구하는 순간 이미 절반은 이탈한다.

Privy는 이 문제를 해결해줬다. 구글 로그인 하나면 Web3 지갑이 자동으로 생성된다. 사용자는 지갑이 만들어졌다는 사실조차 몰라도 된다. Nuvo가 만들고 싶은 경험과 정확히 일치했다.

개발자 경험도 좋았다. 설정 30분이면 로그인부터 지갑 생성까지 붙일 수 있었다.

viem - 타입 안정성이 곧 신뢰다

Web3에서 실수는 단순한 버그가 아니다. 지갑 주소 하나를 잘못 입력하면 돈이 영원히 사라진다. 되돌릴 방법이 없다.

viem은 TypeScript 기반으로 설계된 Web3 라이브러리다. 지갑 주소 타입, 체인 타입, 단위 변환까지 엄격하게 잡혀있다. 컴파일 단계에서 실수를 잡아준다는 것, 그게 선택 이유였다.

ethers.js도 좋은 선택이었겠지만, Nuvo처럼 실제 자산을 다루는 앱에서는 타입 안정성이 더 중요했다.

Base - 가스비 0에 가까운 이더리움

이더리움 메인넷은 가스비가 비싸다. 송금 한 번에 수천 원의 수수료가 붙는다면 Web2 사용자는 첫 송금에서 바로 이탈한다.

Base는 이더리움 L2다. 이더리움과 완전히 호환되면서 가스비는 거의 0에 가깝다. 거기에 Coinbase가 만들었다는 것 자체가 안정성과 신뢰성을 보장해준다.

Web2 사용자가 수수료 걱정 없이 첫 송금을 경험할 수 있는 환경. Base가 그 답이었다.


기술 스택을 정하고 나니 방향이 선명해졌다.

구글 로그인 하나로 지갑을 만들고, 닉네임으로 송금하고, 가스비는 거의 들지 않는 앱.

Web3를 모르는 사람도 쓸 수 있는 토스 같은 앱.

이제 만들면 된다.


다음 편에서는 Privy로 구글 로그인과 지갑 자동 생성을 구현한 과정을 다룬다.