January 28

DeFi. Безопасность Safe (мультисиг). Перевод рекомендаций

ETH-мультисиг

Введение

Для начала - повторите:

А теперь - поехали дальше…

Перевод

Это вольный перевод архивной версии: web.archive.org/web/20230528041618/https://help.safe.global/en/articles/40831-how-to-verify-safe-transactions-on-a-hardware-wallet

Прим. Menaskop: нас интересуют не столько тех. детали (они во многом могут устареть), а именно сам процесс (проверки) и его этапы.

Как проверить транзакции Safe на аппаратном кошельке?

В статье объясняется, как проверить подтверждения вне блокчейна (off-chain) и выполнения транзакций в блокчейне (on-chain) для Safe-транзакций с помощью Ledger, Trezor или Keystone.

Обратите внимание: в настоящее время не существует простого пользовательского интерфейса для выполнения этих действий. Поэтому для выполнения руководства потребуется определённый технический уровень знаний.

Для примера используем перевод 0.01 DAI (v1) с Safe на другой аккаунт.

Safe имеет двух владельцев (1 Metamask и 1 аппаратный кошелёк, например, Ledger, Trezor или Keystone) и установлен порог подписи "2 из 2", то есть подписи от Metamask и аппаратного кошелька обязательны.

Подтверждение вне блокчейна с помощью Ledger

1. Инициируйте транзакцию через веб-интерфейс. В данном примере транзакция инициируется через Metamask, а вторым подписантом выступает Ledger. Аналогично процесс работает и в обратном порядке.

2. Подпишите транзакцию в Metamask. В Metamask появляется запрос на подпись. Сообщение для подписи (EIP-712) можно изучить. Поля сообщения соответствуют параметрам метода execTransaction основного контракта Safe:

  • to — адрес контракта токена.
  • value — установлено значение 0, так как ETH не отправляется.
  • data — содержит данные транзакции. Первые 4 байта (0xa9059cbb) указывают, что используется функция transfer. В рамках данного руководства не рассматривается проверка корректности этих данных, а только то, что сообщение, подписываемое в Ledger, соответствует отображаемому интерфейсу Safe.
  • operation — установлено значение 0, что указывает на простую EVM-вызов (EVM CALL) в соответствии с контрактами Safe.
  • safeTxGas — параметр, определяющий количество газа, переданного внутренней транзакции.
  • baseGas, gasPrice, gasToken и refundReceiver — установлены в 0, так как относятся к функции возврата затрат за ретранслированные транзакции. Подробное объяснение можно найти в документации контракта.

Проверка подписи

3. Теперь в списке транзакций увидите транзакцию, ожидающую подписи от второго владельца (Ledger). Подключите ваш Ledger к интерфейсу и нажмите «Подтвердить» (Confirm).

Проверка Ledger

4. Этот этап касается подтверждений вне блокчейна, поэтому снимите галочку с опции «Выполнить транзакцию» (Execute transaction). Для выполнения транзакций обратитесь к следующему разделу.

Approve транзакция

5. На вашем Ledger появится сообщение, похожее на это: 5dafc3c8178f6f56e55e8d44bf55201b8e4fe3ab5a700372f837f8e8a5fff943. Как убедиться, что это именно та транзакция, которую вы хотите выполнить?

6. Откройте информацию о транзакции через наш backend, заменив адрес Safe и nonce на соответствующие значения в следующем URL:

https://safe-transaction-mainnet.safe.global/api/v1/safes/0xA063Cb7CFd8E57c30c788A0572CBbf2129ae56B6/multisig-transactions/?nonce=52.

Обратите внимание, что параметры транзакции, указанные выше, совпадают с теми, что отображаются здесь.

7. Откройте ваш Safe на Etherscan:

https://etherscan.io/address/0xA063Cb7CFd8E57c30c788A0572CBbf2129ae56B6#readProxyContract.

Убедитесь, что вы читаете контракт в режиме «Read as proxy». Если такой опции ещё нет, вы можете отметить контракт как прокси через: Contract -> More options -> Is this a Proxy?

Чтение контракта (proxy)

8. Найдите метод getTransactionHash и заполните все данные из URL сервиса Safe transaction, указанного выше. Нажмите «Query» (Запрос) и сравните результат с safeTxHash из сервиса транзакций. Они должны совпадать. В нашем случае: 0x4ab6e70bdedf5288dc28c03ac3d61603e1fffaf26a1d9c9e1c11a0c2b0274a64.

Подробнее о safeTxHash вы можете узнать в отдельной статье.

Проверка в сканере

Примечание: Если вы используете мобильное приложение Safe, вы увидите этот safeTxHash в разделе «Advanced» (Дополнительно) в деталях транзакции. В веб-версии это будет добавлено в будущем.

9. Этот safeTxHash повторно хэшируется с использованием алгоритма sha-256, и результат отображается на вашем Ledger.

10. Перейдите к онлайн-инструменту для хэширования или используйте любой другой удобный для вас инструмент. Введите safeTxHash (например, 4ab6e70bdedf5288dc28c03ac3d61603e1fffaf26a1d9c9e1c11a0c2b0274a64, без 0x). Убедитесь, что тип ввода установлен как hex или bytes.

11. Полученный хэш должен полностью совпадать с тем, что отображается на вашем Ledger:

5dafc3c8178f6f56e55e8d44bf55201b8e4fe3ab5a700372f837f8e8a5fff943.

Теперь вы подтвердили, что подписываете именно те параметры транзакции, которые были введены.

Выполнение Safe ончейн-транзакций с помощью Ledger

На вашем Ledger откройте настройки приложения Ethereum и включите опцию Debug data (Отображение отладочных данных), чтобы видеть все детали.

Для шагов 1–3 обратитесь к предыдущему разделу.

Вместо того чтобы снимать галочку с «Execute transaction» (Выполнить транзакцию), теперь оставьте её включённой.

Сверка

Проверьте селектор. Это метод, который (можно вызвать). Для Safe это всегда метод execTransaction, и для текущих версий Safe его значение будет 6A761202.

Поле 1 — параметр to. В нашем примере это: 89d24a6b4ccb1b6faa2625fe562bdd9a23260359.

Поле 2 — параметр value. В нашем примере это 0. Если значение больше 0, учтите, что оно отображается в шестнадцатеричном формате, а не в десятичном. Для преобразования между системами можно использовать такой инструмент: rapidtables.com/convert/number/hex-to-decimal.html.

Поле 3 — смещение (первичное) (Поле 12+ ниже).

Поле 4 — параметр operation. В большинстве случаев это 0.

Поле 5 — параметр safeTxGas. В нашем примере это a455 (в шестнадцатеричном формате) или 42069 (в десятичном).

Поля 6–9 — параметры baseGas, gasPrice, gasToken и refundReceiver. В нашем примере они равны 0.

Поле 10 — смещение к подписям (Поле 17+ ниже).

Поле 11 — длина следующего поля данных.

Поля 12–16 — данные транзакции. В нашем примере это:

a9059cbb0000000000000000000000008ed44000983b5789798b43af9d8d9c1e1e2093d0000000000000000000000000000000000000000000000000002386f26fc10000.

Начиная с Поля 17 и далее, добавляются все необходимые подписи.

атем проверьте комиссии и отправьте транзакцию.

Примечание: Номера полей могут отличаться в зависимости от размера транзакции и количества подписей.

Оффчейн подтверждение с помощью Trezor

Следуйте шагам 1–8 из раздела «Подтверждение вне блокчейна с помощью Ledger».

Шаги 9 и 10 (sha256) не требуются: Trezor напрямую отображает safeTxHash.

Выполнение ончейн-транзакции с помощью Trezor

Trezor не позволяет проверить все данные транзакции. Поэтому вы можете проверить только адрес назначения (то есть ваш Safe) и комиссию за транзакцию.

Подтверждение вне блокчейна с помощью Keystone

Для Keystone следуйте статье Decoding Multi-Signature Transactions на сайте документации Keystone.

До!

P.S. Menaskop

Позже покажу на примере всё, что описано