Аккаунты и адреса
В 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 байта — это ключ
Внутри цепочки аккаунт — не текст. Это 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_ его ключа узла.
Адреса без ключа
Некоторые нативные адреса вообще не являются ключами. Им не соответствует ни один закрытый ключ, поэтому никакая подпись не может потратить с них средства, и их монеты движутся только по собственным правилам протокола:
- пулы протокола: пул долголетия
ZBCLONGV, пул храненияZBCSTOREи пул приложенийZBCAPPS, каждый из которых — имя в ASCII, дополненное нулями до 32 байт (пулы); - группа аккаунтов, названная хешем транзакции, которая её основала (группы аккаунтов);
- мультиподписной аккаунт — хеш его порога и участников (мультиподпись);
- объект набора данных — хеш транзакции, которая его создала (наборы данных).
Всё публично
Каждый узел хранит полное состояние, и его API отвечает любому — без аккаунта, без ключа и без ключа API. GET /api/v1/accounts/<address> возвращает баланс, а маршруты /history, /transactions и /movements под ним перечисляют, что делал аккаунт, и каждое изменение его баланса с причиной, включая уплаченную аренду и выигранные награды. Обозреватели показывают те же данные в виде веб-страниц (обозреватель и архивные узлы).
Чего цепочка не записывает, так это того, кто вы. Адрес — это ключ, а не имя, и ничто в цепочке не связывает его с человеком, если кто-то сам не установит эту связь. Поэтому приватность в ZooBC обеспечивается тем, как вы пользуетесь адресами, а не скрытыми балансами. Ключ нужен, чтобы действовать, но никогда — чтобы смотреть.
Аккаунт, на котором есть ZBC, платит небольшую аренду, а аккаунт, баланс которого не может её покрыть, удаляется (аренда аккаунтов и их удаление).