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

zcashd is retired. For every public API method it exposes, an operator migrating away from it needs one question answered: who owns this now?

This page is that record. For each of the 135 RPC methods zcashd 6.20.0 registers, plus its ZMQ topics, REST interface, and notification hooks, it names the component that owns the API method now, the method that replaces it, or the reason it was retired.

It is a statement of ownership, not a feature comparison. “Zebra owns getblockchaininfo” means Zebra is where that API method lives from now on; it does not promise byte-identical responses. Where Zebra diverges from zcashd, the Notes column says how.

This page describes Zebra 7.0.0-rc.0 and Zallet 0.1.0-beta.3. Zallet releases after 0.1.0-beta.3 read chain data only from Zebra; see Running Zallet with Zebra for what that requires of zebrad.

Where the boundary falls today

OutcomeMethodsShare
Available from Zebra3627%
Available from Zallet2720%
Replaced by another method2116%
Planned1813%
Deferred64%
Undecided21%
Retired2519%

84 of the 135 methods (62%) have a working path today: the method itself, or a replacement that does the same job.

How to read the table

Method

Links go to the zcashd RPC reference. Methods the generated reference omits are unlinked: the hidden methods, and the wallet-encryption methods, which zcashd only lists in help for an encrypted wallet.

Owner

Who owns the API method now that zcashd is gone.

OwnerMeaning
ZebraThe validator node. Node-level chain, network, mempool, and mining API methods.
ZalletThe zcashd wallet replacement. Anything that needs keys or wallet state. Per-method status follows Zallet’s changelog; its JSON-RPC method status page lags it for a few methods.
—No owner: the method is retired, or its disposition is still open.

Owner names the component that implements the API method. Zallet also serves a few node-level methods, such as getrawtransaction, validateaddress, and z_listunifiedreceivers; where Zebra implements the method too, the row says Zebra.

A marker on the owner records what the zcashd-compat sidecar does with the method during a migration. The sidecar is a temporary bridge, not an owner: an unmarked row buys migration time, it does not remove the need to move to the owner named in the column.

MarkerMeaning
(none)The sidecar serves it with stock zcashd semantics.
†The sidecar serves it but rejects some inputs — Ironwood always, and Orchard from NU6.3 on. See Wallet shielded-pool support.
*zcashd registers it, but the sidecar build does not. The miner RPCs and addnode are removed so a misconfigured miner or peer setup fails loudly.

Status

Whether the API method is available from the owner named in the previous column — not from zcashd.

StatusMeaning
DoneThe owner implements it and treats it as a supported API method.
PartialImplemented, but diverges from zcashd. The Notes column says how.
StubRegistered and returns success, but does nothing.
ReplacedThe owner provides a different method or mechanism for the same job; Notes names it.
PlannedThe owner has decided to provide it; not shipped yet.
DeferredOwner assigned; waits on other work named in Notes.
UndecidedWhether the owner will provide it is still open.
RetiredNot provided by anyone; it goes away with zcashd. Notes says why.

Note

The table might be outdated. If a method is listed as Planned, Deferred, or Undecided and you need it, check the owner’s current release before concluding it is unavailable.

Decisions and open questions

The dispositions of the zcashd node and utility methods Zebra does not implement are recorded in #11022. Where an older issue decided a row, the Notes column links it. Open questions are tracked in:

  • #11033: unresolved differences in methods Zebra does implement.
  • #11027: peer topology and relay-policy controls.
  • #11281: the v2 P2P protocol, which the deferred peer-control methods wait on.

Keeping this page current

Any PR that adds, removes, or intentionally changes a zcashd-compatible method, field, notification, or integration point updates this page in the same PR. Before each Zebra stable release, the page is checked against the owners’ current releases and the version line at the top is updated.

RPC methods

Control

MethodOwnerStatusNotes
getexperimentalfeatures—RetiredOut of scope for a validator node.
getinfoZebraPartialNo timeoffset. The wallet fields are zcashd-wallet-only and never apply.
getmemoryinfo—RetiredOut of scope for a validator node.
helpZalletDoneZallet serves help for its own RPC; Zebra does not.
setlogfilterZebraReplacedUse the tracing /filter endpoint (filter-reload build feature); see Tracing Zebra.
stopZebraPartialRegtest only. Returns Zebra server stopping, not zcashd’s Zcash server stopping. #11033

Blockchain

MethodOwnerStatusNotes
getbestblockhashZebraDone
getblockZebraPartialNo authdataroot, chainhistoryroot, chainwork, or anchor. The verbosity argument must be a number, where zcashd also accepts a bool. Adds nTx and an ironwood entry in trees. Also accepts verbosity 3, which zcashd rejects: it adds a prevout to each transparent input and a fee to each non-coinbase transaction.
getblockchaininfoZebraPartialNo initial_block_download_complete or softforks. Some fields are placeholders. #11033
getblockcountZebraDone
getblockdeltas—RetiredBlock-explorer index, out of scope for a validator node. Build on the indexer gRPC service instead.
getblockhashZebraDone
getblockhashes—RetiredBlock-explorer index, out of scope for a validator node. Build on the indexer gRPC service instead. #8436
getblockheaderZebraPartialNo chainwork, which is undocumented in zcashd. Adds blockcommitments.
getchaintipsZebraPlanned#10666
getdifficultyZebraPartialComputed from the high 128 bits of the expanded difficulty instead of zcashd’s f64 division; the two agree to f64 precision. Errors where zcashd returns 1.0 on a chain too short to measure.
getmempoolinfoZebraPartialThe regtest-only key is spelled fully_notified; zcashd spells it fullyNotified.
getrawmempoolZebraDone
getspentinfoZebraPlannedWill use the spending-transaction index from Zebra’s indexer build feature.
gettxoutZebraDone
gettxoutproofZebraPlannedDecision
gettxoutsetinfo—RetiredBlock-explorer index, out of scope for a validator node. Build on the indexer gRPC service instead.
verifychain—RetiredOut of scope for a validator node.
verifytxoutproofZebraPlannedDecision
z_getsubtreesbyindexZebraDone
z_gettreestateZebraPartialEach pool reports finalState only — no finalRoot or skipHash. sprout is omitted when empty, where zcashd always emits it. Adds ironwood. #11033

Address index

MethodOwnerStatusNotes
getaddressbalanceZebraDone
getaddressdeltas—RetiredBlock-explorer index, out of scope for a validator node. Build on the indexer gRPC service instead. #8440
getaddressmempool—RetiredBlock-explorer index, out of scope for a validator node. Build on the indexer gRPC service instead.
getaddresstxidsZebraDone
getaddressutxosZebraDone

Mining

MethodOwnerStatusNotes
getblocksubsidyZebraDone
getblocktemplateZebra*DoneSuperset: adds maxtime and submitold. capabilities and mutable match zcashd, and long polling and proposal mode are both implemented.
getlocalsolps—RetiredOut of scope for a validator node.
getmininginfoZebraPartialNo difficulty, errors, errorstimestamp, genproclimit, localsolps, pooledtx, or generate.
getnetworkhashpsZebraDoneDeprecated alias for getnetworksolps, in both zcashd and Zebra.
getnetworksolpsZebraDone
prioritisetransactionZebraPlannedDecision
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*DoneRegtest only, as in zcashd.
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
clearbannedZebraDeferredDeferred to the v2 P2P protocol (#11281).
disconnectnodeZebraDeferredDeferred to the v2 P2P protocol (#11281).
getaddednodeinfoZebraDeferredDeferred to the v2 P2P protocol (#11281).
getconnectioncountZebraReplacedUse connections from getnetworkinfo or getinfo.
getdeprecationinfoZebraPartialOnly end_of_service. No version, subversion, deprecated_features, or disabled_features.
getnettotalsZebraDeferredDeferred to the v2 P2P protocol (#11281).
getnetworkinfoZebraPartialNo warningstimestamp. localaddresses and warnings are empty. #11030
getpeerinfoZebraPartial10 of zcashd’s 24 per-peer fields; Zebra’s peer set does not track the rest. Adds connection_state.
listbannedZebraDeferredDeferred to the v2 P2P protocol (#11281).
pingZebraStubIntentional (#11028): Zebra already pings every peer about once a minute, so getpeerinfo’s pingtime and pingwait stay current without an explicit ping.
setbanZebraDeferredDeferred to the v2 P2P protocol (#11281).

Raw transactions

MethodOwnerStatusNotes
createrawtransactionZalletReplacedUse Zallet’s PCZT methods (pczt_create, pczt_prove, pczt_sign, pczt_extract) instead. #8952
decoderawtransactionZalletDoneNot implemented in Zebra. #8645
decodescriptZalletDone
fundrawtransactionZalletReplacedUse Zallet’s PCZT methods instead.
getrawtransactionZebraPartialvout omits valueSat, and the -spentindex fields (spentTxId, spentIndex, spentHeight) are absent. P2PK outputs have an empty addresses list (#9671). Adds ironwood.
sendrawtransactionZebraPartialallowhighfees is accepted and ignored.
signrawtransactionZalletReplacedUse Zallet’s PCZT methods instead.

Util

MethodOwnerStatusNotes
createmultisigZalletPlanned
validateaddressZebraPartialNo scriptPubKey. Adds isscript.
verifymessageZalletDoneNot implemented in Zebra. #8947
z_validateaddressZebraPartialEmits address_type but not zcashd’s deprecated type alias. No diversifier or diversifiedtransmissionkey (Sapling), or payingkey or transmissionkey (Sprout). ismine is always false.

Wallet

MethodOwnerStatusNotes
addmultisigaddressZalletPlanned
backupwallet—RetiredNot planned as a Zallet RPC; may become a Zallet CLI command.
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.
getreceivedbyaddressZalletPlanned
gettransactionZalletReplacedUse z_viewtransaction instead.
getunconfirmedbalanceZalletPlanned
getwalletinfoZalletPartialBalance fields are not populated. unlocked_until, mnemonic_seedfp, and mnemonic_seedfps are real; the remaining fields are placeholders.
importaddressZalletReplacedUse the zallet import-address CLI command, or z_importaddress.
importprivkeyZalletPlanned
importpubkeyZalletReplacedUse z_importaddress.
importwalletZalletReplacedUse z_importkey per key, or zallet migrate-zcashd-wallet.
keypoolrefill—RetiredNot needed: Zallet has no key pool.
listaddressesZalletDone
listaddressgroupings—RetiredNot planned by Zallet.
listlockunspentZalletPlanned
listreceivedbyaddressZalletPlanned
listsinceblockZalletPlanned
listtransactionsZalletPlannedAvailable today as the account-scoped z_listtransactions.
listunspentZalletReplacedUse z_listunspent instead.
lockunspentZalletPlanned
sendmanyZalletReplacedUse z_sendmany or z_sendfromaccount.
sendtoaddressZalletReplacedUse z_sendfromaccount; z_sendmany covers most uses too.
settxfee—RetiredNot needed: ZIP 317 fees are always used.
signmessageZalletDoneShipped in 0.1.0-beta.3; Zallet’s status page still lists it as not implemented.
walletconfirmbackupZalletReplacedInternal to zcashd; use the zallet confirm-backup command.
walletlockZalletDoneUnlocks and re-locks the key store.
walletpassphraseZalletDoneUnlocks and re-locks the key store.
walletpassphrasechangeZalletUndecided
z_converttexZebraDoneZallet implements it too.
z_exportkeyZalletDone
z_exportviewingkeyZalletDoneShipped in 0.1.0-beta.2; Zallet’s status page still lists it as not implemented.
z_exportwalletZalletPlannedPlanned as a ZeWIF export, likely a CLI command.
z_getaddressforaccountZalletDone
z_getbalanceZalletReplacedUse z_getbalanceforaccount instead.
z_getbalanceforaccountZalletDone
z_getbalanceforviewingkeyZalletReplacedImported viewing keys get accounts, so z_getbalanceforaccount covers them.
z_getmigrationstatus—RetiredSprout migration; Zallet does not support Sprout. May be revisited for a future pool migration.
z_getnewaccountZalletDone
z_getnewaddressZalletReplacedUse z_getnewaccount + z_getaddressforaccount.
z_getnotescountZalletDone
z_getoperationresultZalletDone
z_getoperationstatusZalletDone
z_gettotalbalanceZalletDoneDeprecated; include_watchonly = false is not honored yet. Prefer z_getbalanceforaccount.
z_importkeyZalletDoneSapling extended spending keys only.
z_importviewingkeyZalletDoneSapling extended full viewing keys only. Shipped in 0.1.0-beta.2; Zallet’s status page still lists it as not implemented.
z_importwalletZalletReplacedUse z_importkey per key, or zallet migrate-zcashd-wallet.
z_listaccountsZalletDone
z_listaddressesZalletReplacedUse listaddresses instead.
z_listoperationidsZalletDone
z_listreceivedbyaddressZalletPlanned
z_listunifiedreceiversZebraDoneZallet implements it too.
z_listunspentZalletDone
z_mergetoaddressZallet†Planned
z_sendmanyZallet†Done
z_setmigration—RetiredSprout migration; Zallet does not support Sprout. May be revisited for a future pool migration.
z_shieldcoinbaseZallet†Done
z_viewtransactionZalletDone
zcbenchmark—RetiredOut of scope for a validator node.
zcsamplejoinsplit—RetiredSprout-only.

Disclosure

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

Hidden

MethodOwnerStatusNotes
dumpwallet—RetiredAlready removed from zcashd. Zallet plans a ZeWIF export (z_exportwallet) instead.
invalidateblockZebraDone
reconsiderblockZebraPartialReturns the reconsidered block hashes; zcashd returns null. #11033
resendwallettransactionsZalletUndecided
setmocktime—RetiredTest-only; out of scope for a validator node.

Zebra-only methods

API methods Zebra adds that zcashd never had. Listed so this page describes the whole RPC boundary, not only a zcashd subset. None of them exist in zcashd or the sidecar.

MethodOwnerStatusNotes
getbestblockheightandhashZebraDoneTip height and hash in one call, so a caller cannot read a torn pair across two requests.
getstandardfeeZebraDoneReturns {standard_fee, version}: the ZIP 317 marginal fee per logical action, in zatoshis, for the next block. The value depends on the next block’s height (#11557).
generatetoaddressZebraDoneRegtest only. Like generate, but pays the coinbase to a given address instead of the configured mining.miner_address, which lets one node fund several test wallets.
rpc.discoverZebraDoneOpenRPC schema for every Zebra RPC method.

Notification transports

zcashd publishes chain and mempool events over ZMQ. Zebra does not implement ZMQ today; publishing the zcashd topics is proposed in #10881, #11034, and #11036.

Zebra’s equivalent is the indexer gRPC service (zebra-rpc/proto/indexer.proto). It streams best-chain tip changes (ChainTipChange), non-finalized blocks (NonFinalizedStateChange), and mempool additions, invalidations, and mined transactions (MempoolChange), and serves single blocks (GetBlock). Enable it by setting indexer_listen_addr in the [rpc] section of zebrad.toml. It has no authentication, so bind it to a loopback or private address. Zallet uses this service; see Running Zallet with Zebra.

zcashd topicOwnerStatusNotes
zmqpubhashblockZebraReplacedIndexer ChainTipChange stream (hash and height), or block_notify_command. ZMQ publishing is proposed in #10881.
zmqpubrawblockZebraReplacedIndexer NonFinalizedStateChange stream. #11034
zmqpubhashtxZebraReplacedIndexer MempoolChange stream. #11036
zmqpubrawtxZebraReplacedIndexer MempoolChange stream plus getrawtransaction. #11036

Other integration points

Integration pointOwnerStatusNotes
REST interface (-rest, /rest/*)—UndecidedJSON-RPC is the supported HTTP interface. #11022
-blocknotify hookZebraDoneblock_notify_command in the [notify] section of zebrad.toml; %s is replaced by the new tip’s hash. Runs only once the node is close to the network tip. #10726
-txexpirynotify hook—UndecidedNo hook. The indexer MempoolChange stream reports expired transactions as invalidated, without distinguishing expiry from other removals.
-walletnotify hookZalletDonenotify in the [external] section of Zallet’s config; %s is replaced by the transaction ID. zallet migrate-zcash-conf maps walletnotify to it.
-alertnotify hook—RetiredThe Zcash alert system is retired; zcashd no longer sends alerts.