Вики ZooBC
Интеграции

Подписанные и зашифрованные сообщения

Не каждой подписи нужна транзакция. Подписанное сообщение доказывает, что у вас есть ключ, без перемещения денег и без уплаты комиссии; зашифрованное сообщение может прочитать только его получатель. Эта статья охватывает и то и другое, а также две связанные подписи, которые принимает API узла.

Как доказать, что вы контролируете адрес

Сайт, которому нужно знать, что вы контролируете адрес ZooBC, присылает вам случайный вызов. Вы подписываете его командой zbc-cli sign-message или той же функцией в любом порте публичных инструментов командной строки, а сайт проверяет подпись по вашему адресу. Для нативного адреса ZBC_ адрес — это сам публичный ключ, поэтому больше ничего не нужно. Отправка платежа тоже доказала бы контроль, но это транзакция, и она стоит комиссии. Никогда не отдавайте никому вместо этого свой закрытый ключ.

Эта схема называется ZBC-MSG-v2. Она подписывает ключом Ed25519:

SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message)

Две части этого дайджеста важны:

  • Метка. Транзакции подписываются под другой меткой, «ZBC-TX». Поэтому подпись сообщения никогда не может быть действительна как транзакция, а подпись транзакции — как сообщение.
  • Хеш генезиса. Он привязывает подпись к одной сети: сообщение, подписанное для devnet, никогда не проходит проверку в testnet или mainnet (подписи, привязанные к цепочке).

В течение переходного периода команда verify-message инструментов принимает также более старую форму без привязки к цепочке, ZBC-MSG-v1 (SHA3-256 от «ZBC-MSG» и сообщения). Период заканчивается в момент отсечки, заданный в инструментах; после него проверку проходит только ZBC-MSG-v2.

Метка ZBC-MSG-v2, хеш генезиса и сообщение хешируются SHA3-256 и подписываются Ed25519, затем проверяются по адресу ZBC_; метки ZBC-TX и ZBC-MSG-v2 никогда не взаимозаменяемы
Метка ZBC-MSG-v2, хеш генезиса и сообщение хешируются SHA3-256 и подписываются Ed25519, затем проверяются по адресу ZBC_; метки ZBC-TX и ZBC-MSG-v2 никогда не взаимозаменяемы

Подписание сообщений — соглашение публичных инструментов и сервисов, которые его приняли, а не возможность цепочки. В цепочке ничего не хранится, и у узлов нет для этого конечной точки.

Зашифрованные сообщения

Любая транзакция может нести сообщение (конверт транзакции). Открытое сообщение занимает не более 256 байт. Зашифрованное начинается с маркера «ZBE1», за которым следует запечатанный контейнер libsodium (sealed box), адресованный ключу получателя, открыть который может только закрытый ключ получателя. Зашифрованное сообщение может занимать до 320 байт, что оставляет место не более чем для 268 байт текста.

Шифруется только сообщение. Остальная часть транзакции, например её отправитель, получатель и сумма, остаётся такой же публичной, как у любой другой.

Подписанные запросы к API

Большая часть API узла — открытое чтение, а транзакции не нужен ключ API, потому что она несёт собственную подпись. Там, где сам запрос должен быть подписан, подпись — это Ed25519 над текстом METHOD:PATH:TIMESTAMP:BODY, действительная 300 секунд. Клиент, который 20 раз не прошёл подписанную аутентификацию за 5 минут, блокируется на 300 секунд.

Отмена ожидающей транзакции

Транзакцию, которая ждёт в пуле узла, можно отозвать с этого узла запросом DELETE /api/v1/transactions/pending/, за которым следует её хеш. Запрос несёт подпись над:

SHA3-256("ZBC-CANCEL" ‖ genesis hash ‖ transaction hash)

Он удаляет копию только из пула этого узла. Другие узлы, у которых транзакция уже есть, всё ещё могут включить её в блок, поэтому отмена — это просьба, а не гарантия.

См. также