Аппаратные кошельки
Аппаратный кошелёк — небольшое устройство, которое хранит закрытый ключ и подписывает на собственном экране, так что ключ никогда не касается компьютера. ZooBC написал спецификацию подписания для производителей таких устройств. Она определяет, что устройство должно проверить, показать и вычислить, прежде чем подписать транзакцию ZooBC.
Идея: устройство решает, что подписывать
Компьютер может быть скомпрометирован; устройство — та часть, которой доверяет пользователь. Поэтому спецификация оставляет главную роль устройству. Компьютер лишь предлагает транзакцию. Устройство читает её поле за полем, показывает пользователю, что она означает, и подписывает только то, что пользователь одобрил, вычисляя дайджест само.
Ключи
Устройство выводит свои ключи из фразы восстановления по пути m/44'/883'/account', используя SLIP-0010 для Ed25519, где 883 — тип монеты ZooBC (ключи и типы аккаунтов). Поэтому подпись — Ed25519, как у любого нативного аккаунта ZooBC, а не подпись secp256k1, которую делает устройство для Bitcoin. Ключ никогда не покидает устройство.
Что должно делать устройство
- Получить от компьютера неподписанные байты транзакции и хеш генезиса цепочки.
- Разобрать каждое поле само и отклонить любую транзакцию, поля длины которой не сходятся в точности.
- Проверить отправителя: отклонить, если отправитель — не собственный выведенный аккаунт устройства.
- Показать сеть, тип транзакции, сумму, получателя полностью, комиссию, любой платёж survival (плата за сохранение данных (долговечность)), сообщение и любое эскроу (эскроу).
- Дождаться одобрения пользователя.
- Вычислить дайджест, привязанный к цепочке, само — SHA3-256("ZBC-TX" ‖ хеш генезиса ‖ байты) — и подписать его ключом Ed25519 (подписи, привязанные к цепочке).
- Вернуть компьютеру только подпись.
Почему такие правила
- Никогда не подписывать готовый дайджест. 32-байтовый дайджест, присланный компьютером, может оказаться хешем транзакции, которую пользователь никогда не видел. Устройство должно строить дайджест из байтов, которые оно разобрало и показало. По той же причине команда подписания сырых сообщений отклоняет входные данные длиной ровно 32 байта, чтобы дайджест транзакции нельзя было подсунуть под видом сообщения.
- Показывать получателя полностью, никогда не сокращая. Похожий адрес можно подобрать так, чтобы он совпадал с началом и концом сокращённого.
- Показывать сеть. Хеш генезиса определяет, в какой цепочке действительна подпись, поэтому пользователь видит, для какой сети предназначена транзакция (devnet, testnet и mainnet).
С чего начать
Спецификация рекомендует, чтобы устройства сначала поддерживали три типа транзакций: SendZBC (платёж), TransferToken (перевод токена, см. Выпуск токена) и ApprovalEscrow (утверждение платежа через эскроу).