Формат команд
Кожна операція 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 розв'язується через будь-який індексатор, причому з доказом Меркла, який ви можете
перевірити самі.