Фармат каманд
Кожная аперацыя 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 вырашаецца праз любы індэксатар, прычым з доказам Меркла, які вы можаце
праверыць самі.