클리어 서명
아직도 많은 지갑이 모르는 컨트랙트에 대해서는 원시 데이터를 그대로 보여 주고, “블라인드 서명”, 즉 실제로는 읽을 수 없는 호출을 승인하는 일은 지갑이 털리는 경로 중 하나입니다. Vela의 답은 클리어 서명입니다. 서명하기 전에 거래를 최대한 이해할 수 있는 형태로 디코딩해서 보여 줍니다.
무엇이 보이나
원시 calldata 대신 다음을 보여 줍니다.
- 의도 — 거래가 무엇을 하는지. 보내기, 승인, 스왑 등.
- 핵심 내용 — 관련된 금액과 주소. 토큰 금액은 실제 단위로 보여 주고, 받는 사람은 이름이 있으면 이름으로 표시합니다.
- 세부 정보 — 논스, 기한, 원시 calldata. 처음부터 들이밀지 않고, 필요할 때 펼쳐 볼 수 있게 둡니다.
- 위험 표시 — 위험한 작업이 눈에 띄도록 색으로 구분합니다.
작동 방식(ERC-7730)
Vela는 ERC-7730 디스크립터로 컨트랙트 호출과 EIP-712 타입 데이터를 모두 디코딩합니다. 디스크립터는 컨트랙트의 함수가 무엇을 뜻하는지 적어 둔 작고 공유 가능한 정의입니다.
Vela는 다음 순서로 디스크립터를 찾습니다.
- 앱에 내장된 디스크립터 — 널리 쓰이는 컨트랙트용입니다. Uniswap, PancakeSwap, SushiSwap 라우터, WETH, Aave v3 풀, 1inch, Lido와 wstETH, Seaport.
- Vela의 체인 데이터 서버에서 가져온 디스크립터 — 이 서버는 공개 ERC-7730 레지스트리를 다시 게시합니다.
- 표준 형태 — ERC-20 토큰, ERC-721·ERC-1155 NFT, ERC-4626 볼트, ERC-2612 permit. 덕분에 일상적인 작업은 대부분 디코딩됩니다.
검증됨은 첫 번째 출처에만 쓰는 말입니다. 거래에 검증됨 표시가 붙는 것은 그 설명이 지금 실행 중인 앱에 내장된 디스크립터에서 왔을 때, 또는 체인 데이터 서버에서 왔고 내장본과 완전히 같을 때뿐입니다. 후자는 전송 도중에 아무것도 바뀌지 않았다는 증거가 됩니다. 서버가 보내는 나머지도 그대로 디코딩해 보여 주지만, 디스크립터 서비스에서 온 것이며 이를 인증한 것은 아무것도 없다는 한 줄이 함께 붙습니다. 그 서비스에는 서명이 없으므로, 그것을 운영하는 사람을 믿을 수 있는 만큼만 믿을 수 있습니다. 서버를 직접 운영할 수 있게 한 이유 중 하나입니다.
토큰 금액은 그 토큰의 실제 온체인 소수 자릿수로 표시합니다. 소수 자릿수를 확인할 수 없으면 18자리라고 가정하고 금액을 보여 주되 미검증으로 표시합니다. 틀릴 수 있는 숫자가 확인된 숫자처럼 보이지 않게 하기 위해서입니다.
위험 등급
디코딩된 거래에는 모두 위험 등급이 붙어, 위험한 패턴이 눈에 띄게 합니다.
- 주의 — 승인과 permit. 토큰을 쓸 권한을 넘기는 일입니다.
- 위험 — 무제한 토큰 승인처럼 실제로 위험한 것.
- 스테이킹이나 예치 같은 일상적인 작업은 위험 등급이 더 낮습니다.
디코딩하지 못할 때
ERC-7730 디스크립터는 없지만 그 함수가 공개 셀렉터 데이터베이스에 있으면, Vela는 일반적인 방식으로 호출을 디코딩하고 주의 배너 아래에 추정 해석(best effort)이라고 표시합니다. 디코딩은 했지만 검증되지는 않았다는 뜻입니다. 그마저 실패하거나 거래의 일부만 디코딩할 수 있다면, Vela는 이해한 척하지 않습니다.
왜 중요한가
자기 수탁에서는 잘못된 거래를 누구도 대신 되돌려 주지 않습니다. 방어 수단은 고객센터가 아니라, 승인하기 전에 무엇을 승인하는지 이해하는 것입니다. 클리어 서명은 그것을 보여 주려는 Vela의 방법이고, 한계도 있습니다. 클리어 서명은 그것을 보여 주는 앱만큼만 정직할 수 있습니다. 그래서 독립적인 확인이 중요합니다. Vela 보안 모델에서 클리어 서명이 차지하는 위치는 백서를 참고하세요.