Подписание транзакции
Подпись доказывает, что владелец ключа аккаунта одобрил транзакцию байт в байт. В ZooBC подписант никогда не подписывает голую транзакцию: он подписывает дайджест, который охватывает ещё и идентичность цепочки, поэтому подпись действительна только в одной цепочке. Подписывать могут аккаунты многих типов ключей, каждый по схеме своей родной цепочки, что позволяет ключу Bitcoin, Ethereum или Solana напрямую управлять аккаунтом ZooBC.
Что подписывается
Подписант берёт неподписанный конверт — все поля, кроме подписи, — и подписывает такой дайджест:
digest = SHA3-256( "ZBC-TX" ‖ genesis block hash ‖ unsigned bytes )
«ZBC-TX» — метка в ASCII, а ‖ означает «за которым следует». Принимается только этот дайджест, привязанный к цепочке. В транзакции версии 3 4 байта срока действия входят в неподписанные байты, поэтому подписываются, как и любое другое поле.
Хеш генезис-блока — идентичность цепочки. Поля идентификатора сети в ZooBC нет: у devnet, testnet и mainnet свой хеш генезиса, поэтому подпись, сделанная для mainnet, не проходит проверку в devnet или testnet, даже если один и тот же ключ хранит средства во всех трёх. Узлы к тому же сравнивают хеши генезиса, прежде чем соединиться друг с другом. Это закрывает межцепочечное повторное воспроизведение, при котором кто-то копирует вашу транзакцию из одной цепочки в другую; см. Подписи, привязанные к цепочке.
Хеш и идентификатор
После подписания транзакция определяется своим хешем и идентификатором:
hash = SHA3-256( unsigned bytes ‖ signature )
id = the first 8 bytes of the hash, read as a little-endian signed 64-bit integer
Узел отклоняет идентификатор, который уже подтверждён, и это останавливает повторное воспроизведение в той же цепочке. Идентификатор транзакции IssueToken — это ещё и идентификатор создаваемого ею токена (см. Выпуск токена).
Типы ключей, которые могут подписывать
Адрес начинается с номера типа, и тип определяет, как проверяется его подпись:
| Тип ключа (номер) | Схема подписи |
|---|---|
| ZooBC (0), Solana (11) | Ed25519 |
| Cardano (13), Tezos (16) | Ed25519, публичный ключ передаётся в 98-байтовом поле подписи |
| Bitcoin legacy (1), P2PKH (5), P2WPKH в обёртке P2SH (6), P2WPKH (7), Ripple (14) | secp256k1 ECDSA над двойным SHA-256 от дайджеста, публичный ключ передаётся |
| Ethereum (4), Tron (15) | secp256k1 над Keccak-256 от дайджеста; ключ восстанавливается из 65-байтовой подписи r‖s‖v |
| Bitcoin Taproot (9) | BIP-340 Schnorr |
| Polkadot (12) | sr25519 |
Подписи ECDSA должны использовать форму с малым s. Какой бы ни была схема, каждый ключ подписывает один и тот же дайджест, привязанный к цепочке.
Некоторые типы адресов никогда не могут подписывать: Empty (2), Estonia eID (3, для него нет верификатора), скрипты Bitcoin P2WSH (8) и наборы данных (10). Адрес P2WSH обозначает скрипт, а не отдельный ключ, а адрес набора данных называет данные, а не подписанта. У бесключевых аккаунтов, таких как системные пулы, группы аккаунтов и мультиподписные аккаунты, ключа нет вовсе, и они тратят средства только по собственным правилам.
Подписание чужим кошельком
Чужой кошелёк может также подписать транзакцию своей собственной цепочки, и она будет передана в виде сообщения внутри соответствующей транзакции ZooBC:
- Ethereum: транзакция legacy, EIP-2930 или EIP-1559 с пустым списком доступа;
- Solana: перевод System;
- Bitcoin: один вход, один или два выхода и нулевая комиссия.
Узел проверяет, что отправитель, получатель и сумма совпадают с транзакцией ZooBC, и данную чужую полезную нагрузку можно потратить только один раз. Такое сообщение может содержать до 4 096 байт. Доступ в стиле Ethereum описан в статье MetaMask и доступ в стиле Ethereum.
Другие подписываемые дайджесты
Та же схема привязки к цепочке, каждый раз со своей меткой, охватывает и другие согласия:
- привязку адреса к группе и передачу управления группой («ZBC-GROUP-LINK» и «ZBC-GROUP-CONTROL»);
- просьбу к узлу отменить ожидающую транзакцию в его пуле («ZBC-CANCEL»);
- соподпись многостороннего эскроу.
Сообщения вне цепочки, которые не являются транзакциями, подписываются как SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message) ключом Ed25519; см. Подписанные и зашифрованные сообщения.