use chia_protocol::Bytes32;
pub const CF_COIN_RECORDS: &str = "coin_records";
pub const CF_COIN_BY_PUZZLE_HASH: &str = "coin_by_puzzle_hash";
pub const CF_UNSPENT_BY_PUZZLE_HASH: &str = "unspent_by_puzzle_hash";
pub const CF_COIN_BY_PARENT: &str = "coin_by_parent";
pub const CF_COIN_BY_CONFIRMED_HEIGHT: &str = "coin_by_confirmed_height";
pub const CF_COIN_BY_SPENT_HEIGHT: &str = "coin_by_spent_height";
pub const CF_HINTS: &str = "hints";
pub const CF_HINTS_BY_VALUE: &str = "hints_by_value";
pub const CF_MERKLE_NODES: &str = "merkle_nodes";
pub const CF_ARCHIVE_COIN_RECORDS: &str = "archive_coin_records";
pub const CF_STATE_SNAPSHOTS: &str = "state_snapshots";
pub const CF_METADATA: &str = "metadata";
pub const ALL_COLUMN_FAMILIES: &[&str] = &[
CF_COIN_RECORDS,
CF_COIN_BY_PUZZLE_HASH,
CF_UNSPENT_BY_PUZZLE_HASH,
CF_COIN_BY_PARENT,
CF_COIN_BY_CONFIRMED_HEIGHT,
CF_COIN_BY_SPENT_HEIGHT,
CF_HINTS,
CF_HINTS_BY_VALUE,
CF_MERKLE_NODES,
CF_ARCHIVE_COIN_RECORDS,
CF_STATE_SNAPSHOTS,
CF_METADATA,
];
pub const STO002_ROCKS_WRITE_BUFFER_BYTES: [usize; 12] = [
64 * 1024 * 1024, 32 * 1024 * 1024, 32 * 1024 * 1024, 16 * 1024 * 1024, 16 * 1024 * 1024, 16 * 1024 * 1024, 16 * 1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024, 16 * 1024 * 1024, 8 * 1024 * 1024, 4 * 1024 * 1024, ];
const _: () = assert!(ALL_COLUMN_FAMILIES.len() == STO002_ROCKS_WRITE_BUFFER_BYTES.len());
pub const STO006_ROCKS_MAX_WRITE_BUFFER_NUMBER: [i32; 12] = [
3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, ];
const _: () = assert!(ALL_COLUMN_FAMILIES.len() == STO006_ROCKS_MAX_WRITE_BUFFER_NUMBER.len());
#[inline]
pub fn coin_key(coin_id: &Bytes32) -> [u8; 32] {
let mut key = [0u8; 32];
key.copy_from_slice(coin_id.as_ref());
key
}
#[inline]
pub fn coin_id_from_key(key: &[u8]) -> Bytes32 {
let mut bytes = [0u8; 32];
bytes.copy_from_slice(&key[..32]);
Bytes32::from(bytes)
}
#[inline]
pub fn puzzle_hash_coin_key(puzzle_hash: &Bytes32, coin_id: &Bytes32) -> [u8; 64] {
let mut key = [0u8; 64];
key[..32].copy_from_slice(puzzle_hash.as_ref());
key[32..].copy_from_slice(coin_id.as_ref());
key
}
#[inline]
pub fn puzzle_hash_from_key(key: &[u8]) -> Bytes32 {
let mut bytes = [0u8; 32];
bytes.copy_from_slice(&key[..32]);
Bytes32::from(bytes)
}
#[inline]
pub fn parent_coin_key(parent_id: &Bytes32, coin_id: &Bytes32) -> [u8; 64] {
let mut key = [0u8; 64];
key[..32].copy_from_slice(parent_id.as_ref());
key[32..].copy_from_slice(coin_id.as_ref());
key
}
#[inline]
pub fn height_coin_key(height: u64, coin_id: &Bytes32) -> [u8; 40] {
let mut key = [0u8; 40];
key[..8].copy_from_slice(&height.to_be_bytes());
key[8..].copy_from_slice(coin_id.as_ref());
key
}
#[inline]
pub fn height_coin_from_key(key: &[u8]) -> (u64, Bytes32) {
let height = u64::from_be_bytes(key[..8].try_into().expect("key must be >= 8 bytes"));
let mut coin_bytes = [0u8; 32];
coin_bytes.copy_from_slice(&key[8..40]);
(height, Bytes32::from(coin_bytes))
}
#[inline]
pub fn snapshot_key(height: u64) -> [u8; 8] {
height.to_be_bytes()
}
#[inline]
pub fn height_from_snapshot_key(key: &[u8]) -> u64 {
u64::from_be_bytes(key[..8].try_into().expect("key must be 8 bytes"))
}
#[inline]
pub fn height_from_key(key: &[u8]) -> u64 {
assert!(
key.len() >= 8,
"height_from_key: key must contain at least 8 bytes for u64 BE prefix"
);
u64::from_be_bytes(key[..8].try_into().expect("len checked"))
}
#[inline]
pub fn coin_hint_key(coin_id: &Bytes32, hint: &Bytes32) -> [u8; 64] {
let mut key = [0u8; 64];
key[..32].copy_from_slice(coin_id.as_ref());
key[32..].copy_from_slice(hint.as_ref());
key
}
#[inline]
pub fn hint_coin_key(hint: &Bytes32, coin_id: &Bytes32) -> [u8; 64] {
let mut key = [0u8; 64];
key[..32].copy_from_slice(hint.as_ref());
key[32..].copy_from_slice(coin_id.as_ref());
key
}
#[inline]
pub fn metadata_key(name: &str) -> Vec<u8> {
name.as_bytes().to_vec()
}
#[inline]
pub fn merkle_node_key(level: u8, path: &Bytes32) -> [u8; 33] {
let mut key = [0u8; 33];
key[0] = level;
key[1..].copy_from_slice(path.as_ref());
key
}
#[inline]
pub fn merkle_node_from_key(key: &[u8]) -> Option<(u8, Bytes32)> {
if key.len() != 33 {
return None;
}
let mut path = [0u8; 32];
path.copy_from_slice(&key[1..33]);
Some((key[0], Bytes32::from(path)))
}