Кошелек – важнейшее приложение на любом блокчейне. С их помощью пользователи взаимодействуют с платформой. Некоторые кошельки, как например, Bitcoin Core, или Ethereum Mist, соединены с блокчейном напрямую, через полный узел, другие для доступа к блокчейну пользуются веб-сервисами.
На базовом уровне, кошелек обеспечивает сервисы получения, отправки, отслеживания и учета транзакций при операциях с криптовалютами. Более продвинутые кошельки обеспечивают повышенную безопасность, или позволяют проводить более сложные действия на блокчейне. Особенно это касается сети Эфириума, так как ее пользователи не только хранят на кошельках свои активы, но и производят различные действия с помощью смарт-контрактов.
Что такое мультиподпись
С момента своего появления в 2013 году, кошельки с несколькими обязательными подписями (мультиподпись, мультисиг) приобрели широкую популярность. Счета с мультиподписью требуют нескольких цифровых подписей для перемещения токенов, аналогично тому, как для открытия банковской ячейки требуются два ключа.
Мультиподпись серьезно осложняет задачу злоумышленникам, ведь приватные ключи теперь можно держать на разных машинах. Кроме того, с его помощью можно создавать структуры с множеством пользователей, например, если для проведения платежа необходимо согласие нескольких человек.
Эволюция от Биткоина к Эфириуму
Стремительный рост курса эфира в 2016 году, обусловленный техническим потенциалом сети Эфириума, породил пользовательский спрос на веб-кошельки с мультиподписью. Однако, в отличие от всевозможных клонов биткоина, таких как лайткоин и другие, блокчейн Эфириума с самого начала построен на совершенно новом наборе правил консенсуса. Поэтому архитектура кошельков с мультиподписью в сети Эфириума существенно отличается от аналогов для Биткоина.
Аккаунты и адресация
Кошелек Биткоина должен отслеживать множественные предыдущие входящие транзакции, отправленные на адреса, приватными ключами от которых этот кошелек владеет (непотраченные, или UTXO). Полная сумма непотраченных входов – это текущий баланс кошелька. В Эфириуме нет понятия непотраченного входа – вместо этого, у каждого счета есть баланс, изменяющийся с каждой транзакцией.
Для того, чтобы создать и подписать транзакцию, уже не нужно собирать и сохранять предыдущие непотраченные входы, все, что требуется – это идентификационный номер (ID) последней транзакции (для предотвращения двойной траты) и ID новой транзакции. Более того, поскольку вместо непотраченных входов отслеживаются только балансы, это уменьшает вычислительную нагрузку на кошелек. В этом отношении, создание транзакций в Эфириуме значительно проще. Однако за эту простоту приходится платить приватностью, так как счета теперь привязаны к единому адресу, в то время как у кошелька биткоина может быть много адресов, что затрудняет отслеживание переводов.
Комиссии за майнинг
В сети Биткоина, размер комиссии, которую пользователь платит майнерам, определяется размером транзакции. Комиссия Эфириума вычисляется на основе количества операций блокчейна, умноженная на цену, которую пользователь согласен платить за единицу газа (внутренняя единичная стоимость транзакции или контракта в Эфириуме). Проще говоря, комиссия зависит от количества и сложности операций, а также размером транзакции на блокчейне.
В технической документации можно найти точное описание стоимости пользования блокчейном и соответствующей цене валидации, но для новичков это довольно сложное чтение. Простой пример: отправка эфира на контракт краудфандинга может потребовать совершенно другой комиссии (платит отправитель), чем отправка частному пользователю такой же суммы. Здесь есть обширное поле деятельности для разработчиков графического интерфейса: помочь пользователям разобраться в начислениях.
Схемы контрактов с мультиподписью
Создание кошелька с мультиподписью в сети Эфириума
В отличие от Биткоина, Эфириум поддерживает сложные скрипты, но у него отсутствует встроенное условие мультиподписи P2SH (возможность провести перевод средств на хэш контракта, а скрипт отправить позднее).
Основной подход Эфириума к работе с мультиподписью состоит в том, что создаются отдельные адреса, каждый с одной подписью, а затем пишется контракт для хранения средств, контролируемый этими адресами. Это выглядит более сложной процедурой по сравнению с биткоином, однако дает больше гибкости разработчикам.
Ниже приведены две основные схемы контрактов Эфириума для мультиподписи.
1. Выполнение и подтверждение операции вывода средств с помощью отдельных транзакций.
Это наиболее распространенный метод, применяемый в кошельках Mist и Etherli.
Первый шаг: размещение контракта, регистрация подписей. Чтобы отправить деньги по определенному адресу, первый пользователь (предлагающий), отправляет в адрес контракта запрос предложения. Запрос имеет уникальный ID операции (хэш), вычисленный из суммы эфира к отправке, адреса получателя и передаваемых данных.
Второй шаг: следующий пользователь контракта кошелька должен подтвердить этот ID, отправив отдельную транзакцию подтверждения на контракт. Обе транзакции публикуются в блокчейне перед результирующей операцией (отправкой средств).
2. Подтверждение мультиподписи единой транзакцией.
Несмотря на то, что мультиподпись с двумя транзакциями обладает высокой надежностью и уже используется во многих приложениях, существует спрос на мультиподпись с одной транзакцией, как это реализовано в Биткоине. Его преимущество состоит в том, что он требует меньше места в блокчейне, и транзакции проходят быстрее, потому что не нужно ждать появления множественных блоков. Иногда его называют «Второй этап эволюции мультиподписи в сети Эфириума».
Каждая транзакция в Эфириуме может иметь только одного отправителя/подпись. Поэтому, реализация мультиподписи с одной транзакцией требует использования оператора ecrecover. Этот оператор может записать подтверждение адреса подписи в поле данных транзакции. Контракт с мультиподписью получает ID-хэш, вычисленный из суммы, адреса получателя, возможно и других данных, и подтверждает, что ID подписан первой подписью в поле данных. Таким образом, первая подпись формально является отправителем транзакции, а вторая подпись подтверждает поле данных, и все происходит в одной транзакции.
Различные реализации мультиподписи в кошельках Эфириума
Ниже приведены наиболее распространенные мультисиг-контракты:
Standart Wallet.sol in dapp-bin
Это самый первый контракт, написанный Гэвином Вудом (Gavin Wood), одним из основателей сети. Он используется в официальном кошельке Фонда Эфириума - Mist.
Его последняя версия реализована как «выполнение, затем подтверждение» (это первый метод – несколько транзакций). Кроме того, контракт поддерживает такие функции как дневные лимиты на перевод, а также добавление/удаление пользователей. Ожидается новая версия контракта, основанная на втором методе (мультиподпись одной транзакцией).
Еще один контракт на основе одной транзакции. Он написан по следам известных событий со взломом TheDAO, и намеренно предлагает самый простой набор функций, чтобы минимизировать число строк кода и не допустить поверхностную атаку. Содержит функцию «safe mode», которая, если ее активировать, позволяет выводы только на адрес собственных подписей.
Надстройка на контрактной платформе Dappsys, основан на методе нескольких транзакций. Опубликован в ходе подготовки к конференции Devcon-2. Основное преимущество – модульный дизайн кода, что очень удобно для программистов, разрабатывающих кошельки на этой платформе. Модули могут использоваться для других сценариев хранения активов.
Задел на будущее
Широкий набор приложений на платформе Эфириума обеспечивает растущий спрос на мультисиг-кошельки с расширенным набором функций.
Поддержка токенов ERC-20
Несмотря на разнообразие кошельков смультиподписью для хранения эфира, лишь немногие поддерживают токены, построенные на платформе Эфириума, такие как DGD компании Digix, REP рынка предсказаний Augur и другие. Контракты токенов – интегральная часть экосистемы и все они построены на общем стандарте ERC-20.
Поддержка других операций и сценариев
Заглядывая немного дальше, можно сказать, что диапазон функций, необходимых кошелькам будет существенно расширен. Эфириумные контракты требуют интеллектуальных функций, а не только процедур приема и отправки средств.
Разработка стандартов взаимной совместимости критически важна для отрасли. Необходимо разработать набор общих функций, которые должны поддерживать все кошельки. В качестве примеров можно привести операции купли-продажи, таймлок (замедлители), возможность делать ставки, голосование и другие.
Дальнейшая эволюция мультиподписи: стандарт EIP101 (Протокол Serenity)
Будущий релиз Serenity получит несколько полезных функций, которые существенно упростят жизнь пользователям при работе с мультисиг-кошельками.
- Функциональность типа «pay-to-script-hash»: возможность создавать и разворачивать в сети контракт кошелька только на тот момент, когда пользователь переводит деньги. Это избавит пользователей от необходимости заранее создавать кошельки. Что еще более важно, пользователям больше не придется платить комиссию газом перед развертыванием кошелька с мультиподписью.
- Контракты смогут самостоятельно оплачивать комиссии. В настоящее время, газ-комиссии при выводе средств оплачиваются с адреса той подписи, которая отправляет транзакцию на контракт кошелька. Это означает, что пользователям приходится держать баланс в двух местах: контракт кошелька, защищенный мультиподписью, и адрес подписи (чтобы оплачивать комиссии). Serenity позволит контрактам платить собственным газом, так что пользователям не придется держать отдельный счет для оплаты комиссий.
В конечном счете, пользователи будут выбирать кошельки, основанные не на какой-либо отдельной криптовалюте, а на приложениях, в которых нуждаются пользователи. Людям нужны супер-приложения, а не супер-блокчейн.