
Мультиподписной кошелёк Solana, где адрес — это набор участников
Мультиподписному кошельку нужно два или более ключа, чтобы одобрить любую трату. В Bitcoin адрес кошелька — это просто хеш его собственных правил: списка открытых ключей и числа «сколько подписей требуется». Вы можете вычислить этот адрес на листке бумаги, раздать его и получать средства задолго до того, как кто-либо коснётся блокчейна.
Solana традиционно так не умеет. Как объясняет первая статья этой серии, доминирующие мультиподписи Solana требуют выполнить транзакцию создания со случайностью, выбранной создателем, ещё до того, как адрес кошелька вообще существует. Собственная программа мультиподписи Solana от SSP идёт по пути Bitcoin. Она самоинициализирующаяся: адрес кошелька и есть набор участников.
Одно замечание сразу: программа мультиподписи Solana от SSP имеет открытый исходный код (RunOnFlux/Solana-Multisig) и сейчас работает только в devnet — тестовой сети Solana. Развёртывание в mainnet зависит от внешнего аудита безопасности.
Два адреса: мультиподпись и vault
В дизайне SSP для каждого мультиподписного кошелька используются два отдельных адреса.
Адрес мультиподписи хранит правила — отсортированный список ключей участников, порог (M в «M-из-N») и счётчик предложенных транзакций. Он принадлежит программе SSP.
Адрес vault хранит деньги — SOL и токены SPL. Он принадлежит встроенной System Program в Solana и не хранит собственных данных. Vault — это адрес для пополнения: его вы даёте тому, кто хочет вам заплатить.
Оба они представляют собой Program Derived Address, или PDA — адрес без приватного ключа, намеренно размещённый вне криптографической кривой, так что никакой ключ не может им управлять. Только программа, которая его вывела, может разрешать перемещения с него. Эта деталь важна в конце.
Как адрес вычисляется из участников
Именно эта часть делает кошелёк самоинициализирующимся. Чтобы вывести адрес мультиподписи, простыми словами: возьмите буквальную метку multisig, хеш SHA-256 отсортированного списка участников и порог; затем подайте это вместе с идентификатором программы SSP в функцию вывода адресов Solana. Три детали заслуживают внимания.
Участники сначала сортируются и дедуплицируются. Кошелёк 2-из-3 с участниками A, B, C даёт один и тот же адрес, перечислите ли вы их как C, A, B или B, C, A. Порядок не важен; важен только набор.
Используется полный 32-байтовый хеш — никогда укороченная версия. Усечение хеша открыло бы реальную атаку: злоумышленник мог бы искать другой набор участников, который хешируется в то же укороченное значение, затем зарегистрировать своих участников по вашему адресу и опустошить любые средства, которые вы заранее внесли. Полный 32-байтовый хеш делает такой поиск астрономически дорогим, поэтому этого никогда не происходит.
Порог — часть адреса. Кошелёк 2-из-3 и кошелёк 3-из-3 с теми же самыми участниками — это разные кошельки по разным адресам. Правила вшиты в идентичность.
Адрес vault затем выводится из адреса мультиподписи плюс небольшой номер индекса (SSP всегда использует индекс 0), так что vault тоже полностью определяется набором участников и порогом.
Практический итог: любой может вычислить оба адреса офлайн, до отправки хотя бы одной транзакции. Вы можете раздать адрес vault и получать средства в кошелёк, который в цепочке ещё не существует, — свойство Bitcoin, перенесённое в Solana.
Регистрация без разрешения: включить может любой
Адрес кошелька существует в тот момент, когда вы знаете участников. Но чтобы тратить с него, правила в какой-то момент должны быть записаны в цепочку — программа называет этот шаг initialize.
В большинстве мультиподписей Solana эквивалентный шаг может сделать только привилегированный создатель. В программе SSP инициализация не требует разрешения: её может сделать кто угодно. Ни учётной записи создателя, ни подписи участника, ни особого разрешения. Обычно небольшую плату за аренду вносит сервис relay от SSP и включает кошелёк, но кто именно это делает — действительно неважно.
Это звучит тревожно, пока вы не увидите проверку безопасности. Когда кто-то инициализирует кошелёк, программа пересчитывает хеш SHA-256 предоставленного списка участников и отклоняет транзакцию, если этот хеш не совпадает с вшитым в адрес. Фреймворк учётных записей Solana независимо привязывает адрес к тому же хешу. Вместе эти две проверки означают, что канонический адрес может содержать только канонический набор участников. Никто не может зарегистрировать ваш адрес со списком участников по своему выбору — хеш не совпадёт, и транзакция не пройдёт.
Почему незнакомец, инициализирующий ваш кошелёк, не может вам навредить
Разберём, что злоумышленник на самом деле мог бы попробовать.
Он инициализирует с другим набором участников. Другой набор хешируется в другое значение, которое выводит другой адрес. Злоумышленник просто создал свой собственный, ни с чем не связанный кошелёк где-то ещё в Solana — никакой связи с вашим vault, никаких прав на ваши средства.
Он инициализирует с вашим набором участников. Хеш совпадает, поэтому транзакция проходит, но всё, что он сделал, — оплатил за вас плату за аренду. Кошелёк теперь зарегистрирован ровно с теми правилами, которых вы ждали, а злоумышленник не участник, поэтому он не может ничего предложить, одобрить или выполнить. Деньги никогда не лежат на самом адресе мультиподписи — они лежат в vault, который принадлежит системе и не может быть захвачен. Кто бы ни инициализировал кошелёк и когда бы это ни произошло, результат один и тот же — канонический кошелёк с верными правилами.
Порог проверяется при трате, а не при регистрации
Это та же модель, что использует мультиподпись P2WSH в Bitcoin, и стоит сказать прямо: порог M-из-N применяется только при перемещении средств — никогда при регистрации.
Регистрация лишь фиксирует: «вот участники, вот порог». Она не требует подписей, потому что не может причинить никакого вреда. Настоящий заслон — это процесс траты, где программа подсчитывает одобрения и отказывается действовать, пока достаточное число участников не дало согласие. Адрес — это хеш правил; пополнить его может кто угодно; потратить — только при действительных подписях. Чтобы освежить, что значит «M-из-N», см. 2-из-2 против 2-из-3 против M-из-N мультиподписи.
Полный жизненный цикл, от начала до конца
Собирая части воедино, вот жизнь мультиподписного кошелька Solana от SSP:
- Вывести. Любой вычисляет адреса мультиподписи и vault офлайн из участников и порога. Без блокчейна, без затрат.
- Предварительно пополнить. Любой отправляет SOL или токены на адрес vault — это работает даже до того, как кошелёк зарегистрирован.
- Инициализировать. Любой, обычно relay от SSP, отправляет транзакцию регистрации без разрешения. Программа проверяет хеш участников и записывает канонические правила в цепочку.
- Предложить. Участник создаёт предложение транзакции, компактно хранящееся на отдельном аккаунте предложения.
- Одобрить. Каждый участник одобряет предложение, по одному разу. Одобрения накапливаются в цепочке.
- Выполнить. Когда одобрения достигают порога, любой может запустить выполнение. Программа сначала помечает предложение как выполненное — намеренная защита, чтобы оно никогда не выполнилось дважды, — а затем проводит каждую инструкцию, причём сам vault выступает подписантом.
Именно на этом последнем шаге окупается беcключевой адрес vault. Поскольку vault — это PDA без приватного ключа, ни человек, ни программа не могут переместить его средства, подписав обычным образом. Единственный выход — программа SSP выполняет одобренное предложение, достигшее порога. Она «подписывает» за vault, предъявляя рецепт вывода vault среде выполнения Solana — разрешение, которое она получает лишь потому, что является владельцем адреса.
Ни создателя, ни администратора, ни ротации ключей на месте
Два последних свойства связывают дизайн воедино.
Набор участников и порог неизменяемы. После инициализации кошелька ни одна инструкция программы не может изменить его участников или порог — для этого попросту нет пути в коде. Чтобы изменить, кто управляет кошельком — то, что другие системы расплывчато называют «ротацией ключей», — вы создаёте новую мультиподпись с новым набором участников и переводите средства туда. Старый адрес навсегда сохраняет свои старые правила.
Никакой роли создателя и никакого ключа администратора, никогда. Многие дизайны мультиподписи держат привилегированную учётную запись, способную переопределить участников или изменить конфигурацию. У программы SSP такой нет — нечего компрометировать, нет ключа администратора для фишинга, нет создателя, которого можно принудить. Участники и порог — вся история целиком.
Этот минимализм — намеренный компромисс: SSP построила небольшой детерминированный примитив, а не богатую функциями платформу управления. Следующая статья, Мультиподпись Solana от SSP против Squads, честно сравнивает этот дизайн со Squads V4 — зрелой, проверенной аудитами, доминирующей мультиподписью Solana. Для контекста продукта объявление о запуске поддержки Solana описывает, что появилось в SSP Wallet v1.39.0.
Ключевая идея достаточно мала, чтобы держать её в голове: в мультиподписи Solana от SSP адрес кошелька — это отпечаток его собственных правил. Знайте участников и порог — и вы знаете адрес. Больше ничего не нужно и ничему другому не доверяют.


