Екранований бюлетень
Надішліть Markdown-нотаток до списку екранованих адрес як пам’ятки Zcash, використовуючи Zallet. Список отримувачів і нотатка не потрапляють на прозорі адреси.
Екранований бюлетень — це серія екранованих транзакцій. Кожен вихід сплачує крихітну суму отримувачу Unified Address і містить наступний фрагмент нотатки в полі пам’ятки. Zallet створює та надсилає ці транзакції. Zebra і Zaino лише надають дані ланцюга.
Скрипти розміщено в site/tutorials/shieldedNewsletter. Їх написали для ранньої версії Zallet, і їх небезпечно запускати без змін із поточним випуском. Ця сторінка містить оновлену процедуру. Перевірено з Zallet v0.1.0-beta.3 та книгою Zallet станом на 7 жовтня 2026 року.
Що вам потрібно
- Повністю синхронізований Zebra з RPC, прив’язаним до localhost.
- Zaino, синхронізований із цим вузлом Zebra.
- Zallet
v0.1.0-beta.3 або новішої версії, збірка гаманця, з його RPC, прив’язаним до localhost. У книзі z_sendmany зазначено як реалізований. Числова комісія відхиляється: якщо ви передаєте fee, це має бути null, оскільки Zallet завжди використовує комісію ZIP 317.
- Поповнений обліковий запис, чий Unified Address може витрачати екрановані кошти.
- Unified Addresses отримувачів. Пам’ятка на прозорій адресі є помилкою.
Не розміщуйте поповнену адресу або cookie у вікі чи в закоміченому скрипті. Поточний txBuilderFromFile.sh має жорстко закодований Unified Address. Замініть його локально й не комітьте.
Налаштування Zallet
Згенеруйте конфігурацію за допомогою Zallet, який ви запускаєте, а потім вкажіть у ній Zebra і Zaino. Зразок у старому посібнику використовує as_of_version = "0.0.0" та особистий домашній шлях. Вважайте цей файл знімком, а не шаблоном.
Code-highlight
zallet init
zallet -c ~/.zallet/zallet.toml start
zallet -c ~/.zallet/zallet.toml rpc help
rpc help має перелічувати z_sendmany, z_getoperationstatus і z_getoperationresult. Прив’язуйте RPC лише до 127.0.0.1.
Список отримувачів
Один Unified Address на рядок, без лапок і порожніх рядків. Скрипт читає daoAddresses.md. У старому readme зазначено daoAddress.md. Цього файлу немає в репозиторії, а назви не збігаються.
Code-highlight
u1...
u1...
Надіслати одну пам’ятку
z_sendmany є асинхронним. Він повертає ідентифікатор операції. Опитуйте z_getoperationstatus, доки статус не стане success або не виникне помилка. Фіксована 5-секундна пауза, яку використовує скрипт, втрачає результат, якщо збірка триває довше. z_getoperationresult споживає операцію, тому не викликайте його, доки статус не стане остаточним.
Комісію пропущено. Zallet обчислює ZIP 317. Не передавайте число.
Code-highlight
MEMO_HEX=$(printf '%s' "$NOTE" | xxd -p -c 9999)
zallet -c ~/.zallet/zallet.toml rpc z_sendmany \
"$FROM_UA" \
"[{\"address\":\"$TO_UA\",\"amount\":0.0001,\"memo\":\"$MEMO_HEX\"}]"
Поле пам’ятки містить необроблений hex і має максимум 512 байтів. ascii2hex кодує лише ASCII. Нотатка з будь-яким не-ASCII символом завершується помилкою. xxd або python3 -c 'import sys; sys.stdout.write(sys.stdin.buffer.read().hex())' обробляє UTF-8.
Політика конфіденційності за замовчуванням має значення FullPrivacy. Це правильне значення за замовчуванням для екранованого отримувача. Не передавайте AllowFullyTransparent.
Дефекти скрипту
Вони присутні в дереві станом на 8 жовтня 2026 року. Не запускайте shieldNewsletter.sh, доки їх не буде виправлено.
- У
[[ bytesInFile -lt 512 ]] відсутній $. Гілка з однією пам’яткою ніколи не запускається.
- Цикл фрагментів зберігає hex, потім
hex2ascii декодує його, а потім txBuilderFromFile.sh кодує його знову. Останній фрагмент не скидається, якщо пізніший рядок не перевищує 512. Довгий рядок не розбивається. Він надсилається цілком і може перевищити 512-байтову пам’ятку.
txBuilderFromFile.sh викликає ./zallet rpc без шляху до конфігурації й очікує бінарний файл у поточному каталозі. Використовуйте zallet -c <config> rpc.
toCurl.sh взаємодіє з Zebra на порту 8232 за допомогою cookie та викликає getinfo і sendmany. Zallet не надає sendmany. Цикл очікування майнінгу також використовує [[ chainHeight -gt temp ]] без $, тому не очікує.
z_gettotalbalance 0 true передається як додаткові позиційні аргументи. Перед використанням цього виклику перевірте rpc help z_gettotalbalance у бінарному файлі, який ви запускаєте.
- Кожен фрагмент надсилає
0.0001 ZEC кожному отримувачу. Комісія ZIP 317 додається зверху. Довга нотатка для багатьох адрес витрачає більше, ніж суми пилу.
Після виправлення
Виправлений виконавець має:
- Зчитувати нотатку як байти та розбивати на межах 512 байтів, а не за рядками.
- Кодувати кожен фрагмент у hex один раз.
- Викликати
zallet -c <config> rpc z_sendmany із поповненим UA, масивом отримувачів і без аргументу комісії.
- Опитувати
z_getoperationstatus для цього ідентифікатора операції.
- Записувати txid лише після
success.
Стара сторінка посібника залишається за адресою Скрипти екранованого бюлетеня. Використовуйте цю сторінку для процедури.