[디센트] 지갑 UX 스토리 : “approve” 그 특별한 트랜잭션에 관하여

블록체인 지갑을 사용한다는 것은 여전히 어렵습니다. 스스로 지갑의 개인키를 관리해야 한다는 컨셉도 어렵게 느껴지고요. 지갑을 사용하려면 아직은 어느 정도 기술에 대한 이해가 필요하기도 하죠. 그렇다고 더 나은 사용자 경험을 위한 노력을 멈출 수는 없을 것 같습니다. 개선할 수 있는 부분부터 하나씩 꾸준히 개선하다보면 언젠간 더 쉽게 지갑을 사용할 수 있게 될테니까요.

디센트 지갑팀에서 지갑의 사용자 경험(UX, User eXperience)을 개선하기 위해 노력했던 사례들을 하나씩 풀어보고자 합니다. 이번 글의 주제는 DEX와 같은 디앱을 사용하다보면 마주치게 되는 “approve” 트랜잭션에 관한 이야기입니다.

TL;DR

  • ERC-20과 ERC-721은 토큰을 위한 스마트 컨트랙트 인터페이스입니다.
  • ERC-20과 ERC-721 인터페이스에는 토큰을 옮길 수 있는 권한을 주는 approve라는 특별한 트랜잭션이 있습니다.
  • approve는 토큰을 옮길 수 있는 권한을 부여하는 트랜잭션이기 때문에 사용자 입장에서 해당 트랜잭션에 대한 정확한 인지가 필요합니다.
  • approve 트랜잭션은 특별하면서도 위험할 수 있는 트랜잭션이기 때문에 지갑의 UX/UI에서도 특별하게 취급해야 합니다.

토큰을 위한 스마트 컨트랙트 : ERC-20 & ERC-721

잘 알려진 것처럼 이더리움 위에서는 다양한 스마트 컨트랙트가 수행됩니다. 스마트 컨트랙트는 블록체인 위에서 수행되는 프로그램이죠. 스마트 컨트랙트로 만들 수 있는 것은 무궁무진합니다. 그리고 이미 수많은 스마트 컨트랙트들이 이더리움 메인넷 위에서 동작하고 있습니다. 이더리움 메인넷 위에 존재하는 수많은 스마트 컨트랙트 중에 특별한 스마트 컨트랙트가 있습니다. 바로 토큰을 만들기 위한 스마트 컨트랙트입니다.

보통 토큰을 위한 스마트 컨트랙트는 토큰과 토큰간에, 그리고 토큰과 디앱간의 호환성을 위해서 표준화된 인터페이스를 가지고 있습니다. 토큰은 크게 두 종류로 나눌 수 있는데요. 암호화폐라고 부르기도 하는 펀지블 토큰 (Fungible Token)을 위한 스마트 컨트랙트 인터페이스인 ERC-20이 있고, NFT (Non-Fungible Token)를 위한 인터페이스인 ERC-721/1155가 있습니다.

펀지블 토큰을 위한 ERC-20

ERC-20은 펀지블 토큰을 위한 스마트 컨트랙트 인터페이스입니다. 이더리움 메인넷에서 네이티브 토큰인 이더(ETH)를 제외한 거의 모든 암호화폐들이 ERC-20 인터페이스를 따르고 있습니다.

ERC-20 인터페이스 Method 규격

ERC-20 인터페이스를 살펴보면 다음과 같은 기능들이 있다는 것을 알 수 있습니다.

  • 토큰 이름, 심볼, 소수점 자리수 조회 : name(), symbol(), decimals()
  • 전체 발행량 조회 : totalSupply()
  • 특정 주소의 토큰 잔액 조회 : balanceOf()
  • 토큰 전송 : transfer(), transferFrom()
  • 다른 주소에 토큰 전송 권한 승인 : approve()

NFT를 위한 ERC-721

ERC-721은 논-펀지블 토큰, 즉 NFT를 위한 스마트 컨트랙트 인터페이스입니다. 또 다른 NFT 관련 인터페이스인 ERC-1155도 있지만, ERC-1155의 기본도 역시 ERC-721이기 때문에 이 글에서는 ERC-721만 다루도록 하겠습니다.

ERC-721 인터페이스 Method 규격

ERC-721 인터페이스를 살펴보면 다음과 같은 기능들이 있다는 것을 알 수 있습니다.

  • 특정 주소가 보유한 NFT 개수 조회 : balanceOf()
  • 특정 NFT의 소유 주소 조회 : ownerOf()
  • NFT 전송 : safeTransferFrom(), transferFrom()
  • 다른 주소에 NFT 전송 권한 승인 : approve()

트랜잭션 : 블록체인에 정보를 쓰는 행위

위의 ERC-20이나 ERC-721 인터페이스에서 조회를 제외한 나머지 기능을 사용하려면, 지갑 소유자의 전자서명이 필요합니다. 다시 말하면, 토큰 잔액 조회는 지갑의 서명이 필요없지만, 토큰 전송을 위해서는 지갑 서명이 필요한 것이죠. (토큰 전송과 같은) 요청하려는 기능과 지갑 서명을 합쳐서 이더리움 블록체인에 보내면, 블록체인 위에서 스마트 컨트랙트가 수행되게 됩니다.

보통 블록체인에 있는 정보를 읽는 기능은 지갑 서명이 필요없습니다. 대신, 블록체인에 정보를 써야 하는 경우에는 지갑 서명이 필요합니다. 이렇게 블록체인 위에 정보를 쓰는 기능들을 수행하는 것을 트랜잭션을 처리한다라고 합니다. 토큰 전송의 경우를 보면, 토큰의 잔액이 변경되는 것을 기록해야 되겠죠.

approve : 토큰 이동 권한을 승인하는 트랜잭션

ERC-20과 ERC-721 인터페이스에는 토큰 전송 말고도 다른 트랜잭션 기능이 있습니다. 바로 approve입니다. approve는 간단히 말해 내 지갑의 토큰을 다른 주소가 가져갈 수 있는 권한을 승인하는 트랜잭션입니다.

ERC-20의 approve() 메소드는 다음과 같은 형태로 되어 있습니다. ERC-721의 approve() 인터페이스는 약간 다르지만 개념은 비슷하니 ERC-20을 기준으로 설명해 보겠습니다.

function approve(address _spender, uint256 _value) public returns (bool success)

풀이하면, 입력받은 _spender 주소에 _value 만큼의 토큰을 이동할 수 있는 권한을 승인합니다. 만약 앨리스가 ABC 토큰을 1만개 가지고 있다고 해볼께요. 앨리스가 ABC 토큰에 대하여 주소 _spender 0x1234..5678에게 1천개 _value 만큼 approve 한다면, 0x1234…5678의 소유자는 언제든지 앨리스의 2토큰 1천개를 옮길 수 있는 권한을 가지게 됩니다.

또한 approve하는 개수는 현재 토큰의 개수보다 더 많이 승인하는 것도 가능합니다. 즉, 앨리스가 1만개의 ABC 토큰만 가지고 있더라도, approve는 5만개로 하는 것도 가능합니다. 무한대로 approve하는 것도 가능하죠.

approve 트랜잭션의 용도

자신이 가진 토큰을 옮길 수 있는 권한을 다른 주소에게 준다고? 뭔가 위험해 보이는 트랜잭션입니다. 그럼 approve 트랜잭션은 어디에 활용되고 있을까요?

approve 트랜잭션은 다양하게 활용될 수 있지만, 가장 대표적으로 사용되는 곳은 탈중앙거래소(DEX)에서 DEX의 스마트 컨트랙트에 토큰 스왑을 위한 권한을 부여하는데 사용됩니다.

만약 유니스왑이라는 DEX 서비스에서 제가 가진 DAI 토큰을 1INCH 토큰으로 스왑하려고 한다고 해보죠. 그럼 먼저 유니스왑의 스마트 컨트랙트에 DAI 토큰을 옮길 수 있는 권한을 주어야 합니다. 이때 approve 트랜잭션을 이용해 제 지갑에 있는 DAI 토큰을 옮길 수 있는 권한을 유니스왑에게 주게 됩니다.

approve 트랜잭션의 위험

approve 트랜잭션은 개인 지갑 주소에 있는 토큰/NFT를 옮길 수 있는 권한을 다른 주소에게 부여하는 역할을 하기 때문에 신중하게 진행해야 합니다. 권한을 부여한 스마트 컨트랙트에 취약점이 있는 경우에는 지갑에 있는 자산을 잃어버릴 위험성이 있죠.

권한을 부여하려는 주소가 스마트 컨트랙트의 주소인지 아니면 일반 주소인지 확인하는 것도 중요한 문제입니다. 보통 approve 트랜잭션은 디앱 프로토콜에서 사용하는 경우가 많기 때문에, 일반 주소가 아닌 스마트 컨트랙트에 권한을 부여하는 경우가 일반적입니다.

스마트 컨트랙트에 approve하는 경우라고 하더라도, 악의적인 목적을 가진 스마트 컨트랙트에 권한을 부여하는 순간 지갑의 자산이 위험해질 수 있겠죠.

approve 트랜잭션과 사용자 경험 (UX)

위에 설명드린 것처럼, approve 트랜잭션은 특별한 트랜잭션입니다. 모든 트랜잭션이 마찬가지이지만, 제대로 이해하고 있지 않다면 특히 위험할 수 있는 트랜잭션이기도 합니다. 트랜잭션의 서명은 지갑에서 이루어지기 때문에, 특별한 트랜잭션은 지갑에서도 특별하게 다루어주어야 합니다.

일반적인 트랜잭션의 사용자 인터페이스 (UI)

디센트 지갑의 디앱 브라우저*에서 일반적인 이더리움 트랜잭션에 대한 사용자 인터페이스는 아래와 같습니다.

*디앱브라우저 : 다양한 디앱 서비스와 지갑을 연결하여 사용할 수 있는 지갑의 인앱 브라우저 기능

디앱에서는 다양한 종류의 트랜잭션을 발생시킬 수 있기 때문에 일반적인 트랜잭션 처리에 대한 UX/UI가 필요합니다. 일반 트랜잭션인 경우에는, 트랜잭션에 대한 기본적인 정보와 수수료를 설정할 수 있는 사용자 인터페이스가 있습니다.

approve 트랜잭션을 위한 사용자 인터페이스 (UI)

approve 트랜잭션인 경우에는 UX 플로우가 조금 달라집니다. 수행하려고 하는 트랜잭션이 approve 트랜잭션이라는 것을 사용자에게 알리고, approve 트랜잭션이 무엇인지 그리고 어떤 주소에 승인을 하려고 하는지 등에 대한 정보를 먼저 표시해줍니다.

이런 추가 과정을 통해 지갑 사용자에게 해당 트랜잭션에 대한 내용을 다시 한번 상기시켜주는 역할을 하게 됩니다. 이런 화면을 통해 사용자는 현재 이용중인 사이트나 권한을 부여하려는 주소에 대한 정보를 얻을 수 있습니다. 그 정보를 다시 한번 체크해볼 수 있게 되겠죠.

마치며

여전히 블록체인 지갑을 사용하는 것은 어렵습니다. 작은 개선만으로 모든 것을 얻을 수는 없을거에요. 하지만 작은 부분들이 모여 더 나은 사용자 경험을 하나씩 이루어 나갈 수 있지 않을까요. 읽어주셔서 감사합니다. :)

참고자료

--

--

Minho, Yoo | D'CENT wallet & WEPIN wallet
IOTRUST : Team Blog

Interested in Blockchain Tech. Developing Cryptocurrency wallet D’CENT and WEPIN. Learning is best way to improve.