From 1bb21f90ca292f360e64f093e51d1d5a0a4e2bf1 Mon Sep 17 00:00:00 2001 From: Pacu Date: Sat, 11 Jul 2026 12:04:32 -0300 Subject: [PATCH 1/6] Add lightwallet protocol Python bindings Add the lightwallet-protocol proto definitions and generated Python gRPC stubs used by future gRPC parity tests. Include the grpcio/protobuf dependencies and a helper script for regenerating the stubs. Co-Authored-By: OpenAI Codex --- CHANGELOG.md | 171 ++++ LICENSE | 21 + pyproject.toml | 2 + qa/rpc-tests/test_framework/proto/__init__.py | 3 + .../proto/compact_formats_pb2.py | 51 + .../proto/compact_formats_pb2.pyi | 99 ++ .../proto/compact_formats_pb2_grpc.py | 25 + .../test_framework/proto/service_pb2.py | 85 ++ .../test_framework/proto/service_pb2.pyi | 235 +++++ .../test_framework/proto/service_pb2_grpc.py | 963 ++++++++++++++++++ scripts/generate_proto.sh | 42 + uv.lock | 49 + walletrpc/compact_formats.proto | 125 +++ walletrpc/service.proto | 303 ++++++ 14 files changed, 2174 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 qa/rpc-tests/test_framework/proto/__init__.py create mode 100644 qa/rpc-tests/test_framework/proto/compact_formats_pb2.py create mode 100644 qa/rpc-tests/test_framework/proto/compact_formats_pb2.pyi create mode 100644 qa/rpc-tests/test_framework/proto/compact_formats_pb2_grpc.py create mode 100644 qa/rpc-tests/test_framework/proto/service_pb2.py create mode 100644 qa/rpc-tests/test_framework/proto/service_pb2.pyi create mode 100644 qa/rpc-tests/test_framework/proto/service_pb2_grpc.py create mode 100755 scripts/generate_proto.sh create mode 100644 walletrpc/compact_formats.proto create mode 100644 walletrpc/service.proto diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..59a13060f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,171 @@ +# Changelog +All notable changes to this library will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this library adheres to Rust's notion of +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +## [v0.4.0] - 2025-12-03 + +### Added +- `compact_formats.CompactTxIn` +- `compact_formats.TxOut` +- `service.PoolType` +- `service.LightdInfo` has added fields `upgradeName`, `upgradeHeight`, and + `lightwalletProtocolVersion` +- `compact_formats.CompactTx` has added fields `vin` and `vout`, + which may be used to represent transparent transaction input and output data. +- `service.BlockRange` has added field `poolTypes`, which allows + the caller of service methods that take this type as input to cause returned + data to be filtered to include information only for the specified protocols. + For backwards compatibility, when this field is set the default (empty) value, + servers should return Sapling and Orchard data. This field is to be ignored + when the type is used as part of a `service.TransparentAddressBlockFilter`. + +### Changed +- The `hash` field of `compact_formats.CompactTx` has been renamed to `txid`. + This is a serialization-compatible clarification, as the index of this field + in the .proto type does not change. +- `service.Exclude` has been renamed to `service.GetMempoolTxRequest` and has + an added `poolTypes` field, which allows the caller of this method to specify + which pools the resulting `CompactTx` values should contain data for. + +### Deprecated +- `service.CompactTxStreamer`: + - The `GetBlockNullifiers` and `GetBlockRangeNullifiers` methods are + deprecated. + +## [v0.3.6] - 2025-05-20 + +### Added +- `service.LightdInfo` has added field `donationAddress` +- `service.CompactTxStreamer.GetTaddressTransactions`. This duplicates + the `GetTaddressTxids` method, but is more accurately named. + +### Deprecated +- `service.CompactTxStreamer.GetTaddressTxids`. Use `GetTaddressTransactions` + instead. + +## [v0.3.5] - 2023-07-03 + +### Added +- `compact_formats.ChainMetadata` +- `service.ShieldedProtocol` +- `service.GetSubtreeRootsArg` +- `service.SubtreeRoot` +- `service.CompactTxStreamer.GetBlockNullifiers` +- `service.CompactTxStreamer.GetBlockRangeNullifiers` +- `service.CompactTxStreamer.SubtreeRoots` + +### Changed +- `compact_formats.CompactBlock` has added field `chainMetadata` +- `compact_formats.CompactSaplingOutput.epk` has been renamed to `ephemeralKey` + +## [v0.3.4] - UNKNOWN + +### Added +- `service.CompactTxStreamer.GetLatestTreeState` + +## [v0.3.3] - 2022-04-02 + +### Added +- `service.TreeState` has added field `orchardTree` + +### Changed +- `service.TreeState.tree` has been renamed to `saplingTree` + +## [v0.3.2] - 2021-12-09 + +### Changed +- `compact_formats.CompactOrchardAction.encCiphertext` has been renamed to + `CompactOrchardAction.ciphertext` + +## [v0.3.1] - 2021-12-09 + +### Added +- `compact_formats.CompactOrchardAction` +- `service.CompactTxStreamer.GetMempoolTx` (removed in 0.3.0) has been reintroduced. +- `service.Exclude` (removed in 0.3.0) has been reintroduced. + +### Changed +- `compact_formats.CompactSpend` has been renamed `CompactSaplingSpend` +- `compact_formats.CompactOutput` has been renamed `CompactSaplingOutput` + +## [v0.3.0] - 2021-07-23 + +### Added +- `service.CompactTxStreamer.GetMempoolStream` + +### Removed +- `service.CompactTxStreamer.GetMempoolTx` has been replaced by `GetMempoolStream` +- `service.Exclude` has been removed as it is now unused. + +## [v0.2.4] - 2021-01-14 + +### Changed +- `service.GetAddressUtxosArg.address` has been replaced by the + repeated field `addresses`. This is a [conditionally-safe](https://protobuf.dev/programming-guides/proto3/#conditionally-safe-changes) + format change. +- `service.GetAddressUtxosReply` has added field `address` + +## [v0.2.3] - 2021-01-14 + +### Added +- `service.LightdInfo` has added fields: + - `estimatedHeight` + - `zcashdBuild` + - `zcashdSubversion` + +## [v0.2.2] - 2020-10-22 + +### Added +- `service.TreeState` +- `service.GetAddressUtxosArg` +- `service.GetAddressUtxosReply` +- `service.GetAddressUtxosReplyList` +- `service.CompactTxStreamer.GetTreeState` +- `service.CompactTxStreamer.GetAddressUtxos` +- `service.CompactTxStreamer.GetAddressUtxosStream` + +## [v0.2.1] - 2020-10-06 + +### Added +- `service.Address` +- `service.AddressList` +- `service.Balance` +- `service.Exclude` +- `service.CompactTxStreamer.GetTaddressBalance` +- `service.CompactTxStreamer.GetTaddressBalanceStream` +- `service.CompactTxStreamer.GetMempoolTx` +- `service.LightdInfo` has added fields: + - `gitCommit` + - `branch` + - `buildDate` + - `buildUser` + +## [v0.2.0] - 2020-04-24 + +### Added +- `service.Duration` +- `service.PingResponse` +- `service.CompactTxStreamer.Ping` + +### Removed +- `service.TransparentAddress` was removed (it was unused in any service API). + +## [v0.1.1] - 2019-11-27 + +### Added +- `service.Empty` +- `service.LightdInfo` +- `service.TransparentAddress` +- `service.TransparentAddressBlockFilter` +- `service.CompactTxStreamer.GetTaddressTxids` +- `service.CompactTxStreamer.GetLightdInfo` +- `service.RawTransaction` has added field `height` + +## [v0.1.0] - 2019-09-19 + +Initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..a8b65b3ce --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Electric Coin Company + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pyproject.toml b/pyproject.toml index f27d8466f..05fc1c56f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,6 +5,8 @@ requires-python = "==3.11.*" dependencies = [ "base58", "embit>=0.8.0", + "grpcio>=1.80.0", + "protobuf>=6.31.1", "pyzmq", "toml", ] diff --git a/qa/rpc-tests/test_framework/proto/__init__.py b/qa/rpc-tests/test_framework/proto/__init__.py new file mode 100644 index 000000000..1faef238a --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/__init__.py @@ -0,0 +1,3 @@ +# Generated Python gRPC stubs for the Zcash lightwallet protocol. +# Proto source: lightwallet-protocol/ (git subtree of zcash/lightwallet-protocol) +# Regenerate with: scripts/generate_proto.sh diff --git a/qa/rpc-tests/test_framework/proto/compact_formats_pb2.py b/qa/rpc-tests/test_framework/proto/compact_formats_pb2.py new file mode 100644 index 000000000..01ccd66d9 --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/compact_formats_pb2.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: compact_formats.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'compact_formats.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x63ompact_formats.proto\x12\x15\x63\x61sh.z.wallet.sdk.rpc\"U\n\rChainMetadata\x12!\n\x19saplingCommitmentTreeSize\x18\x01 \x01(\r\x12!\n\x19orchardCommitmentTreeSize\x18\x02 \x01(\r\"\xde\x01\n\x0c\x43ompactBlock\x12\x14\n\x0cprotoVersion\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\x0c\x12\x10\n\x08prevHash\x18\x04 \x01(\x0c\x12\x0c\n\x04time\x18\x05 \x01(\r\x12\x0e\n\x06header\x18\x06 \x01(\x0c\x12-\n\x03vtx\x18\x07 \x03(\x0b\x32 .cash.z.wallet.sdk.rpc.CompactTx\x12;\n\rchainMetadata\x18\x08 \x01(\x0b\x32$.cash.z.wallet.sdk.rpc.ChainMetadata\"\xca\x02\n\tCompactTx\x12\r\n\x05index\x18\x01 \x01(\x04\x12\x0c\n\x04txid\x18\x02 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\r\x12:\n\x06spends\x18\x04 \x03(\x0b\x32*.cash.z.wallet.sdk.rpc.CompactSaplingSpend\x12<\n\x07outputs\x18\x05 \x03(\x0b\x32+.cash.z.wallet.sdk.rpc.CompactSaplingOutput\x12<\n\x07\x61\x63tions\x18\x06 \x03(\x0b\x32+.cash.z.wallet.sdk.rpc.CompactOrchardAction\x12/\n\x03vin\x18\x07 \x03(\x0b\x32\".cash.z.wallet.sdk.rpc.CompactTxIn\x12*\n\x04vout\x18\x08 \x03(\x0b\x32\x1c.cash.z.wallet.sdk.rpc.TxOut\"8\n\x0b\x43ompactTxIn\x12\x13\n\x0bprevoutTxid\x18\x01 \x01(\x0c\x12\x14\n\x0cprevoutIndex\x18\x02 \x01(\r\",\n\x05TxOut\x12\r\n\x05value\x18\x01 \x01(\x04\x12\x14\n\x0cscriptPubKey\x18\x02 \x01(\x0c\"!\n\x13\x43ompactSaplingSpend\x12\n\n\x02nf\x18\x01 \x01(\x0c\"M\n\x14\x43ompactSaplingOutput\x12\x0b\n\x03\x63mu\x18\x01 \x01(\x0c\x12\x14\n\x0c\x65phemeralKey\x18\x02 \x01(\x0c\x12\x12\n\nciphertext\x18\x03 \x01(\x0c\"`\n\x14\x43ompactOrchardAction\x12\x11\n\tnullifier\x18\x01 \x01(\x0c\x12\x0b\n\x03\x63mx\x18\x02 \x01(\x0c\x12\x14\n\x0c\x65phemeralKey\x18\x03 \x01(\x0c\x12\x12\n\nciphertext\x18\x04 \x01(\x0c\x42\x1bZ\x16lightwalletd/walletrpc\xba\x02\x00\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'compact_formats_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z\026lightwalletd/walletrpc\272\002\000' + _globals['_CHAINMETADATA']._serialized_start=48 + _globals['_CHAINMETADATA']._serialized_end=133 + _globals['_COMPACTBLOCK']._serialized_start=136 + _globals['_COMPACTBLOCK']._serialized_end=358 + _globals['_COMPACTTX']._serialized_start=361 + _globals['_COMPACTTX']._serialized_end=691 + _globals['_COMPACTTXIN']._serialized_start=693 + _globals['_COMPACTTXIN']._serialized_end=749 + _globals['_TXOUT']._serialized_start=751 + _globals['_TXOUT']._serialized_end=795 + _globals['_COMPACTSAPLINGSPEND']._serialized_start=797 + _globals['_COMPACTSAPLINGSPEND']._serialized_end=830 + _globals['_COMPACTSAPLINGOUTPUT']._serialized_start=832 + _globals['_COMPACTSAPLINGOUTPUT']._serialized_end=909 + _globals['_COMPACTORCHARDACTION']._serialized_start=911 + _globals['_COMPACTORCHARDACTION']._serialized_end=1007 +# @@protoc_insertion_point(module_scope) diff --git a/qa/rpc-tests/test_framework/proto/compact_formats_pb2.pyi b/qa/rpc-tests/test_framework/proto/compact_formats_pb2.pyi new file mode 100644 index 000000000..6947fb09c --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/compact_formats_pb2.pyi @@ -0,0 +1,99 @@ +from google.protobuf.internal import containers as _containers +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class ChainMetadata(_message.Message): + __slots__ = ("saplingCommitmentTreeSize", "orchardCommitmentTreeSize") + SAPLINGCOMMITMENTTREESIZE_FIELD_NUMBER: _ClassVar[int] + ORCHARDCOMMITMENTTREESIZE_FIELD_NUMBER: _ClassVar[int] + saplingCommitmentTreeSize: int + orchardCommitmentTreeSize: int + def __init__(self, saplingCommitmentTreeSize: _Optional[int] = ..., orchardCommitmentTreeSize: _Optional[int] = ...) -> None: ... + +class CompactBlock(_message.Message): + __slots__ = ("protoVersion", "height", "hash", "prevHash", "time", "header", "vtx", "chainMetadata") + PROTOVERSION_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + HASH_FIELD_NUMBER: _ClassVar[int] + PREVHASH_FIELD_NUMBER: _ClassVar[int] + TIME_FIELD_NUMBER: _ClassVar[int] + HEADER_FIELD_NUMBER: _ClassVar[int] + VTX_FIELD_NUMBER: _ClassVar[int] + CHAINMETADATA_FIELD_NUMBER: _ClassVar[int] + protoVersion: int + height: int + hash: bytes + prevHash: bytes + time: int + header: bytes + vtx: _containers.RepeatedCompositeFieldContainer[CompactTx] + chainMetadata: ChainMetadata + def __init__(self, protoVersion: _Optional[int] = ..., height: _Optional[int] = ..., hash: _Optional[bytes] = ..., prevHash: _Optional[bytes] = ..., time: _Optional[int] = ..., header: _Optional[bytes] = ..., vtx: _Optional[_Iterable[_Union[CompactTx, _Mapping]]] = ..., chainMetadata: _Optional[_Union[ChainMetadata, _Mapping]] = ...) -> None: ... + +class CompactTx(_message.Message): + __slots__ = ("index", "txid", "fee", "spends", "outputs", "actions", "vin", "vout") + INDEX_FIELD_NUMBER: _ClassVar[int] + TXID_FIELD_NUMBER: _ClassVar[int] + FEE_FIELD_NUMBER: _ClassVar[int] + SPENDS_FIELD_NUMBER: _ClassVar[int] + OUTPUTS_FIELD_NUMBER: _ClassVar[int] + ACTIONS_FIELD_NUMBER: _ClassVar[int] + VIN_FIELD_NUMBER: _ClassVar[int] + VOUT_FIELD_NUMBER: _ClassVar[int] + index: int + txid: bytes + fee: int + spends: _containers.RepeatedCompositeFieldContainer[CompactSaplingSpend] + outputs: _containers.RepeatedCompositeFieldContainer[CompactSaplingOutput] + actions: _containers.RepeatedCompositeFieldContainer[CompactOrchardAction] + vin: _containers.RepeatedCompositeFieldContainer[CompactTxIn] + vout: _containers.RepeatedCompositeFieldContainer[TxOut] + def __init__(self, index: _Optional[int] = ..., txid: _Optional[bytes] = ..., fee: _Optional[int] = ..., spends: _Optional[_Iterable[_Union[CompactSaplingSpend, _Mapping]]] = ..., outputs: _Optional[_Iterable[_Union[CompactSaplingOutput, _Mapping]]] = ..., actions: _Optional[_Iterable[_Union[CompactOrchardAction, _Mapping]]] = ..., vin: _Optional[_Iterable[_Union[CompactTxIn, _Mapping]]] = ..., vout: _Optional[_Iterable[_Union[TxOut, _Mapping]]] = ...) -> None: ... + +class CompactTxIn(_message.Message): + __slots__ = ("prevoutTxid", "prevoutIndex") + PREVOUTTXID_FIELD_NUMBER: _ClassVar[int] + PREVOUTINDEX_FIELD_NUMBER: _ClassVar[int] + prevoutTxid: bytes + prevoutIndex: int + def __init__(self, prevoutTxid: _Optional[bytes] = ..., prevoutIndex: _Optional[int] = ...) -> None: ... + +class TxOut(_message.Message): + __slots__ = ("value", "scriptPubKey") + VALUE_FIELD_NUMBER: _ClassVar[int] + SCRIPTPUBKEY_FIELD_NUMBER: _ClassVar[int] + value: int + scriptPubKey: bytes + def __init__(self, value: _Optional[int] = ..., scriptPubKey: _Optional[bytes] = ...) -> None: ... + +class CompactSaplingSpend(_message.Message): + __slots__ = ("nf",) + NF_FIELD_NUMBER: _ClassVar[int] + nf: bytes + def __init__(self, nf: _Optional[bytes] = ...) -> None: ... + +class CompactSaplingOutput(_message.Message): + __slots__ = ("cmu", "ephemeralKey", "ciphertext") + CMU_FIELD_NUMBER: _ClassVar[int] + EPHEMERALKEY_FIELD_NUMBER: _ClassVar[int] + CIPHERTEXT_FIELD_NUMBER: _ClassVar[int] + cmu: bytes + ephemeralKey: bytes + ciphertext: bytes + def __init__(self, cmu: _Optional[bytes] = ..., ephemeralKey: _Optional[bytes] = ..., ciphertext: _Optional[bytes] = ...) -> None: ... + +class CompactOrchardAction(_message.Message): + __slots__ = ("nullifier", "cmx", "ephemeralKey", "ciphertext") + NULLIFIER_FIELD_NUMBER: _ClassVar[int] + CMX_FIELD_NUMBER: _ClassVar[int] + EPHEMERALKEY_FIELD_NUMBER: _ClassVar[int] + CIPHERTEXT_FIELD_NUMBER: _ClassVar[int] + nullifier: bytes + cmx: bytes + ephemeralKey: bytes + ciphertext: bytes + def __init__(self, nullifier: _Optional[bytes] = ..., cmx: _Optional[bytes] = ..., ephemeralKey: _Optional[bytes] = ..., ciphertext: _Optional[bytes] = ...) -> None: ... diff --git a/qa/rpc-tests/test_framework/proto/compact_formats_pb2_grpc.py b/qa/rpc-tests/test_framework/proto/compact_formats_pb2_grpc.py new file mode 100644 index 000000000..24f667a0d --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/compact_formats_pb2_grpc.py @@ -0,0 +1,25 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +warnings + + +GRPC_GENERATED_VERSION = '1.80.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in compact_formats_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/qa/rpc-tests/test_framework/proto/service_pb2.py b/qa/rpc-tests/test_framework/proto/service_pb2.py new file mode 100644 index 000000000..e81d92085 --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/service_pb2.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import compact_formats_pb2 as compact__formats__pb2 +compact__formats__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rservice.proto\x12\x15\x63\x61sh.z.wallet.sdk.rpc\x1a\x15\x63ompact_formats.proto\"\'\n\x07\x42lockID\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12\x0c\n\x04hash\x18\x02 \x01(\x0c\"\x9c\x01\n\nBlockRange\x12-\n\x05start\x18\x01 \x01(\x0b\x32\x1e.cash.z.wallet.sdk.rpc.BlockID\x12+\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x1e.cash.z.wallet.sdk.rpc.BlockID\x12\x32\n\tpoolTypes\x18\x03 \x03(\x0e\x32\x1f.cash.z.wallet.sdk.rpc.PoolType\"V\n\x08TxFilter\x12-\n\x05\x62lock\x18\x01 \x01(\x0b\x32\x1e.cash.z.wallet.sdk.rpc.BlockID\x12\r\n\x05index\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\x0c\".\n\x0eRawTransaction\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x0e\n\x06height\x18\x02 \x01(\x04\"7\n\x0cSendResponse\x12\x11\n\terrorCode\x18\x01 \x01(\x05\x12\x14\n\x0c\x65rrorMessage\x18\x02 \x01(\t\"\x0b\n\tChainSpec\"\x07\n\x05\x45mpty\"\xa1\x03\n\nLightdInfo\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x14\n\x0ctaddrSupport\x18\x03 \x01(\x08\x12\x11\n\tchainName\x18\x04 \x01(\t\x12\x1f\n\x17saplingActivationHeight\x18\x05 \x01(\x04\x12\x19\n\x11\x63onsensusBranchId\x18\x06 \x01(\t\x12\x13\n\x0b\x62lockHeight\x18\x07 \x01(\x04\x12\x11\n\tgitCommit\x18\x08 \x01(\t\x12\x0e\n\x06\x62ranch\x18\t \x01(\t\x12\x11\n\tbuildDate\x18\n \x01(\t\x12\x11\n\tbuildUser\x18\x0b \x01(\t\x12\x17\n\x0f\x65stimatedHeight\x18\x0c \x01(\x04\x12\x13\n\x0bzcashdBuild\x18\r \x01(\t\x12\x18\n\x10zcashdSubversion\x18\x0e \x01(\t\x12\x17\n\x0f\x64onationAddress\x18\x0f \x01(\t\x12\x13\n\x0bupgradeName\x18\x10 \x01(\t\x12\x15\n\rupgradeHeight\x18\x11 \x01(\x04\x12\"\n\x1alightwalletProtocolVersion\x18\x12 \x01(\t\"b\n\x1dTransparentAddressBlockFilter\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x30\n\x05range\x18\x02 \x01(\x0b\x32!.cash.z.wallet.sdk.rpc.BlockRange\"\x1e\n\x08\x44uration\x12\x12\n\nintervalUs\x18\x01 \x01(\x03\"+\n\x0cPingResponse\x12\r\n\x05\x65ntry\x18\x01 \x01(\x03\x12\x0c\n\x04\x65xit\x18\x02 \x01(\x03\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\" \n\x0b\x41\x64\x64ressList\x12\x11\n\taddresses\x18\x01 \x03(\t\"\x1b\n\x07\x42\x61lance\x12\x10\n\x08valueZat\x18\x01 \x01(\x03\"n\n\x13GetMempoolTxRequest\x12\x1d\n\x15\x65xclude_txid_suffixes\x18\x01 \x03(\x0c\x12\x32\n\tpoolTypes\x18\x03 \x03(\x0e\x32\x1f.cash.z.wallet.sdk.rpc.PoolTypeJ\x04\x08\x02\x10\x03\"r\n\tTreeState\x12\x0f\n\x07network\x18\x01 \x01(\t\x12\x0e\n\x06height\x18\x02 \x01(\x04\x12\x0c\n\x04hash\x18\x03 \x01(\t\x12\x0c\n\x04time\x18\x04 \x01(\r\x12\x13\n\x0bsaplingTree\x18\x05 \x01(\t\x12\x13\n\x0borchardTree\x18\x06 \x01(\t\"\x7f\n\x12GetSubtreeRootsArg\x12\x12\n\nstartIndex\x18\x01 \x01(\r\x12\x41\n\x10shieldedProtocol\x18\x02 \x01(\x0e\x32\'.cash.z.wallet.sdk.rpc.ShieldedProtocol\x12\x12\n\nmaxEntries\x18\x03 \x01(\r\"[\n\x0bSubtreeRoot\x12\x10\n\x08rootHash\x18\x02 \x01(\x0c\x12\x1b\n\x13\x63ompletingBlockHash\x18\x03 \x01(\x0c\x12\x1d\n\x15\x63ompletingBlockHeight\x18\x04 \x01(\x04\"P\n\x12GetAddressUtxosArg\x12\x11\n\taddresses\x18\x01 \x03(\t\x12\x13\n\x0bstartHeight\x18\x02 \x01(\x04\x12\x12\n\nmaxEntries\x18\x03 \x01(\r\"v\n\x14GetAddressUtxosReply\x12\x0f\n\x07\x61\x64\x64ress\x18\x06 \x01(\t\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\x05\x12\x0e\n\x06script\x18\x03 \x01(\x0c\x12\x10\n\x08valueZat\x18\x04 \x01(\x03\x12\x0e\n\x06height\x18\x05 \x01(\x04\"]\n\x18GetAddressUtxosReplyList\x12\x41\n\x0c\x61\x64\x64ressUtxos\x18\x01 \x03(\x0b\x32+.cash.z.wallet.sdk.rpc.GetAddressUtxosReply*L\n\x08PoolType\x12\x15\n\x11POOL_TYPE_INVALID\x10\x00\x12\x0f\n\x0bTRANSPARENT\x10\x01\x12\x0b\n\x07SAPLING\x10\x02\x12\x0b\n\x07ORCHARD\x10\x03*,\n\x10ShieldedProtocol\x12\x0b\n\x07sapling\x10\x00\x12\x0b\n\x07orchard\x10\x01\x32\xa2\x0f\n\x11\x43ompactTxStreamer\x12T\n\x0eGetLatestBlock\x12 .cash.z.wallet.sdk.rpc.ChainSpec\x1a\x1e.cash.z.wallet.sdk.rpc.BlockID\"\x00\x12Q\n\x08GetBlock\x12\x1e.cash.z.wallet.sdk.rpc.BlockID\x1a#.cash.z.wallet.sdk.rpc.CompactBlock\"\x00\x12[\n\x12GetBlockNullifiers\x12\x1e.cash.z.wallet.sdk.rpc.BlockID\x1a#.cash.z.wallet.sdk.rpc.CompactBlock\"\x00\x12[\n\rGetBlockRange\x12!.cash.z.wallet.sdk.rpc.BlockRange\x1a#.cash.z.wallet.sdk.rpc.CompactBlock\"\x00\x30\x01\x12\x65\n\x17GetBlockRangeNullifiers\x12!.cash.z.wallet.sdk.rpc.BlockRange\x1a#.cash.z.wallet.sdk.rpc.CompactBlock\"\x00\x30\x01\x12Z\n\x0eGetTransaction\x12\x1f.cash.z.wallet.sdk.rpc.TxFilter\x1a%.cash.z.wallet.sdk.rpc.RawTransaction\"\x00\x12_\n\x0fSendTransaction\x12%.cash.z.wallet.sdk.rpc.RawTransaction\x1a#.cash.z.wallet.sdk.rpc.SendResponse\"\x00\x12s\n\x10GetTaddressTxids\x12\x34.cash.z.wallet.sdk.rpc.TransparentAddressBlockFilter\x1a%.cash.z.wallet.sdk.rpc.RawTransaction\"\x00\x30\x01\x12z\n\x17GetTaddressTransactions\x12\x34.cash.z.wallet.sdk.rpc.TransparentAddressBlockFilter\x1a%.cash.z.wallet.sdk.rpc.RawTransaction\"\x00\x30\x01\x12Z\n\x12GetTaddressBalance\x12\".cash.z.wallet.sdk.rpc.AddressList\x1a\x1e.cash.z.wallet.sdk.rpc.Balance\"\x00\x12^\n\x18GetTaddressBalanceStream\x12\x1e.cash.z.wallet.sdk.rpc.Address\x1a\x1e.cash.z.wallet.sdk.rpc.Balance\"\x00(\x01\x12`\n\x0cGetMempoolTx\x12*.cash.z.wallet.sdk.rpc.GetMempoolTxRequest\x1a .cash.z.wallet.sdk.rpc.CompactTx\"\x00\x30\x01\x12[\n\x10GetMempoolStream\x12\x1c.cash.z.wallet.sdk.rpc.Empty\x1a%.cash.z.wallet.sdk.rpc.RawTransaction\"\x00\x30\x01\x12R\n\x0cGetTreeState\x12\x1e.cash.z.wallet.sdk.rpc.BlockID\x1a .cash.z.wallet.sdk.rpc.TreeState\"\x00\x12V\n\x12GetLatestTreeState\x12\x1c.cash.z.wallet.sdk.rpc.Empty\x1a .cash.z.wallet.sdk.rpc.TreeState\"\x00\x12\x64\n\x0fGetSubtreeRoots\x12).cash.z.wallet.sdk.rpc.GetSubtreeRootsArg\x1a\".cash.z.wallet.sdk.rpc.SubtreeRoot\"\x00\x30\x01\x12o\n\x0fGetAddressUtxos\x12).cash.z.wallet.sdk.rpc.GetAddressUtxosArg\x1a/.cash.z.wallet.sdk.rpc.GetAddressUtxosReplyList\"\x00\x12s\n\x15GetAddressUtxosStream\x12).cash.z.wallet.sdk.rpc.GetAddressUtxosArg\x1a+.cash.z.wallet.sdk.rpc.GetAddressUtxosReply\"\x00\x30\x01\x12R\n\rGetLightdInfo\x12\x1c.cash.z.wallet.sdk.rpc.Empty\x1a!.cash.z.wallet.sdk.rpc.LightdInfo\"\x00\x12N\n\x04Ping\x12\x1f.cash.z.wallet.sdk.rpc.Duration\x1a#.cash.z.wallet.sdk.rpc.PingResponse\"\x00\x42\x1bZ\x16lightwalletd/walletrpc\xba\x02\x00\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'service_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z\026lightwalletd/walletrpc\272\002\000' + _globals['_POOLTYPE']._serialized_start=1913 + _globals['_POOLTYPE']._serialized_end=1989 + _globals['_SHIELDEDPROTOCOL']._serialized_start=1991 + _globals['_SHIELDEDPROTOCOL']._serialized_end=2035 + _globals['_BLOCKID']._serialized_start=63 + _globals['_BLOCKID']._serialized_end=102 + _globals['_BLOCKRANGE']._serialized_start=105 + _globals['_BLOCKRANGE']._serialized_end=261 + _globals['_TXFILTER']._serialized_start=263 + _globals['_TXFILTER']._serialized_end=349 + _globals['_RAWTRANSACTION']._serialized_start=351 + _globals['_RAWTRANSACTION']._serialized_end=397 + _globals['_SENDRESPONSE']._serialized_start=399 + _globals['_SENDRESPONSE']._serialized_end=454 + _globals['_CHAINSPEC']._serialized_start=456 + _globals['_CHAINSPEC']._serialized_end=467 + _globals['_EMPTY']._serialized_start=469 + _globals['_EMPTY']._serialized_end=476 + _globals['_LIGHTDINFO']._serialized_start=479 + _globals['_LIGHTDINFO']._serialized_end=896 + _globals['_TRANSPARENTADDRESSBLOCKFILTER']._serialized_start=898 + _globals['_TRANSPARENTADDRESSBLOCKFILTER']._serialized_end=996 + _globals['_DURATION']._serialized_start=998 + _globals['_DURATION']._serialized_end=1028 + _globals['_PINGRESPONSE']._serialized_start=1030 + _globals['_PINGRESPONSE']._serialized_end=1073 + _globals['_ADDRESS']._serialized_start=1075 + _globals['_ADDRESS']._serialized_end=1101 + _globals['_ADDRESSLIST']._serialized_start=1103 + _globals['_ADDRESSLIST']._serialized_end=1135 + _globals['_BALANCE']._serialized_start=1137 + _globals['_BALANCE']._serialized_end=1164 + _globals['_GETMEMPOOLTXREQUEST']._serialized_start=1166 + _globals['_GETMEMPOOLTXREQUEST']._serialized_end=1276 + _globals['_TREESTATE']._serialized_start=1278 + _globals['_TREESTATE']._serialized_end=1392 + _globals['_GETSUBTREEROOTSARG']._serialized_start=1394 + _globals['_GETSUBTREEROOTSARG']._serialized_end=1521 + _globals['_SUBTREEROOT']._serialized_start=1523 + _globals['_SUBTREEROOT']._serialized_end=1614 + _globals['_GETADDRESSUTXOSARG']._serialized_start=1616 + _globals['_GETADDRESSUTXOSARG']._serialized_end=1696 + _globals['_GETADDRESSUTXOSREPLY']._serialized_start=1698 + _globals['_GETADDRESSUTXOSREPLY']._serialized_end=1816 + _globals['_GETADDRESSUTXOSREPLYLIST']._serialized_start=1818 + _globals['_GETADDRESSUTXOSREPLYLIST']._serialized_end=1911 + _globals['_COMPACTTXSTREAMER']._serialized_start=2038 + _globals['_COMPACTTXSTREAMER']._serialized_end=3992 +# @@protoc_insertion_point(module_scope) diff --git a/qa/rpc-tests/test_framework/proto/service_pb2.pyi b/qa/rpc-tests/test_framework/proto/service_pb2.pyi new file mode 100644 index 000000000..3eabec0c2 --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/service_pb2.pyi @@ -0,0 +1,235 @@ +from . import compact_formats_pb2 as _compact_formats_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class PoolType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + POOL_TYPE_INVALID: _ClassVar[PoolType] + TRANSPARENT: _ClassVar[PoolType] + SAPLING: _ClassVar[PoolType] + ORCHARD: _ClassVar[PoolType] + +class ShieldedProtocol(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + sapling: _ClassVar[ShieldedProtocol] + orchard: _ClassVar[ShieldedProtocol] +POOL_TYPE_INVALID: PoolType +TRANSPARENT: PoolType +SAPLING: PoolType +ORCHARD: PoolType +sapling: ShieldedProtocol +orchard: ShieldedProtocol + +class BlockID(_message.Message): + __slots__ = ("height", "hash") + HEIGHT_FIELD_NUMBER: _ClassVar[int] + HASH_FIELD_NUMBER: _ClassVar[int] + height: int + hash: bytes + def __init__(self, height: _Optional[int] = ..., hash: _Optional[bytes] = ...) -> None: ... + +class BlockRange(_message.Message): + __slots__ = ("start", "end", "poolTypes") + START_FIELD_NUMBER: _ClassVar[int] + END_FIELD_NUMBER: _ClassVar[int] + POOLTYPES_FIELD_NUMBER: _ClassVar[int] + start: BlockID + end: BlockID + poolTypes: _containers.RepeatedScalarFieldContainer[PoolType] + def __init__(self, start: _Optional[_Union[BlockID, _Mapping]] = ..., end: _Optional[_Union[BlockID, _Mapping]] = ..., poolTypes: _Optional[_Iterable[_Union[PoolType, str]]] = ...) -> None: ... + +class TxFilter(_message.Message): + __slots__ = ("block", "index", "hash") + BLOCK_FIELD_NUMBER: _ClassVar[int] + INDEX_FIELD_NUMBER: _ClassVar[int] + HASH_FIELD_NUMBER: _ClassVar[int] + block: BlockID + index: int + hash: bytes + def __init__(self, block: _Optional[_Union[BlockID, _Mapping]] = ..., index: _Optional[int] = ..., hash: _Optional[bytes] = ...) -> None: ... + +class RawTransaction(_message.Message): + __slots__ = ("data", "height") + DATA_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + data: bytes + height: int + def __init__(self, data: _Optional[bytes] = ..., height: _Optional[int] = ...) -> None: ... + +class SendResponse(_message.Message): + __slots__ = ("errorCode", "errorMessage") + ERRORCODE_FIELD_NUMBER: _ClassVar[int] + ERRORMESSAGE_FIELD_NUMBER: _ClassVar[int] + errorCode: int + errorMessage: str + def __init__(self, errorCode: _Optional[int] = ..., errorMessage: _Optional[str] = ...) -> None: ... + +class ChainSpec(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class Empty(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class LightdInfo(_message.Message): + __slots__ = ("version", "vendor", "taddrSupport", "chainName", "saplingActivationHeight", "consensusBranchId", "blockHeight", "gitCommit", "branch", "buildDate", "buildUser", "estimatedHeight", "zcashdBuild", "zcashdSubversion", "donationAddress", "upgradeName", "upgradeHeight", "lightwalletProtocolVersion") + VERSION_FIELD_NUMBER: _ClassVar[int] + VENDOR_FIELD_NUMBER: _ClassVar[int] + TADDRSUPPORT_FIELD_NUMBER: _ClassVar[int] + CHAINNAME_FIELD_NUMBER: _ClassVar[int] + SAPLINGACTIVATIONHEIGHT_FIELD_NUMBER: _ClassVar[int] + CONSENSUSBRANCHID_FIELD_NUMBER: _ClassVar[int] + BLOCKHEIGHT_FIELD_NUMBER: _ClassVar[int] + GITCOMMIT_FIELD_NUMBER: _ClassVar[int] + BRANCH_FIELD_NUMBER: _ClassVar[int] + BUILDDATE_FIELD_NUMBER: _ClassVar[int] + BUILDUSER_FIELD_NUMBER: _ClassVar[int] + ESTIMATEDHEIGHT_FIELD_NUMBER: _ClassVar[int] + ZCASHDBUILD_FIELD_NUMBER: _ClassVar[int] + ZCASHDSUBVERSION_FIELD_NUMBER: _ClassVar[int] + DONATIONADDRESS_FIELD_NUMBER: _ClassVar[int] + UPGRADENAME_FIELD_NUMBER: _ClassVar[int] + UPGRADEHEIGHT_FIELD_NUMBER: _ClassVar[int] + LIGHTWALLETPROTOCOLVERSION_FIELD_NUMBER: _ClassVar[int] + version: str + vendor: str + taddrSupport: bool + chainName: str + saplingActivationHeight: int + consensusBranchId: str + blockHeight: int + gitCommit: str + branch: str + buildDate: str + buildUser: str + estimatedHeight: int + zcashdBuild: str + zcashdSubversion: str + donationAddress: str + upgradeName: str + upgradeHeight: int + lightwalletProtocolVersion: str + def __init__(self, version: _Optional[str] = ..., vendor: _Optional[str] = ..., taddrSupport: bool = ..., chainName: _Optional[str] = ..., saplingActivationHeight: _Optional[int] = ..., consensusBranchId: _Optional[str] = ..., blockHeight: _Optional[int] = ..., gitCommit: _Optional[str] = ..., branch: _Optional[str] = ..., buildDate: _Optional[str] = ..., buildUser: _Optional[str] = ..., estimatedHeight: _Optional[int] = ..., zcashdBuild: _Optional[str] = ..., zcashdSubversion: _Optional[str] = ..., donationAddress: _Optional[str] = ..., upgradeName: _Optional[str] = ..., upgradeHeight: _Optional[int] = ..., lightwalletProtocolVersion: _Optional[str] = ...) -> None: ... + +class TransparentAddressBlockFilter(_message.Message): + __slots__ = ("address", "range") + ADDRESS_FIELD_NUMBER: _ClassVar[int] + RANGE_FIELD_NUMBER: _ClassVar[int] + address: str + range: BlockRange + def __init__(self, address: _Optional[str] = ..., range: _Optional[_Union[BlockRange, _Mapping]] = ...) -> None: ... + +class Duration(_message.Message): + __slots__ = ("intervalUs",) + INTERVALUS_FIELD_NUMBER: _ClassVar[int] + intervalUs: int + def __init__(self, intervalUs: _Optional[int] = ...) -> None: ... + +class PingResponse(_message.Message): + __slots__ = ("entry", "exit") + ENTRY_FIELD_NUMBER: _ClassVar[int] + EXIT_FIELD_NUMBER: _ClassVar[int] + entry: int + exit: int + def __init__(self, entry: _Optional[int] = ..., exit: _Optional[int] = ...) -> None: ... + +class Address(_message.Message): + __slots__ = ("address",) + ADDRESS_FIELD_NUMBER: _ClassVar[int] + address: str + def __init__(self, address: _Optional[str] = ...) -> None: ... + +class AddressList(_message.Message): + __slots__ = ("addresses",) + ADDRESSES_FIELD_NUMBER: _ClassVar[int] + addresses: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, addresses: _Optional[_Iterable[str]] = ...) -> None: ... + +class Balance(_message.Message): + __slots__ = ("valueZat",) + VALUEZAT_FIELD_NUMBER: _ClassVar[int] + valueZat: int + def __init__(self, valueZat: _Optional[int] = ...) -> None: ... + +class GetMempoolTxRequest(_message.Message): + __slots__ = ("exclude_txid_suffixes", "poolTypes") + EXCLUDE_TXID_SUFFIXES_FIELD_NUMBER: _ClassVar[int] + POOLTYPES_FIELD_NUMBER: _ClassVar[int] + exclude_txid_suffixes: _containers.RepeatedScalarFieldContainer[bytes] + poolTypes: _containers.RepeatedScalarFieldContainer[PoolType] + def __init__(self, exclude_txid_suffixes: _Optional[_Iterable[bytes]] = ..., poolTypes: _Optional[_Iterable[_Union[PoolType, str]]] = ...) -> None: ... + +class TreeState(_message.Message): + __slots__ = ("network", "height", "hash", "time", "saplingTree", "orchardTree") + NETWORK_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + HASH_FIELD_NUMBER: _ClassVar[int] + TIME_FIELD_NUMBER: _ClassVar[int] + SAPLINGTREE_FIELD_NUMBER: _ClassVar[int] + ORCHARDTREE_FIELD_NUMBER: _ClassVar[int] + network: str + height: int + hash: str + time: int + saplingTree: str + orchardTree: str + def __init__(self, network: _Optional[str] = ..., height: _Optional[int] = ..., hash: _Optional[str] = ..., time: _Optional[int] = ..., saplingTree: _Optional[str] = ..., orchardTree: _Optional[str] = ...) -> None: ... + +class GetSubtreeRootsArg(_message.Message): + __slots__ = ("startIndex", "shieldedProtocol", "maxEntries") + STARTINDEX_FIELD_NUMBER: _ClassVar[int] + SHIELDEDPROTOCOL_FIELD_NUMBER: _ClassVar[int] + MAXENTRIES_FIELD_NUMBER: _ClassVar[int] + startIndex: int + shieldedProtocol: ShieldedProtocol + maxEntries: int + def __init__(self, startIndex: _Optional[int] = ..., shieldedProtocol: _Optional[_Union[ShieldedProtocol, str]] = ..., maxEntries: _Optional[int] = ...) -> None: ... + +class SubtreeRoot(_message.Message): + __slots__ = ("rootHash", "completingBlockHash", "completingBlockHeight") + ROOTHASH_FIELD_NUMBER: _ClassVar[int] + COMPLETINGBLOCKHASH_FIELD_NUMBER: _ClassVar[int] + COMPLETINGBLOCKHEIGHT_FIELD_NUMBER: _ClassVar[int] + rootHash: bytes + completingBlockHash: bytes + completingBlockHeight: int + def __init__(self, rootHash: _Optional[bytes] = ..., completingBlockHash: _Optional[bytes] = ..., completingBlockHeight: _Optional[int] = ...) -> None: ... + +class GetAddressUtxosArg(_message.Message): + __slots__ = ("addresses", "startHeight", "maxEntries") + ADDRESSES_FIELD_NUMBER: _ClassVar[int] + STARTHEIGHT_FIELD_NUMBER: _ClassVar[int] + MAXENTRIES_FIELD_NUMBER: _ClassVar[int] + addresses: _containers.RepeatedScalarFieldContainer[str] + startHeight: int + maxEntries: int + def __init__(self, addresses: _Optional[_Iterable[str]] = ..., startHeight: _Optional[int] = ..., maxEntries: _Optional[int] = ...) -> None: ... + +class GetAddressUtxosReply(_message.Message): + __slots__ = ("address", "txid", "index", "script", "valueZat", "height") + ADDRESS_FIELD_NUMBER: _ClassVar[int] + TXID_FIELD_NUMBER: _ClassVar[int] + INDEX_FIELD_NUMBER: _ClassVar[int] + SCRIPT_FIELD_NUMBER: _ClassVar[int] + VALUEZAT_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + address: str + txid: bytes + index: int + script: bytes + valueZat: int + height: int + def __init__(self, address: _Optional[str] = ..., txid: _Optional[bytes] = ..., index: _Optional[int] = ..., script: _Optional[bytes] = ..., valueZat: _Optional[int] = ..., height: _Optional[int] = ...) -> None: ... + +class GetAddressUtxosReplyList(_message.Message): + __slots__ = ("addressUtxos",) + ADDRESSUTXOS_FIELD_NUMBER: _ClassVar[int] + addressUtxos: _containers.RepeatedCompositeFieldContainer[GetAddressUtxosReply] + def __init__(self, addressUtxos: _Optional[_Iterable[_Union[GetAddressUtxosReply, _Mapping]]] = ...) -> None: ... diff --git a/qa/rpc-tests/test_framework/proto/service_pb2_grpc.py b/qa/rpc-tests/test_framework/proto/service_pb2_grpc.py new file mode 100644 index 000000000..3cdbd319c --- /dev/null +++ b/qa/rpc-tests/test_framework/proto/service_pb2_grpc.py @@ -0,0 +1,963 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings +warnings + +from . import compact_formats_pb2 as compact__formats__pb2 +from . import service_pb2 as service__pb2 + +GRPC_GENERATED_VERSION = '1.80.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in service_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class CompactTxStreamerStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetLatestBlock = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLatestBlock', + request_serializer=service__pb2.ChainSpec.SerializeToString, + response_deserializer=service__pb2.BlockID.FromString, + _registered_method=True) + self.GetBlock = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlock', + request_serializer=service__pb2.BlockID.SerializeToString, + response_deserializer=compact__formats__pb2.CompactBlock.FromString, + _registered_method=True) + self.GetBlockNullifiers = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockNullifiers', + request_serializer=service__pb2.BlockID.SerializeToString, + response_deserializer=compact__formats__pb2.CompactBlock.FromString, + _registered_method=True) + self.GetBlockRange = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockRange', + request_serializer=service__pb2.BlockRange.SerializeToString, + response_deserializer=compact__formats__pb2.CompactBlock.FromString, + _registered_method=True) + self.GetBlockRangeNullifiers = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockRangeNullifiers', + request_serializer=service__pb2.BlockRange.SerializeToString, + response_deserializer=compact__formats__pb2.CompactBlock.FromString, + _registered_method=True) + self.GetTransaction = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTransaction', + request_serializer=service__pb2.TxFilter.SerializeToString, + response_deserializer=service__pb2.RawTransaction.FromString, + _registered_method=True) + self.SendTransaction = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/SendTransaction', + request_serializer=service__pb2.RawTransaction.SerializeToString, + response_deserializer=service__pb2.SendResponse.FromString, + _registered_method=True) + self.GetTaddressTxids = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressTxids', + request_serializer=service__pb2.TransparentAddressBlockFilter.SerializeToString, + response_deserializer=service__pb2.RawTransaction.FromString, + _registered_method=True) + self.GetTaddressTransactions = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressTransactions', + request_serializer=service__pb2.TransparentAddressBlockFilter.SerializeToString, + response_deserializer=service__pb2.RawTransaction.FromString, + _registered_method=True) + self.GetTaddressBalance = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressBalance', + request_serializer=service__pb2.AddressList.SerializeToString, + response_deserializer=service__pb2.Balance.FromString, + _registered_method=True) + self.GetTaddressBalanceStream = channel.stream_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressBalanceStream', + request_serializer=service__pb2.Address.SerializeToString, + response_deserializer=service__pb2.Balance.FromString, + _registered_method=True) + self.GetMempoolTx = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetMempoolTx', + request_serializer=service__pb2.GetMempoolTxRequest.SerializeToString, + response_deserializer=compact__formats__pb2.CompactTx.FromString, + _registered_method=True) + self.GetMempoolStream = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetMempoolStream', + request_serializer=service__pb2.Empty.SerializeToString, + response_deserializer=service__pb2.RawTransaction.FromString, + _registered_method=True) + self.GetTreeState = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTreeState', + request_serializer=service__pb2.BlockID.SerializeToString, + response_deserializer=service__pb2.TreeState.FromString, + _registered_method=True) + self.GetLatestTreeState = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLatestTreeState', + request_serializer=service__pb2.Empty.SerializeToString, + response_deserializer=service__pb2.TreeState.FromString, + _registered_method=True) + self.GetSubtreeRoots = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetSubtreeRoots', + request_serializer=service__pb2.GetSubtreeRootsArg.SerializeToString, + response_deserializer=service__pb2.SubtreeRoot.FromString, + _registered_method=True) + self.GetAddressUtxos = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetAddressUtxos', + request_serializer=service__pb2.GetAddressUtxosArg.SerializeToString, + response_deserializer=service__pb2.GetAddressUtxosReplyList.FromString, + _registered_method=True) + self.GetAddressUtxosStream = channel.unary_stream( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetAddressUtxosStream', + request_serializer=service__pb2.GetAddressUtxosArg.SerializeToString, + response_deserializer=service__pb2.GetAddressUtxosReply.FromString, + _registered_method=True) + self.GetLightdInfo = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLightdInfo', + request_serializer=service__pb2.Empty.SerializeToString, + response_deserializer=service__pb2.LightdInfo.FromString, + _registered_method=True) + self.Ping = channel.unary_unary( + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/Ping', + request_serializer=service__pb2.Duration.SerializeToString, + response_deserializer=service__pb2.PingResponse.FromString, + _registered_method=True) + + +class CompactTxStreamerServicer(object): + """Missing associated documentation comment in .proto file.""" + + def GetLatestBlock(self, request, context): + """Return the BlockID of the block at the tip of the best chain + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlock(self, request, context): + """Return the compact block corresponding to the given block identifier + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockNullifiers(self, request, context): + """Same as GetBlock except the returned CompactBlock value contains only + nullifiers. + + Note: this method is deprecated. Implementations should ignore any + `PoolType::TRANSPARENT` member of the `poolTypes` argument. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockRange(self, request, context): + """Return a list of consecutive compact blocks in the specified range, + which is inclusive of `range.end`. + + If range.start <= range.end, blocks are returned increasing height order; + otherwise blocks are returned in decreasing height order. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBlockRangeNullifiers(self, request, context): + """Same as GetBlockRange except the returned CompactBlock values contain + only nullifiers. + + Note: this method is deprecated. Implementations should ignore any + `PoolType::TRANSPARENT` member of the `poolTypes` argument. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTransaction(self, request, context): + """Return the requested full (not compact) transaction (as from zcashd) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SendTransaction(self, request, context): + """Submit the given transaction to the Zcash network + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTaddressTxids(self, request, context): + """Return RawTransactions that match the given transparent address filter. + + Note: This function is misnamed, it returns complete `RawTransaction` values, not TxIds. + NOTE: this method is deprecated, please use GetTaddressTransactions instead. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTaddressTransactions(self, request, context): + """Return the transactions corresponding to the given t-address within the given block range. + Mempool transactions are not included in the results. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTaddressBalance(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTaddressBalanceStream(self, request_iterator, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetMempoolTx(self, request, context): + """Returns a stream of the compact transaction representation for transactions + currently in the mempool. The results of this operation may be a few + seconds out of date. If the `exclude_txid_suffixes` list is empty, + return all transactions; otherwise return all *except* those in the + `exclude_txid_suffixes` list (if any); this allows the client to avoid + receiving transactions that it already has (from an earlier call to this + RPC). The transaction IDs in the `exclude_txid_suffixes` list can be + shortened to any number of bytes to make the request more + bandwidth-efficient; if two or more transactions in the mempool match a + txid suffix, none of the matching transactions are excluded. Txid + suffixes in the exclude list that don't match any transactions in the + mempool are ignored. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetMempoolStream(self, request, context): + """Return a stream of current Mempool transactions. This will keep the output stream open while + there are mempool transactions. It will close the returned stream when a new block is mined. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTreeState(self, request, context): + """GetTreeState returns the note commitment tree state corresponding to the given block. + See section 3.7 of the Zcash protocol specification. It returns several other useful + values also (even though they can be obtained using GetBlock). + The block can be specified by either height or hash. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetLatestTreeState(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSubtreeRoots(self, request, context): + """Returns a stream of information about roots of subtrees of the note commitment tree + for the specified shielded protocol (Sapling or Orchard). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetAddressUtxos(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetAddressUtxosStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetLightdInfo(self, request, context): + """Return information about this lightwalletd instance and the blockchain + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Ping(self, request, context): + """Testing-only, requires lightwalletd --ping-very-insecure (do not enable in production) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_CompactTxStreamerServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetLatestBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetLatestBlock, + request_deserializer=service__pb2.ChainSpec.FromString, + response_serializer=service__pb2.BlockID.SerializeToString, + ), + 'GetBlock': grpc.unary_unary_rpc_method_handler( + servicer.GetBlock, + request_deserializer=service__pb2.BlockID.FromString, + response_serializer=compact__formats__pb2.CompactBlock.SerializeToString, + ), + 'GetBlockNullifiers': grpc.unary_unary_rpc_method_handler( + servicer.GetBlockNullifiers, + request_deserializer=service__pb2.BlockID.FromString, + response_serializer=compact__formats__pb2.CompactBlock.SerializeToString, + ), + 'GetBlockRange': grpc.unary_stream_rpc_method_handler( + servicer.GetBlockRange, + request_deserializer=service__pb2.BlockRange.FromString, + response_serializer=compact__formats__pb2.CompactBlock.SerializeToString, + ), + 'GetBlockRangeNullifiers': grpc.unary_stream_rpc_method_handler( + servicer.GetBlockRangeNullifiers, + request_deserializer=service__pb2.BlockRange.FromString, + response_serializer=compact__formats__pb2.CompactBlock.SerializeToString, + ), + 'GetTransaction': grpc.unary_unary_rpc_method_handler( + servicer.GetTransaction, + request_deserializer=service__pb2.TxFilter.FromString, + response_serializer=service__pb2.RawTransaction.SerializeToString, + ), + 'SendTransaction': grpc.unary_unary_rpc_method_handler( + servicer.SendTransaction, + request_deserializer=service__pb2.RawTransaction.FromString, + response_serializer=service__pb2.SendResponse.SerializeToString, + ), + 'GetTaddressTxids': grpc.unary_stream_rpc_method_handler( + servicer.GetTaddressTxids, + request_deserializer=service__pb2.TransparentAddressBlockFilter.FromString, + response_serializer=service__pb2.RawTransaction.SerializeToString, + ), + 'GetTaddressTransactions': grpc.unary_stream_rpc_method_handler( + servicer.GetTaddressTransactions, + request_deserializer=service__pb2.TransparentAddressBlockFilter.FromString, + response_serializer=service__pb2.RawTransaction.SerializeToString, + ), + 'GetTaddressBalance': grpc.unary_unary_rpc_method_handler( + servicer.GetTaddressBalance, + request_deserializer=service__pb2.AddressList.FromString, + response_serializer=service__pb2.Balance.SerializeToString, + ), + 'GetTaddressBalanceStream': grpc.stream_unary_rpc_method_handler( + servicer.GetTaddressBalanceStream, + request_deserializer=service__pb2.Address.FromString, + response_serializer=service__pb2.Balance.SerializeToString, + ), + 'GetMempoolTx': grpc.unary_stream_rpc_method_handler( + servicer.GetMempoolTx, + request_deserializer=service__pb2.GetMempoolTxRequest.FromString, + response_serializer=compact__formats__pb2.CompactTx.SerializeToString, + ), + 'GetMempoolStream': grpc.unary_stream_rpc_method_handler( + servicer.GetMempoolStream, + request_deserializer=service__pb2.Empty.FromString, + response_serializer=service__pb2.RawTransaction.SerializeToString, + ), + 'GetTreeState': grpc.unary_unary_rpc_method_handler( + servicer.GetTreeState, + request_deserializer=service__pb2.BlockID.FromString, + response_serializer=service__pb2.TreeState.SerializeToString, + ), + 'GetLatestTreeState': grpc.unary_unary_rpc_method_handler( + servicer.GetLatestTreeState, + request_deserializer=service__pb2.Empty.FromString, + response_serializer=service__pb2.TreeState.SerializeToString, + ), + 'GetSubtreeRoots': grpc.unary_stream_rpc_method_handler( + servicer.GetSubtreeRoots, + request_deserializer=service__pb2.GetSubtreeRootsArg.FromString, + response_serializer=service__pb2.SubtreeRoot.SerializeToString, + ), + 'GetAddressUtxos': grpc.unary_unary_rpc_method_handler( + servicer.GetAddressUtxos, + request_deserializer=service__pb2.GetAddressUtxosArg.FromString, + response_serializer=service__pb2.GetAddressUtxosReplyList.SerializeToString, + ), + 'GetAddressUtxosStream': grpc.unary_stream_rpc_method_handler( + servicer.GetAddressUtxosStream, + request_deserializer=service__pb2.GetAddressUtxosArg.FromString, + response_serializer=service__pb2.GetAddressUtxosReply.SerializeToString, + ), + 'GetLightdInfo': grpc.unary_unary_rpc_method_handler( + servicer.GetLightdInfo, + request_deserializer=service__pb2.Empty.FromString, + response_serializer=service__pb2.LightdInfo.SerializeToString, + ), + 'Ping': grpc.unary_unary_rpc_method_handler( + servicer.Ping, + request_deserializer=service__pb2.Duration.FromString, + response_serializer=service__pb2.PingResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'cash.z.wallet.sdk.rpc.CompactTxStreamer', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('cash.z.wallet.sdk.rpc.CompactTxStreamer', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class CompactTxStreamer(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def GetLatestBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLatestBlock', + service__pb2.ChainSpec.SerializeToString, + service__pb2.BlockID.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlock(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlock', + service__pb2.BlockID.SerializeToString, + compact__formats__pb2.CompactBlock.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockNullifiers(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockNullifiers', + service__pb2.BlockID.SerializeToString, + compact__formats__pb2.CompactBlock.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockRange(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockRange', + service__pb2.BlockRange.SerializeToString, + compact__formats__pb2.CompactBlock.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetBlockRangeNullifiers(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetBlockRangeNullifiers', + service__pb2.BlockRange.SerializeToString, + compact__formats__pb2.CompactBlock.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTransaction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTransaction', + service__pb2.TxFilter.SerializeToString, + service__pb2.RawTransaction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SendTransaction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/SendTransaction', + service__pb2.RawTransaction.SerializeToString, + service__pb2.SendResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTaddressTxids(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressTxids', + service__pb2.TransparentAddressBlockFilter.SerializeToString, + service__pb2.RawTransaction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTaddressTransactions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressTransactions', + service__pb2.TransparentAddressBlockFilter.SerializeToString, + service__pb2.RawTransaction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTaddressBalance(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressBalance', + service__pb2.AddressList.SerializeToString, + service__pb2.Balance.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTaddressBalanceStream(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_unary( + request_iterator, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTaddressBalanceStream', + service__pb2.Address.SerializeToString, + service__pb2.Balance.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetMempoolTx(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetMempoolTx', + service__pb2.GetMempoolTxRequest.SerializeToString, + compact__formats__pb2.CompactTx.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetMempoolStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetMempoolStream', + service__pb2.Empty.SerializeToString, + service__pb2.RawTransaction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetTreeState(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetTreeState', + service__pb2.BlockID.SerializeToString, + service__pb2.TreeState.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetLatestTreeState(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLatestTreeState', + service__pb2.Empty.SerializeToString, + service__pb2.TreeState.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSubtreeRoots(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetSubtreeRoots', + service__pb2.GetSubtreeRootsArg.SerializeToString, + service__pb2.SubtreeRoot.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetAddressUtxos(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetAddressUtxos', + service__pb2.GetAddressUtxosArg.SerializeToString, + service__pb2.GetAddressUtxosReplyList.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetAddressUtxosStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetAddressUtxosStream', + service__pb2.GetAddressUtxosArg.SerializeToString, + service__pb2.GetAddressUtxosReply.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetLightdInfo(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/GetLightdInfo', + service__pb2.Empty.SerializeToString, + service__pb2.LightdInfo.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def Ping(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/cash.z.wallet.sdk.rpc.CompactTxStreamer/Ping', + service__pb2.Duration.SerializeToString, + service__pb2.PingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/scripts/generate_proto.sh b/scripts/generate_proto.sh new file mode 100755 index 000000000..8e627885d --- /dev/null +++ b/scripts/generate_proto.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# Regenerate Python gRPC stubs from the lightwallet-protocol subtree. +# +# Run this after updating the subtree to a new protocol version: +# +# git subtree pull --prefix=lightwallet-protocol \ +# https://github.com/zcash/lightwallet-protocol.git --squash +# +# Then regenerate and commit the updated stubs: +# +# scripts/generate_proto.sh +# git add qa/rpc-tests/test_framework/proto/ +# git commit -m "update: regenerate gRPC stubs from lightwallet-protocol " +# +# Requirements: grpcio-tools (developer tool, not a runtime dependency) +# uv tool install grpcio-tools +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PROTO_SRC="$REPO_ROOT/lightwallet-protocol/walletrpc" +PROTO_OUT="$REPO_ROOT/qa/rpc-tests/test_framework/proto" + +python-grpc-tools-protoc \ + -I "$PROTO_SRC" \ + --python_out="$PROTO_OUT" \ + --pyi_out="$PROTO_OUT" \ + --grpc_python_out="$PROTO_OUT" \ + "$PROTO_SRC/compact_formats.proto" \ + "$PROTO_SRC/service.proto" + +# grpcio-tools generates flat imports that break when loaded as a package. +# Fix them to use relative imports in all generated Python artifacts. +for generated_file in \ + "$PROTO_OUT/service_pb2.py" \ + "$PROTO_OUT/service_pb2.pyi" \ + "$PROTO_OUT/service_pb2_grpc.py" +do + sed -i 's/^import compact_formats_pb2 as/from . import compact_formats_pb2 as/' "$generated_file" + sed -i 's/^import service_pb2 as/from . import service_pb2 as/' "$generated_file" +done + +echo "Stubs written to $PROTO_OUT" diff --git a/uv.lock b/uv.lock index ca23c6a7f..3248b47c0 100644 --- a/uv.lock +++ b/uv.lock @@ -41,6 +41,42 @@ version = "0.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/83/88/b054b00ade6d2a41749e15976cdcec4b7ec4656ac1cb917ce3de395528d1/embit-0.8.0.tar.gz", hash = "sha256:8bf4b10073c67400370ce523fb16f035fe759f6fdd987c579bdcc268d75ed770", size = 763120, upload-time = "2024-05-30T10:56:48.944Z" } +[[package]] +name = "grpcio" +version = "1.80.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/db/1d56e5f5823257b291962d6c0ce106146c6447f405b60b234c4f222a7cde/grpcio-1.80.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:dfab85db094068ff42e2a3563f60ab3dddcc9d6488a35abf0132daec13209c8a", size = 6055009, upload-time = "2026-03-30T08:46:46.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/18/c83f3cad64c5ca63bca7e91e5e46b0d026afc5af9d0a9972472ceba294b3/grpcio-1.80.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060", size = 12035295, upload-time = "2026-03-30T08:46:49.099Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8e/e14966b435be2dda99fbe89db9525ea436edc79780431a1c2875a3582644/grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2", size = 6610297, upload-time = "2026-03-30T08:46:52.123Z" }, + { url = "https://files.pythonhosted.org/packages/cc/26/d5eb38f42ce0e3fdc8174ea4d52036ef8d58cc4426cb800f2610f625dd75/grpcio-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3cb8130ba457d2aa09fa6b7c3ed6b6e4e6a2685fce63cb803d479576c4d80e21", size = 7300208, upload-time = "2026-03-30T08:46:54.859Z" }, + { url = "https://files.pythonhosted.org/packages/25/51/bd267c989f85a17a5b3eea65a6feb4ff672af41ca614e5a0279cc0ea381c/grpcio-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab", size = 6813442, upload-time = "2026-03-30T08:46:57.056Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d9/d80eef735b19e9169e30164bbf889b46f9df9127598a83d174eb13a48b26/grpcio-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1", size = 7414743, upload-time = "2026-03-30T08:46:59.682Z" }, + { url = "https://files.pythonhosted.org/packages/de/f2/567f5bd5054398ed6b0509b9a30900376dcf2786bd936812098808b49d8d/grpcio-1.80.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8502122a3cc1714038e39a0b071acb1207ca7844208d5ea0d091317555ee7106", size = 8426046, upload-time = "2026-03-30T08:47:02.474Z" }, + { url = "https://files.pythonhosted.org/packages/62/29/73ef0141b4732ff5eacd68430ff2512a65c004696997f70476a83e548e7e/grpcio-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6", size = 7851641, upload-time = "2026-03-30T08:47:05.462Z" }, + { url = "https://files.pythonhosted.org/packages/46/69/abbfa360eb229a8623bab5f5a4f8105e445bd38ce81a89514ba55d281ad0/grpcio-1.80.0-cp311-cp311-win32.whl", hash = "sha256:51b4a7189b0bef2aa30adce3c78f09c83526cf3dddb24c6a96555e3b97340440", size = 4154368, upload-time = "2026-03-30T08:47:08.027Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/ae92206d01183b08613e846076115f5ac5991bae358d2a749fa864da5699/grpcio-1.80.0-cp311-cp311-win_amd64.whl", hash = "sha256:02e64bb0bb2da14d947a49e6f120a75e947250aebe65f9629b62bb1f5c14e6e9", size = 4894235, upload-time = "2026-03-30T08:47:10.839Z" }, +] + +[[package]] +name = "protobuf" +version = "7.34.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/6b/a0e95cad1ad7cc3f2c6821fcab91671bd5b78bd42afb357bb4765f29bc41/protobuf-7.34.1.tar.gz", hash = "sha256:9ce42245e704cc5027be797c1db1eb93184d44d1cdd71811fb2d9b25ad541280", size = 454708, upload-time = "2026-03-20T17:34:47.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/11/3325d41e6ee15bf1125654301211247b042563bcc898784351252549a8ad/protobuf-7.34.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8b2cc79c4d8f62b293ad9b11ec3aebce9af481fa73e64556969f7345ebf9fc7", size = 429247, upload-time = "2026-03-20T17:34:37.024Z" }, + { url = "https://files.pythonhosted.org/packages/eb/9d/aa69df2724ff63efa6f72307b483ce0827f4347cc6d6df24b59e26659fef/protobuf-7.34.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:5185e0e948d07abe94bb76ec9b8416b604cfe5da6f871d67aad30cbf24c3110b", size = 325753, upload-time = "2026-03-20T17:34:38.751Z" }, + { url = "https://files.pythonhosted.org/packages/92/e8/d174c91fd48e50101943f042b09af9029064810b734e4160bbe282fa1caa/protobuf-7.34.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:403b093a6e28a960372b44e5eb081775c9b056e816a8029c61231743d63f881a", size = 340198, upload-time = "2026-03-20T17:34:39.871Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/3b431694a4dc6d37b9f653f0c64b0a0d9ec074ee810710c0c3da21d67ba7/protobuf-7.34.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ff40ce8cd688f7265326b38d5a1bed9bfdf5e6723d49961432f83e21d5713e4", size = 324267, upload-time = "2026-03-20T17:34:41.1Z" }, + { url = "https://files.pythonhosted.org/packages/85/29/64de04a0ac142fb685fd09999bc3d337943fb386f3a0ec57f92fd8203f97/protobuf-7.34.1-cp310-abi3-win32.whl", hash = "sha256:34b84ce27680df7cca9f231043ada0daa55d0c44a2ddfaa58ec1d0d89d8bf60a", size = 426628, upload-time = "2026-03-20T17:34:42.536Z" }, + { url = "https://files.pythonhosted.org/packages/4d/87/cb5e585192a22b8bd457df5a2c16a75ea0db9674c3a0a39fc9347d84e075/protobuf-7.34.1-cp310-abi3-win_amd64.whl", hash = "sha256:e97b55646e6ce5cbb0954a8c28cd39a5869b59090dfaa7df4598a7fba869468c", size = 437901, upload-time = "2026-03-20T17:34:44.112Z" }, + { url = "https://files.pythonhosted.org/packages/88/95/608f665226bca68b736b79e457fded9a2a38c4f4379a4a7614303d9db3bc/protobuf-7.34.1-py3-none-any.whl", hash = "sha256:bb3812cd53aefea2b028ef42bd780f5b96407247f20c6ef7c679807e9d188f11", size = 170715, upload-time = "2026-03-20T17:34:45.384Z" }, +] + [[package]] name = "pycparser" version = "3.0" @@ -95,6 +131,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, ] +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + [[package]] name = "zcash-integration-tests" version = "0.1.0" @@ -102,6 +147,8 @@ source = { virtual = "." } dependencies = [ { name = "base58" }, { name = "embit" }, + { name = "grpcio" }, + { name = "protobuf" }, { name = "pyzmq" }, { name = "toml" }, ] @@ -110,6 +157,8 @@ dependencies = [ requires-dist = [ { name = "base58" }, { name = "embit", specifier = ">=0.8.0" }, + { name = "grpcio", specifier = ">=1.80.0" }, + { name = "protobuf", specifier = ">=6.31.1" }, { name = "pyzmq" }, { name = "toml" }, ] diff --git a/walletrpc/compact_formats.proto b/walletrpc/compact_formats.proto new file mode 100644 index 000000000..c62c7acbb --- /dev/null +++ b/walletrpc/compact_formats.proto @@ -0,0 +1,125 @@ +// Copyright (c) 2019-2021 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or https://www.opensource.org/licenses/mit-license.php . + +syntax = "proto3"; +package cash.z.wallet.sdk.rpc; +option go_package = "lightwalletd/walletrpc"; +option swift_prefix = ""; + +// REMINDER: proto3 fields are all optional. A field that is not present will be set to its zero/false/empty +// value. + +// Information about the state of the chain as of a given block. +message ChainMetadata { + uint32 saplingCommitmentTreeSize = 1; // the size of the Sapling note commitment tree as of the end of this block + uint32 orchardCommitmentTreeSize = 2; // the size of the Orchard note commitment tree as of the end of this block +} + +// A compact representation of a Zcash block. +// +// CompactBlock is a packaging of ONLY the data from a block that's needed to: +// 1. Detect a payment to your Shielded address +// 2. Detect a spend of your Shielded notes +// 3. Update your witnesses to generate new spend proofs. +// 4. Spend UTXOs associated to t-addresses of your wallet. +message CompactBlock { + uint32 protoVersion = 1; // the version of this wire format, for storage + uint64 height = 2; // the height of this block + bytes hash = 3; // the ID (hash) of this block, same as in block explorers + bytes prevHash = 4; // the ID (hash) of this block's predecessor + uint32 time = 5; // Unix epoch time when the block was mined + bytes header = 6; // full header (as returned by the getblock RPC) + repeated CompactTx vtx = 7; // zero or more compact transactions from this block + ChainMetadata chainMetadata = 8; // information about the state of the chain as of this block +} + +// A compact representation of a Zcash transaction. +// +// CompactTx contains the minimum information for a wallet to know if this transaction +// is relevant to it (either pays to it or spends from it) via shielded elements. Additionally, +// it can optionally include the minimum necessary data to detect payments to transparent addresses +// related to your wallet. +message CompactTx { + // The index of the transaction within the block. + uint64 index = 1; + + // The id of the transaction as defined in + // [§ 7.1.1 ‘Transaction Identifiers’](https://zips.z.cash/protocol/protocol.pdf#txnidentifiers) + // This byte array MUST be in protocol order and MUST NOT be reversed + // or hex-encoded; the byte-reversed and hex-encoded representation is + // exclusively a textual representation of a txid. + bytes txid = 2; + + // The transaction fee: present if server can provide. In the case of a + // stateless server and a transaction with transparent inputs, this will be + // unset because the calculation requires reference to prior transactions. + // If there are no transparent inputs, the fee will be calculable as: + // valueBalanceSapling + valueBalanceOrchard + sum(vPubNew) - sum(vPubOld) - sum(tOut) + uint32 fee = 3; + + repeated CompactSaplingSpend spends = 4; + repeated CompactSaplingOutput outputs = 5; + repeated CompactOrchardAction actions = 6; + + // `CompactTxIn` values corresponding to the `vin` entries of the full transaction. + // + // Note: the single null-outpoint input for coinbase transactions is omitted. Light + // clients can test `CompactTx.index == 0` to determine whether a `CompactTx` + // represents a coinbase transaction, as the coinbase transaction is always the + // first transaction in any block. + repeated CompactTxIn vin = 7; + + // A sequence of transparent outputs being created by the transaction. + repeated TxOut vout = 8; +} + +// A compact representation of a transparent transaction input. +message CompactTxIn { + // The id of the transaction that generated the output being spent. This + // byte array must be in protocol order and MUST NOT be reversed or + // hex-encoded. + bytes prevoutTxid = 1; + + // The index of the output being spent in the `vout` array of the + // transaction referred to by `prevoutTxid`. + uint32 prevoutIndex = 2; +} + +// A transparent output being created by the transaction. +// +// This contains identical data to the `TxOut` type in the transaction itself, and +// thus it is not "compact". +message TxOut { + // The value of the output, in Zatoshis. + uint64 value = 1; + + // The script pubkey that must be satisfied in order to spend this output. + bytes scriptPubKey = 2; +} + +// A compact representation of a [Sapling Spend](https://zips.z.cash/protocol/protocol.pdf#spendencodingandconsensus). +// +// CompactSaplingSpend is a Sapling Spend Description as described in 7.3 of the Zcash +// protocol specification. +message CompactSaplingSpend { + bytes nf = 1; // Nullifier (see the Zcash protocol specification) +} + +// A compact representation of a [Sapling Output](https://zips.z.cash/protocol/protocol.pdf#outputencodingandconsensus). +// +// It encodes the `cmu` field, `ephemeralKey` field, and a 52-byte prefix of the +// `encCiphertext` field of a Sapling Output Description. Total size is 116 bytes. +message CompactSaplingOutput { + bytes cmu = 1; // Note commitment u-coordinate. + bytes ephemeralKey = 2; // Ephemeral public key. + bytes ciphertext = 3; // First 52 bytes of ciphertext. +} + +// A compact representation of an [Orchard Action](https://zips.z.cash/protocol/protocol.pdf#actionencodingandconsensus). +message CompactOrchardAction { + bytes nullifier = 1; // [32] The nullifier of the input note + bytes cmx = 2; // [32] The x-coordinate of the note commitment for the output note + bytes ephemeralKey = 3; // [32] An encoding of an ephemeral Pallas public key + bytes ciphertext = 4; // [52] The first 52 bytes of the encCiphertext field +} diff --git a/walletrpc/service.proto b/walletrpc/service.proto new file mode 100644 index 000000000..d3dc8ba04 --- /dev/null +++ b/walletrpc/service.proto @@ -0,0 +1,303 @@ +// Copyright (c) 2019-2020 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or https://www.opensource.org/licenses/mit-license.php . + +syntax = "proto3"; +package cash.z.wallet.sdk.rpc; +option go_package = "lightwalletd/walletrpc"; +option swift_prefix = ""; +import "compact_formats.proto"; + +// An identifier for a Zcash value pool. +enum PoolType { + POOL_TYPE_INVALID = 0; + TRANSPARENT = 1; + SAPLING = 2; + ORCHARD = 3; +} + +// A BlockID message contains identifiers to select a block: a height or a +// hash. Specification by hash is not implemented, but may be in the future. +message BlockID { + uint64 height = 1; + bytes hash = 2; +} + +// BlockRange specifies a series of blocks from start to end inclusive. +// Both BlockIDs must be heights; specification by hash is not yet supported. +// +// If no pool types are specified, the server should default to the legacy +// behavior of returning only data relevant to the shielded (Sapling and +// Orchard) pools; otherwise, the server should prune `CompactBlocks` returned +// to include only data relevant to the requested pool types. Clients MUST +// verify that the version of the server they are connected to are capable +// of returning pruned and/or transparent data before setting `poolTypes` +// to a non-empty value. +message BlockRange { + BlockID start = 1; + BlockID end = 2; + repeated PoolType poolTypes = 3; +} + +// A TxFilter contains the information needed to identify a particular +// transaction: either a block and an index, or a direct transaction hash. +// Currently, only specification by hash is supported. +message TxFilter { + BlockID block = 1; // block identifier, height or hash + uint64 index = 2; // index within the block + bytes hash = 3; // transaction ID (hash, txid) +} + +// RawTransaction contains the complete transaction data. It also optionally includes +// the block height in which the transaction was included, or, when returned +// by GetMempoolStream(), the latest block height. +// +// FIXME: the documentation here about mempool status contradicts the documentation +// for the `height` field. See https://github.com/zcash/librustzcash/issues/1484 +message RawTransaction { + // The serialized representation of the Zcash transaction. + bytes data = 1; + // The height at which the transaction is mined, or a sentinel value. + // + // Due to an error in the original protobuf definition, it is necessary to + // reinterpret the result of the `getrawtransaction` RPC call. Zcashd will + // return the int64 value `-1` for the height of transactions that appear + // in the block index, but which are not mined in the main chain. Here, the + // height field of `RawTransaction` was erroneously created as a `uint64`, + // and as such we must map the response from the zcashd RPC API to be + // representable within this space. Additionally, the `height` field will + // be absent for transactions in the mempool, resulting in the default + // value of `0` being set. Therefore, the meanings of the `height` field of + // the `RawTransaction` type are as follows: + // + // * height 0: the transaction is in the mempool + // * height 0xffffffffffffffff: the transaction has been mined on a fork that + // is not currently the main chain + // * any other height: the transaction has been mined in the main chain at the + // given height + uint64 height = 2; +} + +// A SendResponse encodes an error code and a string. It is currently used +// only by SendTransaction(). If error code is zero, the operation was +// successful; if non-zero, it and the message specify the failure. +message SendResponse { + int32 errorCode = 1; + string errorMessage = 2; +} + +// Chainspec is a placeholder to allow specification of a particular chain fork. +message ChainSpec {} + +// Empty is for gRPCs that take no arguments, currently only GetLightdInfo. +message Empty {} + +// LightdInfo returns various information about this lightwalletd instance +// and the state of the blockchain. +message LightdInfo { + string version = 1; + string vendor = 2; + bool taddrSupport = 3; // true + string chainName = 4; // either "main" or "test" + uint64 saplingActivationHeight = 5; // depends on mainnet or testnet + string consensusBranchId = 6; // protocol identifier, see consensus/upgrades.cpp + uint64 blockHeight = 7; // latest block on the best chain + string gitCommit = 8; + string branch = 9; + string buildDate = 10; + string buildUser = 11; + uint64 estimatedHeight = 12; // less than tip height if zcashd is syncing + string zcashdBuild = 13; // example: "v4.1.1-877212414" + string zcashdSubversion = 14; // example: "/MagicBean:4.1.1/" + string donationAddress = 15; // Zcash donation UA address + string upgradeName = 16; // name of next pending network upgrade, empty if none scheduled + uint64 upgradeHeight = 17; // height of next pending upgrade, zero if none is scheduled + string lightwalletProtocolVersion = 18; // version of https://github.com/zcash/lightwallet-protocol served by this server +} + +// TransparentAddressBlockFilter restricts the results of the GRPC methods that +// use it to the transactions that involve the given address and were mined in +// the specified block range. Non-default values for both the address and the +// block range must be specified. Mempool transactions are not included. +// +// The `poolTypes` field of the `range` argument should be ignored. +// Implementations MAY consider it an error if any pool types are specified. +message TransparentAddressBlockFilter { + string address = 1; // t-address + BlockRange range = 2; // start, end heights only +} + +// Duration is currently used only for testing, so that the Ping rpc +// can simulate a delay, to create many simultaneous connections. Units +// are microseconds. +message Duration { + int64 intervalUs = 1; +} + +// PingResponse is used to indicate concurrency, how many Ping rpcs +// are executing upon entry and upon exit (after the delay). +// This rpc is used for testing only. +message PingResponse { + int64 entry = 1; + int64 exit = 2; +} + +message Address { + string address = 1; +} +message AddressList { + repeated string addresses = 1; +} +message Balance { + int64 valueZat = 1; +} + +// Request parameters for the `GetMempoolTx` RPC. +message GetMempoolTxRequest { + // A list of transaction ID byte string suffixes that should be excluded + // from the response. These suffixes may be produced either directly from + // the underlying txid bytes, or, if the source values are encoded txid + // strings, by truncating the hexadecimal representation of each + // transaction ID to an even number of characters, and then hex-decoding + // and then byte-reversing this value to obtain the byte representation. + repeated bytes exclude_txid_suffixes = 1; + // We reserve field number 2 for a potential future `exclude_txid_prefixes` + // field. + reserved 2; + // The server must prune `CompactTx`s returned to include only data + // relevant to the requested pool types. If no pool types are specified, + // the server should default to the legacy behavior of returning only data + // relevant to the shielded (Sapling and Orchard) pools. + repeated PoolType poolTypes = 3; +} + +// The TreeState is derived from the Zcash z_gettreestate rpc. +message TreeState { + string network = 1; // "main" or "test" + uint64 height = 2; // block height + string hash = 3; // block id + uint32 time = 4; // Unix epoch time when the block was mined + string saplingTree = 5; // sapling commitment tree state + string orchardTree = 6; // orchard commitment tree state +} + +enum ShieldedProtocol { + sapling = 0; + orchard = 1; +} + +message GetSubtreeRootsArg { + uint32 startIndex = 1; // Index identifying where to start returning subtree roots + ShieldedProtocol shieldedProtocol = 2; // Shielded protocol to return subtree roots for + uint32 maxEntries = 3; // Maximum number of entries to return, or 0 for all entries. +} +message SubtreeRoot { + bytes rootHash = 2; // The 32-byte Merkle root of the subtree. + bytes completingBlockHash = 3; // The hash of the block that completed this subtree. + uint64 completingBlockHeight = 4; // The height of the block that completed this subtree in the main chain. +} + +// Results are sorted by height, which makes it easy to issue another +// request that picks up from where the previous left off. +message GetAddressUtxosArg { + repeated string addresses = 1; + uint64 startHeight = 2; + uint32 maxEntries = 3; // zero means unlimited +} +message GetAddressUtxosReply { + string address = 6; + bytes txid = 1; + int32 index = 2; + bytes script = 3; + int64 valueZat = 4; + uint64 height = 5; +} +message GetAddressUtxosReplyList { + repeated GetAddressUtxosReply addressUtxos = 1; +} + +service CompactTxStreamer { + // Return the BlockID of the block at the tip of the best chain + rpc GetLatestBlock(ChainSpec) returns (BlockID) {} + + // Return the compact block corresponding to the given block identifier + rpc GetBlock(BlockID) returns (CompactBlock) {} + + // Same as GetBlock except the returned CompactBlock value contains only + // nullifiers. + // + // Note: this method is deprecated. Implementations should ignore any + // `PoolType::TRANSPARENT` member of the `poolTypes` argument. + rpc GetBlockNullifiers(BlockID) returns (CompactBlock) {} + + // Return a list of consecutive compact blocks in the specified range, + // which is inclusive of `range.end`. + // + // If range.start <= range.end, blocks are returned increasing height order; + // otherwise blocks are returned in decreasing height order. + rpc GetBlockRange(BlockRange) returns (stream CompactBlock) {} + + // Same as GetBlockRange except the returned CompactBlock values contain + // only nullifiers. + // + // Note: this method is deprecated. Implementations should ignore any + // `PoolType::TRANSPARENT` member of the `poolTypes` argument. + rpc GetBlockRangeNullifiers(BlockRange) returns (stream CompactBlock) {} + + // Return the requested full (not compact) transaction (as from zcashd) + rpc GetTransaction(TxFilter) returns (RawTransaction) {} + + // Submit the given transaction to the Zcash network + rpc SendTransaction(RawTransaction) returns (SendResponse) {} + + // Return RawTransactions that match the given transparent address filter. + // + // Note: This function is misnamed, it returns complete `RawTransaction` values, not TxIds. + // NOTE: this method is deprecated, please use GetTaddressTransactions instead. + rpc GetTaddressTxids(TransparentAddressBlockFilter) returns (stream RawTransaction) {} + + // Return the transactions corresponding to the given t-address within the given block range. + // Mempool transactions are not included in the results. + rpc GetTaddressTransactions(TransparentAddressBlockFilter) returns (stream RawTransaction) {} + + rpc GetTaddressBalance(AddressList) returns (Balance) {} + rpc GetTaddressBalanceStream(stream Address) returns (Balance) {} + + // Returns a stream of the compact transaction representation for transactions + // currently in the mempool. The results of this operation may be a few + // seconds out of date. If the `exclude_txid_suffixes` list is empty, + // return all transactions; otherwise return all *except* those in the + // `exclude_txid_suffixes` list (if any); this allows the client to avoid + // receiving transactions that it already has (from an earlier call to this + // RPC). The transaction IDs in the `exclude_txid_suffixes` list can be + // shortened to any number of bytes to make the request more + // bandwidth-efficient; if two or more transactions in the mempool match a + // txid suffix, none of the matching transactions are excluded. Txid + // suffixes in the exclude list that don't match any transactions in the + // mempool are ignored. + rpc GetMempoolTx(GetMempoolTxRequest) returns (stream CompactTx) {} + + // Return a stream of current Mempool transactions. This will keep the output stream open while + // there are mempool transactions. It will close the returned stream when a new block is mined. + rpc GetMempoolStream(Empty) returns (stream RawTransaction) {} + + // GetTreeState returns the note commitment tree state corresponding to the given block. + // See section 3.7 of the Zcash protocol specification. It returns several other useful + // values also (even though they can be obtained using GetBlock). + // The block can be specified by either height or hash. + rpc GetTreeState(BlockID) returns (TreeState) {} + rpc GetLatestTreeState(Empty) returns (TreeState) {} + + // Returns a stream of information about roots of subtrees of the note commitment tree + // for the specified shielded protocol (Sapling or Orchard). + rpc GetSubtreeRoots(GetSubtreeRootsArg) returns (stream SubtreeRoot) {} + + rpc GetAddressUtxos(GetAddressUtxosArg) returns (GetAddressUtxosReplyList) {} + rpc GetAddressUtxosStream(GetAddressUtxosArg) returns (stream GetAddressUtxosReply) {} + + // Return information about this lightwalletd instance and the blockchain + rpc GetLightdInfo(Empty) returns (LightdInfo) {} + + // Testing-only, requires lightwalletd --ping-very-insecure (do not enable in production) + rpc Ping(Duration) returns (PingResponse) {} +} From 54afeefb4202188ce039d2252fd488a253077735 Mon Sep 17 00:00:00 2001 From: Pacu Date: Sat, 11 Jul 2026 12:18:53 -0300 Subject: [PATCH 2/6] Add manual gRPC comparison test Add framework support for starting lightwalletd and standalone zcashd fixtures, then add a manual gRPC parity test comparing zainod and lightwalletd responses. Include cached regtest fixtures and documentation so the test can run locally without rebuilding the fixture chain every time. Co-Authored-By: OpenAI Codex --- .gitignore | 5 +- README.md | 26 +- doc/book/src/SUMMARY.md | 1 + doc/book/src/dev/grpc-comparison.md | 243 +++ doc/book/src/user/running-tests.md | 55 +- doc/book/src/user/writing-tests.md | 60 + qa/README.md | 31 +- .../cache/grpc_comparison/chain_metadata.json | 29 + .../cache/grpc_comparison/zebrad_state.tar.gz | Bin 0 -> 143689 bytes .../chain_metadata.json | 29 + .../zcashd0_state.tar.gz | Bin 0 -> 211412 bytes .../zcashd1_state.tar.gz | Bin 0 -> 180833 bytes qa/rpc-tests/grpc_comparison.py | 1352 +++++++++++++++++ qa/rpc-tests/test_framework/authproxy.py | 4 +- qa/rpc-tests/test_framework/config.py | 12 + qa/rpc-tests/test_framework/test_framework.py | 28 +- qa/rpc-tests/test_framework/util.py | 283 +++- qa/zcash/grpc_comparison_tests.py | 37 + 18 files changed, 2116 insertions(+), 79 deletions(-) create mode 100644 doc/book/src/dev/grpc-comparison.md create mode 100644 qa/rpc-tests/cache/grpc_comparison/chain_metadata.json create mode 100644 qa/rpc-tests/cache/grpc_comparison/zebrad_state.tar.gz create mode 100644 qa/rpc-tests/cache/grpc_comparison_stage1/chain_metadata.json create mode 100644 qa/rpc-tests/cache/grpc_comparison_stage1/zcashd0_state.tar.gz create mode 100644 qa/rpc-tests/cache/grpc_comparison_stage1/zcashd1_state.tar.gz create mode 100755 qa/rpc-tests/grpc_comparison.py create mode 100755 qa/zcash/grpc_comparison_tests.py diff --git a/.gitignore b/.gitignore index 739b5e52f..0be1501a4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,13 @@ *.orig *.pyc .vscode - +.claude +.codex qa/pull-tester/tests_config.py qa/pull-tester/tests_config.ini qa/cache/* +qa/rpc-tests/cache/grpc_comparison/ +qa/rpc-tests/cache/grpc_comparison_stage1/ src/* poetry.lock diff --git a/README.md b/README.md index 83ae620c6..de52ea3e4 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ Zcash ecosystem. The following tests are provided: - Functional tests in Python of [`zebrad`], [`zainod`], and [`zallet`], using regtest mode and primarily their JSON-RPC interfaces. +- gRPC parity tests that run [`zainod`] and [`lightwalletd`] side-by-side + against the same [`zebrad`] node and compare their + [lightwallet-protocol] gRPC responses. The functional tests and CI workflows were originally part of the [`zcashd`] codebase, with the Python test framework (and some of the tests) inherited from @@ -15,6 +18,8 @@ codebase, with the Python test framework (and some of the tests) inherited from [`zebrad`]: https://github.com/ZcashFoundation/zebra [`zainod`]: https://github.com/zingolabs/zaino [`zallet`]: https://github.com/zcash/zallet +[`lightwalletd`]: https://github.com/zcash/lightwalletd +[lightwallet-protocol]: https://github.com/zcash/lightwallet-protocol [`zcashd`]: https://github.com/zcash/zcash [Bitcoin Core]: https://github.com/bitcoin/bitcoin @@ -22,6 +27,8 @@ codebase, with the Python test framework (and some of the tests) inherited from ## Getting Started ### Running the tests locally +Pre-requisite: See the [`uv` installation instructions](https://docs.astral.sh/uv/getting-started/installation/) + if it is not already installed. - Clone the repository. - Build `zebrad`, `zainod`, and `zallet` binaries, and place them in a folder @@ -40,20 +47,17 @@ codebase, with the Python test framework (and some of the tests) inherited from - `uv sync` - `uv run ./qa/zcash/full_test_suite.py` -#### Without uv +See [the README for the functional tests][qa/README.md] for additional usage +information. -On Ubuntu or Debian-based distributions: -- `sudo apt-get install python3-zmq python3-base58 python3-toml` -- `./qa/zcash/full_test_suite.py` +### Running the gRPC parity tests -On macOS or other platforms: -- `python3 -m venv venv` -- `. venv/bin/activate` -- `pip3 install pyzmq base58 toml` -- `./qa/zcash/full_test_suite.py` +The gRPC parity tests additionally require the `lightwalletd` binary in `./src/` +(or set `LIGHTWALLETD=/path/to/lightwalletd`). -See [the README for the functional tests][qa/README.md] for additional usage -information. +```bash +uv run ./qa/zcash/grpc_comparison_tests.py +``` ### Writing tests diff --git a/doc/book/src/SUMMARY.md b/doc/book/src/SUMMARY.md index 30a7796cb..1bc007380 100644 --- a/doc/book/src/SUMMARY.md +++ b/doc/book/src/SUMMARY.md @@ -7,6 +7,7 @@ - [Platform Support](user/platform-support.md) - [Developer Documentation](dev.md) - [Regtest Mode](dev/regtest.md) + - [Bringing `grpc_comparison.py` Live](dev/grpc-comparison.md) - [Platform Policy](dev/platform-policy.md) - [CI Infrastructure](ci/README.md) - [Cross-Repository CI](ci/cross-repo.md) diff --git a/doc/book/src/dev/grpc-comparison.md b/doc/book/src/dev/grpc-comparison.md new file mode 100644 index 000000000..92b514b95 --- /dev/null +++ b/doc/book/src/dev/grpc-comparison.md @@ -0,0 +1,243 @@ +# Bringing `grpc_comparison.py` Live + +The `qa/rpc-tests/grpc_comparison.py` test compares Zainod and Lightwalletd by +asking both implementations the same `CompactTxStreamer` gRPC queries while +they are backed by the same Zebrad node. + +This chapter documents the process that led to the test becoming stable, fast, +and usable in CI. It is intentionally more historical than the inline comments +in the test file: the goal is to explain not just what the fixture does, but +why it ended up that way. + +## Goal + +The original goal was straightforward: + +1. Build a short regtest chain containing transparent, Sapling, and Orchard + activity. +2. Submit that chain to Zebrad. +3. Start Zainod and Lightwalletd against the same Zebrad state. +4. Compare their responses method-by-method. + +The hard part was step 1. A chain that is easy to describe is not necessarily a +chain that `zcashd`, Zebrad, Zainod, and Lightwalletd will all accept and index +reliably in the same test harness. + +## What made this fixture tricky + +Several interacting constraints shaped the final fixture: + +- The test needs both Sapling and Orchard activity, including cross-pool sends. +- Standalone `zcashd` wallet behavior is sensitive to note selection and wallet + state reloading, especially for Orchard spends. +- Zebrad and standalone `zcashd` do not build the fixture chain together over + P2P in this harness, so the test submits raw blocks explicitly. +- Zainod must only start after Zebrad has loaded the full chain state, or it can + fail during initial indexing. That behavior appears to be a Zaino bug: Zainod + should wait for Zebra instead of crashing during startup. +- Regenerating proof-heavy shielded transactions on every run is too slow for a + useful parity test. + +Those constraints are why the final test uses: + +- two standalone `zcashd` builder wallets, +- a two-stage cache, +- checkpoint-assisted Zebrad replay, +- and explicit startup ordering for Zebrad, Zainod, and Lightwalletd. + +## Dead ends we had to eliminate + +The final structure came from working through a series of failures. + +Some of these failures appear to be upstream bugs rather than intended +behavior. When they are reproducible in isolation, they should be tracked +against the relevant implementation (`zcashd`, Zaino, or Zebra), and any +protocol ambiguity should be clarified in the corresponding specification or +ZIP before the implementations are updated. + +### One-wallet chain construction was not reliable + +The first versions tried to build the whole fixture from a single standalone +`zcashd` wallet. That produced multiple classes of failure: + +- Sapling funds created on-chain were not always surfaced as spendable to the + next `z_sendmany` call. +- Orchard cross-pool and follow-on Orchard spends could crash in wallet anchor + handling. That looks like a `zcashd` bug and should be reported there if it + can be reproduced outside this fixture. +- The wallet would often choose the same note pool for multiple test + transactions, leading to duplicate-nullifier or "insufficient funds" errors. + +The fix was to split responsibilities: + +- `zcashd0` authors the transparent and Sapling side of the chain. +- `zcashd1` owns the Orchard accounts and authors Orchard spends. + +That mirrors the separation already used by the working Orchard wallet tests. + +### The "obvious" chain was still too sensitive to note selection + +Even with two wallets, using a single Sapling note pool and a single Orchard +note pool made the test fragile. Some later spends depended on `zcashd` +selecting exactly the notes we expected. + +The final fixture avoids that by creating separate source pools: + +- one Sapling pool for the Sapling-to-Orchard funding transaction, +- one Sapling pool for later Sapling spends, +- one Orchard pool for the first Orchard spend, +- and one Orchard pool for later Orchard-originated transactions. + +That is why the fixture has two Sapling funding steps and two Orchard funding +steps instead of a single minimal funding transaction for each pool. + +### ZIP 317 fee assumptions mattered + +Some cross-pool transactions that looked simple on paper were not satisfiable +with a hard-coded `ZIP_317_FEE`. That also appears to be a `zcashd` wallet-side +issue rather than an intended invariant of the fixture. This behavior is now +tracked upstream as [`zcash/zcash#6956`](https://github.com/zcash/zcash/issues/6956). + +The fix was to compute fees for the actual transaction shape where needed using +`conventional_fee(...)`, while still keeping `ZIP_317_FEE` for the simpler +cases that matched the existing wallet tests. + +### Standalone `zcashd` and Zebrad needed aligned activation behavior + +The fixture uses standalone `zcashd` builders, then replays the resulting chain +into Zebrad. That only worked reliably once the test stopped assuming every +network upgrade should activate at height 1. + +The stable layout is: + +- Overwinter through Canopy at height 1 +- NU5 and NU6 at height 2 + +That matches Zebrad's regtest expectations closely enough for the replayed chain +to be accepted and indexed consistently by the downstream services. + +### Zainod startup ordering mattered + +One important operational rule emerged from debugging: + +Zainod and Lightwalletd must connect only after Zebrad has the full replayed or +restored chain loaded. + +If Zainod starts too early, it can fail during initial indexing because the +state it expects is not fully available yet. The final test therefore: + +1. restores or replays the Zebrad chain, +2. waits for Zebrad to report the expected tip height, +3. then starts Zainod and Lightwalletd, +4. then waits for both indexers to catch up. + +This ordering is required, not cosmetic. +It also appears to expose a Zaino startup bug that should be tracked separately +from the parity test itself. + +## The final fixture design + +The chain that shipped in the live test is: + +- Blocks `1..200`: transparent coinbase to a `taddr` +- Block `201`: transparent to Sapling funding +- Block `202`: second transparent to Sapling funding +- Block `203`: Sapling to Orchard +- Block `204`: Sapling to Sapling +- Block `205`: transparent to Orchard +- Block `206`: Orchard to Orchard +- Block `207`: Orchard to Sapling +- Block `208`: Sapling to transparent +- Block `209`: Orchard to transparent + +This gives the parity checks: + +- transparent address queries, +- tree state queries, +- block and block-range queries, +- Sapling activity, +- Orchard activity, +- and cross-pool activity. + +Just as importantly, it does so with a chain that all four components in the +test setup can handle reproducibly. + +## Why the test uses a two-stage cache + +Proof generation and shielded transaction construction dominate runtime if the +fixture is rebuilt from scratch on every run. + +The final design uses two cache layers: + +- `qa/rpc-tests/cache/grpc_comparison_stage1/` + Stores the expensive builder-wallet state after the initial 200-block chain + and the two Sapling funding steps. +- `qa/rpc-tests/cache/grpc_comparison/` + Stores the final Zebrad state and metadata used by the parity test itself. + +The final cache is checked in so CI can run the parity test without a standalone +`zcashd` binary. The cache should be regenerated deliberately with `--fresh` +when the fixture layout changes, and those changes should be reviewed alongside +the test changes that require them. + +This split was useful because it let development continue even when the later +shielded transactions were still being debugged. Once the test was stable, it +also kept the normal runtime low. + +Typical usage is: + +```bash +uv run ./qa/zcash/grpc_comparison_tests.py +``` + +To rebuild the fixture and overwrite the caches: + +```bash +uv run ./qa/zcash/grpc_comparison_tests.py --fresh +``` + +## Why checkpoint-assisted replay exists + +The final test still builds the chain with standalone `zcashd`, then loads it +into Zebrad by submitting raw blocks. The test also writes a temporary +checkpoint file for the replayed chain before starting Zebrad. + +That part exists because the builder chain and the validator chain are not being +grown together live over P2P. The checkpoint-assisted setup made Zebrad replay +stable enough for the indexer comparison to become routine. + +## Compact block parity is strict + +The parity test now compares `CompactBlock` responses exactly as returned by +each implementation. It does not normalize `protoVersion`, omit transparent +coinbase compact transactions, or otherwise rewrite the compact block payload +before comparing it. + +That makes the failures noisier, but it is deliberate: any divergence between +Zainod and Lightwalletd should be surfaced directly in test output so it can be +understood and fixed rather than normalized away. + +If a divergence turns out to reflect an underspecified part of the protocol +rather than an implementation bug, the right long-term fix is to clarify that +behavior in the relevant spec. For gRPC behavior, that likely means ZIP 307 or +the lightwallet protocol itself. After that, the implementation that does not +match the clarified spec should be fixed, and the parity test should keep +failing until that happens. + +## Maintenance guidance + +If this test starts failing again, the safest order of operations is: + +1. Verify the normal cached path still passes. +2. Run with `--fresh` to determine whether the failure is in cache restore or + fixture generation. +3. Check whether Zebrad reaches the expected tip before Zainod starts. +4. Check whether a failure is really a parity mismatch, or whether it is a + wallet-construction problem in the standalone builder nodes. +5. Avoid simplifying the fixture unless the replacement has been verified across + all four components. + +The biggest lesson from bringing this test live is that "shortest chain" and +"most maintainable chain" were not the same thing. The stable fixture is a bit +more explicit than the original idealized version, but it is much easier to run, +cache, and reason about in CI. diff --git a/doc/book/src/user/running-tests.md b/doc/book/src/user/running-tests.md index 619dd3af5..cbf9f35ab 100644 --- a/doc/book/src/user/running-tests.md +++ b/doc/book/src/user/running-tests.md @@ -5,7 +5,8 @@ ### Binaries All tests require the `zebrad` binary; most tests require the `zallet` binary; -some tests require the `zainod` binary. +some tests require the `zainod` binary. The gRPC parity tests additionally +require the `lightwalletd` binary. By default, binaries must exist in the `./src/` folder under the repository root. Alternatively, you can set the binary paths with environment variables: @@ -14,66 +15,65 @@ root. Alternatively, you can set the binary paths with environment variables: export ZEBRAD=/path/to/zebrad export ZAINOD=/path/to/zainod export ZALLET=/path/to/zallet +export LIGHTWALLETD=/path/to/lightwalletd ``` ### Python dependencies -The `zmq`, `toml`, and `base58` Python libraries are required. - -#### With uv (recommended) +The `zmq`, `toml`, `base58`, `grpcio`, and `protobuf` Python libraries are required. ```bash uv sync ``` -#### Without uv - -On Ubuntu or Debian-based distributions: - -```bash -sudo apt-get install python3-zmq python3-base58 python3-toml -``` +See the [`uv` installation instructions](https://docs.astral.sh/uv/getting-started/installation/) +if it is not already installed. -On macOS or other platforms: +## Running the full test suite ```bash -python3 -m venv venv -. venv/bin/activate -pip3 install pyzmq base58 toml +uv run ./qa/zcash/full_test_suite.py ``` -## Running the full test suite +## Running the gRPC parity tests -With uv: +The gRPC parity tests run [`zainod`] and [`lightwalletd`] side-by-side against +the same [`zebrad`] node and compare their [lightwallet-protocol] gRPC responses. +They require the `lightwalletd` binary (see [Binaries](#binaries) above). ```bash -uv run ./qa/zcash/full_test_suite.py +uv run ./qa/zcash/grpc_comparison_tests.py ``` -Without uv: +Pass any [test runner options](#test-runner-options) after the script name: ```bash -./qa/zcash/full_test_suite.py +uv run ./qa/zcash/grpc_comparison_tests.py --nocleanup ``` +[`zebrad`]: https://github.com/ZcashFoundation/zebra +[`zainod`]: https://github.com/zingolabs/zaino +[`lightwalletd`]: https://github.com/zcash/lightwalletd +[lightwallet-protocol]: https://github.com/zcash/lightwallet-protocol + ## Running individual tests Run a single test: ```bash -./qa/pull-tester/rpc-tests.py +uv run ./qa/pull-tester/rpc-tests.py ``` Run multiple specific tests: ```bash -./qa/pull-tester/rpc-tests.py +uv run ./qa/pull-tester/rpc-tests.py ``` Run all regression tests: ```bash -./qa/pull-tester/rpc-tests.py +uv run ./qa/pull-tester/rpc-tests.py ``` ## Parallel execution @@ -81,7 +81,7 @@ Run all regression tests: By default, tests run in parallel with 4 jobs. To change the number of jobs: ```bash -./qa/pull-tester/rpc-tests.py --jobs=n +uv run ./qa/pull-tester/rpc-tests.py --jobs=n ``` ## Test runner options @@ -102,13 +102,13 @@ By default, tests run in parallel with 4 jobs. To change the number of jobs: Set `PYTHON_DEBUG=1` for debug output: ```bash -PYTHON_DEBUG=1 qa/pull-tester/rpc-tests.py wallet +PYTHON_DEBUG=1 uv run ./qa/pull-tester/rpc-tests.py wallet ``` -For real-time output, run a test directly with `python3`: +For real-time output, run a test directly with `uv run python3`: ```bash -python3 qa/rpc-tests/wallet.py +uv run python3 qa/rpc-tests/wallet.py ``` ## Cache management @@ -127,4 +127,5 @@ rm -rf cache killall zebrad killall zainod killall zallet +killall lightwalletd ``` diff --git a/doc/book/src/user/writing-tests.md b/doc/book/src/user/writing-tests.md index 03c27a323..046ad5b16 100644 --- a/doc/book/src/user/writing-tests.md +++ b/doc/book/src/user/writing-tests.md @@ -25,6 +25,66 @@ The test framework lives in `qa/rpc-tests/test_framework/`. Key modules: | `key.py` | Wrapper around OpenSSL EC_Key | | `bignum.py` | Helpers for `script.py` | | `blocktools.py` | Helper functions for creating blocks and transactions | +| `proto/` | Generated Python gRPC stubs for the [lightwallet-protocol] | + +[lightwallet-protocol]: https://github.com/zcash/lightwallet-protocol + +## Writing gRPC parity tests + +The framework supports starting a `lightwalletd` instance alongside a `zainod` +instance and comparing their `CompactTxStreamer` gRPC responses. See +`qa/rpc-tests/grpc_comparison.py` for a complete example. + +### Service lifecycle + +Set `num_lightwalletds` in your test's `__init__` alongside `num_indexers`: + +```python +class MyGrpcTest(BitcoinTestFramework): + def __init__(self): + super().__init__() + self.num_nodes = 1 + self.num_indexers = 1 # starts zainod + self.num_lightwalletds = 1 # starts lightwalletd + self.num_wallets = 0 + self.cache_behavior = 'clean' +``` + +After `setup_network()` runs, `self.lwds` holds a list of gRPC port numbers +(one per lightwalletd instance). `self.zainos` holds JSON-RPC proxy objects as +usual, but the Zainod gRPC port is obtained via `zaino_grpc_port(i)`. + +### Connecting gRPC clients + +```python +import grpc +from test_framework.proto import service_pb2, service_pb2_grpc +from test_framework.util import zaino_grpc_port + +zainod_ch = grpc.insecure_channel(f"127.0.0.1:{zaino_grpc_port(0)}") +lwd_ch = grpc.insecure_channel(f"127.0.0.1:{self.lwds[0]}") + +zs = service_pb2_grpc.CompactTxStreamerStub(zainod_ch) +ls = service_pb2_grpc.CompactTxStreamerStub(lwd_ch) +``` + +### Regenerating the proto stubs + +The proto files live in the `lightwallet-protocol/` git subtree +(`zcash/lightwallet-protocol`). To update to a new protocol version: + +```bash +# Pull the new version +git subtree pull --prefix=lightwallet-protocol \ + https://github.com/zcash/lightwallet-protocol.git --squash + +# Regenerate Python stubs (requires grpcio-tools: uv tool install grpcio-tools) +scripts/generate_proto.sh + +# Commit both the subtree update and the regenerated stubs +git add lightwallet-protocol/ qa/rpc-tests/test_framework/proto/ +git commit +``` ## P2P test design diff --git a/qa/README.md b/qa/README.md index 07e589096..4a1139e65 100644 --- a/qa/README.md +++ b/qa/README.md @@ -4,23 +4,14 @@ multiple tests from the [rpc-tests](/rpc-tests/) folder. Test dependencies ================= -Before running the tests, the following must be installed. +Before running the tests, install the Python dependencies with `uv`: -Unix ----- - -The `zmq`, `toml` and `base58` Python libraries are required. On Ubuntu or Debian-based -distributions they can be installed via: -``` -sudo apt-get install python3-zmq python3-base58 +```bash +uv sync ``` -OS X ------- - -``` -pip3 install pyzmq base58 toml embit -``` +See the [`uv` installation instructions](https://docs.astral.sh/uv/getting-started/installation/) +if it is not already installed. Setup ===== @@ -47,15 +38,15 @@ Running tests locally You can run any single test by calling - ./qa/pull-tester/rpc-tests.py + uv run ./qa/pull-tester/rpc-tests.py Or you can run any combination of tests by calling - ./qa/pull-tester/rpc-tests.py ... + uv run ./qa/pull-tester/rpc-tests.py ... Run the regression test suite with - ./qa/pull-tester/rpc-tests.py + uv run ./qa/pull-tester/rpc-tests.py By default, tests will be run in parallel. To specify how many jobs to run, append `--jobs=n` (default n=4). @@ -77,13 +68,13 @@ Possible options, which apply to each individual test run: ``` If you set the environment variable `PYTHON_DEBUG=1` you will get some debug -output (example: `PYTHON_DEBUG=1 qa/pull-tester/rpc-tests.py wallet`). +output (example: `PYTHON_DEBUG=1 uv run ./qa/pull-tester/rpc-tests.py wallet`). To get real-time output during a test you can run it using the -`python3` binary such as: +`uv run python3` such as: ``` -python3 qa/rpc-tests/wallet.py +uv run python3 qa/rpc-tests/wallet.py ``` A 200-block -regtest blockchain and wallets for four nodes diff --git a/qa/rpc-tests/cache/grpc_comparison/chain_metadata.json b/qa/rpc-tests/cache/grpc_comparison/chain_metadata.json new file mode 100644 index 000000000..5dcbabdca --- /dev/null +++ b/qa/rpc-tests/cache/grpc_comparison/chain_metadata.json @@ -0,0 +1,29 @@ +{ + "taddr": "tmMWmEeXxaY2DexNSXTNwyycqHyQKy2ftCf", + "sapling_ua0": "zregtestsapling1nanlwtu2mduvwlnrh5x6xe65pcatwrmpmk8669x4dtqarp4yahcdvateptkzekryndc9jkcm8rn", + "sapling_ua_aux": "zregtestsapling1nm2yht29xhpsqp7eyfk4a6uagafpwcw0wtegemm5pm6agqmspsq6jej0mm2v2g444d5yyxpeg32", + "orchard_ua1": "uregtest17r5twml8p4r0l3jekpxmy2uhvlxjguah4cucxskgg2m7u0gphy0dxfx08h3xsr4rxy0ppgnh0q7fkqv3gzfpqkef8wnfv8d4egkukvvq", + "orchard_ua_aux": "uregtest1hzfyrt406dd29cmvksdwdr92rdprsl654s57p0fgugwv8j00xqppdzvhkzaesqxx87he0xm88tn3c3vu74fhx8zdatnrml26vqy5pp0w", + "sapling_addr0": "zregtestsapling1nanlwtu2mduvwlnrh5x6xe65pcatwrmpmk8669x4dtqarp4yahcdvateptkzekryndc9jkcm8rn", + "sapling_addr1": "zregtestsapling1z2mrs2wlfff4l3qav3n0g0tgatzgsxajttvgrxxq3qxn7yye57efdflg3587ft75agyhz6zjf82", + "orchard_addr0": "uregtest17r5twml8p4r0l3jekpxmy2uhvlxjguah4cucxskgg2m7u0gphy0dxfx08h3xsr4rxy0ppgnh0q7fkqv3gzfpqkef8wnfv8d4egkukvvq", + "orchard_addr1": "uregtest128gmqv7yh2kqw0qfgf9rhmeuxqs82nxhumsp482vk4pa0u2fc3ql5znr3ycnwnt7sanu3a4nrf53k5dzh5pt56w6yandv0yvwulhagkc", + "_orchard_aux_addr": "uregtest1hzfyrt406dd29cmvksdwdr92rdprsl654s57p0fgugwv8j00xqppdzvhkzaesqxx87he0xm88tn3c3vu74fhx8zdatnrml26vqy5pp0w", + "t_to_sapling_txid": "f1117f206884149044743d5a373ce89a24d52a3c9dba5fbc1c124fb22f53c1ad", + "t_to_sapling_height": 201, + "t_to_orchard_txid": "a76f1f6033910bb69dabe921f027eb51149f98fb46edea1c195fdc6bae6588ea", + "t_to_orchard_height": 205, + "sapling_to_sapling_txid": "07757ef9206e4095e5de9d69bff0988e282f2af64a16e09a8afbec8f18d60a5f", + "sapling_to_sapling_height": 204, + "orchard_to_orchard_txid": "02027d83f067e79f731d70571fb2911971a1ec80a59c1dac694f3645f003b8ef", + "orchard_to_orchard_height": 206, + "sapling_to_orchard_txid": "8816ad5caed9a68bfd8a3baba1030cbf7c270a53c1bb43e23eff45a675508945", + "sapling_to_orchard_height": 203, + "orchard_to_sapling_txid": "42b83dc768e6110dc3f937bf07778624dca0d9c980b01bd546646f108459ce58", + "orchard_to_sapling_height": 207, + "sapling_to_t_txid": "743c646a0bb8ba1e47021e1901201236084a06bfaeb0136ad31d321411b46349", + "sapling_to_t_height": 208, + "orchard_to_t_txid": "9e2682800fb642f8a72529f45839aaf99a9989871cc81ac31ccd7c623c667a30", + "orchard_to_t_height": 209, + "cache_version": 8 +} \ No newline at end of file diff --git a/qa/rpc-tests/cache/grpc_comparison/zebrad_state.tar.gz b/qa/rpc-tests/cache/grpc_comparison/zebrad_state.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6fc1e1cebd1be86157beb528fe00e5e2321dd9c6 GIT binary patch literal 143689 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®UjhjigH>8gwsK8}ft$5&f^;AVKjikfv!mTeJZ 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 z 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%0D5#`O)UWPyVa!9K}gzor1W@FHc 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 literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/grpc_comparison_stage1/chain_metadata.json b/qa/rpc-tests/cache/grpc_comparison_stage1/chain_metadata.json new file mode 100644 index 000000000..bb4596d85 --- /dev/null +++ b/qa/rpc-tests/cache/grpc_comparison_stage1/chain_metadata.json @@ -0,0 +1,29 @@ +{ + "taddr": "tmMWmEeXxaY2DexNSXTNwyycqHyQKy2ftCf", + "sapling_ua0": "zregtestsapling1nanlwtu2mduvwlnrh5x6xe65pcatwrmpmk8669x4dtqarp4yahcdvateptkzekryndc9jkcm8rn", + "sapling_ua_aux": "zregtestsapling1nm2yht29xhpsqp7eyfk4a6uagafpwcw0wtegemm5pm6agqmspsq6jej0mm2v2g444d5yyxpeg32", + "orchard_ua1": "uregtest17r5twml8p4r0l3jekpxmy2uhvlxjguah4cucxskgg2m7u0gphy0dxfx08h3xsr4rxy0ppgnh0q7fkqv3gzfpqkef8wnfv8d4egkukvvq", + "orchard_ua_aux": "uregtest1hzfyrt406dd29cmvksdwdr92rdprsl654s57p0fgugwv8j00xqppdzvhkzaesqxx87he0xm88tn3c3vu74fhx8zdatnrml26vqy5pp0w", + "sapling_addr0": "zregtestsapling1nanlwtu2mduvwlnrh5x6xe65pcatwrmpmk8669x4dtqarp4yahcdvateptkzekryndc9jkcm8rn", + "sapling_addr1": "zregtestsapling1z2mrs2wlfff4l3qav3n0g0tgatzgsxajttvgrxxq3qxn7yye57efdflg3587ft75agyhz6zjf82", + "orchard_addr0": "uregtest17r5twml8p4r0l3jekpxmy2uhvlxjguah4cucxskgg2m7u0gphy0dxfx08h3xsr4rxy0ppgnh0q7fkqv3gzfpqkef8wnfv8d4egkukvvq", + "orchard_addr1": "uregtest128gmqv7yh2kqw0qfgf9rhmeuxqs82nxhumsp482vk4pa0u2fc3ql5znr3ycnwnt7sanu3a4nrf53k5dzh5pt56w6yandv0yvwulhagkc", + "_orchard_aux_addr": "uregtest1hzfyrt406dd29cmvksdwdr92rdprsl654s57p0fgugwv8j00xqppdzvhkzaesqxx87he0xm88tn3c3vu74fhx8zdatnrml26vqy5pp0w", + "t_to_sapling_txid": "f1117f206884149044743d5a373ce89a24d52a3c9dba5fbc1c124fb22f53c1ad", + "t_to_sapling_height": 201, + "t_to_orchard_txid": null, + "t_to_orchard_height": null, + "sapling_to_sapling_txid": null, + "sapling_to_sapling_height": null, + "orchard_to_orchard_txid": null, + "orchard_to_orchard_height": null, + "sapling_to_orchard_txid": null, + "sapling_to_orchard_height": null, + "orchard_to_sapling_txid": null, + "orchard_to_sapling_height": null, + "sapling_to_t_txid": null, + "sapling_to_t_height": null, + "orchard_to_t_txid": null, + "orchard_to_t_height": null, + "cache_version": 8 +} \ No newline at end of file diff --git a/qa/rpc-tests/cache/grpc_comparison_stage1/zcashd0_state.tar.gz b/qa/rpc-tests/cache/grpc_comparison_stage1/zcashd0_state.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..21b4be88fa03d4e186fd047e283196fa916bd980 GIT binary patch literal 211412 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 )DNPJy`M{b&vT=meTbk<4aZM;X{f74enTXZoN45 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 literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/grpc_comparison_stage1/zcashd1_state.tar.gz b/qa/rpc-tests/cache/grpc_comparison_stage1/zcashd1_state.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9731c6b90b0ff80cc7196f9e15c1dbc1d9293064 GIT binary patch literal 180833 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

Q4Uls(FC7K>v+=mVQ5vG@{IzKROb*$oB)&>7y5d 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 nj{%XoXb literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/grpc_comparison.py b/qa/rpc-tests/grpc_comparison.py new file mode 100755 index 000000000..3b6e6133d --- /dev/null +++ b/qa/rpc-tests/grpc_comparison.py @@ -0,0 +1,1352 @@ +#!/usr/bin/env python3 +# Copyright (c) 2025 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +""" +gRPC parity test: compare CompactTxStreamer responses from Zainod and Lightwalletd +backed by the same Zebrad node. + +Mirrors the Rust test fixtures in client_rpc_test_fixtures, porting them to Python +so they run inside the existing BitcoinTestFramework CI pipeline. + +Chain setup (zcashd mines; all blocks are submitted to Zebrad via submitblock): + The fixture begins with 200 transparent coinbase blocks to the zcashd0 + wallet t-address (taddr), yielding 100 mature UTXOs by height 200. A second + standalone wallet (zcashd1) follows the same chain and owns the Orchard + account used for Orchard spends, matching the separation used by the working + Orchard wallet tests. + + The shielded fixture range then appends: + - t→Sapling funding via z_shieldcoinbase to sapling_ua0 + - extra t→Sapling funding via z_shieldcoinbase to sapling_ua_aux + - Sapling→Orchard cross-pool funding into orchard_addr0 + - Sapling→Sapling + - t→Orchard funding into orchard_ua_aux + - Orchard→Orchard + - Orchard→Sapling + - Sapling→t + - Orchard→t + +Chain caching: + After the first run the zcashd block data and chain metadata (addresses, txids, + heights) are saved to qa/rpc-tests/cache/grpc_comparison/. Subsequent runs + restore the zcashd state and skip block generation entirely, saving the time + spent on z_sendmany proof generation. Pass --fresh to force a rebuild and + overwrite the existing cache. + +Methods tested (CompactTxStreamer service): + GetLightdInfo, GetLatestBlock, GetBlock, GetBlockNullifiers, + GetBlockRange, GetBlockRangeNullifiers, + GetTransaction, GetTaddressTxids, GetTaddressBalance, GetTaddressBalanceStream, + GetTreeState, GetLatestTreeState, GetSubtreeRoots, + GetAddressUtxos, GetAddressUtxosStream + +Not yet tested (require a wallet to submit mempool transactions): + GetMempoolTx, GetMempoolStream +""" + +import json +import os +import shutil +import tarfile +import time +from difflib import unified_diff +from decimal import Decimal + +import grpc +from google.protobuf import text_format + +from test_framework.config import ZebraArgs +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + assert_equal, + assert_true, + get_coinbase_address, + initialize_chain, + persistent_cache_path, + persistent_cache_exists, + start_nodes, + start_zcashd_node, + stop_zcashd_node, + tarfile_extractall, + wait_and_assert_operationid_status, + zaino_grpc_port, +) +from test_framework.zip317 import ZIP_317_FEE, conventional_fee +from test_framework.proto import ( + compact_formats_pb2, + service_pb2, + service_pb2_grpc, +) + +_GRPC_CACHE_NAME = 'grpc_comparison' +_GRPC_STAGE1_CACHE_NAME = 'grpc_comparison_stage1' +_GRPC_ACTIVATION_HEIGHT = 2 +_GRPC_CACHE_VERSION = 8 # Bump when cached metadata/state layout changes incompatibly. +_GRPC_STAGE1_HEIGHT = 202 +_GRPC_T_TO_SAPLING_HEIGHT = 201 +_GRPC_SAPLING_TO_ORCHARD_HEIGHT = 203 +_GRPC_SAPLING_TO_SAPLING_HEIGHT = 204 +_GRPC_T_TO_ORCHARD_HEIGHT = 205 +_GRPC_ORCHARD_TO_ORCHARD_HEIGHT = 206 +_GRPC_ORCHARD_TO_SAPLING_HEIGHT = 207 +_GRPC_SAPLING_TO_T_HEIGHT = 208 +_GRPC_ORCHARD_TO_T_HEIGHT = 209 +_GRPC_ZCASHD_NUPARAMS = { + '5ba81b19': 1, # Overwinter + '76b809bb': 1, # Sapling + '2bb40e60': 1, # Blossom + 'f5b9230b': 1, # Heartwood + 'e9ff75a6': 1, # Canopy + 'c2d6d0b4': _GRPC_ACTIVATION_HEIGHT, # NU5 + 'c8e71055': _GRPC_ACTIVATION_HEIGHT, # NU6 +} + + +def _zcashd_available(): + """Return True if the standalone zcashd builder binary can be executed.""" + return ( + os.path.isfile(os.getenv("ZCASHD", os.path.join("src", "zcashd"))) or + shutil.which("zcashd") is not None + ) + + +def _skip_cached_runtime_files(tarinfo): + """Exclude runtime-only files from cached datadirs.""" + basename = os.path.basename(tarinfo.name) + if basename in ( + 'debug.log', + 'db.log', + 'peers.dat', + 'mempool.dat', + 'fee_estimates.dat', + ): + return None + if basename.endswith('.lock'): + return None + return tarinfo + + +def _submit_missing_blocks(src_node, dst_node): + """Submit any blocks missing from dst_node using raw blocks from src_node.""" + dst_height = dst_node.getblockcount() + src_height = src_node.getblockcount() + for height in range(dst_height + 1, src_height + 1): + raw_hex = src_node.getblock(str(height), 0) + result = dst_node.submitblock(raw_hex) + if result is not None: + raise Exception("submitblock to zcashd failed at height %d: %s" % (height, result)) + + +def _relay_raw_transaction(src_node, dst_node, txid): + """Relay a raw transaction from one standalone node to another.""" + raw_hex = src_node.getrawtransaction(txid) + relayed_txid = dst_node.sendrawtransaction(raw_hex, True) + assert_equal(txid, relayed_txid) + + +def _write_checkpoint_file(node, max_height, path): + """Write Zebra checkpoints from genesis through max_height to path.""" + with open(path, 'w', encoding='utf8') as f: + for height in range(0, max_height + 1): + f.write("%d %s\n" % (height, node.getblockhash(height))) + + +def _grpc_metadata_fields(): + """Metadata persisted alongside the cached fixture chain.""" + return ( + 'taddr', + 'sapling_ua0', 'sapling_ua_aux', 'orchard_ua1', 'orchard_ua_aux', + 'sapling_addr0', 'sapling_addr1', + 'orchard_addr0', 'orchard_addr1', '_orchard_aux_addr', + 't_to_sapling_txid', 't_to_sapling_height', + 't_to_orchard_txid', 't_to_orchard_height', + 'sapling_to_sapling_txid', 'sapling_to_sapling_height', + 'orchard_to_orchard_txid', 'orchard_to_orchard_height', + 'sapling_to_orchard_txid', 'sapling_to_orchard_height', + 'orchard_to_sapling_txid', 'orchard_to_sapling_height', + 'sapling_to_t_txid', 'sapling_to_t_height', + 'orchard_to_t_txid', 'orchard_to_t_height', + ) + + +def _collect_stream(streaming_call): + """Collect all messages from a server-streaming gRPC call into a list.""" + results = [] + for msg in streaming_call: + results.append(msg) + return results + + +def _strict_compact_block(block): + """Return a CompactBlock exactly as provided by the implementation.""" + strict = compact_formats_pb2.CompactBlock() + strict.CopyFrom(block) + return strict + + +def _compact_tx_summary(tx): + """Return a short one-line summary of a CompactTx for failure messages.""" + return ( + "index=%d txid=%s spends=%d outputs=%d actions=%d" + % (tx.index, tx.txid.hex(), len(tx.spends), len(tx.outputs), len(tx.actions)) + ) + + +def _protobuf_unified_diff(z_block, l_block, label, max_lines=200): + """Render a unified diff for two protobuf messages.""" + z_text = text_format.MessageToString(z_block) + l_text = text_format.MessageToString(l_block) + diff_lines = list(unified_diff( + z_text.splitlines(), + l_text.splitlines(), + fromfile="%s (Zainod)" % label, + tofile="%s (Lightwalletd)" % label, + lineterm="", + )) + if not diff_lines: + return " No unified diff available." + if len(diff_lines) > max_lines: + diff_lines = diff_lines[:max_lines] + ["... diff truncated after %d lines ..." % max_lines] + return "\n".join(diff_lines) + + +def _compact_block_mismatch_message(label, z_block, l_block): + """ + Summarize the first useful difference between two CompactBlocks. + + Keep this compact enough for CI logs while still pointing developers at the + exact block and CompactTx entry that diverged. + """ + lines = [ + "%s mismatch at height %d:" % (label, z_block.height), + " Zainod: protoVersion=%d hash=%s prevHash=%s vtx=%d" + % (z_block.protoVersion, z_block.hash.hex(), z_block.prevHash.hex(), len(z_block.vtx)), + " Lightwalletd: protoVersion=%d hash=%s prevHash=%s vtx=%d" + % (l_block.protoVersion, l_block.hash.hex(), l_block.prevHash.hex(), len(l_block.vtx)), + ] + + if z_block.hash != l_block.hash or z_block.prevHash != l_block.prevHash: + lines.append("") + lines.append(_protobuf_unified_diff(z_block, l_block, label)) + return "\n".join(lines) + + shared_len = min(len(z_block.vtx), len(l_block.vtx)) + for index in range(shared_len): + z_tx = z_block.vtx[index] + l_tx = l_block.vtx[index] + if z_tx != l_tx: + lines.extend([ + " First differing CompactTx:", + " Zainod[%d]: %s" % (index, _compact_tx_summary(z_tx)), + " Lightwalletd[%d]: %s" % (index, _compact_tx_summary(l_tx)), + ]) + lines.append("") + lines.append(_protobuf_unified_diff(z_block, l_block, label)) + return "\n".join(lines) + + if len(z_block.vtx) != len(l_block.vtx): + extra_side = "Zainod" if len(z_block.vtx) > len(l_block.vtx) else "Lightwalletd" + extra_txs = z_block.vtx[shared_len:] if len(z_block.vtx) > len(l_block.vtx) else l_block.vtx[shared_len:] + lines.append(" Extra CompactTx entries on %s:" % extra_side) + for tx in extra_txs[:3]: + lines.append(" %s" % _compact_tx_summary(tx)) + if len(extra_txs) > 3: + lines.append(" ... %d more" % (len(extra_txs) - 3)) + lines.append("") + lines.append(_protobuf_unified_diff(z_block, l_block, label)) + return "\n".join(lines) + + lines.append(" Blocks differ, but no shorter structured summary was found.") + lines.append("") + lines.append(_protobuf_unified_diff(z_block, l_block, label)) + return "\n".join(lines) + + +def _assert_compact_block_equal(label, z_block, l_block): + """Assert two CompactBlocks are identical, with a readable unified diff on failure.""" + if z_block != l_block: + raise AssertionError(_compact_block_mismatch_message(label, z_block, l_block)) + + +class GrpcComparisonTest(BitcoinTestFramework): + + def __init__(self): + super().__init__() + self.num_nodes = 1 + self.num_indexers = 1 # Zainod + self.num_lightwalletds = 1 # Lightwalletd + self.num_wallets = 0 + self.cache_behavior = 'clean' + + # Populated in setup_network (or restored from cache); used by test methods. + self.taddr = None # coinbase t-address (blocks 1–200) + self.txid = None # coinbase txid of block 1 (for GetTransaction) + self.sapling_ua0 = None # Sapling source used for the Sapling→Orchard funding tx + self.sapling_ua_aux = None # Sapling source used for later Sapling spends + self.orchard_ua1 = None # account 1 UA (spent from Orchard-funded account) + self.orchard_ua_aux = None # account 2 UA (spent from later Orchard-funded account) + self.sapling_addr0 = None # bare Sapling receiver of account 0 (funded at block 202) + self.sapling_addr1 = None # bare Sapling receiver of account 2 (receives at blocks 204, 206) + self.orchard_addr0 = None # bare Orchard receiver of account 1 (funded at blocks 201, 203) + self.orchard_addr1 = None # bare Orchard receiver of account 3 (receives at blocks 205, 203) + self._orchard_aux_addr = None # Orchard receiver used for the t→Orchard case and later Orchard spends + self.t_to_sapling_txid = None + self.t_to_sapling_height = None + self.t_to_orchard_txid = None + self.t_to_orchard_height = None + self.sapling_to_sapling_txid = None + self.sapling_to_sapling_height = None + self.orchard_to_orchard_txid = None + self.orchard_to_orchard_height = None + self.sapling_to_orchard_txid = None + self.sapling_to_orchard_height = None + self.orchard_to_sapling_txid = None + self.orchard_to_sapling_height = None + self.sapling_to_t_txid = None + self.sapling_to_t_height = None + self.orchard_to_t_txid = None + self.orchard_to_t_height = None + + self._chain_loaded_from_cache = False + self._stage1_loaded_from_cache = False + self._zebra_checkpoints = None + + def add_options(self, parser): + parser.add_option( + "--fresh", + dest="fresh", + default=False, + action="store_true", + help=( + "Discard cached chain state and rebuild from scratch. " + "The full cache lives at qa/rpc-tests/cache/%s/." % _GRPC_CACHE_NAME + ), + ) + + def setup_chain(self): + """Restore the final cache, fall back to the reusable stage-1 cache, or start clean.""" + cache_path = persistent_cache_path(_GRPC_CACHE_NAME) + if not self.options.fresh and persistent_cache_exists(_GRPC_CACHE_NAME): + try: + self._load_cached_metadata(cache_path) + print("grpc_comparison: loading chain from cache (%s)" % cache_path) + initialize_chain(self.options.tmpdir, self.num_nodes, + self.options.cachedir, 'clean') + self._restore_framework_cache(cache_path) + self._chain_loaded_from_cache = True + except (IOError, OSError, ValueError) as e: + print("grpc_comparison: ignoring incompatible full cache: %s" % str(e)) + initialize_chain(self.options.tmpdir, self.num_nodes, + self.options.cachedir, 'clean') + else: + initialize_chain(self.options.tmpdir, self.num_nodes, + self.options.cachedir, 'clean') + stage1_cache_path = persistent_cache_path(_GRPC_STAGE1_CACHE_NAME) + if (not self.options.fresh and + not self._chain_loaded_from_cache and + persistent_cache_exists(_GRPC_STAGE1_CACHE_NAME)): + try: + self._load_cached_metadata(stage1_cache_path) + print("grpc_comparison: loading stage-1 chain cache (%s)" % stage1_cache_path) + self._restore_stage1_cache(stage1_cache_path) + self._stage1_loaded_from_cache = True + except (IOError, OSError, ValueError) as e: + print("grpc_comparison: ignoring incompatible stage-1 cache: %s" % str(e)) + + if (not self._chain_loaded_from_cache and + not self._stage1_loaded_from_cache and + not _zcashd_available()): + raise Exception( + "grpc_comparison requires either qa/rpc-tests/cache/%s, " + "qa/rpc-tests/cache/%s, or a standalone zcashd binary to " + "rebuild the fixture." % (_GRPC_CACHE_NAME, _GRPC_STAGE1_CACHE_NAME) + ) + + def _load_cached_metadata(self, cache_path): + with open(os.path.join(cache_path, 'chain_metadata.json'), encoding='utf8') as f: + meta = json.load(f) + + if meta.get('cache_version') != _GRPC_CACHE_VERSION: + raise ValueError( + "cache version mismatch for %s: found %r, expected %r" + % (cache_path, meta.get('cache_version'), _GRPC_CACHE_VERSION) + ) + + for field in _grpc_metadata_fields(): + setattr(self, field, meta.get(field)) + + def _write_cached_metadata(self, cache_path): + meta = {field: getattr(self, field) for field in _grpc_metadata_fields()} + meta['cache_version'] = _GRPC_CACHE_VERSION + with open(os.path.join(cache_path, 'chain_metadata.json'), 'w', encoding='utf8') as f: + json.dump(meta, f, indent=2) + + def _persist_framework_cache(self): + cache_path = persistent_cache_path(_GRPC_CACHE_NAME) + if os.path.isdir(cache_path): + import shutil + shutil.rmtree(cache_path) + os.makedirs(cache_path) + + src = os.path.join(self.options.tmpdir, 'node0') + + with tarfile.open(os.path.join(cache_path, 'zebrad_state.tar.gz'), 'w:gz') as tf: + tf.add(src, arcname='node0', filter=_skip_cached_runtime_files) + + self._write_cached_metadata(cache_path) + + def _restore_framework_cache(self, cache_path): + with tarfile.open(os.path.join(cache_path, 'zebrad_state.tar.gz'), 'r:gz') as tf: + tarfile_extractall(tf, self.options.tmpdir) + + def _restore_stage1_cache(self, cache_path): + self._load_cached_metadata(cache_path) + for index in range(2): + with tarfile.open(os.path.join(cache_path, 'zcashd%d_state.tar.gz' % index), 'r:gz') as tf: + tarfile_extractall(tf, self.options.tmpdir) + + def _start_build_nodes(self): + return [ + start_zcashd_node(0, self.options.tmpdir, activation_heights=_GRPC_ZCASHD_NUPARAMS), + start_zcashd_node(1, self.options.tmpdir, activation_heights=_GRPC_ZCASHD_NUPARAMS), + ] + + def _wait_for_build_nodes_height(self, build_nodes, expected_height, timeout=30): + deadline = time.time() + timeout + while time.time() < deadline: + heights = [node.getblockcount() for node in build_nodes] + if heights == [expected_height] * len(build_nodes): + return + time.sleep(1) + raise AssertionError( + "standalone zcashd nodes did not reach height %d: %s" + % (expected_height, heights) + ) + + def _restart_build_node(self, build_nodes, index): + """Restart a standalone builder node so its wallet reloads note state from disk.""" + stop_zcashd_node(index, build_nodes[index]) + build_nodes[index] = start_zcashd_node( + index, + self.options.tmpdir, + activation_heights=_GRPC_ZCASHD_NUPARAMS, + ) + return build_nodes[index] + + def _mine_and_sync_build_nodes(self, miner, build_nodes): + """Mine one block on the canonical builder node and submit it to the follower node.""" + miner.generate(1) + _submit_missing_blocks(build_nodes[0], build_nodes[1]) + return build_nodes[0].getblockcount() + + def _persist_stage1_cache(self, build_nodes): + print("grpc_comparison: persisting stage-1 wallet cache") + for index, node in enumerate(build_nodes): + stop_zcashd_node(index, node) + + cache_path = persistent_cache_path(_GRPC_STAGE1_CACHE_NAME) + if os.path.isdir(cache_path): + import shutil + shutil.rmtree(cache_path) + os.makedirs(cache_path) + + for index in range(2): + src = os.path.join(self.options.tmpdir, 'zcashd%d' % index) + with tarfile.open(os.path.join(cache_path, 'zcashd%d_state.tar.gz' % index), 'w:gz') as tf: + tf.add(src, arcname='zcashd%d' % index, filter=_skip_cached_runtime_files) + + self._write_cached_metadata(cache_path) + build_nodes = self._start_build_nodes() + self._wait_for_build_nodes_height(build_nodes, _GRPC_STAGE1_HEIGHT) + return build_nodes + + def _build_stage1_with_wallet_nodes(self): + """ + Build the reusable prefix of the fixture chain. + + Stage 1 does the slow work: mine 200 transparent blocks and create two + independent Sapling note pools. Subsequent reruns can resume from this + point without repeating the expensive proof generation. + """ + build_nodes = self._start_build_nodes() + node0, node1 = build_nodes + + assert_equal(node0.getblockcount(), 0) + print("grpc_comparison: mining initial transparent chain (200 blocks)") + node0.generate(200) + _submit_missing_blocks(node0, node1) + + print("grpc_comparison: deriving Sapling and Orchard fixture addresses") + self.taddr = get_coinbase_address(node0) + self.txid = node0.getblock("1")['tx'][0] + + self.sapling_ua0 = node0.z_getnewaddress('sapling') + self.sapling_addr0 = self.sapling_ua0 + + self.sapling_ua_aux = node0.z_getnewaddress('sapling') + self.sapling_addr1 = node0.z_getnewaddress('sapling') + + orchard_acct1 = node1.z_getnewaccount()['account'] + self.orchard_ua1 = node1.z_getaddressforaccount(orchard_acct1, ['orchard'])['address'] + self.orchard_addr0 = node1.z_listunifiedreceivers(self.orchard_ua1)['orchard'] + + orchard_aux_acct = node1.z_getnewaccount()['account'] + self.orchard_ua_aux = node1.z_getaddressforaccount(orchard_aux_acct, ['orchard'])['address'] + self._orchard_aux_addr = node1.z_listunifiedreceivers(self.orchard_ua_aux)['orchard'] + + orchard_acct2 = node1.z_getnewaccount()['account'] + orchard_ua2 = node1.z_getaddressforaccount(orchard_acct2, ['orchard'])['address'] + self.orchard_addr1 = node1.z_listunifiedreceivers(orchard_ua2)['orchard'] + + print("grpc_comparison: funding primary Sapling pool from transparent coinbase") + sapling_shield_fee = conventional_fee(4) + sapling_shield_amount = Decimal('12.5') - sapling_shield_fee + self.t_to_sapling_txid = wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.taddr, + [{"address": self.sapling_ua0, "amount": sapling_shield_amount}], + 10, + sapling_shield_fee, + 'AllowRevealedSenders', + ), + ) + self.t_to_sapling_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.t_to_sapling_height, _GRPC_T_TO_SAPLING_HEIGHT) + + print("grpc_comparison: restarting primary builder wallet before auxiliary Sapling funding") + node0 = self._restart_build_node(build_nodes, 0) + assert_equal(node0.getblockcount(), self.t_to_sapling_height) + + print("grpc_comparison: funding auxiliary Sapling pool from transparent coinbase") + wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.taddr, + [{"address": self.sapling_ua_aux, "amount": sapling_shield_amount}], + 10, + sapling_shield_fee, + 'AllowRevealedSenders', + ), + ) + assert_equal(self._mine_and_sync_build_nodes(node0, build_nodes), _GRPC_STAGE1_HEIGHT) + + return build_nodes + + def _complete_chain_from_stage1(self, build_nodes): + """Build the shielded transaction range used by the parity assertions.""" + node0, node1 = build_nodes + assert_equal(node0.getblockcount(), _GRPC_STAGE1_HEIGHT) + _submit_missing_blocks(node0, node1) + assert_equal(node1.getblockcount(), _GRPC_STAGE1_HEIGHT) + + fund = Decimal('0.1') + amount = Decimal('0.01') + sapling_to_orchard_fee = conventional_fee(4) + + print("grpc_comparison: building Sapling -> Orchard funding transaction") + self.sapling_to_orchard_txid = wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.sapling_ua0, + [{"address": self.orchard_addr0, "amount": fund}], + 1, + sapling_to_orchard_fee, + 'AllowRevealedAmounts', + ), + ) + self.sapling_to_orchard_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.sapling_to_orchard_height, _GRPC_SAPLING_TO_ORCHARD_HEIGHT) + + print("grpc_comparison: building Sapling -> Sapling transaction") + self.sapling_to_sapling_txid = wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.sapling_ua_aux, + [{"address": self.sapling_addr1, "amount": amount}], + 1, + ZIP_317_FEE, + ), + ) + self.sapling_to_sapling_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.sapling_to_sapling_height, _GRPC_SAPLING_TO_SAPLING_HEIGHT) + + orchard_fee = conventional_fee(4) + orchard_amount = Decimal('12.5') - orchard_fee + print("grpc_comparison: building transparent -> Orchard transaction") + self.t_to_orchard_txid = wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.taddr, + [{"address": self.orchard_ua_aux, "amount": orchard_amount}], + 1, + orchard_fee, + 'NoPrivacy', + ), + ) + self.t_to_orchard_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.t_to_orchard_height, _GRPC_T_TO_ORCHARD_HEIGHT) + # Restart the Orchard-owning wallet after funding lands so it reloads + # its Orchard note state before the first Orchard spend. + node1 = self._restart_build_node(build_nodes, 1) + assert_equal(node1.getblockcount(), node0.getblockcount()) + + print("grpc_comparison: building Orchard -> Orchard transaction") + self.orchard_to_orchard_txid = wait_and_assert_operationid_status( + node1, + node1.z_sendmany( + self.orchard_ua1, + [{"address": self.orchard_addr1, "amount": amount}], + 1, + ZIP_317_FEE, + ), + ) + _relay_raw_transaction(node1, node0, self.orchard_to_orchard_txid) + self.orchard_to_orchard_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.orchard_to_orchard_height, _GRPC_ORCHARD_TO_ORCHARD_HEIGHT) + + node1 = self._restart_build_node(build_nodes, 1) + assert_equal(node1.getblockcount(), node0.getblockcount()) + + print("grpc_comparison: building Orchard -> Sapling transaction") + self.orchard_to_sapling_txid = wait_and_assert_operationid_status( + node1, + node1.z_sendmany( + self.orchard_ua1, + [{"address": self.sapling_addr1, "amount": amount}], + 1, + ZIP_317_FEE, + 'AllowRevealedAmounts', + ), + ) + _relay_raw_transaction(node1, node0, self.orchard_to_sapling_txid) + self.orchard_to_sapling_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.orchard_to_sapling_height, _GRPC_ORCHARD_TO_SAPLING_HEIGHT) + + node1 = self._restart_build_node(build_nodes, 1) + assert_equal(node1.getblockcount(), node0.getblockcount()) + + print("grpc_comparison: building Sapling -> transparent transaction") + self.sapling_to_t_txid = wait_and_assert_operationid_status( + node0, + node0.z_sendmany( + self.sapling_ua_aux, + [{"address": self.taddr, "amount": amount}], + 1, + ZIP_317_FEE, + 'AllowRevealedRecipients', + ), + ) + self.sapling_to_t_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.sapling_to_t_height, _GRPC_SAPLING_TO_T_HEIGHT) + + print("grpc_comparison: building Orchard -> transparent transaction") + self.orchard_to_t_txid = wait_and_assert_operationid_status( + node1, + node1.z_sendmany( + self.orchard_ua1, + [{"address": self.taddr, "amount": amount}], + 1, + ZIP_317_FEE, + 'AllowRevealedRecipients', + ), + ) + _relay_raw_transaction(node1, node0, self.orchard_to_t_txid) + self.orchard_to_t_height = self._mine_and_sync_build_nodes(node0, build_nodes) + assert_equal(self.orchard_to_t_height, _GRPC_ORCHARD_TO_T_HEIGHT) + + def setup_nodes(self): + # Match Zebra regtest defaults up to Canopy, and activate Orchard-era + # upgrades at the start of the shielded fixture range. + args = [ZebraArgs(activation_heights={ + "NU5": _GRPC_ACTIVATION_HEIGHT, + "NU6": _GRPC_ACTIVATION_HEIGHT, + }, checkpoints=self._zebra_checkpoints) for _ in range(self.num_nodes)] + return start_nodes(self.num_nodes, self.options.tmpdir, + args) + + def setup_network(self, split=False): + self.wallets = [] # no wallets used; required for teardown + self.nodes = [] + self.zcashd_nodes = [] + if self._chain_loaded_from_cache: + print("grpc_comparison: restoring Zebrad chain from cache") + self.nodes = self.setup_nodes() + self.txid = self.nodes[0].getblock("1")['tx'][0] + else: + if self._stage1_loaded_from_cache: + print("grpc_comparison: resuming from stage-1 wallet cache") + build_nodes = self._start_build_nodes() + self._wait_for_build_nodes_height(build_nodes, _GRPC_STAGE1_HEIGHT) + else: + print("grpc_comparison: building fresh stage-1 fixture chain with standalone zcashd") + build_nodes = self._build_stage1_with_wallet_nodes() + build_nodes = self._persist_stage1_cache(build_nodes) + try: + print("grpc_comparison: building stage-2 shielded transactions") + self._complete_chain_from_stage1(build_nodes) + # TODO: Re-home this fixture once standalone zcashd is retired. + # Today we still rely on standalone zcashd to author the + # shielded transactions, then replay the resulting chain into + # Zebrad for the actual parity checks. + # + # Zebra and standalone zcashd disagree on regtest difficulty + # throughout this standalone fixture, so replay via checkpoints + # before starting the downstream indexers. + checkpoint_path = os.path.join(self.options.tmpdir, 'grpc_comparison_checkpoints.txt') + _write_checkpoint_file(build_nodes[0], build_nodes[0].getblockcount(), checkpoint_path) + self._zebra_checkpoints = checkpoint_path + print("grpc_comparison: starting Zebrad") + self.nodes = self.setup_nodes() + print("grpc_comparison: replaying built chain into Zebrad") + _submit_missing_blocks(build_nodes[0], self.nodes[0]) + assert_equal(self.nodes[0].getblockcount(), build_nodes[0].getblockcount()) + print("grpc_comparison: waiting for Zebrad tip") + self._wait_for_zebra_tip(build_nodes[0].getblockcount()) + finally: + for index, node in enumerate(build_nodes): + stop_zcashd_node(index, node) + print("grpc_comparison: persisting fresh Zebrad cache") + self._persist_framework_cache() + self.txid = self.nodes[0].getblock("1")['tx'][0] + + print("grpc_comparison: waiting for restored Zebrad tip before starting indexers") + self._wait_for_zebra_tip(self.orchard_to_t_height) + self.zainos = self.setup_indexers() + self.lwds = self.setup_lightwalletds() + + # Wait for both indexers to sync to the chain tip before running tests. + self._wait_for_indexers(self.nodes[0].getblockcount()) + + def _wait_for_indexers(self, expected_height, timeout=60): + """Block until both Zainod and Lightwalletd report the expected block height.""" + print("grpc_comparison: waiting for indexers to sync to height %d" % expected_height) + zainod_ch = grpc.insecure_channel(f"127.0.0.1:{zaino_grpc_port(0)}") + lwd_ch = grpc.insecure_channel(f"127.0.0.1:{self.lwds[0]}") + try: + zs = service_pb2_grpc.CompactTxStreamerStub(zainod_ch) + ls = service_pb2_grpc.CompactTxStreamerStub(lwd_ch) + + deadline = time.time() + timeout + last_zainod_height = None + last_lightwalletd_height = None + last_zainod_error = None + last_lightwalletd_error = None + while time.time() < deadline: + try: + z_info = zs.GetLightdInfo(service_pb2.Empty(), timeout=5) + last_zainod_height = z_info.blockHeight + last_zainod_error = None + except grpc.RpcError as e: + last_zainod_error = e + z_info = None + + try: + l_info = ls.GetLightdInfo(service_pb2.Empty(), timeout=5) + last_lightwalletd_height = l_info.blockHeight + last_lightwalletd_error = None + except grpc.RpcError as e: + last_lightwalletd_error = e + l_info = None + + if (z_info is not None and l_info is not None and + z_info.blockHeight >= expected_height and + l_info.blockHeight >= expected_height): + return + time.sleep(1) + + raise Exception( + "Indexers did not sync to height {} within {}s " + "(last zainod height: {}, last lightwalletd height: {}, " + "last zainod error: {}, last lightwalletd error: {})".format( + expected_height, + timeout, + last_zainod_height, + last_lightwalletd_height, + last_zainod_error, + last_lightwalletd_error, + ) + ) + finally: + zainod_ch.close() + lwd_ch.close() + + def _wait_for_zebra_tip(self, expected_height, timeout=30): + """Wait until Zebrad reports the expected tip height.""" + zebra = self.nodes[0] + deadline = time.time() + timeout + last_height = None + while time.time() < deadline: + last_height = zebra.getblockcount() + if last_height >= expected_height: + return + time.sleep(1) + + raise AssertionError( + "Zebrad did not reach height %d within %ds (last height %s)" + % (expected_height, timeout, last_height) + ) + + def _run_checks(self, checks): + """Run a sequence of labeled test helpers in order.""" + for label, method in checks: + print("Testing %s..." % label) + method() + + def run_test(self): + zainod_ch = grpc.insecure_channel(f"127.0.0.1:{zaino_grpc_port(0)}") + lwd_ch = grpc.insecure_channel(f"127.0.0.1:{self.lwds[0]}") + zs = service_pb2_grpc.CompactTxStreamerStub(zainod_ch) + ls = service_pb2_grpc.CompactTxStreamerStub(lwd_ch) + + # Start with chain-wide parity checks on transparent and metadata APIs. + self._run_checks([ + ("GetLightdInfo", lambda: self.test_get_lightd_info(zs, ls)), + ("GetLatestBlock", lambda: self.test_get_latest_block(zs, ls)), + ("GetBlock", lambda: self.test_get_block(zs, ls)), + ("GetBlock (out of bounds)", lambda: self.test_get_block_out_of_bounds(zs, ls)), + ("GetBlockNullifiers", lambda: self.test_get_block_nullifiers(zs, ls)), + ("GetBlockRange (forward)", lambda: self.test_get_block_range(zs, ls)), + ("GetBlockRange (reverse)", lambda: self.test_get_block_range_reverse(zs, ls)), + ("GetBlockRange (out of bounds)", lambda: self.test_get_block_range_out_of_bounds(zs, ls)), + ("GetBlockRangeNullifiers", lambda: self.test_get_block_range_nullifiers(zs, ls)), + ("GetBlockRangeNullifiers (reverse)", lambda: self.test_get_block_range_nullifiers_reverse(zs, ls)), + ("GetTransaction", lambda: self.test_get_transaction(zs, ls)), + ("GetTaddressTxids (full range)", lambda: self.test_get_taddress_txids(zs, ls)), + ("GetTaddressTxids (tip-only range)", lambda: self.test_get_taddress_txids_tip_only(zs, ls)), + ("GetTaddressTxids (genesis-only range)", lambda: self.test_get_taddress_txids_genesis_only(zs, ls)), + ("GetTaddressBalance", lambda: self.test_get_taddress_balance(zs, ls)), + ("GetTaddressBalanceStream", lambda: self.test_get_taddress_balance_stream(zs, ls)), + ("GetTreeState (by height)", lambda: self.test_get_tree_state_by_height(zs, ls)), + ("GetTreeState (out of bounds)", lambda: self.test_get_tree_state_out_of_bounds(zs, ls)), + ("GetLatestTreeState", lambda: self.test_get_latest_tree_state(zs, ls)), + ("GetSubtreeRoots (sapling)", lambda: self.test_get_subtree_roots_sapling(zs, ls)), + ("GetSubtreeRoots (orchard)", lambda: self.test_get_subtree_roots_orchard(zs, ls)), + ("GetAddressUtxos", lambda: self.test_get_address_utxos(zs, ls)), + ("GetAddressUtxosStream", lambda: self.test_get_address_utxos_stream(zs, ls)), + ]) + + # Then walk the shielded fixture in chain order so each assertion lines + # up with the block narrative at the top of the file. + self._run_checks([ + ("GetBlock (t→Sapling, block %d)" % self.t_to_sapling_height, + lambda: self.test_get_block_t_to_sapling(zs, ls)), + ("GetBlockNullifiers (t→Sapling)", + lambda: self.test_get_block_nullifiers_t_to_sapling(zs, ls)), + ("GetBlockRange (shielded range %d–%d)" % (self.t_to_sapling_height, self.orchard_to_t_height), + lambda: self.test_get_block_range_shielded(zs, ls)), + ("GetTransaction (t→Sapling)", + lambda: self.test_get_transaction_t_to_sapling(zs, ls)), + ("GetTreeState (after t→Sapling, block %d)" % self.t_to_sapling_height, + lambda: self.test_get_tree_state_after_t_to_sapling(zs, ls)), + ("GetBlock (Sapling→Orchard, block %d)" % self.sapling_to_orchard_height, + lambda: self.test_get_block_sapling_to_orchard(zs, ls)), + ("GetTransaction (Sapling→Orchard)", + lambda: self.test_get_transaction_sapling_to_orchard(zs, ls)), + ("GetBlock (Sapling→Sapling, block %d)" % self.sapling_to_sapling_height, + lambda: self.test_get_block_sapling_to_sapling(zs, ls)), + ("GetTransaction (Sapling→Sapling)", + lambda: self.test_get_transaction_sapling_to_sapling(zs, ls)), + ("GetBlock (t→Orchard, block %d)" % self.t_to_orchard_height, + lambda: self.test_get_block_t_to_orchard(zs, ls)), + ("GetTransaction (t→Orchard)", + lambda: self.test_get_transaction_t_to_orchard(zs, ls)), + ("GetTreeState (after t→Orchard, block %d)" % self.t_to_orchard_height, + lambda: self.test_get_tree_state_after_t_to_orchard(zs, ls)), + ("GetBlock (Orchard→Orchard, block %d)" % self.orchard_to_orchard_height, + lambda: self.test_get_block_orchard_to_orchard(zs, ls)), + ("GetTransaction (Orchard→Orchard)", + lambda: self.test_get_transaction_orchard_to_orchard(zs, ls)), + ("GetBlock (Orchard→Sapling, block %d)" % self.orchard_to_sapling_height, + lambda: self.test_get_block_orchard_to_sapling(zs, ls)), + ("GetTransaction (Orchard→Sapling)", + lambda: self.test_get_transaction_orchard_to_sapling(zs, ls)), + ("GetBlock (Sapling→t, block %d)" % self.sapling_to_t_height, + lambda: self.test_get_block_sapling_to_t(zs, ls)), + ("GetTransaction (Sapling→t)", + lambda: self.test_get_transaction_sapling_to_t(zs, ls)), + ("GetBlock (Orchard→t, block %d)" % self.orchard_to_t_height, + lambda: self.test_get_block_orchard_to_t(zs, ls)), + ("GetTransaction (Orchard→t)", + lambda: self.test_get_transaction_orchard_to_t(zs, ls)), + ]) + + # TODO: GetMempoolTx and GetMempoolStream require submitting a transaction + # to the mempool via the mempool RPC. + + zainod_ch.close() + lwd_ch.close() + + # ------------------------------------------------------------------------- + # Test methods + # ------------------------------------------------------------------------- + + def test_get_lightd_info(self, zs, ls): + z = zs.GetLightdInfo(service_pb2.Empty()) + l = ls.GetLightdInfo(service_pb2.Empty()) + + # Implementation-specific fields are intentionally skipped: + # version, vendor, git_commit, branch, build_date, build_user, + # zcashd_build, zcashd_subversion, donation_address, + # lightwallet_protocol_version + assert_equal(z.taddrSupport, l.taddrSupport) + assert_equal(z.chainName, l.chainName) + assert_equal(z.saplingActivationHeight, l.saplingActivationHeight) + assert_equal(z.consensusBranchId, l.consensusBranchId) + assert_equal(z.blockHeight, l.blockHeight) + assert_equal(z.estimatedHeight, l.estimatedHeight) + + def test_get_latest_block(self, zs, ls): + z = zs.GetLatestBlock(service_pb2.ChainSpec()) + l = ls.GetLatestBlock(service_pb2.ChainSpec()) + assert_equal(z.height, l.height) + assert_equal(z.hash, l.hash) + + def test_get_block(self, zs, ls): + req = service_pb2.BlockID(height=5, hash=b"") + z = _strict_compact_block(zs.GetBlock(req)) + l = _strict_compact_block(ls.GetBlock(req)) + _assert_compact_block_equal("GetBlock", z, l) + + def test_get_block_out_of_bounds(self, zs, ls): + # Height beyond chain tip — both must respond with a gRPC error. + # Note: Zainod returns OUT_OF_RANGE; Lightwalletd returns INVALID_ARGUMENT. + # We only assert that both raise an error, not that the codes match. + chain_height = self.nodes[0].getblockcount() + req = service_pb2.BlockID(height=chain_height + 1000, hash=b"") + try: + zs.GetBlock(req) + raise AssertionError("Zainod did not error on out-of-range GetBlock") + except grpc.RpcError: + pass + try: + ls.GetBlock(req) + raise AssertionError("Lightwalletd did not error on out-of-range GetBlock") + except grpc.RpcError: + pass + + def test_get_block_nullifiers(self, zs, ls): + req = service_pb2.BlockID(height=5, hash=b"") + z = _strict_compact_block(zs.GetBlockNullifiers(req)) + l = _strict_compact_block(ls.GetBlockNullifiers(req)) + _assert_compact_block_equal("GetBlockNullifiers", z, l) + + def test_get_block_range(self, zs, ls): + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=1, hash=b""), + end=service_pb2.BlockID(height=10, hash=b""), + ) + z_blocks = [_strict_compact_block(b) for b in _collect_stream(zs.GetBlockRange(req))] + l_blocks = [_strict_compact_block(b) for b in _collect_stream(ls.GetBlockRange(req))] + assert_equal(len(z_blocks), len(l_blocks)) + for z_b, l_b in zip(z_blocks, l_blocks): + _assert_compact_block_equal("GetBlockRange", z_b, l_b) + + def test_get_block_range_reverse(self, zs, ls): + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=10, hash=b""), + end=service_pb2.BlockID(height=1, hash=b""), + ) + z_blocks = [_strict_compact_block(b) for b in _collect_stream(zs.GetBlockRange(req))] + l_blocks = [_strict_compact_block(b) for b in _collect_stream(ls.GetBlockRange(req))] + assert_equal(len(z_blocks), len(l_blocks)) + for z_b, l_b in zip(z_blocks, l_blocks): + _assert_compact_block_equal("GetBlockRange reverse", z_b, l_b) + + def test_get_block_range_out_of_bounds(self, zs, ls): + # Both must respond with a gRPC error when the range exceeds the chain tip. + # Note: implementations may return different status codes (OUT_OF_RANGE vs + # INVALID_ARGUMENT), so we only assert that both raise an error. + chain_height = self.nodes[0].getblockcount() + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=1, hash=b""), + end=service_pb2.BlockID(height=chain_height + 1000, hash=b""), + ) + try: + list(zs.GetBlockRange(req)) + raise AssertionError("Zainod did not error on out-of-range GetBlockRange") + except grpc.RpcError: + pass + try: + list(ls.GetBlockRange(req)) + raise AssertionError("Lightwalletd did not error on out-of-range GetBlockRange") + except grpc.RpcError: + pass + + def test_get_block_range_nullifiers(self, zs, ls): + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=1, hash=b""), + end=service_pb2.BlockID(height=10, hash=b""), + ) + z_blocks = [_strict_compact_block(b) for b in _collect_stream(zs.GetBlockRangeNullifiers(req))] + l_blocks = [_strict_compact_block(b) for b in _collect_stream(ls.GetBlockRangeNullifiers(req))] + assert_equal(len(z_blocks), len(l_blocks)) + for z_b, l_b in zip(z_blocks, l_blocks): + _assert_compact_block_equal("GetBlockRangeNullifiers", z_b, l_b) + + def test_get_block_range_nullifiers_reverse(self, zs, ls): + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=10, hash=b""), + end=service_pb2.BlockID(height=1, hash=b""), + ) + z_blocks = [_strict_compact_block(b) for b in _collect_stream(zs.GetBlockRangeNullifiers(req))] + l_blocks = [_strict_compact_block(b) for b in _collect_stream(ls.GetBlockRangeNullifiers(req))] + assert_equal(len(z_blocks), len(l_blocks)) + for z_b, l_b in zip(z_blocks, l_blocks): + _assert_compact_block_equal("GetBlockRangeNullifiers reverse", z_b, l_b) + + def test_get_transaction(self, zs, ls): + # self.txid is a hex string; the TxFilter expects bytes in little-endian order + txid_bytes = bytes.fromhex(self.txid)[::-1] + req = service_pb2.TxFilter(hash=txid_bytes) + z = zs.GetTransaction(req) + l = ls.GetTransaction(req) + assert_equal(z.data, l.data) + assert_equal(z.height, l.height) + + def test_get_taddress_txids(self, zs, ls): + req = service_pb2.TransparentAddressBlockFilter( + address=self.taddr, + range=service_pb2.BlockRange( + start=service_pb2.BlockID(height=1, hash=b""), + end=service_pb2.BlockID(height=self.nodes[0].getblockcount(), hash=b""), + ), + ) + z_txs = _collect_stream(zs.GetTaddressTxids(req)) + l_txs = _collect_stream(ls.GetTaddressTxids(req)) + assert_equal(len(z_txs), len(l_txs)) + for z_tx, l_tx in zip(z_txs, l_txs): + assert_equal(z_tx.data, l_tx.data) + assert_equal(z_tx.height, l_tx.height) + + def test_get_taddress_txids_tip_only(self, zs, ls): + tip = self.nodes[0].getblockcount() + req = service_pb2.TransparentAddressBlockFilter( + address=self.taddr, + range=service_pb2.BlockRange( + start=service_pb2.BlockID(height=tip, hash=b""), + end=service_pb2.BlockID(height=tip, hash=b""), + ), + ) + z_txs = _collect_stream(zs.GetTaddressTxids(req)) + l_txs = _collect_stream(ls.GetTaddressTxids(req)) + assert_equal(len(z_txs), len(l_txs)) + for z_tx, l_tx in zip(z_txs, l_txs): + assert_equal(z_tx.data, l_tx.data) + assert_equal(z_tx.height, l_tx.height) + + def test_get_taddress_txids_genesis_only(self, zs, ls): + req = service_pb2.TransparentAddressBlockFilter( + address=self.taddr, + range=service_pb2.BlockRange( + start=service_pb2.BlockID(height=1, hash=b""), + end=service_pb2.BlockID(height=1, hash=b""), + ), + ) + z_txs = _collect_stream(zs.GetTaddressTxids(req)) + l_txs = _collect_stream(ls.GetTaddressTxids(req)) + assert_equal(len(z_txs), len(l_txs)) + for z_tx, l_tx in zip(z_txs, l_txs): + assert_equal(z_tx.data, l_tx.data) + assert_equal(z_tx.height, l_tx.height) + + def test_get_taddress_balance(self, zs, ls): + req = service_pb2.AddressList(addresses=[self.taddr]) + z = zs.GetTaddressBalance(req) + l = ls.GetTaddressBalance(req) + assert_equal(z.valueZat, l.valueZat) + + def test_get_taddress_balance_stream(self, zs, ls): + def addr_iter(): + yield service_pb2.Address(address=self.taddr) + + z = zs.GetTaddressBalanceStream(addr_iter()) + l = ls.GetTaddressBalanceStream(addr_iter()) + assert_equal(z.valueZat, l.valueZat) + + def test_get_tree_state_by_height(self, zs, ls): + req = service_pb2.BlockID(height=10, hash=b"") + z = zs.GetTreeState(req) + l = ls.GetTreeState(req) + assert_equal(z.network, l.network) + assert_equal(z.height, l.height) + assert_equal(z.hash, l.hash) + assert_equal(z.time, l.time) + assert_equal(z.saplingTree, l.saplingTree) + assert_equal(z.orchardTree, l.orchardTree) + + def test_get_tree_state_out_of_bounds(self, zs, ls): + # Both must respond with a gRPC error for an out-of-range height. + # Note: Zainod returns OUT_OF_RANGE; Lightwalletd returns INVALID_ARGUMENT. + chain_height = self.nodes[0].getblockcount() + req = service_pb2.BlockID(height=chain_height + 1000, hash=b"") + try: + zs.GetTreeState(req) + raise AssertionError("Zainod did not error on out-of-range GetTreeState") + except grpc.RpcError: + pass + try: + ls.GetTreeState(req) + raise AssertionError("Lightwalletd did not error on out-of-range GetTreeState") + except grpc.RpcError: + pass + + def test_get_latest_tree_state(self, zs, ls): + z = zs.GetLatestTreeState(service_pb2.Empty()) + l = ls.GetLatestTreeState(service_pb2.Empty()) + assert_equal(z.network, l.network) + assert_equal(z.height, l.height) + assert_equal(z.hash, l.hash) + assert_equal(z.saplingTree, l.saplingTree) + assert_equal(z.orchardTree, l.orchardTree) + + def test_get_subtree_roots_sapling(self, zs, ls): + req = service_pb2.GetSubtreeRootsArg( + startIndex=0, + shieldedProtocol=service_pb2.ShieldedProtocol.sapling, + maxEntries=0, + ) + z_roots = _collect_stream(zs.GetSubtreeRoots(req)) + l_roots = _collect_stream(ls.GetSubtreeRoots(req)) + assert_equal(len(z_roots), len(l_roots)) + for z_r, l_r in zip(z_roots, l_roots): + assert_equal(z_r.rootHash, l_r.rootHash) + assert_equal(z_r.completingBlockHash, l_r.completingBlockHash) + assert_equal(z_r.completingBlockHeight, l_r.completingBlockHeight) + + def test_get_subtree_roots_orchard(self, zs, ls): + req = service_pb2.GetSubtreeRootsArg( + startIndex=0, + shieldedProtocol=service_pb2.ShieldedProtocol.orchard, + maxEntries=0, + ) + z_roots = _collect_stream(zs.GetSubtreeRoots(req)) + l_roots = _collect_stream(ls.GetSubtreeRoots(req)) + assert_equal(len(z_roots), len(l_roots)) + for z_r, l_r in zip(z_roots, l_roots): + assert_equal(z_r.rootHash, l_r.rootHash) + assert_equal(z_r.completingBlockHash, l_r.completingBlockHash) + assert_equal(z_r.completingBlockHeight, l_r.completingBlockHeight) + + def test_get_address_utxos(self, zs, ls): + req = service_pb2.GetAddressUtxosArg( + addresses=[self.taddr], + startHeight=1, + maxEntries=0, + ) + z = zs.GetAddressUtxos(req) + l = ls.GetAddressUtxos(req) + assert_equal(len(z.addressUtxos), len(l.addressUtxos)) + z_sorted = sorted(z.addressUtxos, key=lambda u: (u.txid, u.index)) + l_sorted = sorted(l.addressUtxos, key=lambda u: (u.txid, u.index)) + for z_u, l_u in zip(z_sorted, l_sorted): + assert_equal(z_u.address, l_u.address) + assert_equal(z_u.txid, l_u.txid) + assert_equal(z_u.index, l_u.index) + assert_equal(z_u.script, l_u.script) + assert_equal(z_u.valueZat, l_u.valueZat) + assert_equal(z_u.height, l_u.height) + + def test_get_address_utxos_stream(self, zs, ls): + req = service_pb2.GetAddressUtxosArg( + addresses=[self.taddr], + startHeight=1, + maxEntries=0, + ) + z_utxos = _collect_stream(zs.GetAddressUtxosStream(req)) + l_utxos = _collect_stream(ls.GetAddressUtxosStream(req)) + assert_equal(len(z_utxos), len(l_utxos)) + z_sorted = sorted(z_utxos, key=lambda u: (u.txid, u.index)) + l_sorted = sorted(l_utxos, key=lambda u: (u.txid, u.index)) + for z_u, l_u in zip(z_sorted, l_sorted): + assert_equal(z_u.address, l_u.address) + assert_equal(z_u.txid, l_u.txid) + assert_equal(z_u.index, l_u.index) + assert_equal(z_u.script, l_u.script) + assert_equal(z_u.valueZat, l_u.valueZat) + assert_equal(z_u.height, l_u.height) + + # ------------------------------------------------------------------------- + # Shielded transaction tests (the shielded fixture range) + # + # Every block in the shielded range has at least one shielded component + # (Sapling spend/output or Orchard action), so vtx must be non-empty and + # identical across both Zainod and Lightwalletd. + # ------------------------------------------------------------------------- + + def _assert_shielded_block_match(self, zs, ls, height, label): + req = service_pb2.BlockID(height=height, hash=b"") + z = _strict_compact_block(zs.GetBlock(req)) + l = _strict_compact_block(ls.GetBlock(req)) + assert_true(len(z.vtx) > 0, + "Zainod returned empty vtx for %s block at height %d" % (label, height)) + assert_true(len(l.vtx) > 0, + "Lightwalletd returned empty vtx for %s block at height %d" % (label, height)) + _assert_compact_block_equal("GetBlock %s" % label, z, l) + + def _assert_transaction_match(self, zs, ls, txid_hex, expected_height): + txid_bytes = bytes.fromhex(txid_hex)[::-1] + req = service_pb2.TxFilter(hash=txid_bytes) + z = zs.GetTransaction(req) + l = ls.GetTransaction(req) + assert_equal(z.data, l.data) + assert_equal(z.height, l.height) + assert_equal(z.height, expected_height) + + # -- t → Sapling (block 201) -- + + def test_get_block_t_to_sapling(self, zs, ls): + """Block with a t→Sapling output must have matching, non-empty vtx.""" + self._assert_shielded_block_match(zs, ls, self.t_to_sapling_height, 't→Sapling') + + def test_get_block_nullifiers_t_to_sapling(self, zs, ls): + req = service_pb2.BlockID(height=self.t_to_sapling_height, hash=b"") + z = _strict_compact_block(zs.GetBlockNullifiers(req)) + l = _strict_compact_block(ls.GetBlockNullifiers(req)) + _assert_compact_block_equal("GetBlockNullifiers t→Sapling", z, l) + + def test_get_block_range_shielded(self, zs, ls): + """ + All blocks in the shielded range must have matching, non-empty vtx. + + This range check intentionally keeps the streamed CompactTx entries + intact so it can detect GetBlockRange divergences between Zainod and + Lightwalletd. + """ + start = self.t_to_sapling_height + end = self.orchard_to_t_height + req = service_pb2.BlockRange( + start=service_pb2.BlockID(height=start, hash=b""), + end=service_pb2.BlockID(height=end, hash=b""), + ) + z_blocks = [_strict_compact_block(b) for b in _collect_stream(zs.GetBlockRange(req))] + l_blocks = [_strict_compact_block(b) for b in _collect_stream(ls.GetBlockRange(req))] + assert_equal(len(z_blocks), len(l_blocks)) + for z_b, l_b in zip(z_blocks, l_blocks): + assert_true(len(z_b.vtx) > 0, + "Zainod returned empty vtx for shielded block at height %d" % z_b.height) + assert_true(len(l_b.vtx) > 0, + "Lightwalletd returned empty vtx for shielded block at height %d" % l_b.height) + _assert_compact_block_equal("GetBlockRange shielded", z_b, l_b) + + def test_get_transaction_t_to_sapling(self, zs, ls): + """t→Sapling transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.t_to_sapling_txid, self.t_to_sapling_height) + + def test_get_tree_state_after_t_to_sapling(self, zs, ls): + """After t→Sapling (block 201) Sapling must be non-empty. + Orchard tree state is already initialized on this chain layout, so we + only assert parity and Sapling population here.""" + req = service_pb2.BlockID(height=self.t_to_sapling_height, hash=b"") + z = zs.GetTreeState(req) + l = ls.GetTreeState(req) + assert_equal(z.network, l.network) + assert_equal(z.height, l.height) + assert_equal(z.hash, l.hash) + assert_equal(z.saplingTree, l.saplingTree) + assert_equal(z.orchardTree, l.orchardTree) + assert_true(len(z.saplingTree) > 0, + "Sapling tree is empty after t→Sapling tx at height %d" % self.t_to_sapling_height) + + # -- t → Orchard (block 205) -- + + def test_get_block_t_to_orchard(self, zs, ls): + """Block with a t→Orchard output must have matching, non-empty vtx.""" + self._assert_shielded_block_match(zs, ls, self.t_to_orchard_height, 't→Orchard') + + def test_get_transaction_t_to_orchard(self, zs, ls): + """t→Orchard transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.t_to_orchard_txid, self.t_to_orchard_height) + + def test_get_tree_state_after_t_to_orchard(self, zs, ls): + """After t→Orchard (block 205) the Orchard tree must be non-empty.""" + req = service_pb2.BlockID(height=self.t_to_orchard_height, hash=b"") + z = zs.GetTreeState(req) + l = ls.GetTreeState(req) + assert_equal(z.network, l.network) + assert_equal(z.height, l.height) + assert_equal(z.hash, l.hash) + assert_equal(z.saplingTree, l.saplingTree) + assert_equal(z.orchardTree, l.orchardTree) + assert_true(len(z.orchardTree) > 0, + "Orchard tree is empty after t→Orchard coinbase at height %d" % self.t_to_orchard_height) + + # -- Sapling → Sapling (block 204) -- + + def test_get_block_sapling_to_sapling(self, zs, ls): + """Block with a Sapling→Sapling spend must have matching, non-empty vtx.""" + self._assert_shielded_block_match( + zs, ls, self.sapling_to_sapling_height, 'Sapling→Sapling') + + def test_get_transaction_sapling_to_sapling(self, zs, ls): + """Sapling→Sapling transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.sapling_to_sapling_txid, self.sapling_to_sapling_height) + + # -- Orchard → Orchard (block 206) -- + + def test_get_block_orchard_to_orchard(self, zs, ls): + """Block with an Orchard→Orchard spend must have matching, non-empty vtx.""" + self._assert_shielded_block_match( + zs, ls, self.orchard_to_orchard_height, 'Orchard→Orchard') + + def test_get_transaction_orchard_to_orchard(self, zs, ls): + """Orchard→Orchard transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.orchard_to_orchard_txid, self.orchard_to_orchard_height) + + # -- Sapling → Orchard (block 203) -- + + def test_get_block_sapling_to_orchard(self, zs, ls): + """Block with a Sapling→Orchard (cross-pool) tx must have matching, non-empty vtx.""" + self._assert_shielded_block_match( + zs, ls, self.sapling_to_orchard_height, 'Sapling→Orchard') + + def test_get_transaction_sapling_to_orchard(self, zs, ls): + """Sapling→Orchard transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.sapling_to_orchard_txid, self.sapling_to_orchard_height) + + # -- Orchard → Sapling (block 207) -- + + def test_get_block_orchard_to_sapling(self, zs, ls): + """Block with an Orchard→Sapling (cross-pool) tx must have matching, non-empty vtx.""" + self._assert_shielded_block_match( + zs, ls, self.orchard_to_sapling_height, 'Orchard→Sapling') + + def test_get_transaction_orchard_to_sapling(self, zs, ls): + """Orchard→Sapling transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.orchard_to_sapling_txid, self.orchard_to_sapling_height) + + # -- Sapling → t (block 208) -- + + def test_get_block_sapling_to_t(self, zs, ls): + """Block with a Sapling→t tx must have matching, non-empty vtx (Sapling spend present).""" + self._assert_shielded_block_match( + zs, ls, self.sapling_to_t_height, 'Sapling→t') + + def test_get_transaction_sapling_to_t(self, zs, ls): + """Sapling→t transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.sapling_to_t_txid, self.sapling_to_t_height) + + # -- Orchard → t (block 209) -- + + def test_get_block_orchard_to_t(self, zs, ls): + """Block with an Orchard→t tx must have matching, non-empty vtx (Orchard action present).""" + self._assert_shielded_block_match( + zs, ls, self.orchard_to_t_height, 'Orchard→t') + + def test_get_transaction_orchard_to_t(self, zs, ls): + """Orchard→t transaction bytes and height must match across both indexers.""" + self._assert_transaction_match( + zs, ls, self.orchard_to_t_txid, self.orchard_to_t_height) + + +if __name__ == '__main__': + GrpcComparisonTest().main() diff --git a/qa/rpc-tests/test_framework/authproxy.py b/qa/rpc-tests/test_framework/authproxy.py index 10839d781..25598a465 100644 --- a/qa/rpc-tests/test_framework/authproxy.py +++ b/qa/rpc-tests/test_framework/authproxy.py @@ -153,8 +153,8 @@ def _get_response(self): 'code': -342, 'message': 'missing HTTP response from server'}) content_type = http_response.getheader('Content-Type') - # Zallet uses 'application/json; charset=utf-8'` while zcashd uses 'application/json' - if content_type != 'application/json; charset=utf-8': + # Zallet uses 'application/json; charset=utf-8'; zcashd uses 'application/json'. + if content_type not in ('application/json', 'application/json; charset=utf-8'): raise JSONRPCException({ 'code': -342, 'message': 'non-JSON HTTP response with \'%i %s\' from server' % (http_response.status, http_response.reason)}) diff --git a/qa/rpc-tests/test_framework/config.py b/qa/rpc-tests/test_framework/config.py index dbde9780f..ba5b36e10 100644 --- a/qa/rpc-tests/test_framework/config.py +++ b/qa/rpc-tests/test_framework/config.py @@ -21,6 +21,7 @@ class ZebraArgs: funding_streams: list[dict[str, Any]] = field(default_factory=list) lockbox_disbursements: list[dict[str, Any]] = field(default_factory=list) should_allow_unshielded_coinbase_spends: bool | None = None + checkpoints: Any = None def __add__(self, other): if other is None: @@ -37,6 +38,8 @@ def __add__(self, other): self.lockbox_disbursements = other.lockbox_disbursements if other.should_allow_unshielded_coinbase_spends != defaults.should_allow_unshielded_coinbase_spends: self.should_allow_unshielded_coinbase_spends = other.should_allow_unshielded_coinbase_spends + if other.checkpoints != defaults.checkpoints: + self.checkpoints = other.checkpoints return self @@ -122,6 +125,10 @@ def update(self, config_file): config_file['network']['testnet_parameters']['funding_streams'] = extra_args.funding_streams config_file['network']['testnet_parameters']['activation_heights'] = extra_args.activation_heights config_file['network']['testnet_parameters']['lockbox_disbursements'] = extra_args.lockbox_disbursements + if extra_args.checkpoints is not None: + config_file['network']['testnet_parameters']['checkpoints'] = extra_args.checkpoints + else: + config_file['network']['testnet_parameters'].pop('checkpoints', None) return config_file @@ -131,6 +138,7 @@ class ZainoConfig: grpc_listen_address: str = "127.0.0.1:0" validator_grpc_listen_address: str = "127.0.0.1:0" validator_jsonrpc_listen_address: str = "127.0.0.1:0" + storage_database_path: str | None = None def update(self, config_file): # Base config updates @@ -138,5 +146,9 @@ def update(self, config_file): config_file['grpc_settings']['grpc_listen_address'] = self.grpc_listen_address config_file['validator_settings']['validator_grpc_listen_address'] = self.validator_grpc_listen_address config_file['validator_settings']['validator_jsonrpc_listen_address'] = self.validator_jsonrpc_listen_address + if self.storage_database_path is not None: + config_file.setdefault('storage', {}) + config_file['storage'].setdefault('database', {}) + config_file['storage']['database']['path'] = self.storage_database_path return config_file diff --git a/qa/rpc-tests/test_framework/test_framework.py b/qa/rpc-tests/test_framework/test_framework.py index fb067a431..47e4b82cd 100755 --- a/qa/rpc-tests/test_framework/test_framework.py +++ b/qa/rpc-tests/test_framework/test_framework.py @@ -23,6 +23,7 @@ start_nodes, start_wallets, start_zainos, + start_lightwalletds, connect_nodes_bi, sync_blocks, sync_mempools, @@ -30,9 +31,13 @@ stop_nodes, stop_wallets, stop_zainos, + stop_lightwalletds, + stop_zcashd_nodes, wait_bitcoinds, wait_zainods, wait_zallets, + wait_lightwalletds, + wait_zcashd_nodes, enable_coverage, check_json_precision, PortSeed, @@ -45,11 +50,15 @@ def __init__(self): self.activation_heights = {"NU5": 1, "NU6": 1, "NU6.1": 1, "NU6.2": 1} self.num_nodes = 4 self.num_indexers = 0 + self.num_lightwalletds = 0 self.num_wallets = 4 + self.num_zcashd_nodes = 0 self.cache_behavior = 'current' self.nodes = None self.zainos = None + self.lwds = None self.wallets = None + self.zcashd_nodes = None self.miner_addresses = None def run_test(self): @@ -95,6 +104,9 @@ def prepare_chain(self): def setup_indexers(self): return start_zainos(self.num_indexers, self.options.tmpdir) + def setup_lightwalletds(self): + return start_lightwalletds(self.num_lightwalletds, self.options.tmpdir) + def setup_wallets(self): return start_wallets(self.num_wallets, self.options.tmpdir) @@ -123,6 +135,7 @@ def setup_network(self, split = False, do_mempool_sync = True): self.sync_all(do_mempool_sync) self.zainos = self.setup_indexers() + self.lwds = self.setup_lightwalletds() self.wallets = self.setup_wallets() def split_network(self): @@ -227,10 +240,17 @@ def main(self): stop_wallets(self.wallets) wait_zallets() + print("Stopping lightwalletds") + stop_lightwalletds(self.lwds or []) + wait_lightwalletds() + print("Stopping indexers") - if self.zainos is not None: - stop_zainos(self.zainos) - wait_zainods() + stop_zainos(self.zainos or []) + wait_zainods() + + print("Stopping zcashd nodes") + stop_zcashd_nodes(self.zcashd_nodes or []) + wait_zcashd_nodes() print("Stopping nodes") if self.nodes is not None: @@ -241,7 +261,7 @@ def main(self): # running processes, `util` keeps global dicts or running processes stop_all_processes() else: - print("Note: zebrads, zainods, and zallets were not stopped and may still be running") + print("Note: zebrads, zainods, lightwalletds, zallets, and zcashd nodes were not stopped and may still be running") if not self.options.nocleanup and not self.options.noshutdown: print("Cleaning up") diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 003409083..76acee813 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -82,6 +82,9 @@ def zaino_binary(): def zallet_binary(): return os.getenv("ZALLET", os.path.join("src", "zallet")) +def lightwalletd_binary(): + return os.getenv("LIGHTWALLETD", os.path.join("src", "lightwalletd")) + def zebrad_config(datadir): base_location = os.path.join('qa', 'defaults', 'zebrad', 'config.toml') new_location = os.path.join(datadir, "config.toml") @@ -158,6 +161,9 @@ def zaino_rpc_port(n): def zaino_grpc_port(n): return PORT_MIN + (PORT_RANGE * 5) + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) +def lwd_grpc_port(n): + return PORT_MIN + (PORT_RANGE * 6) + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) + def check_json_precision(): """Make sure json library being used does not lose precision converting ZEC values""" n = Decimal("20000000.00000003") @@ -611,7 +617,10 @@ def init_persistent(cache_behavior): # Copy in per-node wallet data wallet_tgz_filename = os.path.join(cache_path, "node"+str(i)+"_wallet.tar.gz") if not os.path.exists(wallet_tgz_filename): - raise Exception('Wallet cache missing for cache behavior %s, node %d' % (cache_behavior, i)) + raise Exception( + 'Wallet cache missing for cache behavior %s, node %d' + % (cache_behavior, i) + ) with tarfile.open(wallet_tgz_filename, "r:gz") as wallet_tgz_file: tarfile_extractall(wallet_tgz_file, os.path.join(to_dir, "wallet.dat")) @@ -680,23 +689,27 @@ def persist_node_caches(tmpdir, cache_behavior, num_nodes): node_path = os.path.join(tmpdir, 'node' + str(i), 'regtest') # Clean up the files that we don't want to persist - os.remove(os.path.join(node_path, 'debug.log')) - os.remove(os.path.join(node_path, 'db.log')) - os.remove(os.path.join(node_path, 'peers.dat')) + for filename in ('debug.log', 'db.log', 'peers.dat'): + path = os.path.join(node_path, filename) + if os.path.exists(path): + os.remove(path) # Persist the wallet file for the node to the cache + wallet_path = os.path.join(node_path, 'wallet.dat') wallet_tgz_filename = os.path.join(cache_path, 'node' + str(i) + '_wallet.tar.gz') - with tarfile.open(wallet_tgz_filename, "w:gz") as wallet_tgz_file: - wallet_tgz_file.add(os.path.join(node_path, 'wallet.dat'), arcname="") + if os.path.exists(wallet_path): + with tarfile.open(wallet_tgz_filename, "w:gz") as wallet_tgz_file: + wallet_tgz_file.add(wallet_path, arcname="") # Persist the chain data and cache config just once; it will be reused # for all of the nodes when loading from the cache. if i == 0: # Move the wallet.dat file out of the way so that it doesn't # pollute the chain cache tarfile - shutil.move( - os.path.join(node_path, 'wallet.dat'), - os.path.join(tmpdir, 'wallet.dat.0')) + if os.path.exists(wallet_path): + shutil.move( + wallet_path, + os.path.join(tmpdir, 'wallet.dat.0')) # Store the current time so that we can correctly set the clock # offset when restoring from the cache. @@ -712,9 +725,11 @@ def persist_node_caches(tmpdir, cache_behavior, num_nodes): chain_cache_file.add(node_path, arcname="") # Move the wallet file back into place - shutil.move( - os.path.join(tmpdir, 'wallet.dat.0'), - os.path.join(node_path, 'wallet.dat')) + wallet_tmp = os.path.join(tmpdir, 'wallet.dat.0') + if os.path.exists(wallet_tmp): + shutil.move( + wallet_tmp, + wallet_path) def _rpchost_to_args(rpchost): @@ -1378,7 +1393,8 @@ def update_zainod_conf(datadir, rpc_port, indexer_port, zaino_rpc_port, zaino_gr json_rpc_listen_address='127.0.0.1:'+str(zaino_rpc_port), grpc_listen_address='127.0.0.1:'+str(zaino_grpc_port), validator_grpc_listen_address='127.0.0.1:'+str(indexer_port), - validator_jsonrpc_listen_address='127.0.0.1:'+str(rpc_port) + validator_jsonrpc_listen_address='127.0.0.1:'+str(rpc_port), + storage_database_path=os.path.join(datadir, 'db'), ) config_file = zaino_config.update(config_file) @@ -1408,7 +1424,7 @@ def stop_all_processes(): Forcibly terminate every zebrad, zainod and zallet process we spawned, regardless of whether a test data structure still references it. ''' - for processes in (bitcoind_processes, zallet_processes, zainod_processes): + for processes in (bitcoind_processes, zallet_processes, zainod_processes, lwd_processes): for p in list(processes.values()): try: p.terminate() # send SIGHIGH @@ -1906,3 +1922,242 @@ def assert_in_message(e, needle: str) -> None: """Assert that JSONRPCException `e`'s message contains `needle`.""" msg = e.error['message'] assert_true(needle in msg, "Expected {!r} in error, got: {!r}".format(needle, msg)) + + +# Lightwalletd utilities + +lwd_processes = {} + +def write_lwd_conf(datadir, node_rpc_port): + """Write a minimal zcash.conf for lightwalletd to connect to a Zebrad node.""" + conf_path = os.path.join(datadir, "zcash.conf") + with open(conf_path, "w", encoding="utf8") as f: + f.write("regtest=1\n") + f.write("rpcbind=127.0.0.1\n") + f.write(f"rpcport={node_rpc_port}\n") + f.write("rpcuser=test\n") + f.write("rpcpassword=test\n") + return conf_path + +def start_lightwalletds(num_nodes, dirname, binary=None): + """Start multiple lightwalletd instances, return list of gRPC port numbers.""" + if binary is None: + binary = [None] * num_nodes + ports = [] + try: + for i in range(num_nodes): + ports.append(start_lightwalletd(i, dirname, binary=binary[i])) + except: + stop_lightwalletds(ports) + raise + return ports + +def start_lightwalletd(i, dirname, binary=None, stderr=None): + """Start a lightwalletd instance and return its gRPC port number.""" + datadir = os.path.join(dirname, "lwd" + str(i)) + os.makedirs(datadir, exist_ok=True) + + if binary is None: + binary = lightwalletd_binary() + + conf = write_lwd_conf(datadir, rpc_port(i)) + grpc_addr = f"127.0.0.1:{lwd_grpc_port(i)}" + + args = [ + binary, + "--grpc-bind-addr", grpc_addr, + "--no-tls-very-insecure", + "--zcash-conf-path", conf, + "--data-dir", datadir, + "--log-file", os.path.join(datadir, "lwd.log"), + "--log-level", "10", + ] + + if os.getenv("PYTHON_DEBUG", ""): + print(f"start_lightwalletd: starting lightwalletd {i}") + + lwd_processes[i] = subprocess.Popen(args, stderr=stderr) + wait_for_lwd_start(lwd_processes[i], lwd_grpc_port(i), i) + + if os.getenv("PYTHON_DEBUG", ""): + print(f"start_lightwalletd: lightwalletd {i} ready on {grpc_addr}") + + return lwd_grpc_port(i) + +def wait_for_lwd_start(process, port, i): + """Poll lightwalletd via GetLightdInfo until it responds or exits.""" + import grpc + from test_framework.proto import service_pb2, service_pb2_grpc + + deadline = time.time() + 60 + while time.time() < deadline: + if process.poll() is not None: + raise Exception( + f"lightwalletd {i} exited with status {process.returncode} during initialization" + ) + try: + with grpc.insecure_channel(f"127.0.0.1:{port}") as ch: + stub = service_pb2_grpc.CompactTxStreamerStub(ch) + stub.GetLightdInfo(service_pb2.Empty(), timeout=2) + return + except grpc.RpcError: + pass + time.sleep(0.5) + raise Exception(f"lightwalletd {i} did not become ready within 60 seconds") + +def stop_lightwalletds(lwds): + del lwds[:] + +def wait_lightwalletds(): + for proc in list(lwd_processes.values()): + try: + proc.terminate() + proc.wait(timeout=10) + except Exception: + try: + proc.kill() + except Exception: + pass + lwd_processes.clear() + + +# zcashd utilities +# Used for tests that need a full node with wallet to generate shielded transactions. + +# AuthServiceProxy defines its own JSONRPCException; import it here so +# wait_for_zcashd_start can catch the warmup error (-28) raised by the proxy. +from .authproxy import JSONRPCException as _AuthJSONRPCException + +zcashd_node_processes = {} + +ZCASHD_RPC_USER = "zcashrpc" +ZCASHD_RPC_PASSWORD = "zcashrpc" + + +def zcashd_node_binary(): + return os.getenv("ZCASHD", os.path.join("src", "zcashd")) + + +def zcashd_p2p_port(n): + assert n <= MAX_NODES + return PORT_MIN + (PORT_RANGE * 7) + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) + + +def zcashd_rpc_port(n): + return PORT_MIN + (PORT_RANGE * 8) + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) + + +def zcashd_rpc_url(i): + return "http://%s:%s@127.0.0.1:%d" % (ZCASHD_RPC_USER, ZCASHD_RPC_PASSWORD, zcashd_rpc_port(i)) + + +def write_zcash_conf(datadir, node_rpc_port, node_p2p_port, miner_address=None, activation_heights=None): + """Write a zcash.conf for a standalone regtest zcashd node. + + By default all network upgrades are activated from block 1 to preserve the + historical behavior of the standalone helper. Tests can override the + activation heights to match a validator's regtest configuration. + + miner_address, if given, sets the coinbase recipient for `generate` calls. + setmineraddress has been removed from this zcashd version, so the address + must be set via the config file; restart zcashd between mining phases. + """ + os.makedirs(datadir, exist_ok=True) + conf_path = os.path.join(datadir, "zcash.conf") + with open(conf_path, "w", encoding="utf8") as f: + f.write("regtest=1\n") + f.write("port=%d\n" % node_p2p_port) + f.write("rpcbind=127.0.0.1\n") + f.write("rpcport=%d\n" % node_rpc_port) + f.write("rpcuser=%s\n" % ZCASHD_RPC_USER) + f.write("rpcpassword=%s\n" % ZCASHD_RPC_PASSWORD) + if miner_address is not None: + f.write("mineraddress=%s\n" % miner_address) + f.write("minetolocalwallet=0\n") + if activation_heights is None: + activation_heights = { + '5ba81b19': 1, # Overwinter + '76b809bb': 1, # Sapling + '2bb40e60': 1, # Blossom + 'f5b9230b': 1, # Heartwood + 'e9ff75a6': 1, # Canopy + 'c2d6d0b4': 1, # NU5 + 'c8e71055': 1, # NU6 + } + for branch_id, height in activation_heights.items(): + f.write("nuparams=%s:%d\n" % (branch_id, height)) + # Re-enable the deprecated getnewaddress RPC used to obtain a t-address + # for transparent coinbase mining. + f.write("allowdeprecated=getnewaddress\n") + f.write("allowdeprecated=z_getnewaddress\n") + f.write("regtestwalletsetbestchaineveryblock=1\n") + f.write("i-am-aware-zcashd-will-be-replaced-by-zebrad-and-zallet-in-2025=1\n") + return conf_path + + +def start_zcashd_node(i, dirname, miner_address=None, activation_heights=None, binary=None, stderr=None): + """Start a standalone regtest zcashd node and return an RPC proxy.""" + if binary is None: + binary = zcashd_node_binary() + datadir = os.path.join(dirname, "zcashd" + str(i)) + conf = write_zcash_conf( + datadir, + zcashd_rpc_port(i), + zcashd_p2p_port(i), + miner_address=miner_address, + activation_heights=activation_heights, + ) + args = [binary, "-conf=" + conf, "-datadir=" + datadir] + zcashd_node_processes[i] = subprocess.Popen(args, stderr=stderr) + url = zcashd_rpc_url(i) + wait_for_zcashd_start(zcashd_node_processes[i], url, i) + if os.getenv("PYTHON_DEBUG", ""): + print("start_zcashd_node: zcashd %d ready, pid %d" % (i, zcashd_node_processes[i].pid)) + return get_rpc_auth_proxy(url, i) + + +def stop_zcashd_node(i, node): + """Stop zcashd node i via RPC and wait for the process to exit.""" + try: + node.stop() + except (_AuthJSONRPCException, http.client.CannotSendRequest): + pass + if i in zcashd_node_processes: + zcashd_node_processes[i].wait() + del zcashd_node_processes[i] + + +def wait_for_zcashd_start(process, url, i): + """Poll zcashd RPC until ready or until the process exits.""" + while True: + if process.poll() is not None: + raise Exception( + "zcashd node %d exited with status %d during initialization" + % (i, process.returncode) + ) + try: + rpc = get_rpc_auth_proxy(url, i) + rpc.getblockcount() + break + except IOError as e: + if e.errno != errno.ECONNREFUSED: + raise + except _AuthJSONRPCException as e: + if e.error['code'] != -28: + raise + time.sleep(0.25) + + +def stop_zcashd_nodes(nodes): + for node in nodes: + try: + node.stop() + except (http.client.CannotSendRequest, _AuthJSONRPCException) as e: + print("WARN: Unable to stop zcashd node: " + repr(e)) + del nodes[:] + + +def wait_zcashd_nodes(): + for proc in list(zcashd_node_processes.values()): + proc.wait() + zcashd_node_processes.clear() diff --git a/qa/zcash/grpc_comparison_tests.py b/qa/zcash/grpc_comparison_tests.py new file mode 100755 index 000000000..40874db46 --- /dev/null +++ b/qa/zcash/grpc_comparison_tests.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# +# Run the gRPC parity tests comparing Zainod and Lightwalletd +# backed by the same Zebrad node. +# +# Usage: +# uv run ./qa/zcash/grpc_comparison_tests.py [rpc-tests options] +# +# Examples: +# uv run ./qa/zcash/grpc_comparison_tests.py +# uv run ./qa/zcash/grpc_comparison_tests.py --nocleanup +# +# Binaries are resolved from ./src/ by default, or from environment variables: +# ZEBRAD, ZAINOD, LIGHTWALLETD +# + +import os +import subprocess +import sys + +REPOROOT = os.path.dirname( + os.path.dirname( + os.path.dirname( + os.path.abspath(__file__) + ) + ) +) + +def repofile(filename): + return os.path.join(REPOROOT, filename) + +def main(): + cmd = [repofile('qa/rpc-tests/grpc_comparison.py')] + sys.argv[1:] + sys.exit(subprocess.call(cmd)) + +if __name__ == '__main__': + main() From 9bf294d56e9c3e5c37a620f03194415260c4a55b Mon Sep 17 00:00:00 2001 From: Pacu Date: Sat, 11 Jul 2026 12:19:52 -0300 Subject: [PATCH 3/6] Run gRPC comparison test in CI Build and package lightwalletd for integration tests, use the uv-managed environment in RPC jobs, and register grpc_comparison.py in the RPC test matrix. Keep the workflow changes separate from the manual test so reviewers can evaluate CI enablement independently. Co-Authored-By: OpenAI Codex --- .../make-zcash-artifacts-executable.sh | 16 +- .github/scripts/stage-zallet-db-dump.sh | 24 ++- .github/workflows/ci.yml | 143 ++++++++++++++++-- qa/pull-tester/rpc-tests.py | 1 + 4 files changed, 158 insertions(+), 26 deletions(-) diff --git a/.github/scripts/make-zcash-artifacts-executable.sh b/.github/scripts/make-zcash-artifacts-executable.sh index c21b3cad4..2d6833fbd 100755 --- a/.github/scripts/make-zcash-artifacts-executable.sh +++ b/.github/scripts/make-zcash-artifacts-executable.sh @@ -2,8 +2,8 @@ # # Make the zcash binaries downloaded into ./src executable on the test runners. # -# The `zallet` launcher execs a sibling backend binary (`zallet-zaino` or -# `zallet-zebra`), so those are made executable too when present. +# The `zallet` launcher execs a sibling backend binary, so backend binaries are +# made executable too when present. # # Inputs (environment): # FILE_EXT executable suffix, e.g. ".exe" (optional, default empty) @@ -15,9 +15,9 @@ ext="${FILE_EXT:-}" chmod +x "./src/zebrad$ext" chmod +x "./src/zainod$ext" chmod +x "./src/zallet$ext" -if [ -f "./src/zallet-zaino$ext" ]; then - chmod +x "./src/zallet-zaino$ext" -fi -if [ -f "./src/zallet-zebra$ext" ]; then - chmod +x "./src/zallet-zebra$ext" -fi +chmod +x "./src/lightwalletd$ext" +for zallet_backend in zallet-zebra zallet-zaino; do + if [ -f "./src/${zallet_backend}$ext" ]; then + chmod +x "./src/${zallet_backend}$ext" + fi +done diff --git a/.github/scripts/stage-zallet-db-dump.sh b/.github/scripts/stage-zallet-db-dump.sh index 343496f74..83c9b44f0 100755 --- a/.github/scripts/stage-zallet-db-dump.sh +++ b/.github/scripts/stage-zallet-db-dump.sh @@ -16,9 +16,29 @@ set -euo pipefail root="${DB_DUMP_ROOT:?DB_DUMP_ROOT must be set}" -db_dump="$(find "$root" -path '*/zewif-zcashd-*/out/db_dump' -type f -print -quit)" +candidate_roots=( + "$root" + backends/zaino/target/release/build + backends/zaino/target + target/release/build + target +) +existing_roots=() +for candidate in "${candidate_roots[@]}"; do + if [ -d "$candidate" ]; then + existing_roots+=("$candidate") + fi +done + +db_dump="" +if [ "${#existing_roots[@]}" -gt 0 ]; then + db_dump="$( + find "${existing_roots[@]}" \ + -path '*/zewif-zcashd-*/out/db_dump' -type f -print -quit + )" +fi if [ -z "$db_dump" ]; then - echo "Vendored db_dump not found under $root/zewif-zcashd-*/out/" >&2 + echo "Vendored db_dump not found under target/.../zewif-zcashd-*/out/" >&2 exit 1 fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 690dd7250..58b2d4603 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,6 +33,7 @@ on: - zebra-interop-request - zaino-interop-request - zallet-interop-request + - lightwalletd-interop-request permissions: contents: read @@ -455,6 +456,84 @@ jobs: job_name_prefix: Build zallet on is_zallet: true + build-lightwalletd: + name: Build lightwalletd on ${{ matrix.platform }}${{ matrix.required_suffix }} + needs: setup + runs-on: ${{ matrix.build_os }} + container: + image: ${{ matrix.container }} + env: + HOME: /root + PATH: /root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH + continue-on-error: ${{ !matrix.required }} + strategy: + matrix: + include: ${{ fromJson(needs.setup.outputs.build_matrix) }} + + steps: + - name: Check out integration-tests to access actions + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + path: integration-tests + persist-credentials: false + + - name: Compute interop repo ids + id: repo-ids + uses: ./integration-tests/.github/actions/interop-repo-ids + + - id: start-interop + uses: ./integration-tests/.github/actions/start-interop + with: + status-app-id: ${{ secrets.STATUS_APP_ID }} + status-app-private-key: ${{ secrets.STATUS_APP_PRIVATE_KEY }} + requesting-owner: ${{ steps.repo-ids.outputs.requesting-owner }} + requesting-repository: ${{ steps.repo-ids.outputs.requesting-repository }} + job-name: "Build lightwalletd on ${{ matrix.platform }}${{ matrix.required_suffix }}" + + - name: Use specified zcash/lightwalletd commit + if: github.event.action == 'lightwalletd-interop-request' + shell: sh + env: + SHA: ${{ github.event.client_payload.sha }} + run: echo "LIGHTWALLETD_REF=${SHA}" >> $GITHUB_ENV + + - name: Use zcash/lightwalletd current master + if: github.event.action != 'lightwalletd-interop-request' + run: echo "LIGHTWALLETD_REF=refs/heads/master" >> $GITHUB_ENV + + - name: Check out zcash/lightwalletd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: zcash/lightwalletd + ref: ${{ env.LIGHTWALLETD_REF }} + path: lightwalletd + persist-credentials: false + + - name: Set up Go + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 + with: + go-version-file: lightwalletd/go.mod + cache-dependency-path: lightwalletd/go.sum + + - name: Build lightwalletd + run: go build -v -o lightwalletd${{ matrix.file_ext }} . + working-directory: ./lightwalletd + + - name: Upload lightwalletd + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: lightwalletd-${{ matrix.name }} + path: | + ${{ format('./lightwalletd/lightwalletd{0}', matrix.file_ext) }} + + - uses: ./integration-tests/.github/actions/finish-interop + if: always() + with: + app-token: ${{ steps.start-interop.outputs.app-token }} + requesting-owner: ${{ steps.repo-ids.outputs.requesting-owner }} + requesting-repository: ${{ steps.repo-ids.outputs.requesting-repository }} + job-name: "Build lightwalletd on ${{ matrix.platform }}${{ matrix.required_suffix }}" + # Not working in Windows sec-hard: name: sec-hard ${{ matrix.platform }}${{ matrix.required_suffix }} @@ -463,6 +542,7 @@ jobs: - build-zebra - build-zaino - build-zallet + - build-lightwalletd runs-on: ${{ matrix.test_os }} container: image: ${{ matrix.container }} @@ -523,6 +603,12 @@ jobs: name: zallet-${{ matrix.name }} path: ./src + - name: Download lightwalletd artifact + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: lightwalletd-${{ matrix.name }} + path: ./src + - name: Make artifact executable if: runner.os != 'Windows' shell: bash @@ -560,23 +646,41 @@ jobs: include: ${{ fromJson(needs.setup.outputs.rpc_test_matrix) }} steps: + - name: Select the test branch + id: test-branch + if: endsWith(github.event.action, '-interop-request') + env: + TEST_SHA: ${{ github.event.client_payload.test_sha }} + run: | + if [ "${TEST_SHA}" != "null" ] && [ -n "${TEST_SHA}" ]; then + echo "test_sha=${TEST_SHA}" >> $GITHUB_OUTPUT + fi + + - name: Check out the selected test branch + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + # Empty on direct repo PRs, which selects the default. + ref: ${{ steps.test-branch.outputs.test_sha }} + persist-credentials: false + - name: Set up Python uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: ${{ needs.setup.outputs.python_version }} - - name: Cache Python dependencies for RPC tests + - name: Cache uv project environment for RPC tests uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: enableCrossOsArchive: true - path: venv - key: test-rpc-venv-${{ matrix.name }}-py${{ needs.setup.outputs.python_version }} + path: .venv + key: test-rpc-venv-${{ matrix.name }}-py${{ needs.setup.outputs.python_version }}-${{ hashFiles('pyproject.toml', 'uv.lock') }} - - name: Get Python dependencies for RPC tests + - name: Install uv + run: python3 -m pip install uv + + - name: Sync Python dependencies for RPC tests run: | - python3 -m venv ./venv - . ./venv/bin/activate - pip install zmq asyncio base58 toml embit + uv sync --frozen test-rpc: name: RPC tests ${{ matrix.platform }} ${{ matrix.backend }} ${{ matrix.shard }}${{ matrix.required_suffix }} @@ -585,6 +689,7 @@ jobs: - build-zebra - build-zaino - build-zallet + - build-lightwalletd - rpc-depends runs-on: ${{ matrix.test_os }} container: @@ -641,18 +746,19 @@ jobs: with: python-version: ${{ needs.setup.outputs.python_version }} - - name: Cache Python dependencies for RPC tests + - name: Cache uv project environment for RPC tests uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: enableCrossOsArchive: true - path: venv - key: test-rpc-venv-${{ matrix.name }}-py${{ needs.setup.outputs.python_version }} + path: .venv + key: test-rpc-venv-${{ matrix.name }}-py${{ needs.setup.outputs.python_version }}-${{ hashFiles('pyproject.toml', 'uv.lock') }} + + - name: Install uv + run: python3 -m pip install uv - - name: Get Python dependencies for RPC tests if not cached + - name: Sync Python dependencies for RPC tests run: | - python3 -m venv ./venv - . ./venv/bin/activate - pip install zmq asyncio base58 toml embit + uv sync --frozen - name: Download zebrad artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 @@ -672,6 +778,12 @@ jobs: name: zallet-${{ matrix.name }} path: ./src + - name: Download lightwalletd artifact + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: lightwalletd-${{ matrix.name }} + path: ./src + - name: Make artifact executable if: runner.os != 'Windows' shell: bash @@ -744,8 +856,7 @@ jobs: if all_passed == False: sys.exit(1) EOF - . ./venv/bin/activate - ZALLET_BACKEND=${{ matrix.backend }} ZEBRAD=$(pwd)/${{ format('src/zebrad{0}', matrix.file_ext) }} ZAINOD=$(pwd)/${{ format('src/zainod{0}', matrix.file_ext) }} ZALLET=$(pwd)/${{ format('src/zallet{0}', matrix.file_ext) }} SRC_DIR=$(pwd) python3 ./subclass.py + ZALLET_BACKEND=${{ matrix.backend }} ZEBRAD=$(pwd)/${{ format('src/zebrad{0}', matrix.file_ext) }} ZAINOD=$(pwd)/${{ format('src/zainod{0}', matrix.file_ext) }} ZALLET=$(pwd)/${{ format('src/zallet{0}', matrix.file_ext) }} LIGHTWALLETD=$(pwd)/${{ format('src/lightwalletd{0}', matrix.file_ext) }} SRC_DIR=$(pwd) uv run python3 ./subclass.py - uses: ./.github/actions/finish-interop if: always() diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 473bf87ae..301b4cbda 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -279,6 +279,7 @@ 'wallet.py', # vv Tests less than 2m vv 'wallet_ironwood.py', + 'grpc_comparison.py', # vv Tests less than 60s vv 'addnode.py', 'wallet_z_shieldcoinbase.py', From f44ab9be8511c1c9123ab0ea3b35157a80a25754 Mon Sep 17 00:00:00 2001 From: Pacu Date: Thu, 16 Jul 2026 20:56:11 -0300 Subject: [PATCH 4/6] Add wallet_transparent_coinbase_balance.py covering z_getbalances coinbase split and z_listunspent generated flag Integration test for zcash/zallet#635: z_getbalances now splits each account's transparent pool into regular (non-coinbase) and coinbase buckets, with immature coinbase under pending and mature coinbase under spendable, and folds transparent value into the account total. z_listunspent transparent entries gain a boolean "generated" flag (absent on shielded entries), while immature coinbase stays excluded from z_listunspent and z_gettotalbalance semantics are unchanged. The test drives four phases against the Z3 stack: immature-only coinbase, matured coinbase, a regular UTXO created by shielding and then sending back to a second wallet-owned taddr, and a final z_gettotalbalance cross-check. Registered in NEW_SCRIPTS. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017WB1TU6tyLmMa1n4SQ9XgK --- qa/pull-tester/rpc-tests.py | 1 + .../wallet_transparent_coinbase_balance.py | 503 ++++++++++++++++++ 2 files changed, 504 insertions(+) create mode 100644 qa/rpc-tests/wallet_transparent_coinbase_balance.py diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 301b4cbda..579d1e28a 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -284,6 +284,7 @@ 'addnode.py', 'wallet_z_shieldcoinbase.py', 'wallet_z_shieldcoinbase_multi_taddr.py', + 'wallet_transparent_coinbase_balance.py', # vv Tests less than 30s vv 'feature_nu6.py', 'feature_backup_non_finalized_state.py', diff --git a/qa/rpc-tests/wallet_transparent_coinbase_balance.py b/qa/rpc-tests/wallet_transparent_coinbase_balance.py new file mode 100644 index 000000000..67e4980dc --- /dev/null +++ b/qa/rpc-tests/wallet_transparent_coinbase_balance.py @@ -0,0 +1,503 @@ +#!/usr/bin/env python3 +# Copyright (c) 2026 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +# +# Test the transparent regular/coinbase balance split against the Z3 stack +# (zebrad + zaino + zallet). Covers zcash/zallet#635: +# +# z_getbalances : each account's `transparent` pool is split into +# `regular` : non-coinbase transparent funds (payable to a transparent +# recipient), and +# `coinbase` : coinbase-originated funds (spendable only by shielding). +# Immature coinbase is reported under `pending`, mature +# coinbase under `spendable`. +# The account's `total` object includes transparent value in its +# spendable/pending buckets (total == sum of parts). A Balance object is +# { spendable: {valueZat}, pending: {valueZat}, dust: {valueZat} } with +# empty buckets omitted, and the `regular`/`coinbase` keys themselves are +# omitted when the whole bucket is empty. +# +# z_listunspent : transparent entries gain `"generated": true/false` +# (coinbase origin). Shielded entries never carry a `generated` key. +# Immature coinbase does not appear in z_listunspent at all (upstream +# maturity clause — unchanged). +# +# z_gettotalbalance : semantics intentionally unchanged; its `transparent` +# figure must equal the sum of the regular and coinbase buckets reported +# by z_getbalances. +# +# This test asserts the raw z_getbalances JSON shape directly — its purpose +# is the response contract — while using the util polling helpers to ride +# out wallet-scan lag (zcash/wallet#316). +# + +import json +import time + +from decimal import Decimal +from test_framework.test_framework import BitcoinTestFramework +from test_framework.config import ZebraArgs +from test_framework.util import ( + COINBASE_MATURITY, + Pool, + TotalBalanceField, + assert_equal, + assert_shieldcoinbase_preflight_shape, + assert_true, + first_transparent_receiver, + nu_activation_all_at_1, + start_nodes, + transparent_utxos, + wait_and_assert_operationid_status, + wait_for_mature_coinbase_count, + wait_for_total_balance, + wait_for_tx_scanned, + zat, +) + +# The shielded pools an account section of z_getbalances may report. +SHIELDED_POOLS = (Pool.SAPLING, Pool.ORCHARD, Pool.IRONWOOD) + +# Buckets a z_getbalances Balance object may carry (empty ones are omitted). +BALANCE_BUCKETS = ('spendable', 'locked', 'pending', 'dust') + + +def bucket_zat(balance, bucket): + """The zatoshi value of `bucket` ('spendable' / 'locked' / 'pending' / + 'dust') in a z_getbalances Balance object. Balance objects omit empty + buckets, and a whole pool / sub-pool key is omitted when it holds + nothing, so both `balance` and the bucket may be absent -> 0.""" + if not balance: + return 0 + component = balance.get(bucket) + if not component: + return 0 + return component['valueZat'] + + +def balance_total_zat(balance): + """The sum of every bucket of a z_getbalances Balance object, in + zatoshis. 0 if the whole Balance object is omitted.""" + return sum(bucket_zat(balance, bucket) for bucket in BALANCE_BUCKETS) + + +def account_section(balances, account_uuid): + """The account section of a z_getbalances response for `account_uuid`, + or None if the response does not (yet) list the account.""" + for acct in balances.get('accounts', []): + if acct.get('account_uuid') == account_uuid: + return acct + return None + + +def transparent_bucket_zat(balances, account_uuid, sub_pool, bucket): + """The zatoshi value of `bucket` in the `sub_pool` ('regular' / + 'coinbase') transparent Balance object of `account_uuid`, tolerating + every omitted-when-empty level of the response.""" + acct = account_section(balances, account_uuid) + if acct is None: + return 0 + tbal = acct.get(Pool.TRANSPARENT) or {} + return bucket_zat(tbal.get(sub_pool), bucket) + + +def parts_zat(acct, bucket): + """Sum `bucket` across every value pool of an account section (both + transparent sub-pools plus each shielded pool), in zatoshis. The + account's `total` object must equal this, bucket by bucket.""" + tbal = acct.get(Pool.TRANSPARENT) or {} + total = (bucket_zat(tbal.get('regular'), bucket) + + bucket_zat(tbal.get('coinbase'), bucket)) + for pool in SHIELDED_POOLS: + total += bucket_zat(acct.get(pool), bucket) + return total + + +def utxo_zat(utxo): + """The value of a z_listunspent entry in zatoshis. Prefers the exact + integer `valueZat` field; falls back to converting the decimal + `amount`.""" + if 'valueZat' in utxo: + return utxo['valueZat'] + return zat(utxo['amount']) + + +def assert_generated_contract(unspent): + """Assert the z_listunspent `generated` contract on a full listing: + every transparent entry carries a boolean `generated` key, and no + shielded entry carries one at all.""" + for u in unspent: + if u.get('pool') == Pool.TRANSPARENT: + assert_true('generated' in u, + "Transparent entry missing 'generated': {!r}".format(u)) + assert_true(isinstance(u['generated'], bool), + "'generated' must be a bool: {!r}".format(u)) + else: + assert_true('generated' not in u, + "Shielded entry must not carry 'generated': {!r}".format(u)) + + +class WalletTransparentCoinbaseBalanceTest(BitcoinTestFramework): + + def __init__(self): + super().__init__() + self.num_nodes = 1 + self.num_wallets = 1 + self.cache_behavior = 'clean' + + def setup_nodes(self): + # All later NUs must also be listed at height 1; otherwise zebra mines + # a coinbase committing to NU5's consensus branch ID while zallet's + # network params expect the latest NU's branch ID, and zallet rejects + # the coinbase on the first block sync. See ZebraArgs default in + # test_framework/config.py. + args = [ + ZebraArgs( + miner_address=addr, + activation_heights=nu_activation_all_at_1(), + ) for addr in self.miner_addresses + ] + return start_nodes(self.num_nodes, self.options.tmpdir, args) + + def wait_for_balances(self, wallet, predicate, timeout=300, settle_secs=5): + """ + Poll `z_getbalances(1)` until `predicate(response)` holds AND the + response has been byte-identical for `settle_secs` consecutive + seconds, then return that response. The stability window rides out + the balance summary lagging the wallet tip by a block, and yields an + internally consistent snapshot to run exact-equality shape + assertions against (zcash/wallet#316). + """ + deadline = time.time() + timeout + last_serialized = None + stable_secs = 0 + balances = None + while time.time() < deadline: + try: + balances = wallet.z_getbalances(1) + if predicate(balances): + serialized = json.dumps( + balances, sort_keys=True, default=str) + if serialized == last_serialized: + stable_secs += 1 + else: + stable_secs = 0 + last_serialized = serialized + if stable_secs >= settle_secs: + return balances + else: + stable_secs = 0 + last_serialized = None + except Exception: + pass + time.sleep(1) + raise AssertionError( + "wait_for_balances: timeout after {}s; last response: {!r}".format( + timeout, balances)) + + # ------------------------------------------------------------------ + # Phase 1: only immature coinbase exists. + # ------------------------------------------------------------------ + + def run_immature_phase(self, node, w0, account_uuid): + print("\n==== Phase 1: immature coinbase only ====") + # `prepare_chain` mined block 1; a few more keep every coinbase + # well under COINBASE_MATURITY confirmations. + node.generate(4) + self.sync_all() + tip = node.getblockcount() + assert_true(tip < COINBASE_MATURITY - 10, + "Phase 1 premise broken: tip {} too close to maturity".format(tip)) + + balances = self.wait_for_balances( + w0, + lambda b: transparent_bucket_zat( + b, account_uuid, 'coinbase', 'pending') > 0) + acct = account_section(balances, account_uuid) + assert_true(acct is not None, + "Account {} missing from z_getbalances: {!r}".format( + account_uuid, balances)) + + tbal = acct.get(Pool.TRANSPARENT) + assert_true(tbal is not None, + "transparent pool missing while holding immature coinbase: " + "{!r}".format(acct)) + coinbase = tbal.get('coinbase') + assert_true(coinbase is not None, + "transparent.coinbase missing: {!r}".format(tbal)) + + # Immature coinbase is pending, never spendable. + coinbase_pending = bucket_zat(coinbase, 'pending') + assert_true(coinbase_pending > 0, + "Expected pending immature coinbase, got {!r}".format(coinbase)) + assert_equal(bucket_zat(coinbase, 'spendable'), 0, + "Immature coinbase must not be spendable: {!r}".format(coinbase)) + + # No non-coinbase funds exist, so the regular bucket is omitted. + assert_true(tbal.get('regular') is None, + "transparent.regular must be absent with only coinbase " + "funds: {!r}".format(tbal)) + + # The account total's pending bucket covers the immature coinbase. + total = acct.get('total') + assert_true(total is not None, "total missing: {!r}".format(acct)) + assert_true(bucket_zat(total, 'pending') >= coinbase_pending, + "total.pending {} must include coinbase pending {}".format( + bucket_zat(total, 'pending'), coinbase_pending)) + + # z_listunspent shows NO coinbase UTXOs here: the upstream maturity + # clause (unchanged by zcash/zallet#635) excludes immature coinbase + # from z_listunspent entirely — it only ever surfaces once mature. + # The wallet holds nothing but immature coinbase, so the listing has + # no transparent entries at all. + unspent = w0.z_listunspent(1) + assert_generated_contract(unspent) + assert_equal( + [u for u in unspent if u.get('pool') == Pool.TRANSPARENT], [], + "Immature coinbase must not appear in z_listunspent") + + print(" Immature coinbase pending: {} zat. PASSED".format(coinbase_pending)) + return coinbase_pending + + # ------------------------------------------------------------------ + # Phase 2: coinbase matures; spendable-by-shielding. + # ------------------------------------------------------------------ + + def run_mature_phase(self, node, w0, w0_taddr, account_uuid): + print("\n==== Phase 2: mature coinbase ====") + node.generate(COINBASE_MATURITY + 5) + # A block at height H has (tip - H + 1) confirmations, so blocks + # 1..(tip - 99) are mature: (tip - COINBASE_MATURITY + 1) in total. + # Nothing has been spent yet. + expected_mature = node.getblockcount() - COINBASE_MATURITY + 1 + mature = wait_for_mature_coinbase_count(w0, expected_mature) + mature_sum = sum(utxo_zat(u) for u in mature) + print(" Mature coinbase UTXOs: {} ({} zat)".format( + expected_mature, mature_sum)) + + balances = self.wait_for_balances( + w0, + lambda b: transparent_bucket_zat( + b, account_uuid, 'coinbase', 'spendable') == mature_sum) + acct = account_section(balances, account_uuid) + coinbase = acct[Pool.TRANSPARENT]['coinbase'] + coinbase_spendable = bucket_zat(coinbase, 'spendable') + assert_true(coinbase_spendable > 0, + "Mature coinbase must be spendable: {!r}".format(coinbase)) + assert_equal(coinbase_spendable, mature_sum, + "coinbase.spendable must equal the mature coinbase UTXO sum") + # The 99 blocks above the maturity horizon are still pending. + assert_true(bucket_zat(coinbase, 'pending') > 0, + "Immature tail should still be pending: {!r}".format(coinbase)) + assert_true(acct[Pool.TRANSPARENT].get('regular') is None, + "Still no regular transparent funds expected") + + # total == sum of parts, bucket by bucket, within one snapshot. + total = acct.get('total') + assert_true(total is not None, "total missing: {!r}".format(acct)) + for bucket in ('spendable', 'pending'): + assert_equal(bucket_zat(total, bucket), parts_zat(acct, bucket), + "total.{} must equal the sum of parts".format(bucket)) + assert_true(bucket_zat(total, 'spendable') >= coinbase_spendable, + "total.spendable must include mature coinbase") + + # Every transparent z_listunspent entry is a miner-address coinbase + # here, and each must be flagged generated == True. + unspent = w0.z_listunspent(1) + assert_generated_contract(unspent) + t_entries = [u for u in unspent if u.get('pool') == Pool.TRANSPARENT] + assert_true(len(t_entries) > 0, "Expected mature coinbase entries") + for u in t_entries: + assert_equal(u.get('address'), w0_taddr) + assert_equal(u['generated'], True, + "Coinbase UTXO must have generated == True: {!r}".format(u)) + + print(" coinbase.spendable == {} zat across {} UTXOs. PASSED".format( + coinbase_spendable, len(t_entries))) + return mature, mature_sum + + # ------------------------------------------------------------------ + # Phase 3: create a regular (non-coinbase) UTXO and check the split. + # ------------------------------------------------------------------ + + def run_regular_utxo_phase(self, node, w0, w0_taddr, account_uuid, + ua_shielded, taddr_b, mature, mature_sum): + print("\n==== Phase 3: regular UTXO alongside coinbase ====") + + # Shield every mature coinbase UTXO into the account's shielded pools. + result = w0.z_shieldcoinbase(w0_taddr, ua_shielded) + assert_shieldcoinbase_preflight_shape(result) + assert_equal(result['shieldingUTXOs'], len(mature), + "Sweep should select every mature coinbase UTXO") + assert_equal(result['remainingUTXOs'], 0) + shielding_value = Decimal(result['shieldingValue']) + shield_txid = wait_and_assert_operationid_status(w0, result['opid']) + assert_true(shield_txid is not None, "Shielding should have succeeded") + + node.generate(1) + shield_fee = Decimal(wait_for_tx_scanned(w0, shield_txid)['fee']) + # No shielded funds existed before, so `private` lands at exactly + # shieldingValue - fee. + expected_private = shielding_value - shield_fee + got_private = wait_for_total_balance( + w0, TotalBalanceField.PRIVATE, lambda v: v == expected_private) + assert_equal(got_private, expected_private) + + # Send shielded funds to a second wallet-owned taddr, creating a + # regular (non-coinbase) transparent UTXO. AllowRevealedRecipients + # permits the transparent output while still forbidding transparent + # (coinbase) inputs, so the send is guaranteed to be funded from the + # shielded pools. fee must be null: zallet computes ZIP-317 fees + # internally. + send_zec = Decimal('2.5') + send_zat = zat(send_zec) + opid = w0.z_sendmany( + ua_shielded, [{'address': taddr_b, 'amount': send_zec}], + 1, None, 'AllowRevealedRecipients') + send_txid = wait_and_assert_operationid_status(w0, opid) + assert_true(send_txid is not None, "Send to taddr should have succeeded") + node.generate(1) + wait_for_tx_scanned(w0, send_txid) + + # The new UTXO must land in the regular bucket, and only there. + balances = self.wait_for_balances( + w0, + lambda b: transparent_bucket_zat( + b, account_uuid, 'regular', 'spendable') == send_zat) + acct = account_section(balances, account_uuid) + tbal = acct[Pool.TRANSPARENT] + assert_equal(bucket_zat(tbal.get('regular'), 'spendable'), send_zat, + "regular.spendable must equal the amount sent to the taddr") + assert_equal(bucket_zat(tbal.get('regular'), 'pending'), 0, + "Confirmed regular UTXO must not be pending") + + # The coinbase bucket now reflects only the coinbase that remained + # after the sweep (the blocks that matured since; the two generate(1) + # calls above matured two more). It must match the mature generated + # UTXOs z_listunspent reports, and be strictly below the swept sum. + coinbase_spendable = bucket_zat(tbal.get('coinbase'), 'spendable') + mature_now = [u for u in transparent_utxos(w0, COINBASE_MATURITY) + if u.get('generated') is True] + assert_equal(coinbase_spendable, + sum(utxo_zat(u) for u in mature_now), + "coinbase.spendable must equal the remaining mature " + "coinbase UTXO sum") + assert_true(coinbase_spendable < mature_sum, + "Sweep must have reduced spendable coinbase " + "({} !< {})".format(coinbase_spendable, mature_sum)) + + # z_listunspent: the new UTXO is present with generated == False, + # coinbase entries stay generated == True, and shielded change notes + # carry no generated key. + unspent = w0.z_listunspent(1) + assert_generated_contract(unspent) + regular_entries = [u for u in unspent + if u.get('pool') == Pool.TRANSPARENT + and u.get('address') == taddr_b] + assert_equal(len(regular_entries), 1, + "Expected exactly one UTXO on the second taddr: " + "{!r}".format(unspent)) + assert_equal(regular_entries[0]['generated'], False, + "Non-coinbase UTXO must have generated == False") + assert_equal(utxo_zat(regular_entries[0]), send_zat) + shielded_entries = [u for u in unspent + if u.get('pool') != Pool.TRANSPARENT] + assert_true(len(shielded_entries) > 0, + "Expected shielded notes after the shielding sweep") + + # total.spendable == shielded spendable + regular + mature coinbase, + # computed from the same response, to the zatoshi. + total = acct.get('total') + assert_true(total is not None, "total missing: {!r}".format(acct)) + shielded_spendable = sum( + bucket_zat(acct.get(pool), 'spendable') for pool in SHIELDED_POOLS) + assert_true(shielded_spendable > 0, + "Shielded funds must be spendable by now: {!r}".format(acct)) + assert_equal( + bucket_zat(total, 'spendable'), + shielded_spendable + send_zat + coinbase_spendable, + "total.spendable must equal shielded + regular + mature coinbase") + assert_equal(bucket_zat(total, 'pending'), parts_zat(acct, 'pending'), + "total.pending must equal the sum of parts") + + print(" regular.spendable == {} zat; coinbase.spendable == {} zat. " + "PASSED".format(send_zat, coinbase_spendable)) + return balances + + # ------------------------------------------------------------------ + # Phase 4: z_gettotalbalance cross-check. + # ------------------------------------------------------------------ + + def run_totalbalance_crosscheck(self, w0, account_uuid, balances): + print("\n==== Phase 4: z_gettotalbalance cross-check ====") + # z_gettotalbalance's semantics are intentionally unchanged by + # zcash/zallet#635: its `transparent` figure (in ZEC decimal) is the + # whole transparent holding, which must equal the regular + coinbase + # bucket totals of z_getbalances. The chain is idle here, so the + # snapshot from phase 3 is still current; poll the summary until it + # converges (its scan tip can lag, zcash/wallet#316). + acct = account_section(balances, account_uuid) + tbal = acct[Pool.TRANSPARENT] + expected_zat = (balance_total_zat(tbal.get('regular')) + + balance_total_zat(tbal.get('coinbase'))) + got = wait_for_total_balance( + w0, TotalBalanceField.TRANSPARENT, + lambda v: zat(v) == expected_zat) + assert_equal(zat(got), expected_zat, + "z_gettotalbalance.transparent must equal the " + "regular + coinbase totals from z_getbalances") + print(" transparent == {} ZEC ({} zat). PASSED".format(got, expected_zat)) + + # ------------------------------------------------------------------ + + def run_test(self): + node = self.nodes[0] + w0 = self.wallets[0] + + # `prepare_wallets_for_mining` captures the raw zallet CLI stdout; + # normalize for string comparison against z_listunspent's encoding. + w0_taddr = self.miner_addresses[0].strip() + + # Wait for the wallet to sync to the node tip. Account-mutating RPCs + # reject with "Wallet sync required" until the wallet has committed + # at least one block, since they anchor derivations to a chain height. + self.sync_all() + + accounts = w0.z_listaccounts() + assert_true(len(accounts) >= 1, "Wallet 0 should have at least one account") + account_uuid = accounts[0]['account_uuid'] + + # Shielding destination owned by the same account. Sapling+Orchard + # receivers let the change strategy pick whichever pool it prefers + # (pure-Orchard many-UTXO shields hit a fee-estimation bug, see + # wallet_z_shieldcoinbase.py). + ua_shielded = w0.z_getaddressforaccount( + account_uuid, ["sapling", "orchard"])['address'] + + # A second wallet-owned transparent address (EXTERNAL scope), distinct + # from the INTERNAL-scope miner address: the destination for the + # regular (non-coinbase) UTXO in phase 3. + ua_with_taddr = w0.z_getaddressforaccount( + account_uuid, ["orchard", "p2pkh"])['address'] + taddr_b = first_transparent_receiver(w0, ua_with_taddr) + assert_true(taddr_b != w0_taddr, + "Second taddr must differ from the miner address") + print(" Account UUID: {}".format(account_uuid)) + print(" Miner taddr: {}".format(w0_taddr)) + print(" Second taddr: {}".format(taddr_b)) + + self.run_immature_phase(node, w0, account_uuid) + mature, mature_sum = self.run_mature_phase( + node, w0, w0_taddr, account_uuid) + balances = self.run_regular_utxo_phase( + node, w0, w0_taddr, account_uuid, ua_shielded, taddr_b, + mature, mature_sum) + self.run_totalbalance_crosscheck(w0, account_uuid, balances) + + print("\nAll transparent coinbase balance tests passed!") + + +if __name__ == '__main__': + WalletTransparentCoinbaseBalanceTest().main() From 692e64a42c999c45e3b46f5ec99febb7c033bbff Mon Sep 17 00:00:00 2001 From: Pacu Date: Fri, 17 Jul 2026 06:02:40 -0300 Subject: [PATCH 5/6] test_framework: run generate-encryption-identity before init-wallet-encryption Zallet after 0.1.0-beta.1 requires an age encryption identity to exist before init-wallet-encryption succeeds (zcash/zallet#621 made recipient initialization atomic and moved identity generation to a dedicated generate-encryption-identity subcommand). Run it first at every wallet provisioning site, tolerating failure so older zallet binaries (which lack the subcommand and generate the identity inside init-wallet-encryption) keep working. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017WB1TU6tyLmMa1n4SQ9XgK --- qa/rpc-tests/test_framework/util.py | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 76acee813..c75a864c1 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -380,6 +380,24 @@ def wait_for_zebrad_start(process, url, i): raise # unknown JSON RPC exception time.sleep(0.25) +def init_wallet_encryption(zallet, datadir, stderr=None): + """ + Initializes wallet encryption for the zallet at `datadir`. + + Newer zallets (after 0.1.0-beta.1) require an age encryption identity to + exist before `init-wallet-encryption` will succeed, generated via the + `generate-encryption-identity` subcommand. Older zallets do not have that + subcommand and create the identity inside `init-wallet-encryption`; the + failure of the first invocation is harmless there, so we tolerate it. + """ + args = [ zallet, "-d="+datadir, "generate-encryption-identity" ] + process = subprocess.Popen(args, stderr=stderr) + process.wait() + + args = [ zallet, "-d="+datadir, "init-wallet-encryption" ] + process = subprocess.Popen(args, stderr=stderr) + process.wait() + def initialize_chain(test_dir, num_nodes, cachedir, cache_behavior='current'): """ Create a set of node datadirs in `test_dir`, based upon the specified @@ -422,9 +440,7 @@ def rebuild_cache(): indexer_port=indexer_rpc_port(i), zebra_state_dir=node_dir(cachedir, i)) - args = [ zallet, "-d="+datadir, "init-wallet-encryption" ] - process = subprocess.Popen(args) - process.wait() + init_wallet_encryption(zallet, datadir) args = [ zallet, "-d="+datadir, "generate-mnemonic" ] process = subprocess.Popen(args) @@ -1127,9 +1143,7 @@ def prepare_wallets_for_mining(num_wallets, dirname, binary=None, zallet_args=No indexer_port=indexer_rpc_port(i), zebra_state_dir=node_dir(dirname, i)) - args = [ zallet, "-d="+datadir, "init-wallet-encryption" ] - process = subprocess.Popen(args) - process.wait() + init_wallet_encryption(zallet, datadir) args = [ zallet, "-d="+datadir, "generate-mnemonic" ] process = subprocess.Popen(args) @@ -1179,9 +1193,7 @@ def start_wallet(i, dirname, extra_args=None, rpchost=None, timewait=None, binar # We prepare the wallet if it is new if prepare: - args = [ binary, "-d="+datadir, "init-wallet-encryption" ] - process = subprocess.Popen(args, stderr=stderr) - process.wait() + init_wallet_encryption(binary, datadir, stderr=stderr) args = [ binary, "-d="+datadir, "generate-mnemonic" ] process = subprocess.Popen(args, stderr=stderr) From 9c414b0cf496ae983899d7860db73a3f3215f9f2 Mon Sep 17 00:00:00 2001 From: Pacu Date: Fri, 17 Jul 2026 06:02:40 -0300 Subject: [PATCH 6/6] wallet_transparent_coinbase_balance: wait for shielded spendable before sending z_gettotalbalance's private field counts pending value, so polling it is not sufficient before z_sendmany: the freshly-shielded note must become spendable (zcash/wallet#316 lag) or the send fails with insufficient balance. Poll the shielded spendable buckets from z_getbalances, with ZIP-317 fee headroom, before proposing the send. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017WB1TU6tyLmMa1n4SQ9XgK --- .../wallet_transparent_coinbase_balance.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/qa/rpc-tests/wallet_transparent_coinbase_balance.py b/qa/rpc-tests/wallet_transparent_coinbase_balance.py index 67e4980dc..beb9f3331 100644 --- a/qa/rpc-tests/wallet_transparent_coinbase_balance.py +++ b/qa/rpc-tests/wallet_transparent_coinbase_balance.py @@ -115,6 +115,13 @@ def parts_zat(acct, bucket): return total +def shielded_spendable_zat(balances, account_uuid): + """Sum of the `spendable` buckets across the account's shielded pools.""" + acct = account_section(balances, account_uuid) + return sum(bucket_zat(acct.get(pool), 'spendable') + for pool in SHIELDED_POOLS) + + def utxo_zat(utxo): """The value of a z_listunspent entry in zatoshis. Prefers the exact integer `valueZat` field; falls back to converting the decimal @@ -353,6 +360,17 @@ def run_regular_utxo_phase(self, node, w0, w0_taddr, account_uuid, # internally. send_zec = Decimal('2.5') send_zat = zat(send_zec) + + # `private` (via z_gettotalbalance) counts pending value, but the + # freshly-shielded note must become *spendable* before it can fund a + # send: the wallet lags between a note being confirmed and being + # reported (and usable) as spendable (zcash/wallet#316). Wait on the + # spendable bucket, with ZIP-317 fee headroom, before proposing. + self.wait_for_balances( + w0, + lambda b: shielded_spendable_zat(b, account_uuid) + >= send_zat + zat(Decimal('0.001'))) + opid = w0.z_sendmany( ua_shielded, [{'address': taddr_b, 'amount': send_zec}], 1, None, 'AllowRevealedRecipients')