백서

요약

Vela는 이더리움과 기타 EVM 네트워크를 위한 자기 수탁형 스마트 컨트랙트 지갑입니다. 각 지갑은 수정하지 않은 Safe v1.4.1 계정으로, ERC-4337로 운용되며, 최대 일곱 개의 패스키로 제어됩니다. 패스키는 사용자의 기기, 비밀번호 관리자, 또는 하드웨어 보안 키에 보관되는 WebAuthn P-256 키입니다. 시드 구문은 없습니다.

회사로서의 Vela는 키를 가진 적이 없고 Safe에 대한 어떤 권한도 없으므로, 스스로 자금을 옮기거나 동결하거나 압류할 수 없습니다. 다만 키에 서명을 요청하는 소프트웨어는 Vela가 만들고 배포합니다. 아래의 위협 모델이 중요한 이유입니다. 앱, 거래를 제출하는 릴레이, 그리고 이를 받쳐 주는 서비스는 오픈소스이며, 각각 직접 사본을 운영할 수 있습니다. 요컨대 신뢰해야 하는 것은 컨트랙트, 키를 보관하는 인증자, 서명에 쓰는 앱의 코드, 패스키가 속한 도메인, 그리고 앱이 사용하도록 지정한 서비스입니다.

Vela가 있는 이유

  • 시드 구문 지갑은 모든 사용자 앞에 12~24단어짜리 비밀을 내놓습니다. 단일 실패 지점이자 늘 피싱의 표적입니다.
  • 수탁형 지갑은 자금을 대신 보관하는 대가로 시드 구문을 없앱니다.
  • 한 회사의 서버와 비공개 코드에 의존하는 패스키 지갑은 시드 구문을 없애 주지만, 회사가 사라지면 사용자를 오도 가도 못하게 만듭니다.
  • 읽을 수 없는 데이터를 승인하는 블라인드 서명은 여전히 흔하고, 지갑이 털리는 경로 중 하나입니다.

Vela는 이런 의존 없이 패스키의 편리함을 주려고 합니다. 표준 계정, 공개된 코드, 교체할 수 있는 서비스, 그리고 서명하기 전에 읽을 수 있는 거래입니다.

설계 원칙

  1. 예외 없는 자기 수탁. 키는 사용자의 인증자가 만들고 보관합니다. Vela의 서비스는 키를 절대 보지 못하며, 서비스가 보는 것은 “개인정보” 항목에 적어 두었습니다.
  2. 수정하지 않은 표준 컨트랙트. 자금으로 가는 경로에 Vela가 작성한 컨트랙트는 없습니다.
  3. 신뢰하지 말고 검증하세요. 앱과 서비스는 공개되어 있고, 서비스는 직접 호스팅할 수 있습니다.
  4. 서명하기 전에 디코딩합니다. 디코딩하지 못한 것에는 명시적인 블라인드 서명 경고가 붙습니다.
  5. 적게 합니다. 지갑은 보내기, 받기, 그리고 사용자가 고른 dApp을 위한 서명을 합니다.

아키텍처

Vela 앱 — 웹, 브라우저 확장 프로그램, 데스크톱(macOS/Windows/Linux), iOS, Android
  공유 Rust 코어 하나(규칙, 암호, ABI, 클리어 서명) + 플랫폼별 네이티브 셸
  • UserOperation을 만들고 그것이 하는 일을 보여 줌
  • 키에 WebAuthn 어설션을 요청
        │  서명된 UserOperation(수수료 포함)
        ▼
릴레이(vela-relay, 직접 호스팅 가능)
  • 수수료 견적, 가스 선지급, handleOps 제출
  • 오퍼레이션을 바꿀 수 없음
        ▼
EVM 체인
  EntryPoint v0.7 → 내 Safe v1.4.1 → Safe 4337 모듈
  Safe 패스키 모듈이 EIP-7951 / RIP-7212 프리컴파일로 P-256 검증

이를 받쳐 주는 서비스는 모두 오픈소스입니다. 새 지갑을 온체인 레지스트리에 등록하고 조회에 답하는 공개 키 인덱스, 체인 데이터 디렉터리, 그리고 환율 피드입니다. 셀프 호스팅 가이드를 참고하세요.

계정

지갑은 Safe v1.4.1 프록시(SafeL2 싱글톤)이며, Safe의 4337 모듈 v0.3.0이 모듈이자 폴백 핸들러로 활성화되어 있고, EntryPoint v0.7을 통해 운용됩니다. 소유자는 Safe 패스키 모듈 v0.2.1의 패스키 서명자입니다. 첫 번째 키는 공유 서명자가 검증하고, 추가한 키는 각각 Safe의 팩토리가 만든 자체 서명자 컨트랙트가 검증합니다. 임계값은 1입니다.

주소는 결정적이고 카운터팩추얼합니다. 아무것도 배포하기 전에, 처음 등록한 모든 키가 들어 있는 Safe 초기 설정 데이터로 CREATE2 주소를 계산합니다. 주소는 모든 네트워크에서 같습니다. 바로 이 주소로 받을 수 있고, 네트워크마다 첫 거래가 지갑을 배포하며 그 비용은 그 거래의 수수료에 포함됩니다.

키

지갑에는 키가 1~7개 있고, 지갑을 만들 때 고정됩니다. 그중 어느 하나로도 혼자 서명할 수 있습니다(1-of-n). 키가 될 수 있는 것은 다음과 같습니다.

  • 지금 쓰는 기기의 패스키. 허용하면 iCloud 키체인, Google 비밀번호 관리자, 또는 다른 비밀번호 관리자가 동기화합니다.
  • QR 코드를 스캔해 연결하는 다른 휴대폰(WebAuthn 하이브리드 전송).
  • USB나 NFC로 연결하는 하드웨어 보안 키. 어디에도 동기화되지 않습니다.

모든 서명에는 인증자 자체의 사용자 인증이 필요합니다. 생체 인증이나 기기 PIN, 또는 보안 키의 PIN과 터치입니다. 세션 키는 없습니다. 키는 나중에 추가하거나 삭제하거나 교체할 수 없습니다. 지갑이 아직 배포되지 않은 모든 체인에서는 주소가 여전히 처음의 키 목록을 뜻하므로, 한 체인에서 소유자를 바꾸면 체인마다 계정이 달라지기 때문입니다.

패스키는 신뢰 당사자(relying party)에 속하며, Vela의 패스키는 getvela.app용으로 만들어집니다. 브라우저는 getvela.app과 그 하위 도메인의 페이지에만 패스키를 내어 줍니다. 이것이 패스키가 피싱에 강한 이유이고, 동시에 이 문서가 아래에서 다시 다루는 의존성이기도 합니다.

서명 흐름

  1. Safe를 위한 UserOperation을 만들고(릴레이에 내는 전송 포함) 시뮬레이션합니다.
  2. 사람이 읽을 수 있는 의도로 디코딩해서 보여 줍니다.
  3. 서명: 인증자가 사용자를 확인한 뒤 오퍼레이션 해시에 대한 WebAuthn 어설션을 만듭니다.
  4. 어설션을 패스키 모듈이 기대하는 Safe 서명 형식으로 인코딩합니다.
  5. 서명된 오퍼레이션을 릴레이에 제출하고, 릴레이가 EntryPoint를 호출합니다.
  6. 온체인 검증: Safe가 무엇이든 실행하기 전에 패스키 모듈이 EIP-7951 / RIP-7212 프리컴파일로 P-256 서명을 확인합니다. 대체 검증기는 없으며, 프리컴파일이 없는 네트워크는 추가할 수 없습니다.

수수료

  • 릴레이는 인밴드로 비용을 받습니다. 오퍼레이션은 EntryPoint 수수료를 0으로 선언하고, Safe에서 릴레이 주소로 보내는 전송을 포함합니다. 금액과 받는 주소가 서명하는 내용에 들어 있으므로, 확인 화면에 표시된 금액을 정확히 내게 됩니다.
  • 수수료는 지갑이 오퍼레이션을 위해 예약하는 가스의 3배이며(시뮬레이션 추정치를 1.5배로 늘리고 최솟값을 둠), 지갑이 직접 읽은 가스 가격과 선택한 속도에 대한 릴레이의 가격 중 높은 쪽으로 계산하고, 최소 약 0.01달러입니다. Tempo에서는 배수가 2입니다. 예약량과 가격에 여유를 두기 때문에 수수료는 오퍼레이션의 실제 온체인 비용보다 많고, 어떤 네트워크에서의 첫 거래라면 더욱 그렇습니다. 차액은 릴레이가 가져갑니다. 정확한 금액은 서명하기 전에 확인 화면에 표시됩니다.
  • 수수료는 지갑에 설정된 릴레이가 받습니다. 기본은 Vela의 릴레이이며, 직접 운영하는 것을 포함해 어떤 vela-relay 배포든 쓸 수 있습니다.
  • 수수료는 네트워크의 코인이나 릴레이가 받아 주는 미국 달러 스테이블코인으로 냅니다(네이티브 코인이 없는 Tempo에서는 pathUSD). 페이마스터는 없습니다. 가스를 대신 내 주는 사람도 없고, 후원 정책으로 거래를 걸러 낼 수 있는 사람도 없습니다.
  • 어떤 네트워크에서 릴레이 자체의 가스 트레저리가 비어 있으면, 지갑이 서명하기 전에 알려 줍니다. 사용자별 보증금은 없습니다.

자세한 내용: 네트워크와 수수료.

클리어 서명

호출과 EIP-712 메시지는 ERC-7730 디스크립터로 디코딩합니다. 흔한 컨트랙트용은 앱에 내장되어 있고, 나머지는 체인 데이터 서비스에서 가져오거나 표준 토큰 형태와 맞춰 봅니다. 그래도 안 되면 마지막으로 공개 셀렉터 데이터베이스를 조회하고 “추정 해석”으로 표시합니다. 남은 것에는 명시적인 블라인드 서명 경고가 붙습니다. 가져온 디스크립터에는 결코 검증됨 표시가 붙지 않습니다. 그 말에 어울리는 것은 앱에 내장된 것, 또는 그것과 완전히 같은 가져온 결과뿐입니다. “무제한” 수준(2^200 이상)의 온체인 승인은 빨간색으로 표시되고 한도를 설정할 수 있습니다. 한도를 설정하지 않으면 dApp이 만든 그대로 전송됩니다. 금액이 크지만 유한한 승인은 주의 표시와 함께 보여 줍니다. 서명 방식의 승인은 한도를 설정할 수 없으므로, 요청받은 그대로 서명하거나 거절하게 됩니다. 자세한 내용: 클리어 서명.

네트워크

Vela에는 24개 네트워크가 내장되어 있습니다. Ethereum, BNB Chain, Polygon, Arbitrum, Optimism, Base, Avalanche, Gnosis, Unichain, Tempo, Monad, World Chain, Arc, X Layer, Stable, Soneium, MegaETH, Robinhood Chain, Mantle, Kaia, Celo, Ink, Plume, XRPL EVM입니다. 그리고 Vela가 확인하는 컨트랙트 12개와 EIP-7951 / RIP-7212 프리컴파일을 갖춘 EVM 네트워크라면 어디든 받아들입니다. 12개 중 두 개는 Safe의 패스키 서명자 팩토리와 그 팩토리가 배포하는 서명자 코드로, 키를 두 개 이상 가진 지갑에만 필요하며, 확인은 이 둘을 따로 보고합니다.

보안 모델

Vela가 할 수 없는 것

  • 스스로 자금을 옮기거나, 쓰거나, 동결하는 것. Safe를 승인할 수 있는 것은 사용자의 키뿐이고, Vela는 Safe에 대한 권한이 없습니다. (Vela가 할 수 있는 것은 서명을 요청하는 소프트웨어를 배포하는 것입니다. 아래 위협을 참고하세요.)
  • 서명한 뒤에 거래를 바꾸는 것. 무엇이든 바꾸면 서명이 무효가 됩니다.
  • 개인 키를 읽는 것. 개인 키는 인증자 안에 있습니다.
  • 지갑에 키를 추가하거나 삭제하는 것.

“동결할 수 없다”가 적용되지 않는 것: 토큰. USDC, USDT와 대부분의 법정화폐 담보 토큰은 발행사가 어떤 주소든, 사용자의 주소도 차단 목록에 올릴 수 있게 되어 있습니다. 그 권한은 발행사에 있고, 어떤 지갑을 쓰든 존재합니다. 자기 수탁이 보장하는 것은 Vela가 그런 권한을 가진 두 번째 당사자가 아니라는 점입니다.

신뢰해야 하는 것

  • 컨트랙트: Safe, Safe의 4337 모듈과 패스키 모듈, EntryPoint v0.7, 그리고 체인의 EIP-7951 / RIP-7212 프리컴파일.
  • 도메인: getvela.app이나 그 하위 도메인에서 서비스되는 페이지는 어느 것이든 키에 서명을 요청할 수 있습니다.
  • 키를 보관하는 인증자, 그리고 동기화되는 패스키라면 그 뒤에 있는 Apple, Google, 비밀번호 관리자 계정.
  • 서명에 쓰는 앱의 코드. 거래를 만들고 그것이 하는 일을 보여 주는 것이 앱입니다. 변조된 앱은 한 가지를 보여 주고 다른 것에 서명하게 할 수 있으며, 인증자의 확인 창으로는 그 차이를 알 수 없습니다.
  • 데이터를 읽어 오는 RPC 엔드포인트: 거짓말하는 노드는 잘못된 잔액이나 잘못된 시뮬레이션 미리보기를 보여 줄 수 있습니다. 직접 엔드포인트를 지정할 수 있습니다.
  • 체인 데이터 서비스와 환율 서비스: 토큰 목록, 디스크립터, 수수료 토큰 목록, 그리고 법정화폐 금액을 토큰 수량으로 바꿀 때 쓰는 환율을 제공합니다.
  • 릴레이: 서명한 내용을 바꿀 수는 없지만, 늦추거나 거부할 수 있고, 언제 체인에 올릴지 정할 수 있으며(그래서 슬리피지 범위 안에서 스왑을 선행 매매할 수도 있습니다), 수수료의 기준이 되는 가스 가격을 지갑이 직접 읽은 값의 3배까지 정할 수 있습니다.

고려한 위협

  • 기기 분실이나 도난 — 도둑도 인증자의 확인을 통과해야 하고, 다른 키로 접근을 되찾을 수 있습니다. 하지만 키는 삭제할 수 없습니다. 키가 다른 사람 손에 들어갔을 수 있다면 자금을 새 지갑으로 옮기세요. 이전 주소는 모든 네트워크에서 그 키로 계속 자금을 쓸 수 있기 때문입니다.
  • 피싱 — 패스키는 가짜 사이트에 입력할 수 없고, 브라우저는 getvela.app과 그 하위 도메인의 페이지에만 패스키를 내어 줍니다.
  • 악성 dApp — 클리어 서명, 승인 가드, 그리고 거부로 대응합니다. Safe가 자기 자신을 호출하도록 요청하는 것(enableModule, addOwnerWithThreshold, swapOwner, setFallbackHandler, setGuard를 비롯한 같은 계열)은 차단되며, 묶음 거래나 MultiSend 안에 들어 있어도 마찬가지입니다. delegatecall이 들어 있는 항목과 SafeTx 타입 데이터 서명도 함께 차단됩니다. 이 중 어느 것이든 한 번 서명하면 바이비트 페이로드만큼이나 완전히 계정을 넘겨주게 되므로, 지갑은 아예 서명할 대상으로 내놓지 않습니다.
  • 침해된 백엔드 서비스(릴레이, 인덱스, 체인 데이터, 환율) — 서명 권한은 없지만 실질적인 영향력은 있습니다. 서비스 거부, 오해를 부르는 디스크립터나 토큰 목록, 법정화폐 금액으로 실제 얼마를 보내는지를 바꾸는 잘못된 환율, 그리고 (릴레이의 경우) 위에서 말한 제출 시점과 가스 가격입니다. 체인 데이터 서비스에서 가져온 설명은 결코 검증됨이라고 부르지 않습니다. 그 말에 어울리는 것은 앱에 내장된 것, 또는 그것과 완전히 같은 가져온 결과뿐이고, 나머지에는 아무것도 이를 인증하지 않았다는 한 줄이 붙습니다. 각 서비스는 교체할 수 있습니다.
  • 침해된 앱 배포 — 변조된 웹 배포, 확장 프로그램 업데이트, 앱 빌드가 악성 거래를 보여 주며 서명을 요청할 수 있습니다. 바이비트 유형의 공격입니다. 현재의 완화 수단은 제한적입니다. 앱 자체의 디코딩과 승인 가드, 공증된 macOS 빌드, 그리고 확장 프로그램이나 앱을 소스에서 직접 빌드하는 것입니다(릴리스 패키지에는 SHA-256 체크섬과, 커밋과 워크플로 실행을 밝히는 GitHub 빌드 출처 증명이 붙습니다. Windows 설치 프로그램은 여전히 코드 서명이 되어 있지 않습니다). 앱과 코드를 공유하지 않는 독립 서명 페이지인 Trusted Signer는 데스크톱, iPhone, Android 앱에서 서명 방식으로 선택할 수 있습니다. 데스크톱의 무결성 확인은 일치하지 않는 페이지를 로그에 남길 뿐이고, 휴대폰 앱은 아직 확인하지 않습니다.
  • 도메인에서 서비스되는 모든 것 — getvela.app이나 그 하위 도메인의 어떤 페이지든, 그 페이지가 불러오는 스크립트까지 포함해 Vela 패스키에 서명을 요청할 수 있고, 확인 창에는 “getvela.app”만 표시됩니다. 그래서 웹사이트는 자기 페이지가 패스키를 쓰지 못하게 막고, 키를 다루는 페이지에서는 분석 스크립트를 불러오지 않습니다. 도메인의 주인이 바뀌면 새 주인이 어떤 앱이 패스키를 쓸 수 있는지도 정하게 됩니다. 확장 프로그램과 직접 빌드한 앱은 자기 코드를 가지고 있지만, 기본 설정으로는 여전히 getvela.app 아래의 서비스에서 디스크립터를 가져오고 그 서비스를 씁니다.

복구

지갑을 만들면 공개 키와 주소가 Gnosis의 공개 레지스트리 컨트랙트에 게시됩니다(이더리움으로 복사할 수 있습니다). 새 기기에서는 어느 하나의 키로 로그인합니다. 앱은 인덱스로 지갑을 찾고, 안 되면 레지스트리에서 직접 찾은 뒤, 그 키들로 계산한 주소가 기록된 주소와 같은지 확인합니다. 키가 하나뿐인 지갑은 레지스트리 없이 서명 두 번으로 다시 구성할 수도 있습니다.

자세한 내용: 복구와 로그인.

Vela가 사라진다면

자금은 온체인의 Safe에 그대로 있습니다. 컨트랙트는 Vela에 의존하지 않고, Vela가 운영하는 모든 서비스는 오픈소스라 누구든 대신 운영할 수 있습니다. 옮길 수 없는 단 하나는 패스키의 신뢰 당사자인 getvela.app입니다. 웹 지갑을 다른 도메인에 올리면 다른 지갑이 만들어집니다. 기존 지갑이라면 Vela 브라우저 확장 프로그램(권한을 받아 getvela.app 패스키를 쓸 수 있음)과 직접 빌드한 앱(휴대폰이나 보안 키 사용)은 getvela.app 없이도 계속 작동합니다. 셀프 호스팅 가이드에 각 방법과 한계를 자세히 적어 두었습니다. 어떤 체인에서 Vela 없이 지갑에 접근하려면 그 체인이 EIP-7951 / RIP-7212를 지원해야 합니다.

개인정보

계정도, 이메일도, KYC도 없습니다. 공개되는 것은 지갑을 만들 때 레지스트리에 기록되는 내용입니다. 각 키의 공개 키와 자격 증명 ID, 인증자 모델, 지갑 이름과 키 이름, 주소, 서명된 등록 데이터입니다. Vela의 인덱스는 기록을 제출하기 전에 그 내용을 보고, 이름을 조회한 주소도 봅니다. Vela의 릴레이는 주소, 제출한 오퍼레이션, 앱이 쓰는 RPC 엔드포인트(URL에 들어 있는 API 키 포함)를 보며, 재시도와 문제 진단을 위해 오퍼레이션을 일정 기간 보관합니다. 모든 서비스는 IP 주소를 봅니다. 웹사이트는 쿠키를 쓰지 않는 분석 도구를 씁니다. 공식 목록은 개인정보 처리방침입니다.

오픈소스

지갑(모든 앱과 코어), 릴레이, 공개 키 인덱스, 환율 서비스, 체인 데이터 디렉터리 모두 MIT 라이선스입니다. 코드: github.com/mondaylabsltd.

토큰 없음

Vela에는 토큰이 없고, 발행할 계획도 없습니다. 살 것도, 파밍할 것도, 투기할 것도 없습니다. 수수료는 각 네트워크의 코인이나 스테이블코인으로 냅니다.

감사 현황과 한계

Safe의 컨트랙트, Safe의 4337 모듈과 패스키 모듈, EntryPoint v0.7은 독립적인 감사를 받았고 널리 쓰이고 있습니다. Vela 자체 코드(앱, 백엔드 서비스, 레지스트리 컨트랙트)는 독립적인 제3자 감사를 받지 않았고, 예정된 감사도 없습니다. 전문 감사는 프로젝트가 비용을 댈 수 있게 되면 받고 싶은 목표일 뿐, 날짜가 정해진 약속이 아닙니다. 그때까지 검토는 비공식적으로 이루어집니다. 코드가 공개되어 있어 역량 있는 커뮤니티 구성원이 읽고, AI 도구로도 검토합니다. 도움이 되지만 전문 감사와 같지는 않습니다. Vela는 알파 소프트웨어로 대해 주세요. 자세한 내용: 감사와 알려진 문제.

참고 자료

  • ERC-4337 — EntryPoint를 통한 계정 추상화
  • EIP-1271 — 컨트랙트 서명 검증
  • ERC-7730 — 클리어 서명 디스크립터
  • EIP-5792 — 지갑 호출 일괄 처리(wallet_sendCalls)
  • EIP-7951 / RIP-7212 — P-256 서명 검증 프리컴파일
  • WebAuthn / FIDO2 — 패스키
  • Safe 스마트 계정 v1.4.1