zecd — Сервер кошелька с приоритетом shielded
zecd — это сервер кошелька с приоритетом shielded для Zcash, построенный на librustzcash и предоставляющий интерфейс через диалект JSON-RPC Bitcoin Core. Он даёт разработчикам и интеграторам платёжных решений знакомый, совместимый с Bitcoin API для работы с Zcash — при этом Orchard (самый приватный пул) используется по умолчанию. Разрабатываемый zec.rocks, zecd предназначен для замены функциональности кошелька zcashd в современных cloud-native развёртываниях.
Текущая версия: 0.5.0-rc3 (13 июля 2026) — с поддержкой Ironwood (NU6.3). Установите через cargo install zecd или используйте официальный Docker-образ.
Кратко
- zecd — это демон кошелька (сервер), а не полный узел. Он управляет ключами, сканированием, proving и RPC, не используя P2P-протокол Zcash.
- Он использует диалект JSON-RPC Bitcoin Core: те же имена методов, структура полей, аутентификация и коды ошибок — многие Bitcoin RPC-клиенты работают с Zcash сразу из коробки.
- Адреса Orchard (shielded) используются по умолчанию; поддержка transparent (t-address) и Sapling требует явного включения для каждого кошелька.
- Он подключается к самостоятельно размещённому полному узлу Zebra через локальный JSON-RPC —
lightwalletd не нужен.
- По своей архитектуре stateless: весь кошелёк можно восстановить только по seed-фразе, поэтому каталог данных можно считать одноразовым.
- Это не полная замена zcashd: реализуется только подмножество методов RPC Zcash, с преднамеренными отличиями в дизайне ради приватности и безопасности.
- Комиссии следуют ZIP-317 (детерминированный расчёт комиссии); комиссии, заданные пользователем, отклоняются.
- Поддерживает shielded memo (ZIP-302) через привычный интерфейс Bitcoin RPC.
Какую проблему решает zecd?
zcashd был исходным узлом и кошельком Zcash в одном — форком кодовой базы Bitcoin на C++ в 2016 году. Со временем это создало проблемы: код сложно сопровождать, кошелёк жёстко связан с узлом, а transparent-адреса представлены как равноправный вариант наряду с shielded.
zecd отделяет ответственность кошелька от консенсуса. Это выделенный слой кошелька, который находится между приложениями и полным узлом Zebra, предоставляя:
- Чистую, современную реализацию на Rust, построенную на librustzcash (той же библиотеке, на которой работают Zodl и Zingo)
- Архитектуру с приватностью по умолчанию (адреса Orchard, если не настроено иначе)
- Совместимый с Bitcoin интерфейс RPC, устраняющий необходимость изучать специфические инструменты Zcash
- Stateless-архитектуру, восстанавливаемую по seed-фразе и подходящую для контейнеризированных и облачных развёртываний
Архитектура
zecd работает по трёхуровневой модели:
Code-highlight
Your app / Bitcoin RPC client
↓ JSON-RPC
zecd
(keys, scanning, proving, RPC)
↓ JSON-RPC (local only)
Zebra
(full node — consensus, mempool, chain data)
zecd взаимодействует с Zebra исключительно через локальный JSON-RPC — без peer-to-peer-сети, без сторонних индексаторов, без lightwalletd. Подключение к Zebra намеренно ограничено локальным доступом: zecd откажется отправлять учётные данные на глобально маршрутизируемый хост, если только это явно не настроено для защищённого внеполосного туннеля (например, WireGuard или SSH).
Ключевые возможности
Shielded-first, Orchard по умолчанию
zecd использует Unified Address Orchard как тип адреса по умолчанию. Для пулов Sapling и transparent (t-address) требуется явная настройка для каждого кошелька. Такая архитектура снижает риск случайных transparent-отправок — распространённой ошибки, вредящей приватности, в старых инструментах Zcash.
Политика приватности настраивается для каждого вызова или глобально в [spend] privacy_policy:
| Политика | Поведение |
|---|
AllowRevealedRecipients (по умолчанию) | Разрешает отправки transparent-получателям; раскрывает сумму и получателя в блокчейне |
AllowRevealedAmounts | Разрешает межпуловые отправки (Sapling↔Orchard), но отклоняет transparent-получателей |
FullPrivacy | Только полностью shielded-отправки внутри одного пула; отклоняет transparent-получателей и межпуловые отправки |
AllowFullyTransparent | Также разрешает отправки t→t, финансируемые из transparent UTXO |
Совместимость с Bitcoin Core RPC
zecd реализует диалект JSON-RPC Bitcoin Core с соответствием в следующих аспектах:
- Имена методов (например,
getblockchaininfo, getbalance, getnewaddress, listtransactions, sendtoaddress, sendmany)
- Имена и типы полей в ответах
- Структура обёртки JSON-RPC 1.0
- Basic auth, записи
rpcauth и аутентификация через cookie-файл
- Коды ошибок и сопоставление со статусами HTTP (HTTP 500 с телом ошибки, семантика 401)
Это означает, что многие существующие Bitcoin-библиотеки для платежей, интеграции бирж и инструменты мониторинга могут работать с Zcash через zecd с минимальными изменениями кода или вообще без них.
Набор тестов на соответствие (140+ проверок) запускается для каждого PR на живом демоне regtest, а также был проверен на публичном testnet.
Shielded memo (ZIP-302)
zecd предоставляет функцию shielded memo в Zcash через привычный интерфейс Bitcoin RPC — то, чего нет в стандартных инструментах Bitcoin:
sendtoaddress принимает необязательный hex memo как дополнительный завершающий параметр (до 512 байт; отклоняется для transparent-получателей)
- Записи истории транзакций из
listtransactions и gettransaction включают поля memo (hex) и memoStr (декодированный текст), когда выход содержит memo
- Поддерживаются отправки с нулевой суммой shielded-получателю для сценариев использования только memo (паттерн
z_sendmany "memo-only-send")
Это делает zecd подходящим для приложений, которым нужны приватные сообщения в блокчейне наряду с платежами.
Stateless по дизайну
zecd сохраняет никакого off-chain-состояния, которое нельзя было бы восстановить только по seed-фразе. База данных кошелька (data.sqlite) полностью выводима из seed-фразы — shielded-средства восстанавливаются безусловно; transparent-средства восстанавливаются в пределах настроенного gap limit.
Чтобы восстановить кошелёк из seed-фразы:
Code-highlight
zecd init --restore --birthday <block-height>
Это делает каталог данных одноразовым: контейнер без постоянного тома, заново создаваемый из seed при каждом запуске, не теряет ничего критически важного. Операторы сами отвечают за отслеживание адресов, которые они выдают — zecd запоминает адреса только после того, как они получили средства в блокчейне.
Метки намеренно отсутствуют. Поскольку у меток нет источника в блокчейне и их нельзя восстановить по seed-фразе, zecd просто не поддерживает их. Вызов методов меток возвращает ошибку method-not-found (-32601).
Без зависимости от lightwalletd
zecd получает compact blocks, состояние дерева и видимость mempool напрямую из JSON-RPC Zebra. Нет lightwalletd, который нужно запускать и сопровождать, — это снижает операционную сложность для самостоятельно размещённых развёртываний.
Cloud-native и контейнеризированные развёртывания
Stateless-архитектура zecd спроектирована для сред Docker и Kubernetes:
- Полный стек Docker Compose (
zebra → zecd) доступен в репозитории
- Health endpoint на порту
9233 с настраиваемыми readiness probes (synced или connected)
- Опция структурированного JSON-логирования для конвейеров агрегации логов
- Детерминированные комиссии ZIP-317 — без fee oracle и ручной настройки комиссии
bootstrap_from_keys (включён по умолчанию): пустой каталог данных рядом с keys.toml автоматически пересобирает кошелёк при запуске — развёртывание выполняется монтированием одного Secret и запуском с пустым PVC
Модели хранения ключей
zecd поддерживает три модели хранения ключей, подходящие для разных требований к развёртыванию и безопасности:
1. Незашифрованная (по умолчанию — авторазблокировка)
Мнемоническая seed-фраза в keys.toml оборачивается в файл age identity (identity.txt). При значении по умолчанию auto_unlock = true seed-фраза расшифровывается в память при запуске, поэтому отправки выполняются без участия оператора и вызов walletpassphrase не требуется.
Лучше всего подходит для: автоматизированных платёжных процессоров, hot wallet бирж, сред разработки.
Code-highlight
zecd init --datadir ./data --wallet default --account-name primary
Храните identity.txt вне каталога данных в mainnet — любой, кто прочитает оба файла, получит право тратить средства.
2. Зашифрованная (защищённая парольной фразой)
Мнемоническая фраза оборачивается парольной фразой (age scrypt) вместо файла identity. Кошелёк запускается заблокированным; walletpassphrase "<pass>" <timeout> разблокирует его на указанное время и автоматически снова блокирует по истечении тайм-аута — как у зашифрованного кошелька Bitcoin Core.
Лучше всего подходит для: hot wallet, где не требуется возможность тратить средства без участия оператора; интерактивных рабочих процессов операторов.
Code-highlight
zecd init --datadir ./data --encrypt
# later: walletpassphrase "my-passphrase" 300
3. Watch-only (UFVK — без ключа траты)
Инициализируется с Unified Full Viewing Key (UFVK), экспортированным из другого кошелька. Может принимать средства, сканировать и отображать балансы — но не может подписывать транзакции. Идеально подходит для мониторинга, выставления счетов или аудиторских узлов, отделённых от кошелька с правом подписи.
Code-highlight
# On the signing wallet's host:
zecd export-ufvk
# On the watch-only host:
zecd init --datadir ./data-watch --ufvk "uview1..." --birthday <height>
Резервное копирование и восстановление
Средства можно восстановить только по мнемонической фразе. Всё остальное — кэш.
| Артефакт | Расположение | Что защищает | Делать резервную копию? |
|---|
| Мнемоническая фраза из 24 слов | Показывается один раз при zecd init | Средства — потеря = безвозвратная потеря | Да — офлайн (бумага/HSM) |
keys.toml | <wallet dir>/keys.toml | Зашифрованный seed + birthday + сеть | Да — как Secret |
identity.txt | [keys] age_identity | Расшифровывает keys.toml (право траты) | Да — отдельно от keys.toml |
| Высота birthday | Внутри keys.toml | Ускоряет восстановление (любая высота до первой транзакции) | Запишите вместе с мнемонической фразой |
data.sqlite | <wallet dir>/data.sqlite | Кэш кошелька — пересоздаётся из seed при восстановлении | Нет — одноразовый |
blocks/ |
Каталог данных должен быть локальным для хоста. Блокировка одиночного экземпляра zecd (<datadir>/.lock) — это рекомендательная блокировка ОС; она не распространяется между хостами. Никогда не делите один каталог данных с доступом на чтение-запись между машинами (NFS, Kubernetes ReadWriteMany) — два экземпляра zecd повредят БД кошелька. В Kubernetes используйте тома ReadWriteOnce.
Safelist методов RPC
Для развёртываний, где утечка учётных данных была бы катастрофической, zecd поддерживает ограничение RPC-интерфейса выбранным подмножеством методов:
Code-highlight
[rpc]
allowed_methods = ["getblockchaininfo", "getbalance", "getnewaddress", "listtransactions"]
Любой метод, отсутствующий в списке, возвращает -32601 (HTTP 404) — это неотличимо от метода, которого вообще не существует, поэтому жёстко ограниченный сервер ничего не раскрывает о том, что именно было отключено. Сервис выставления счетов, работающий только на приём, может отключить sendtoaddress, sendmany и stop, чтобы минимизировать радиус поражения при компрометации клиента.
Ключевые отличия от Bitcoin Core RPC
Разработчики, переходящие с Bitcoin или инструментов zcashd, должны учитывать эти преднамеренные различия:
| Поведение | Bitcoin Core | zecd |
|---|
| Формат адреса | 1... / bc1... | u1... (Unified Address Orchard) — не распознаётся как Bitcoin-адрес клиентами, парсящими строки |
| Метки | Полноценное хранилище меток | Не реализовано — setlabel, listlabels и т. д. возвращают -32601 |
| Комиссии | Настраиваются пользователем; рынок комиссий | Только детерминированные ZIP-317; settxfee, fee_rate, subtractfeefromamount отклоняются с -8 |
| Memo | Не поддерживаются | sendtoaddress принимает hex memo; история содержит поля memo + memoStr |
| Подтверждения для траты | 1 | 3 (собственная сдача) / 10 (сторонние средства) — настраивается через trusted_confirmations / untrusted_confirmations |
listsinceblock при reorg |
Быстрый старт
Требования: Zebra запущен локально с rpc.listen_addr = 127.0.0.1:18234 (testnet).
Установка из crates.io (0.4.3+):
Code-highlight
cargo install zecd
Или сборка из исходников:
Code-highlight
git clone https://github.com/zecrocks/zecd && cd zecd
cargo build --release
Code-highlight
# 1. Initialize a testnet wallet (generates a 24-word mnemonic and an account)
zecd --datadir ./data --testnet init --wallet default --account-name primary
# 2. Start the daemon (syncs in background, serves JSON-RPC on port 18232)
zecd --datadir ./data --testnet \
--rpcuser zec --rpcpassword secret --rpcbind 127.0.0.1 --rpcport 18232
Взаимодействие через curl:
Code-highlight
curl -s --user zec:secret --data-binary \
'{"jsonrpc":"1.0","id":"1","method":"getblockchaininfo","params":[]}' \
-H 'content-type: text/plain;' http://127.0.0.1:18232/
Взаимодействие через Python (с использованием Bitcoin RPC-библиотеки):
Code-highlight
from bitcoinrpc.authproxy import AuthServiceProxy
rpc = AuthServiceProxy("http://zec:secret@127.0.0.1:18232")
print(rpc.getblockchaininfo())
addr = rpc.getnewaddress() # returns a u1... Orchard Unified Address
print(rpc.getbalance())
print(rpc.listtransactions("*", 20))
# Send with a shielded memo
rpc.sendtoaddress(addr, 0.001, "", "", False, "48656c6c6f205a6563617368") # hex memo
Восстановление из seed-фразы:
Code-highlight
zecd --datadir ./data init --restore --birthday 2500000
# paste your 24-word mnemonic when prompted
Порты по умолчанию
| Сеть | zecd RPC | Zebra RPC (backend) | Health |
|---|
| Mainnet | 8232 | 8234 | 9233 |
| Testnet | 18232 | 18234 | 9233 |
zecd vs. zcashd vs. Zaino
| zcashd | Zaino | zecd |
|---|
| Роль | Полный узел + кошелёк | Индексатор (заменяет lightwalletd) | Только сервер кошелька |
| Язык | C++ | Rust | Rust |
| Статус | Устаревает | Активен | Активен (v0.5.0-rc3, июль 2026) |
| Пул по умолчанию | Transparent | N/A | Orchard (shielded) |
| Диалект RPC | Специфичный для zcashd | gRPC (lightwalletd) | Bitcoin Core JSON-RPC |
| Требуется полный узел | Да (собственный) | Zebra или zcashd | Zebra |
| Stateless-восстановление | Нет | N/A | Да (только по seed-фразе) |
| Shielded memo | Да (z_sendmany) | N/A | Да (через интерфейс Bitcoin RPC) |
|
Связанные страницы
- Полный узел Zebra — полный узел, к которому подключается zecd
- Индексатор Zaino — альтернативный подход с индексатором (заменяет lightwalletd)
- Узел Zakura — ещё одна реализация полного узла (форк Zebra)
- Viewing Keys — как zecd сканирует цепочку с помощью ключей просмотра аккаунта
- Кошельки — обзор экосистемы кошельков
Ресурсы