929d19c450
* fixed-bytes: add `serde`, document feature flags * fixed-bytes: add derives * rpc: add `as _` syntax to macro * rpc: use `ByteArrayVec` and `ContainerAsBlob` for binary types * fixed-bytes: re-add derives * rpc-types: dedup default value within macro * readme: fixed bytes section * types: custom epee - `BlockCompleteEntry` * types: custom epee - `KeyImageSpentStatus` * types: custom epee - `PoolInfoExtent` * types: add `Status::Other(String)` variant * types: custom epee - `TxEntry`, add `read_epee_field` macro * bin: custom epee - `GetBlocks` * types: add `serde.rs` * misc: make `TxEntry` an `enum`, impl serde * misc: `unimplemented!()` for `TxEntry`'s epee * types: add `BlockCompleteEntry` * rpc: replace `BlockCompleteEntry` with `cuprate-types` * types: document `BlockCompleteEntry` * bin: fix `number_of_fields` for `GetBlocksResponse` * misc: add `Distribution` * distribution: add todo * misc fixes * readme: add `(De)serialization invariants` * distribution: compress variants * types: add `block_complete_entry.rs` * net: fix imports * p2p: fix imports * turn off default-features * p2p: fix imports * misc fixes * Update net/wire/Cargo.toml Co-authored-by: Boog900 <boog900@tutanota.com> * distribution: module doc * wire: re-export types * bin: use enum for `GetBlocksResponse` * misc: use lowercase for stringify * remove duplicated fields for custom epee * types: remove `should_write()` for custom epee * bin: split `GetBlocksResponse` variant fields into structs * misc: split `Distribution` variant fields into structs * small fixes * put all fields in `read_epee_field!` * distribution: (de)compress during epee/serde (de)serialization * distribution: leave (de)compression functions as `todo!()` --------- Co-authored-by: Boog900 <boog900@tutanota.com> |
||
---|---|---|
.. | ||
src | ||
Cargo.toml | ||
README.md |
Monero RPC types.
What
This crate ports the types used in Monero's RPC interface, including:
- JSON types
- Binary (epee) types
- Mixed types
- Other commonly used RPC types
Modules
This crate's types are split in the following manner:
Module | Purpose |
---|---|
The root module | Miscellaneous items, e.g. constants. |
[json ] |
Contains JSON request/response (some mixed with binary) that all share the common /json_rpc endpoint. |
[bin ] |
Contains request/response types that are expected to be fully in binary (cuprate_epee_encoding ) in monerod and cuprated 's RPC interface. These are called at a custom endpoint instead of /json_rpc , e.g. /get_blocks.bin . |
[other ] |
Contains request/response types that are JSON, but aren't called at /json_rpc (e.g. [crate::other::GetHeightRequest ]). |
[misc ] |
Contains miscellaneous types, e.g. [crate::misc::Status ]. Many of types here are found and used in request/response types, for example, [crate::misc::BlockHeader ] is used in [crate::json::GetLastBlockHeaderResponse ]. |
[base ] |
Contains base types flattened into many request/response types. |
Each type in {json,bin,other}
come in pairs and have identical names, but are suffixed with either Request
or Response
. e.g. GetBlockCountRequest
& GetBlockCountResponse
.
Documentation
The documentation for types within {json,bin,other}
are omitted, as they can be found in Monero's RPC documentation.
However, each type will document:
- Definition: the exact type definition location in
monerod
- Documentation: the Monero RPC documentation link
- Request/response: the other side of this type, either the request or response
Naming
The naming for types within {json,bin,other}
follow the following scheme:
- Convert the endpoint or method name into
UpperCamelCase
- Remove any suffix extension
- Add
Request/Response
suffix
For example:
Endpoint/method | Crate location and name |
---|---|
get_block_count |
[json::GetBlockCountRequest ] & [json::GetBlockCountResponse ] |
/get_blocks.bin |
[bin::GetBlocksRequest ] & [bin::GetBlocksResponse ] |
/get_height |
[other::GetHeightRequest ] & [other::GetHeightResponse ] |
Mixed types
Note that some types mix JSON & binary together, i.e., the message overall is JSON, however some fields contain binary values inside JSON strings, for example:
{
"string": "",
"float": 30.0,
"integer": 30,
"binary": "<serialized binary>"
}
binary
here is (de)serialized as a normal [String
]. In order to be clear on which fields contain binary data, the struct fields that have them will use [crate::misc::BinaryString
] instead of [String
].
These mixed types are:
- [
crate::json::GetTransactionPoolBacklogResponse
] - [
crate::json::GetOutputDistributionResponse
]
TODO: we need to figure out a type that (de)serializes correctly, String
errors with serde_json
Fixed byte containers
TODO
(De)serialization invariants
Due to how types are defined in this library internally (all through a single macro),
most types implement both serde
and epee
.
However, some of the types will panic with [unimplemented
]
or will otherwise have undefined implementation in the incorrect context.
In other words:
- The epee (de)serialization of [
json
] & [other
] types should not be relied upon - The JSON (de)serialization of [
bin
] types should not be relied upon
The invariants that can be relied upon:
- Types in [
json
] & [other
] will implementserde
correctly - Types in [
bin
] will implementepee
correctly - Misc types will implement
serde/epee
correctly as needed
Feature flags
List of feature flags for cuprate-rpc-types
.
All are enabled by default.
Feature flag | Does what |
---|---|
serde |
Implements serde on all types |
epee |
Implements cuprate_epee_encoding on all types |