Whitepaper

Кратко

Vela — некастодиальный кошелёк на смарт-контракте для Ethereum и других EVM-сетей. Каждый кошелёк — немодифицированный аккаунт Safe v1.4.1, который работает через ERC-4337 и управляется ключами passkey (до семи) — ключами WebAuthn P-256, которые хранятся на ваших устройствах, в вашем менеджере паролей или на аппаратных ключах безопасности. Сид-фразы нет.

Vela как компания никогда не хранит ваши ключи и не имеет роли в вашем Safe, поэтому сама она не может перевести, заморозить или изъять ваши средства. Но программу, которая просит ваши ключи подписать, пишет и распространяет именно Vela, — поэтому важна модель угроз ниже. Приложения, релей, который отправляет транзакции, и вспомогательные сервисы открыты, и каждый из них можно запустить у себя. Коротко, вы доверяете: контрактам, аутентификаторам, которые хранят ваши ключи, коду приложения, через которое вы подписываете, домену, к которому привязаны ваши passkey, и сервисам, которые вы указали приложению.

Зачем нужна Vela

  • Кошельки с сид-фразой ставят перед каждым пользователем секрет из 12–24 слов: единую точку отказа и постоянную цель для фишинга.
  • Кастодиальные кошельки избавляют от сид-фразы, забирая средства на хранение.
  • Кошельки на passkey, зависящие от серверов и закрытого кода одной компании, избавляют от сид-фразы, но оставляют вас ни с чем, если компания исчезнет.
  • Слепая подпись — одобрение непрозрачных данных, которые вы не можете прочитать, — по-прежнему распространена и остаётся одним из способов опустошить кошелёк.

Vela стремится дать удобство passkey без всех этих зависимостей: стандартный аккаунт, открытый код, заменяемые сервисы и транзакции, которые можно прочитать до подписи.

Принципы

  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
  модуль passkey от Safe проверяет P-256 через прекомпайл EIP-7951 / RIP-7212

Вспомогательные сервисы, все с открытым кодом: индекс публичных ключей, который регистрирует новые кошельки в реестре в блокчейне и отвечает на запросы поиска, справочник данных сетей и источник курсов валют. См. руководство по самостоятельному развёртыванию.

Аккаунт

Ваш кошелёк — прокси Safe v1.4.1 (синглтон SafeL2), в котором модуль 4337 v0.3.0 от Safe включён как модуль и как fallback handler; работает он через EntryPoint v0.7. Его владельцы — подписанты из модуля passkey v0.2.1 от Safe: первый ключ проверяет общий подписант, а каждый дополнительный — собственный контракт-подписант, созданный фабрикой Safe. Порог — 1.

Адрес детерминированный и контрфактический: он вычисляется через CREATE2 из данных инициализации Safe, в которые входит каждый исходный ключ, ещё до того, как что-либо развёрнуто. Он одинаков во всех сетях. Получать на него можно сразу; первая транзакция в каждой сети разворачивает кошелёк, и стоимость развёртывания входит в комиссию этой транзакции.

Ключи

У кошелька от одного до семи ключей, и они фиксируются при создании. Любой из них может подписывать в одиночку (1-of-n). Ключом может быть:

  • passkey на устройстве, которым вы пользуетесь, — если вы разрешите, его синхронизирует Связка ключей iCloud, Менеджер паролей Google или другой менеджер паролей;
  • другой телефон, подключённый по QR-коду (гибридный транспорт WebAuthn);
  • аппаратный ключ безопасности с USB или NFC, который нигде не синхронизируется.

Каждая подпись требует собственной проверки пользователя аутентификатором — биометрии или PIN-кода устройства либо PIN-кода и касания ключа безопасности. Сессионного ключа нет. Добавлять, удалять или заменять ключи позже нельзя: во всех сетях, где кошелёк ещё не развёрнут, адрес по-прежнему соответствует исходному набору, поэтому смена владельцев в одной сети сделала бы аккаунт разным в разных сетях.

Passkey принадлежат relying party (проверяющей стороне) — ключи Vela создаются для getvela.app. Браузеры предлагают их только страницам на getvela.app и его поддоменах; именно это делает их устойчивыми к фишингу — и это же зависимость, к которой документ ещё вернётся ниже.

Как проходит подпись

  1. Сборка UserOperation для вашего Safe — включая перевод, которым оплачивается релей, — и её симуляция.
  2. Расшифровка в читаемое намерение и показ его вам.
  3. Подпись: проверив вас, аутентификатор создаёт утверждение WebAuthn над хешем операции.
  4. Кодирование утверждения в подпись Safe в том формате, который ожидает модуль passkey.
  5. Отправка подписанной операции релею, который вызывает EntryPoint.
  6. Проверка в блокчейне: модуль passkey проверяет подпись P-256 прекомпайлом EIP-7951 / RIP-7212, прежде чем Safe что-либо выполнит. Запасного верификатора нет; сеть без прекомпайла добавить нельзя.

Комиссии

  • Релей получает оплату внутри операции: операция объявляет нулевые комиссии EntryPoint и содержит перевод с вашего Safe на адрес релея. Сумма и получатель входят в то, что вы подписываете, поэтому вы платите ровно то, что показал экран подтверждения.
  • Комиссия — это стоимость трёхкратного объёма газа, который кошелёк резервирует для операции (симулированные оценки, увеличенные в полтора раза, с минимумами), по более высокой из двух цен: цены газа по данным самого кошелька и цены релея для выбранной скорости, с минимумом около $0,01. В Tempo множитель — два. Из-за запаса в резерве и в цене комиссия выше реальной стоимости операции в сети, а для первой транзакции в сети — тем более; разницу оставляет себе релей. Точная сумма видна на экране подтверждения до подписи.
  • Комиссия идёт тому релею, который указан в кошельке: по умолчанию это релей Vela, но подойдёт любое развёртывание vela-relay, в том числе ваше собственное.
  • Комиссия платится монетой сети или долларовым стейблкоином, который принимает релей (pathUSD в Tempo, где нет нативной монеты). Paymaster нет: никто не оплачивает газ за вас, и никто не может фильтровать транзакции правилами спонсирования.
  • Если у релея опустела казна для газа в какой-то сети, кошелёк скажет об этом до подписи. Депозитов с пользователей нет.

Подробности: сети и комиссии.

Понятная подпись

Вызовы и сообщения EIP-712 расшифровываются с помощью дескрипторов ERC-7730 — встроенных в приложение для распространённых контрактов, загруженных с сервиса данных сетей или подобранных по стандартным формам токенов, — а в крайнем случае по публичной базе селекторов с пометкой «по мере возможности». Всё, что осталось, получает явное предупреждение о слепой подписи. Загруженный дескриптор никогда не помечается как проверенный: этого слова заслуживает только встроенный в приложение или загруженный, но в точности с ним совпадающий. Разрешение в блокчейне на «неограниченную» сумму (2^200 и больше) показывается красным, с предложением лимита; если вы его не ограничите, оно будет отправлено ровно в том виде, в каком его составило dApp. Большое конечное разрешение показывается с предупреждением; подписанные permit ограничить нельзя, поэтому их подписывают в запрошенном виде или отклоняют. Подробности: понятная подпись.

Сети

В 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, — и она принимает любую EVM-сеть, в которой есть двенадцать проверяемых контрактов и прекомпайл EIP-7951 / RIP-7212. Два из двенадцати — фабрика подписантов passkey от Safe и код подписанта, который она разворачивает; они нужны только кошельку, у которого больше одного ключа, и проверка сообщает о них отдельно.

Модель безопасности

Чего Vela сделать не может

  • Сама перевести, потратить или заморозить ваши средства — авторизовать ваш Safe могут только ваши ключи, а у Vela в нём нет роли. (Что Vela может — так это выпускать программы, которые просят вас подписать; см. угрозы ниже.)
  • Изменить транзакцию после того, как вы её подписали, — любое изменение делает подпись недействительной.
  • Прочитать ваши закрытые ключи — они остаются в ваших аутентификаторах.
  • Добавить ключ в ваш кошелёк или удалить его.

Чего не покрывает «не может заморозить»: сам токен. USDC, USDT и большинство токенов, обеспеченных фиатом, позволяют эмитенту занести в чёрный список любой адрес, включая ваш. Это право эмитента, и оно существует, каким бы кошельком вы ни пользовались. Самостоятельное хранение даёт вам то, что Vela не становится второй стороной с таким правом.

Чему вы доверяете

  • Контрактам: Safe, его модулям 4337 и passkey, EntryPoint v0.7 и прекомпайлу EIP-7951 / RIP-7212 в сети.
  • Домену: любая страница с getvela.app или одного из его поддоменов может запросить у ваших ключей подпись.
  • Аутентификаторам, которые хранят ваши ключи, а для синхронизируемых passkey — стоящему за ними аккаунту Apple, Google или менеджера паролей.
  • Коду приложения, через которое вы подписываете. Оно собирает транзакцию и показывает, что она делает. Скомпрометированное приложение может показать одно, а попросить подписать другое; запрос аутентификатора разницы не покажет.
  • RPC-эндпоинтам, с которых вы читаете данные: лживый узел может показать неверные балансы или неверный результат симуляции. Можно указать свои.
  • Сервисам данных сетей и курсов валют: они поставляют списки токенов, дескрипторы, список токенов для оплаты комиссии и курсы, по которым сумма в фиате пересчитывается в сумму в токенах.
  • Релею: он не может изменить то, что вы подписали, но может задержать операцию или отказаться её отправлять, выбрать момент, когда она попадёт в блокчейн (а значит, опередить ваш обмен в пределах проскальзывания), и задать цену газа, от которой считается ваша комиссия, — не выше трёхкратных собственных данных кошелька.

Рассмотренные угрозы

  • Потеря или кража устройства — вору всё равно нужно пройти проверку аутентификатора; другой ключ возвращает доступ. Но удалить ключ нельзя: если один из них мог оказаться в чужих руках, переведите средства в новый кошелёк, потому что со старого адреса этим ключом можно тратить в любой сети.
  • Фишинг — passkey нельзя ввести на поддельном сайте, а браузеры предлагают его только страницам на getvela.app и его поддоменах.
  • Вредоносный dApp — от него защищают понятная подпись, защита разрешений и прямой отказ: запрос на вызов из вашего Safe к нему самому — enableModule, addOwnerWithThreshold, swapOwner, setFallbackHandler, setGuard и остальные из этого семейства — блокируется, в том числе внутри пакета или MultiSend, как и любое звено с delegatecall и подпись типизированных данных SafeTx. Любой из них, подписанный один раз, передал бы аккаунт так же полностью, как нагрузка Bybit, поэтому кошелёк вообще не предлагает их подписать.
  • Скомпрометированный бэкенд-сервис (релей, индекс, данные сетей, курсы валют) — права подписи нет, но реальное влияние есть: отказ в обслуживании, вводящие в заблуждение дескрипторы или списки токенов, неверные курсы, от которых зависит, сколько на самом деле уйдёт при сумме в фиате, и (для релея) момент отправки и цена газа, о которых сказано выше. Описание, загруженное из сервиса данных сетей, никогда не называется проверенным: этого слова заслуживает только описание, встроенное в приложение, или загруженное, но в точности с ним совпадающее, — а остальные показываются со строкой о том, что их ничто не заверило. Каждый сервис можно заменить.
  • Скомпрометированная доставка приложения — подменённое веб-развёртывание, обновление расширения или сборка приложения могут подсунуть вам на подпись вредоносную транзакцию. Это класс атак Bybit. Сегодня защита ограничена: расшифровка и защита разрешений в самом приложении, нотаризованные сборки для macOS и самостоятельная сборка расширения или приложений из исходников (к пакетам релизов прилагаются контрольные суммы SHA-256 и аттестации сборки GitHub, называющие коммит и запуск рабочего процесса; установщик для Windows по-прежнему не подписан). Trusted Signer, независимую страницу подписи, не разделяющую код с приложением, можно выбрать как способ подписи в настольном приложении и приложениях для iPhone и Android; проверка целостности в настольном приложении несовпадающую страницу только записывает в журнал, а мобильные приложения пока ничего не проверяют.
  • Всё, что раздаётся с домена, — любая страница на getvela.app или его поддоменах, включая загружаемый ею скрипт, может запросить подпись у passkey Vela, а запрос покажет только «getvela.app». Поэтому сайт запрещает своим страницам использовать passkey и не загружает скрипт аналитики на странице, которая работает с ключом. Если домен сменит владельца, новый владелец также будет решать, каким приложениям можно использовать эти passkey. Расширение и приложения, собранные самостоятельно, несут собственный код, хотя по умолчанию всё равно загружают дескрипторы и пользуются сервисами на getvela.app.

Восстановление

При создании кошелька его публичные ключи и адрес публикуются в публичном контракте-реестре в Gnosis (запись можно скопировать в Ethereum). На новом устройстве вы входите с помощью любого ключа; приложение находит кошелёк через индекс или, если это не удалось, прямо в реестре и проверяет, что ключи дают записанный адрес. Кошелёк с единственным ключом можно восстановить и по двум подписям, вообще без реестра.

Подробности: восстановление и вход.

Если Vela исчезнет

Ваши средства остаются в вашем Safe в блокчейне. Контракты от Vela не зависят, а каждый сервис Vela открыт, и его может запустить кто-то другой. Единственное, что нельзя перенести, — relying party ключей passkey, getvela.app: копия веб-кошелька на другом домене создаёт другой кошелёк. Для существующих кошельков без getvela.app продолжают работать браузерное расширение Vela (оно может использовать passkey getvela.app с разрешения браузера) и приложения, собранные самостоятельно (с телефоном или ключом безопасности). В руководстве по самостоятельному развёртыванию подробно описан каждый путь и его ограничения. Для независимого доступа к кошельку в конкретной сети нужно ещё, чтобы эта сеть поддерживала EIP-7951 / RIP-7212.

Приватность

Ни аккаунта, ни почты, ни KYC. Публичным становится то, что записывается в реестр при создании кошелька: публичный ключ и идентификатор учётных данных каждого ключа, модель аутентификатора, название кошелька и названия ключей, адрес и подписанные регистрационные данные. Индекс Vela видит эту запись до того, как отправит её, а также адреса, для которых вы ищете имена; релей Vela видит ваш адрес, операции, которые вы отправляете, и RPC-эндпоинт, который использует ваше приложение (включая ключ API в его URL, если он там есть), и хранит операции ограниченное время для повторных попыток и диагностики. Каждый сервис видит ваш IP-адрес. Сайт использует аналитику без cookie. Полный и официальный список — в политике конфиденциальности.

Открытый код

Всё распространяется по лицензии MIT: кошелёк (все приложения и ядро), релей, индекс публичных ключей, сервис курсов валют и справочник данных сетей. Код: github.com/mondaylabsltd.

Токена нет

У Vela нет токена и нет планов его выпускать. Покупать, фармить или спекулировать нечем. Комиссии платятся монетой каждой сети или стейблкоином.

Статус аудита и ограничения

Контракты Safe, его модули 4337 и passkey и EntryPoint v0.7 прошли независимый аудит и широко используются. Собственный код Vela — приложения, бэкенд-сервисы и контракт-реестр — независимого стороннего аудита не проходил, и он не запланирован; профессиональный аудит — это цель на то время, когда у проекта появятся средства, а не обязательство с датой. До тех пор проверка неформальная: код открыт, его читают знающие люди из сообщества, и он проверяется с помощью ИИ-инструментов. Это помогает, но не заменяет профессионального аудита. Относитесь к Vela как к программе в стадии альфы. Подробности: аудиты и известные проблемы.

Ссылки

  • ERC-4337 — абстракция аккаунта через EntryPoint
  • EIP-1271 — проверка подписей контрактами
  • ERC-7730 — дескрипторы понятной подписи
  • EIP-5792 — пакетные вызовы в кошельке (wallet_sendCalls)
  • EIP-7951 / RIP-7212 — прекомпайл для проверки подписей P-256
  • WebAuthn / FIDO2 — passkey
  • Смарт-аккаунт Safe v1.4.1