Вики ZooBC
Основы ZooBC

Аккаунты и адреса

В ZooBC ваш ключ — это ваш аккаунт. Нативный аккаунт определяется своим публичным ключом Ed25519, который записывается как 66-символьный адрес, начинающийся с ZBC_. Адреса никто не выдаёт: кошелёк выводит ваш адрес из вашего ключа и может сделать это офлайн. Каждый адрес несёт контрольную сумму, поэтому копия с опечаткой отклоняется ещё до того, как что-либо будет отправлено.

Как выглядит адрес

Нативный адрес — это префикс ZBC, знак подчёркивания и 56 символов в семи группах по восемь:

ZBC_57J5D5QV_OPO4JILA_RQW2JC77_OOIDM4VM_BHFCLTKB_2DOFOR4L_Z24K7SFR

Этот пример получен из хеша специально для викторины zoobc.how. Его ключа ни у кого нет, поэтому никогда не отправляйте на него монеты.

56 символов — это 35 байт, записанных в base32, алфавите из заглавных латинских букв от A до Z и цифр от 2 до 7: 32 байта, которые определяют аккаунт, и за ними 3-байтовая контрольная сумма.

32-байтовый публичный ключ и 3-байтовая контрольная сумма дают 35 байт; base32 (A–Z, 2–7) превращает их в 56 символов; после добавления ZBC_ и разбивки на группы по 8 получается готовый адрес.
32-байтовый публичный ключ и 3-байтовая контрольная сумма дают 35 байт; base32 (A–Z, 2–7) превращает их в 56 символов; после добавления ZBC_ и разбивки на группы по 8 получается готовый адрес.

32 байта — это ключ

Внутри цепочки аккаунт — не текст. Это 4-байтовый номер типа, за которым следуют данные, длину которых определяет тип. Тип 0 — нативный аккаунт ZooBC, и его данные — это сам публичный ключ аккаунта Ed25519, а не его хеш. Поэтому любой может прочитать ключ прямо из адреса: начиная с версии 0.5.8 API узла отвечает на /api/v1/accounts/<address>/pubkey для нативного аккаунта по одному только адресу.

Другие цепочки устроены иначе, и ZooBC следует им, когда использует их адреса. Данные аккаунта Ethereum — последние 20 байт хеша Keccak-256 от ключа, а классического аккаунта Bitcoin (P2PKH) — 20-байтовый HASH160 от ключа. ZooBC принимает аккаунты Bitcoin, Ethereum, Solana, Polkadot, Cardano, Ripple, Tron и Tezos, каждый записанный так, как его записывает родная цепочка, и проверяемый её родной схемой подписи (ключи и типы аккаунтов).

Контрольная сумма ловит опечатки

Контрольная сумма — это первые 3 байта SHA3-256 от 32 байт данных, за которыми следуют три буквы префикса. Всё, что декодирует адрес, будь то кошелёк, инструменты командной строки или API узла, вычисляет её заново и отклоняет адрес, если она не совпадает. Случайная опечатка даёт другой действительный адрес лишь примерно в одном случае из 2^24, то есть из 16,7 миллиона. Для проверки к викторине были опробованы все 1 736 замен одного символа в приведённом выше адресе, и каждая была отклонена.

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

Как записывать адрес

Декодирование следует правилу значимых символов: все подчёркивания, дефисы и пробельные символы, включая переводы строк, отбрасываются, а оставшееся переводится в заглавные буквы. Поэтому ZBC_57J5D5QV_…, zbc-57j5d5qv-…, адрес вовсе без разделителей и адрес, перенесённый на две строки в письме, декодируются в одни и те же 32 байта, после чего контрольная сумма проверяется как обычно. Разделители и заглавные буквы существуют только для того, чтобы людям было удобнее читать и копировать.

Префиксы

Три буквы префикса говорят, для чего служит ключ:

ПрефиксЗначение
ZBC_аккаунт (тип 0)
ZNK_ключ узла (ключи узла)
ZBR_ключ ретранслятора (ретрансляторы)
ZBG_ключ шлюза (шлюзы)
ZBS_объект набора данных (тип 10, наборы данных)

API также принимает форму ZTX_ для идентификаторов транзакций.

Поскольку контрольная сумма охватывает префикс, одни и те же 32 байта под двумя префиксами совпадают в первых 51 символе после префикса и различаются только в последних пяти. Ключ из примера, записанный как ключ узла, заканчивается на …_2DOFOR4L_Z24FR5JM, а не на …_2DOFOR4L_Z24K7SFR. Если заменить префикс вручную, не пересчитав окончание, контрольная сумма нарушится, и правка будет обнаружена. Собственный аккаунт узла — это форма ZBC_ его ключа узла.

Один и тот же ключ в формах ZBC_ и ZNK_: 51 символ после префикса совпадает (это ключ), последние пять различаются, потому что контрольная сумма охватывает префикс.
Один и тот же ключ в формах ZBC_ и ZNK_: 51 символ после префикса совпадает (это ключ), последние пять различаются, потому что контрольная сумма охватывает префикс.

Адреса без ключа

Некоторые нативные адреса вообще не являются ключами. Им не соответствует ни один закрытый ключ, поэтому никакая подпись не может потратить с них средства, и их монеты движутся только по собственным правилам протокола:

  • пулы протокола: пул долголетия ZBCLONGV, пул хранения ZBCSTORE и пул приложений ZBCAPPS, каждый из которых — имя в ASCII, дополненное нулями до 32 байт (пулы);
  • группа аккаунтов, названная хешем транзакции, которая её основала (группы аккаунтов);
  • мультиподписной аккаунт — хеш его порога и участников (мультиподпись);
  • объект набора данных — хеш транзакции, которая его создала (наборы данных).

Всё публично

Каждый узел хранит полное состояние, и его API отвечает любому — без аккаунта, без ключа и без ключа API. GET /api/v1/accounts/<address> возвращает баланс, а маршруты /history, /transactions и /movements под ним перечисляют, что делал аккаунт, и каждое изменение его баланса с причиной, включая уплаченную аренду и выигранные награды. Обозреватели показывают те же данные в виде веб-страниц (обозреватель и архивные узлы).

Чего цепочка не записывает, так это того, кто вы. Адрес — это ключ, а не имя, и ничто в цепочке не связывает его с человеком, если кто-то сам не установит эту связь. Поэтому приватность в ZooBC обеспечивается тем, как вы пользуетесь адресами, а не скрытыми балансами. Ключ нужен, чтобы действовать, но никогда — чтобы смотреть.

Аккаунт, на котором есть ZBC, платит небольшую аренду, а аккаунт, баланс которого не может её покрыть, удаляется (аренда аккаунтов и их удаление).

См. также