Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

zcashd API migration guide

Route node, chain, mempool, and mining calls to Zebra; wallet calls to Zallet. Changing the RPC URL alone does not preserve parameters or responses.

The tables cover zcashd 6.20.0, Zebra 7.0.0, and Zallet 0.1.0-beta.3. Zallet’s reference follows development; the release-specific restrictions here take precedence. Its direct zebra backend is incompatible with Zebra 7.0.0; see backend requirements for the unaffected RPC-based zaino backend. For pool integrations, see the payout RPC compatibility table and tested sidecar procedure; ownership does not imply that an unmodified payout processor works with Zallet.

Where the boundary falls today

API requirementMigration target
Chain, network, mempool, miningZebra, with the differences below
Wallet keys, balances, transaction constructionZallet, with its altered RPC semantics
Existing wallet integration during migrationThe restricted zcashd-compat sidecar

How to read the table

Method

Method links point to the zcashd RPC reference. The inventory includes hidden and wallet-encryption methods omitted there.

Owner

OwnerMeaning
ZebraImplements the node-level method or the named replacement.
ZalletImplements the wallet method or records its disposition in the wallet method status.
—No implemented target RPC; Notes records proposals or non-RPC alternatives.

Rows name Zebra when wallet state is unnecessary, even if Zallet also serves the method (getrawtransaction, validateaddress, z_listunifiedreceivers, and z_converttex).

The sidecar is temporary, not an API owner. Its network and mempool methods describe its own state. Deprecation flags, index requirements, sync gates, and wallet restrictions still apply:

MarkerSidecar behavior
(none)No special registration marker; other sidecar restrictions still apply.
†Wallet transaction construction is subject to the shielded-pool restrictions.
*The sidecar does not register the method; calls return -32601.

Status

Status describes the named target, not the temporary sidecar.

StatusMeaning
DoneImplemented; responses need not be byte-identical.
PartialImplemented with restrictions or semantic differences in Notes.
StubReturns success without performing the operation.
ReplacedAn available replacement requires client changes.
PlannedRecorded implementation decision; not implemented.
DeferredWaits on the named work.
UnavailableNot implemented; no delivery commitment.
UndecidedDisposition remains open.
RetiredNot part of the target API.

Decisions and open questions

Node-method dispositions follow #11022. Issue #11033 tracks remaining shared-RPC differences.

RPC methods

Control

MethodOwnerStatusNotes
getexperimentalfeatures—Retired
getinfoZebraPartialNo timeoffset or wallet balances. The unset proxy field is omitted; paytxfee is always 0.
getmemoryinfo—Retired
helpZalletDoneZallet serves help for its own RPC; Zebra does not.
setlogfilter—ReplacedUse the tracing /filter endpoint; requires the filter-reload build feature.
stopZebraPartialRegtest on non-Windows targets only. Returns Zebra server stopping, not Zcash server stopping. #11033

Blockchain

MethodOwnerStatusNotes
getbestblockhashZebraDone
getblockZebraPartialNo authdataroot, chainhistoryroot, chainwork, or anchor. The verbosity argument is numeric, not boolean. Adds nTx and Ironwood tree data. Verbosity 3 adds transparent-input prevout data and non-coinbase fee where spent outputs are available.
getblockchaininfoZebraPartialNo initial_block_download_complete, softforks, or pruneheight. The chainwork value is numeric 0, not a hex string; commitments is 0, pruned is false, and headers equals the committed tip. #11033
getblockcountZebraDone
getblockdeltas—RetiredBuild explorer indexes on indexer gRPC.
getblockhashZebraDone
getblockhashes—RetiredBuild explorer indexes on indexer gRPC. #8436
getblockheaderZebraPartialOmits zcashd’s undocumented chainwork; adds blockcommitments.
getchaintips—PlannedTracked in #10666.
getdifficultyZebraPartialComputes the ratio from the high 128 bits of expanded targets. Returns an error when state cannot supply chain information, where zcashd can return 1.0 for an empty chain.
getmempoolinfoZebraPartialThe regtest-only key is spelled fully_notified; zcashd spells it fullyNotified.
getrawmempoolZebraPartialIn verbose output, modifiedfee equals fee; Zebra has no prioritisetransaction fee deltas.
getspentinfo—PlannedIntended to use Zebra’s indexer spending-transaction index.
gettxoutZebraPartialP2PK outputs do not receive the synthetic P2PKH address reported by zcashd; the script address list is empty.
gettxoutproof—PlannedDecision.
gettxoutsetinfo—RetiredBuild explorer indexes on indexer gRPC.
verifychain—Retired
verifytxoutproof—PlannedDecision.
z_getsubtreesbyindexZebraDoneAccepts sapling, orchard, and ironwood. During subtree-index rebuilding, a not-yet-rebuilt range can return an empty list.
z_gettreestateZebraPartialReturns finalRoot and finalState for available Sapling, Orchard, and Ironwood trees. Omits Sprout entirely and does not return skipHash. Ironwood appears from NU6.3. #11033

Address index

MethodOwnerStatusNotes
getaddressbalanceZebraDoneAccepts a single transparent address or an object containing addresses; no separate address-index flag is required.
getaddressdeltas—RetiredBuild explorer indexes on indexer gRPC. #8440
getaddressmempool—RetiredBuild explorer indexes on indexer gRPC.
getaddresstxidsZebraPartialAccepts a single address or an addresses object with optional inclusive start/end heights. Limits requests to 10,000 addresses and 100,000 matching transactions; narrow oversized ranges.
getaddressutxosZebraPartialSupports chainInfo and optional startHeight/maxEntries result limits. Limits requests to 10,000 addresses and results to 100,000 outputs.

Mining

MethodOwnerStatusNotes
getblocksubsidyZebraPartialReturns historical subsidies, including founders’ rewards before the first halving. After reserve-dependent reissuance begins, the preceding block must be available; arbitrary future subsidies cannot be forecast.
getblocktemplateZebra*DoneImplements long polling and proposal mode. Adds maxtime and submitold; advertises capabilities: ["proposal"] and mutable: ["time"].
getlocalsolps—Retired
getmininginfoZebraPartialNo errors, errorstimestamp, genproclimit, localsolps, pooledtx, or generate.
getnetworkhashpsZebraDoneDeprecated alias for getnetworksolps, in both zcashd and Zebra.
getnetworksolpsZebraDone
prioritisetransaction—PlannedDecision.
submitblockZebra*PartialReturns only null, duplicate, or rejected. zcashd also returns duplicate-invalid, duplicate-inconclusive, inconclusive, and the specific BIP-22 reject reason in place of a bare rejected.

Generating

MethodOwnerStatusNotes
generateZebra*PartialRequires a network with proof-of-work validation disabled, including Regtest. Pays the configured [mining] miner_address.
getgenerate—*RetiredControls zcashd’s built-in CPU miner. Mine with getblocktemplate and submitblock.
setgenerate—*RetiredControls zcashd’s built-in CPU miner. Mine with getblocktemplate and submitblock.

Network

MethodOwnerStatusNotes
addnodeZebra*PartialRegtest only, and only the add command. #10329
clearbanned—DeferredWaits on v2 P2P (#11281).
disconnectnode—DeferredWaits on v2 P2P (#11281).
getaddednodeinfo—DeferredWaits on v2 P2P (#11281).
getconnectioncountZebraReplacedUse connections from getnetworkinfo or getinfo.
getdeprecationinfoZebraPartialReturns end_of_service on Mainnet only. Omits version, subversion, deprecated_features, and disabled_features.
getnettotals—DeferredWaits on v2 P2P (#11281).
getnetworkinfoZebraPartialNo warningstimestamp. localaddresses and warnings are empty. #11030
getpeerinfoZebraPartialReturns addr, services, lastrecv, inbound, banscore, subver, version, startingheight, and the added connection_state; pingtime and pingwait are optional. Other zcashd per-peer fields are absent.
listbanned—DeferredWaits on v2 P2P (#11281).
pingZebraStubDoes not request a ping; peers use automatic heartbeats (#11028).
setban—DeferredWaits on v2 P2P (#11281).

Raw transactions

MethodOwnerStatusNotes
createrawtransactionZalletReplacedUse Zallet’s partially created Zcash transaction (PCZT) methods: pczt_create, pczt_prove, pczt_sign, and pczt_extract. #8952
decoderawtransactionZalletDone#8645
decodescriptZalletDone
fundrawtransactionZalletReplacedUse Zallet’s PCZT methods instead.
getrawtransactionZebraPartialUses numeric verbosity. Outputs expose valueZat, not valueSat, and omit spentTxId, spentIndex, and spentHeight. P2PK outputs have no synthetic address (#9671). Supports Ironwood transaction data.
sendrawtransactionZebraPartialallowhighfees is accepted and ignored.
signrawtransactionZalletReplacedUse Zallet’s PCZT methods instead.

Util

MethodOwnerStatusNotes
createmultisigZalletUnavailable
validateaddressZebraPartialNo scriptPubKey. Adds isscript.
verifymessageZalletDone#8947
z_validateaddressZebraPartialEmits address_type, not the deprecated type alias. Omits Sapling key details, rejects Sprout addresses, and reports ismine: false.

Wallet

Build Zallet with zcashd-import for its wallet-migration CLI. This also enables transparent-key-import; without it, the registered z_importaddress RPC returns an error.

MethodOwnerStatusNotes
addmultisigaddressZalletUnavailable
backupwallet—RetiredNo Zallet RPC equivalent; zallet backup is unreleased, not in beta.3.
dumpprivkey—RetiredNot planned by Zallet.
encryptwalletZalletReplacedKey material is always encrypted from wallet setup; use walletpassphrase/walletlock.
getbalanceZalletReplacedUse z_getbalanceforaccount instead.
getnewaddressZalletReplacedUse z_getnewaccount + z_getaddressforaccount.
getrawchangeaddress—RetiredNot needed: Zallet derives change addresses internally.
getreceivedbyaddressZalletUnavailable
gettransactionZalletReplacedUse z_viewtransaction instead.
getunconfirmedbalanceZalletUnavailable
getwalletinfoZalletPartialBalances and counters are placeholders; mnemonic_seedfp is "TODO" and mnemonic_seedfps is absent. Only unlocked_until is live. Use dedicated balance methods.
importaddressZalletReplacedUse zallet import-address for a bare address, public key, or redeem script. The z_importaddress RPC covers public keys and redeem scripts, not bare addresses.
importprivkeyZalletUnavailable
importpubkeyZalletReplacedUse z_importaddress.
importwalletZalletReplacedUse z_importkey per key, or zallet migrate-zcashd-wallet.
keypoolrefill—RetiredNot needed: Zallet has no key pool.
listaddressesZalletPartialAdds derived_transparent, expands watch-only coverage, and uses bech32m seed fingerprints. See altered semantics.
listaddressgroupings—RetiredNot planned by Zallet.
listlockunspentZalletUnavailable
listreceivedbyaddressZalletUnavailable
listsinceblockZalletUnavailable
listtransactionsZalletUnavailableUse z_listtransactions, optionally filtered by account.
listunspentZalletReplacedUse z_listunspent instead.
lockunspentZalletUnavailable
sendmanyZalletReplacedUse z_sendmany or z_sendfromaccount.
sendtoaddressZalletReplacedUse z_sendfromaccount; see z_sendmany for its restrictions.
settxfee—RetiredZallet uses ZIP 317 fees rather than a wallet-wide fixed fee.
signmessageZalletDoneSigns with an unlocked wallet’s transparent P2PKH key; ephemeral addresses are refused.
walletconfirmbackupZalletReplacedInternal to zcashd; use the zallet confirm-backup command.
walletlockZalletDone
walletpassphraseZalletDone
walletpassphrasechangeZalletUndecided
z_converttexZebraPartialConverts P2PKH to ZIP 320 TEX. Returns -5 for Sprout or unsupported unified receivers where zcashd returns -8.
z_exportkeyZalletPartialSapling extended spending keys only.
z_exportviewingkeyZalletPartialSupports Sapling and unified viewing keys, adds ivk, and rejects Sprout. See altered semantics.
z_exportwalletZalletUnavailableZallet plans a ZeWIF export workflow.
z_getaddressforaccountZalletPartialAccepts account UUIDs; derives time-based addresses when neither a transparent receiver nor an explicit index is requested. See response changes.
z_getbalanceZalletReplacedUse z_getbalanceforaccount instead.
z_getbalanceforaccountZalletDone
z_getbalanceforviewingkeyZalletReplacedImported viewing keys get accounts, so z_getbalanceforaccount covers them.
z_getmigrationstatus—RetiredZallet does not support Sprout migration.
z_getnewaccountZalletPartialRequires account_name; seedfp is required when the wallet contains multiple seeds.
z_getnewaddressZalletReplacedUse z_getnewaccount + z_getaddressforaccount.
z_getnotescountZalletDone
z_getoperationresultZalletDone
z_getoperationstatusZalletDone
z_gettotalbalanceZalletPartialDeprecated; include_watchonly = false is not honored. Prefer z_getbalanceforaccount.
z_importkeyZalletPartialSapling extended spending keys only.
z_importviewingkeyZalletPartialSapling extended full viewing keys only.
z_importwalletZalletReplacedUse z_importkey per key, or zallet migrate-zcashd-wallet.
z_listaccountsZalletPartialAdds UUIDs, names, seed fingerprints, and include_addresses. Omits account and diversifier_index when derivation is unknown. See response changes.
z_listaddressesZalletReplacedUse listaddresses instead.
z_listoperationidsZalletDone
z_listreceivedbyaddressZalletUnavailable
z_listunifiedreceiversZebraDone
z_listunspentZalletPartialIncludes transparent outputs; uses value, account_uuid, and is_watch_only instead of amount, account, and spendable. Ignores include_watchonly. See response changes.
z_mergetoaddressZallet†Unavailable
z_sendmanyZallet†PartialRequires a null or omitted fee; defaults to the ZIP 315 confirmation policy. Operation results add txids and broadcast. See altered semantics.
z_setmigration—RetiredZallet does not support Sprout migration.
z_shieldcoinbaseZallet†PartialAccepts one address or account UUID, not *; rejects non-null fees. Allows only AllowRevealedSenders or AllowLinkingAccountAddresses. Check the added broadcast result before assuming submission.
z_viewtransactionZalletPartialIncludes transparent activity, account effects, and additional top-level fields. See altered semantics.
zcbenchmark—Retired
zcsamplejoinsplit—RetiredSprout-only.

Disclosure

MethodOwnerStatusNotes
z_getpaymentdisclosure—RetiredSprout-only.
z_validatepaymentdisclosure—RetiredSprout-only. #8443

Hidden

MethodOwnerStatusNotes
dumpwallet—RetiredThe legacy handler returns Method not found and directs callers to z_exportwallet. Zallet records a planned ZeWIF export instead.
invalidateblockZebraPartialOnly removes blocks present in non-finalized state; it is not a general finalized-chain rollback mechanism.
reconsiderblockZebraPartialUses the cache of previously invalidated blocks and returns reconsidered hashes rather than null. #11033
resendwallettransactionsZalletUndecided
setmocktime—RetiredTest-only.

Zebra-only methods

MethodOwnerStatusNotes
getbestblockheightandhashZebraDoneTip height and hash in one call, so a caller cannot read a torn pair across two requests.
getstandardfeeZebraDoneReturns {standard_fee, version}: the next block’s marginal fee per logical action, in zatoshis. Version is 0; the fee is height-dependent (#11557).
generatetoaddressZebraDoneRequires proof-of-work validation to be disabled, including Regtest. Pays the supplied address instead of [mining] miner_address.
preciousblockZebraDoneReturns null; see the tip-selection rules below.
rpc.discoverZebraDoneOpenRPC schema for every Zebra RPC method.

preciousblock prefers a non-finalized chain tip only over competing tips with equal cumulative work; higher-work chains always take precedence. The last call for competing equal-work tips wins. Preferences are not persisted and are lost on restart. Finalized blocks and known non-tip blocks succeed without changing the preference; an unknown hash returns Block not found.

Notification transports

Zebra publishes zcashd-compatible ZMQ hashblock notifications when built with the optional zmq feature and configured with [notify] zmqpubhashblock, for example "tcp://127.0.0.1:28332". The publisher is off by default and has no authentication; expose it only to trusted clients. Like block notify, it is suppressed during initial sync. See ZMQ block notifications for framing and best-effort delivery semantics. The other ZMQ topics remain proposed in #11034 and #11036. Zebra’s indexer gRPC streams cover them but require client changes:

Set [rpc] indexer_listen_addr; the streams need no indexer build feature. Keep the unauthenticated, plaintext listener on loopback or a protected private network; JSON-RPC cookie authentication does not apply.

zcashd topicOwnerStatusAvailable alternative and limitation
zmqpubhashblockZebraDoneOptional zmq feature and [notify] zmqpubhashblock (#10881). Indexer ChainTipChange, block-notify, and mining long polling are alternatives.
zmqpubrawblockZebraReplacedIndexer NonFinalizedStateChange streams serialized non-finalized blocks, including forks; use GetBlock for a best-chain block by hash or height. This is not identical to a best-block ZMQ topic (#11034).
zmqpubhashtxZebraReplacedIndexer MempoolChange reports added, invalidated, and mined transaction IDs. Its events are not the complete zcashd ZMQ transaction contract (#11036).
zmqpubrawtxZebraReplacedCombine MempoolChange with getrawtransaction; a transaction removed before the lookup can be unavailable. The stream does not contain transaction bytes (#11036).

Streams can close when a consumer falls behind. Reconcile state through RPC after reconnecting rather than treating notifications as a durable event log. The non-finalized stream accepts known chain-tip hashes; an empty request streams the current non-finalized state before subsequent updates.

Other integration points

Integration pointOwnerStatusNotes
REST interface (-rest, /rest/*)—UndecidedUse JSON-RPC; REST disposition remains open in #11022.
-blocknotify hookZebraDoneSet [notify] block_notify_command; notifications run only near the tip and can coalesce intermediate changes. #10726
-txexpirynotify hook—UndecidedIndexer MempoolChange reports invalidation without an expiry reason. #11022
-walletnotify hookZalletUnavailableZallet beta.3 accepts [external] notify, and migrate-zcash-conf maps walletnotify to it, but startup warns that the hook is not implemented. See its release notes.
-alertnotify hook—RetiredNo Zebra alert-system hook.

Configuration mappings

Zebra reads TOML, not zcash.conf. These are behavioral mappings, not accepted aliases. See the configuration reference for defaults and environment-variable overrides.

zcashd settingZebra setting or migration action
confSelect Zebra’s TOML with zebrad -c zebrad.toml start.
datadirSet [state] cache_dir for Zebra’s own database. This does not import a zcashd directory.
testnet, regtestSet [network] network = "Testnet" or "Regtest".
bind, portSet one [network] listen_addr = "IP:port"; multiple zcashd binds are not a direct mapping.
externalipSet [network] external_addr to the advertised socket address.
addnode, seednodeUse [network] initial_mainnet_peers or initial_testnet_peers as discovery seeds, not a persistent-peer guarantee.
connect, discover, proxy and relay-policy controlsNo equivalent connect-only policy. Initial peers do not constrain later discovery; decisions remain in #11027.
server, rpcbind, rpcportSet [rpc] listen_addr; the listener is disabled when unset.
rpcuser, rpcpassword, rpcauthNo static-credential mapping. Use Zebra’s cookie authentication and an authenticated deployment boundary for remote access.
rpccookiefileSet [rpc] cookie_dir; the filename is .cookie, not configurable separately.
rpcallowipNo source-address allowlist setting. Bind to loopback or enforce access at the deployment boundary.
rpcthreadsNo equivalent thread-count control; [rpc] parallel_cpu_threads is deprecated and has no effect.
mineraddressSet [mining] miner_address on Zebra, not the sidecar.
blocknotifySet [notify] block_notify_command.
Wallet and ZMQ settings retained during migrationKeep them in the sidecar’s zcash.conf; Zebra does not translate or forward them.

When reusing sidecar data, preserve its transaction-index setting.