Перейти до основного вмісту

Формат команд

Кожна операція 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:

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