Формат команд
Каждая операция zNS — это экранированная транзакция ZCash на протокольный адрес регистратора, где сумма является платежом, а memo — подписанной командой. И то и другое едет в одной ноте, поэтому намерение и оплата связаны неразрывно: сопоставлять отдельные ссылки или счета не нужно.
Эта страница описывает точный формат передачи. Команда, построенная по нему, будет принята и регистратором, и схемой с нулевым разглашением.
Строение
Все команды — это ASCII с разделителями-двоеточиями, начинающиеся с маркера протокола и версии:
zNS:1:{OP}:{name}:…:{ed25519_pubkey_hex}:…:{nonce}:{signature_hex}
Поля между ними зависят от операции:
| Операция | Структура memo | Оплачиваемая сумма |
|---|---|---|
REG регистрация | zNS:1:REG:{name}:{address}:{pubkey}:{nonce}:{sig} | плата за регистрацию по длине имени |
UPD смена адреса | zNS:1:UPD:{name}:{address}:{pubkey}:{nonce}:{sig} | плата за изменение |
CHG передача прав | zNS:1:CHG:{name}:{new_pubkey}:{nonce}:{sig} | плата за изменение |
LST выставить на продажу | zNS:1:LST:{name}:{pubkey}:{price}:{nonce}:{sig} | плата за изменение |
ULT снять с продажи | zNS:1:ULT:{name}:{pubkey}:{nonce}:{sig} | плата за изменение |
BUY покупка | zNS:1:BUY:{name}:{address}:{pubkey}:{nonce}:{sig} | ровно выставленная цена |
Для CHG поле {new_pubkey} — это ключ принимающего владельца, а подпись делает
передающий владелец: передачу санкционирует именно текущий владелец.
Подписываемое сообщение
Подпись покрывает команду без завершающего :{signature} — то есть всё от маркера до
nonce включительно:
zNS:1:REG:richard.zcash:u1…:0101…0101:1780000001
Правила здесь точные, и клиент, нарушивший любое из них, получит подпись, которую схема отвергнет:
pubkey— строчный hex, 64 символа.priceприсутствует только уLST.addressприсутствует только уREG,UPDиBUY.priceиnonce— десятичные, без ведущих нулей, без знака и без дополнения.- Подпись — Ed25519 по ровно этим байтам, в hex-кодировке, 128 символов.
Проверка строгая: неканонические подписи и ключи малого порядка отвергаются.
Правила полей
Имя
| Правило | Значение |
|---|---|
| Символы | a-z, 0-9, дефис |
| Длина | 1–64 символа вместе с зоной |
| Регистр | только нижний — имя хранится и хешируется в нижнем регистре |
| Дефисы | не в начале, не в конце, никогда не подряд |
| Зоны | .zcash, .zec, .private, .secure, .safe |
Допускается ровно одна точка, отделяющая метку от зоны.
Целевой адрес
Адрес, в который разрешается имя, должен быть Unified Address основной сети с приёмником Orchard. Адреса без него не принимаются.
Причина практическая, а не произвольная: регистратор принимает и выплачивает средства через ключевой материал Orchard, который согласно ZIP 229 покрывает и пул Ironwood. На адрес без приёмника Orchard нельзя заплатить, поэтому его нельзя использовать ни для возвратов, ни для выручки от продаж.
Ironwood не добавляет нового приёмника
Ironwood — это новый пул стоимости, а не новый формат адреса. Кошельки переносят в него ноты, тогда как адрес получения остаётся адресом Orchard. Unified Address современного кошелька работает без изменений.
Nonce
Nonce — это временная метка Unix в секундах на момент подписания.
- Он должен быть строго больше nonce, записанного для этого имени сейчас. Именно это предотвращает повторное использование старой подписанной команды.
- Он не может опережать несущий его блок более чем на 300 секунд — этого хватает, чтобы поглотить обычное расхождение часов, но не позволяет задать nonce далеко в будущем.
Для первой регистрации подойдёт любая текущая временная метка.
Цена
Цену несёт только LST. Это целое число затоши (1 ZEC = 100 000 000 затоши), и оно
должно быть больше нуля.
Повторно выставить уже выставленное имя по новой цене можно — отправьте ещё одну команду
LST. Побеждает последняя.
Ограничение размера
Memo в ZCash занимает ровно 512 байт, и вся команда должна в них поместиться. Фиксированные части расходуют предсказуемый объём:
zNS:1:{OP}: … marker, version, operation 11 bytes
{pubkey} 64 hex characters 65 bytes with separator
{nonce} 10 digits today 11 bytes with separator
{signature} 128 hex characters 128 bytes
Остаётся примерно 295 байт, которые делят между собой имя и целевой адрес. Unified Address с несколькими приёмниками бывает длинным, поэтому при очень длинном имени очень длинный адрес может не поместиться. Клиентам стоит вычислять этот бюджет и предупреждать пользователя до оплаты, а не давать транзакции провалиться постфактум.
Оплата
Сумма определяет корректность не меньше, чем memo:
REGдолжна оплатить ровно плату за регистрацию для данной длины имени.UPD,CHG,LST,ULTдолжны оплатить ровно плату за изменение.BUYдолжна оплатить ровно выставленную цену.
Длина считается по метке, без учёта зоны: ab.zcash — это имя из 2 символов.
Команда с недоплатой или переплатой не обрабатывается. Если операция и публичный ключ читаются, сумма зачисляется на ваш внутренний баланс, откуда её можно вывести — см. Вопросы и ответы.
Порядок обработки
Команды обрабатываются в том порядке, в котором их создал ZCash: по высоте блока, затем по индексу транзакции внутри блока, затем по индексу входа. Регистратор не выбирает порядок и не может его переставить так, чтобы каждый независимый индексатор не вычислил при этом другой корень.
Для конкурирующих операций — двух REG на одно имя или двух BUY по одному объявлению —
побеждает первая в этом порядке, а остальным средства возвращаются на внутренний баланс.
Разобранный пример
Регистрация richard.zcash:
1. Generate an Ed25519 keypair. The public key is your identity across all your names.
2. Build the message to sign (note: no trailing signature field):
zNS:1:REG:richard.zcash:u1mvnsq85wane…:3757ee1a…a53:1780000001
3. Sign it with the private key; hex-encode the 64-byte signature.
4. Append it to form the memo:
zNS:1:REG:richard.zcash:u1mvnsq85wane…:3757ee1a…a53:1780000001:cfec7a58…04
5. Send a shielded transaction to the registrar address, with that memo, paying the
registration fee for a 7-character name.
За несколько минут команда попадает в пакет, доказывается и закрепляется в блокчейне. С этого
момента richard.zcash разрешается через любой индексатор, причём с доказательством Меркла,
которое вы можете проверить сами.