mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-07-29 11:48:12 -07:00
74 lines
2.3 KiB
Rust
74 lines
2.3 KiB
Rust
use brk_error::{Error, Result};
|
|
use brk_types::{BlockHashPrefix, Timestamp};
|
|
use tracing::error;
|
|
use vecdb::WritableVec;
|
|
|
|
use super::{BlockProcessor, ComputedTx};
|
|
use crate::IndexesExt;
|
|
|
|
impl BlockProcessor<'_> {
|
|
pub fn process_block_metadata(&mut self) -> Result<()> {
|
|
let height = self.height;
|
|
let blockhash = self.block.hash();
|
|
let blockhash_prefix = BlockHashPrefix::from(blockhash);
|
|
|
|
if self
|
|
.stores
|
|
.blockhashprefix_to_height
|
|
.get(&blockhash_prefix)?
|
|
.is_some_and(|prev_height| *prev_height != height)
|
|
{
|
|
error!("BlockHash: {blockhash}");
|
|
return Err(Error::Internal("BlockHash prefix collision"));
|
|
}
|
|
|
|
self.indexes.checked_push(self.vecs)?;
|
|
|
|
self.stores
|
|
.blockhashprefix_to_height
|
|
.insert(blockhash_prefix, height);
|
|
|
|
self.stores
|
|
.height_to_coinbase_tag
|
|
.insert(height, self.block.coinbase_tag().into());
|
|
|
|
self.vecs
|
|
.blocks
|
|
.blockhash
|
|
.checked_push(height, blockhash.clone())?;
|
|
self.vecs
|
|
.blocks
|
|
.difficulty
|
|
.checked_push(height, self.block.header.difficulty_float().into())?;
|
|
self.vecs
|
|
.blocks
|
|
.timestamp
|
|
.checked_push(height, Timestamp::from(self.block.header.time))?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Push block total_size and weight, reusing per-tx sizes already computed in ComputedTx.
|
|
/// This avoids redundant tx serialization (base_size + total_size were already computed).
|
|
pub fn push_block_size_and_weight(&mut self, txs: &[ComputedTx]) -> Result<()> {
|
|
let overhead = bitcoin::block::Header::SIZE + bitcoin::VarInt::from(txs.len()).size();
|
|
let mut total_size = overhead;
|
|
let mut weight_wu = overhead * 4;
|
|
for ct in txs {
|
|
let base = ct.base_size as usize;
|
|
let total = ct.total_size as usize;
|
|
total_size += total;
|
|
weight_wu += base * 3 + total;
|
|
}
|
|
self.vecs
|
|
.blocks
|
|
.total_size
|
|
.checked_push(self.height, total_size.into())?;
|
|
self.vecs
|
|
.blocks
|
|
.weight
|
|
.checked_push(self.height, weight_wu.into())?;
|
|
Ok(())
|
|
}
|
|
}
|