* import diffs * small fixes, hardfork changes * lints * hard_fork * apply diffs * review fixes * binaries/cuprated/src/rpc/request: `pub(super)` -> `pub(crate)` * add `BlockChainContextService`, `on_get_block_hash` * map `tower::BoxError` to `anyhow::Error` * get_block * connection_info * hard_fork_info * set_bans * get_bans * banned * flush_transaction_pool * get_output_histogram * get_coinbase_tx_sum * get_version * get_fee_estimate * get_alternate_chains * relay_tx * response_base: `fn` -> `const` * get_transaction_pool_backlog * prune * calc_pow * add_aux_pow * get_tx_ids_loose * generate_blocks * get_info * sync_info * get_miner_data * `BlockchainManagerRequest` docs * docs, `ConnectionInfo`, `AddressType` * sig docs, remove `HardForks` request * clean imports * fix `on_get_block_hash`, `generate_blocks`, `get_block_headers_range` * fix `get_info`, `banned` * fix `sync_info` * fix `get_miner_data` * initial `add_aux_pow` impl * fix `calculate_pow` * add_aux_pow * `get_output_distribution` * checkup * `find_nonce()` + `add_aux_pow` async wrapper * fixes * `helper::block_header` * review fixes * fixes * doc fix * p2p: remove tmp `AddressBookRequest::NextNeededPruningSeed` * lint/todo fixes * fix bans * merge diffs from https://github.com/Cuprate/cuprate/pull/272 * `cuprate_types::rpc`, `from` module for `cuprate_rpc_types` * `rpc-types` -> `types` pt. 2 * type fixes, move fn to `-helper` * clippy fix * rpc: move json-rpc types away from macros * !! * move types, fix orphan impl + cyclic dependency * architecture book * fix json-rpc handlers * remove `::<N>` * fix clippy * fix type defaults, use `Hex` * return defaults, hex test * json_rpc: get_block_template * `/get_transactions` * `/is_key_image_spent` * !! * `/get_transactions` hex * most of `/send_raw_transaction` * `/send_raw_transaction`, `/save_bc`, response_base * `/peerlist` * `/get_transaction_pool` * `/get_transaction_pool_stats` * finish other draft * get_blocks_by_height, shared::get_outs * `/get_o_indexes.bin` * `/get_output_distribution.bin` * clippy * `/get_blocks.bin` * rpc-interface: add restricted invariant comments * restricted json-rpc error * get_output_distribution * module cleanup * txpool: all_hashes * `HexVec` * fix `get_txid` for `/get_outs` miner transaction was not accounted for * fix doc tests * fix conflict * json-rpc fixes * `get_transaction_pool_hashes` fix * rpc/interface: fix cargo hack * review fixes * cargo hack fix * use `monero_address` * Update binaries/cuprated/src/rpc/handlers/json_rpc.rs Co-authored-by: Boog900 <boog900@tutanota.com> * Update binaries/cuprated/src/rpc/handlers/json_rpc.rs Co-authored-by: Boog900 <boog900@tutanota.com> * review fixes * fix `get_hashes` * fix `is_key_image_spent` * fix key image types * fixes * fix book * output timelock fix + `blockchain_context()` * fix * fix * fix * fix getblocks.bin * `cuprate_types` doc * output fix * fixme * rct output fix * fix cast * clippy --------- Co-authored-by: Boog900 <boog900@tutanota.com> |
||
---|---|---|
.. | ||
src | ||
Cargo.toml | ||
README.md |
Cuprate's tx-pool database.
This documentation is mostly for practical usage of cuprate_txpool
.
For a high-level overview, see the database section in Cuprate's architecture book.
If you're looking for a database crate, consider using the lower-level
cuprate-database
crate that this crate is built on-top of.
Purpose
This crate does 3 things:
- Uses [
cuprate_database
] as a base database layer - Implements various transaction pool related operations, [tables], and [types]
- Exposes a [
tower::Service
] backed by a thread-pool
Each layer builds on-top of the previous.
As a user of cuprate_txpool
, consider using the higher-level [service
] module,
or at the very least the [ops
] module instead of interacting with the cuprate_database
traits directly.
cuprate_database
Consider reading cuprate_database
's crate documentation before this crate, as it is the first layer.
If/when this crate needs is used, be sure to use the version that this crate re-exports, e.g.:
use cuprate_txpool::{
cuprate_database::RuntimeError,
};
This ensures the types/traits used from cuprate_database
are the same ones used by cuprate_txpool
internally.
Feature flags
Different database backends are enabled by the feature flags:
heed
(LMDB)redb
The default is heed
.
tracing
is always enabled and cannot be disabled via feature-flag.
Invariants when not using service
See cuprate_blockchain
, the invariants are the same.
Examples
The below is an example of using cuprate_txpool
's
lowest API, i.e. using a mix of this crate and cuprate_database
's traits directly -
this is NOT recommended.
For examples of the higher-level APIs, see:
- [
ops
] - [
service
]
use cuprate_txpool::{
cuprate_database::{
ConcreteEnv,
Env, EnvInner,
DatabaseRo, DatabaseRw, TxRo, TxRw,
},
config::ConfigBuilder,
tables::{Tables, TablesMut, OpenTables},
};
# fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a configuration for the database environment.
let tmp_dir = tempfile::tempdir()?;
let db_dir = tmp_dir.path().to_owned();
let config = ConfigBuilder::new()
.data_directory(db_dir.into())
.build();
// Initialize the database environment.
let env = cuprate_txpool::open(config)?;
// Open up a transaction + tables for writing.
let env_inner = env.env_inner();
let tx_rw = env_inner.tx_rw()?;
let mut tables = env_inner.open_tables_mut(&tx_rw)?;
// ⚠️ Write data to the tables directly.
// (not recommended, use `ops` or `service`).
const KEY_IMAGE: [u8; 32] = [88; 32];
const TX_HASH: [u8; 32] = [88; 32];
tables.spent_key_images_mut().put(&KEY_IMAGE, &TX_HASH)?;
// Commit the data written.
drop(tables);
TxRw::commit(tx_rw)?;
// Read the data, assert it is correct.
let tx_ro = env_inner.tx_ro()?;
let tables = env_inner.open_tables(&tx_ro)?;
let (key_image, tx_hash) = tables.spent_key_images().first()?;
assert_eq!(key_image, KEY_IMAGE);
assert_eq!(tx_hash, TX_HASH);
# Ok(())
}