Защищённая рассылка
Отправляйте заметку в формате 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.
Страница старого руководства остаётся по адресу Скрипты Shielded Newsletter. Для процедуры используйте эту страницу.