mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-07-01 22:39:03 -07:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f32b6daa51 | |||
| 3736d6ba5e | |||
| 9788b01f35 |
Generated
+12
-12
@@ -374,7 +374,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk"
|
name = "brk"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_cli",
|
"brk_cli",
|
||||||
"brk_computer",
|
"brk_computer",
|
||||||
@@ -391,7 +391,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_cli"
|
name = "brk_cli"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_computer",
|
"brk_computer",
|
||||||
"brk_core",
|
"brk_core",
|
||||||
@@ -412,7 +412,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_computer"
|
name = "brk_computer"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_core",
|
"brk_core",
|
||||||
"brk_exit",
|
"brk_exit",
|
||||||
@@ -427,7 +427,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_core"
|
name = "brk_core"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin",
|
"bitcoin",
|
||||||
"bitcoincore-rpc",
|
"bitcoincore-rpc",
|
||||||
@@ -444,7 +444,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_exit"
|
name = "brk_exit"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_logger",
|
"brk_logger",
|
||||||
"ctrlc",
|
"ctrlc",
|
||||||
@@ -453,7 +453,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_fetcher"
|
name = "brk_fetcher"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_core",
|
"brk_core",
|
||||||
"brk_logger",
|
"brk_logger",
|
||||||
@@ -466,7 +466,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_indexer"
|
name = "brk_indexer"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin",
|
"bitcoin",
|
||||||
"bitcoincore-rpc",
|
"bitcoincore-rpc",
|
||||||
@@ -485,7 +485,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_logger"
|
name = "brk_logger"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
@@ -495,7 +495,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_parser"
|
name = "brk_parser"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin",
|
"bitcoin",
|
||||||
"bitcoincore-rpc",
|
"bitcoincore-rpc",
|
||||||
@@ -510,7 +510,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_query"
|
name = "brk_query"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brk_computer",
|
"brk_computer",
|
||||||
"brk_indexer",
|
"brk_indexer",
|
||||||
@@ -526,7 +526,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_server"
|
name = "brk_server"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum",
|
"axum",
|
||||||
"brk_computer",
|
"brk_computer",
|
||||||
@@ -552,7 +552,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brk_vec"
|
name = "brk_vec"
|
||||||
version = "0.0.20"
|
version = "0.0.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"axum",
|
"axum",
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ members = ["crates/*"]
|
|||||||
package.description = "The Bitcoin Research Kit is a suite of tools designed to extract, compute and display data stored on a Bitcoin Core node"
|
package.description = "The Bitcoin Research Kit is a suite of tools designed to extract, compute and display data stored on a Bitcoin Core node"
|
||||||
package.license = "MIT"
|
package.license = "MIT"
|
||||||
package.edition = "2024"
|
package.edition = "2024"
|
||||||
package.version = "0.0.20"
|
package.version = "0.0.21"
|
||||||
package.repository = "https://github.com/bitcoinresearchkit/brk"
|
package.repository = "https://github.com/bitcoinresearchkit/brk"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk">
|
<a href="https://deps.rs/crate/brk">
|
||||||
<img src="https://deps.rs/crate/brk/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_cli">
|
<a href="https://deps.rs/crate/brk_cli">
|
||||||
<img src="https://deps.rs/crate/brk_cli/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_cli/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_computer">
|
<a href="https://deps.rs/crate/brk_computer">
|
||||||
<img src="https://deps.rs/crate/brk_computer/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_computer/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -249,11 +249,12 @@ where
|
|||||||
let index = max_from.min(I::from(self.len()));
|
let index = max_from.min(I::from(self.len()));
|
||||||
let one = T::from(1);
|
let one = T::from(1);
|
||||||
let mut prev_index: Option<I> = None;
|
let mut prev_index: Option<I> = None;
|
||||||
first_indexes.iter_from(index, |(i, v, ..)| {
|
first_indexes.iter_from(index, |(index, v, ..)| {
|
||||||
if let Some(prev_index) = prev_index.take() {
|
if let Some(prev_index) = prev_index.take() {
|
||||||
self.forced_push_at(prev_index, v.checked_sub(one).unwrap(), exit)?;
|
let value = v.checked_sub(one).unwrap();
|
||||||
|
self.forced_push_at(prev_index, value, exit)?;
|
||||||
}
|
}
|
||||||
prev_index.replace(i);
|
prev_index.replace(index);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
if let Some(prev_index) = prev_index {
|
if let Some(prev_index) = prev_index {
|
||||||
@@ -276,7 +277,65 @@ where
|
|||||||
) -> Result<()>
|
) -> Result<()>
|
||||||
where
|
where
|
||||||
T: From<T2>,
|
T: From<T2>,
|
||||||
T2: StoredType + Copy + Add<usize, Output = T2> + CheckedSub<T2> + TryInto<T> + Default,
|
T2: StoredType
|
||||||
|
+ StoredIndex
|
||||||
|
+ Copy
|
||||||
|
+ Add<usize, Output = T2>
|
||||||
|
+ CheckedSub<T2>
|
||||||
|
+ TryInto<T>
|
||||||
|
+ Default,
|
||||||
|
<T2 as TryInto<T>>::Error: error::Error + 'static,
|
||||||
|
{
|
||||||
|
let opt: Option<Box<dyn FnMut(T2) -> bool>> = None;
|
||||||
|
self.compute_filtered_count_from_indexes_(max_from, first_indexes, last_indexes, opt, exit)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn compute_filtered_count_from_indexes<T2, F>(
|
||||||
|
&mut self,
|
||||||
|
max_from: I,
|
||||||
|
first_indexes: &mut StoredVec<I, T2>,
|
||||||
|
last_indexes: &mut StoredVec<I, T2>,
|
||||||
|
filter: F,
|
||||||
|
exit: &Exit,
|
||||||
|
) -> Result<()>
|
||||||
|
where
|
||||||
|
T: From<T2>,
|
||||||
|
T2: StoredType
|
||||||
|
+ StoredIndex
|
||||||
|
+ Copy
|
||||||
|
+ Add<usize, Output = T2>
|
||||||
|
+ CheckedSub<T2>
|
||||||
|
+ TryInto<T>
|
||||||
|
+ Default,
|
||||||
|
<T2 as TryInto<T>>::Error: error::Error + 'static,
|
||||||
|
F: FnMut(T2) -> bool,
|
||||||
|
{
|
||||||
|
self.compute_filtered_count_from_indexes_(
|
||||||
|
max_from,
|
||||||
|
first_indexes,
|
||||||
|
last_indexes,
|
||||||
|
Some(Box::new(filter)),
|
||||||
|
exit,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compute_filtered_count_from_indexes_<T2>(
|
||||||
|
&mut self,
|
||||||
|
max_from: I,
|
||||||
|
first_indexes: &mut StoredVec<I, T2>,
|
||||||
|
last_indexes: &mut StoredVec<I, T2>,
|
||||||
|
mut filter: Option<Box<dyn FnMut(T2) -> bool + '_>>,
|
||||||
|
exit: &Exit,
|
||||||
|
) -> Result<()>
|
||||||
|
where
|
||||||
|
T: From<T2>,
|
||||||
|
T2: StoredType
|
||||||
|
+ StoredIndex
|
||||||
|
+ Copy
|
||||||
|
+ Add<usize, Output = T2>
|
||||||
|
+ CheckedSub<T2>
|
||||||
|
+ TryInto<T>
|
||||||
|
+ Default,
|
||||||
<T2 as TryInto<T>>::Error: error::Error + 'static,
|
<T2 as TryInto<T>>::Error: error::Error + 'static,
|
||||||
{
|
{
|
||||||
self.validate_computed_version_or_reset_file(
|
self.validate_computed_version_or_reset_file(
|
||||||
@@ -285,11 +344,14 @@ where
|
|||||||
|
|
||||||
let index = max_from.min(I::from(self.len()));
|
let index = max_from.min(I::from(self.len()));
|
||||||
first_indexes.iter_from(index, |(i, first_index, ..)| {
|
first_indexes.iter_from(index, |(i, first_index, ..)| {
|
||||||
let last_index = last_indexes.cached_get(i)?.unwrap();
|
let last_index = last_indexes.cached_get(i)?.unwrap().into_inner();
|
||||||
let count = (*last_index + 1_usize)
|
let range = first_index.to_usize().unwrap()..=last_index.to_usize().unwrap();
|
||||||
.checked_sub(first_index)
|
let count = if let Some(filter) = filter.as_mut() {
|
||||||
.unwrap_or_default();
|
range.into_iter().filter(|i| filter(T2::from(*i))).count()
|
||||||
self.forced_push_at(i, count.into(), exit)
|
} else {
|
||||||
|
range.count()
|
||||||
|
};
|
||||||
|
self.forced_push_at(i, T::from(T2::from(count)), exit)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
self.safe_flush(exit)
|
self.safe_flush(exit)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ use brk_exit::Exit;
|
|||||||
use brk_vec::{
|
use brk_vec::{
|
||||||
Compressed, DynamicVec, GenericVec, Result, StoredIndex, StoredType, StoredVec, Version,
|
Compressed, DynamicVec, GenericVec, Result, StoredIndex, StoredType, StoredVec, Version,
|
||||||
};
|
};
|
||||||
|
use color_eyre::eyre::ContextCompat;
|
||||||
|
|
||||||
use crate::storage::vecs::base::ComputedVec;
|
use crate::storage::vecs::base::ComputedVec;
|
||||||
|
|
||||||
@@ -162,8 +163,8 @@ where
|
|||||||
{
|
{
|
||||||
let index = self.starting_index(max_from);
|
let index = self.starting_index(max_from);
|
||||||
|
|
||||||
first_indexes.iter_from(index, |(i, first_index, ..)| {
|
first_indexes.iter_from(index, |(i, first_index, first_indexes)| {
|
||||||
let last_index = *last_indexes.cached_get(i)?.unwrap();
|
let last_index = last_indexes.cached_get(i)?.unwrap().into_inner();
|
||||||
|
|
||||||
if let Some(first) = self.first.as_mut() {
|
if let Some(first) = self.first.as_mut() {
|
||||||
let v = source.cached_get(first_index)?.unwrap().into_inner();
|
let v = source.cached_get(first_index)?.unwrap().into_inner();
|
||||||
@@ -199,7 +200,27 @@ where
|
|||||||
values.sort_unstable();
|
values.sort_unstable();
|
||||||
|
|
||||||
if let Some(max) = self.max.as_mut() {
|
if let Some(max) = self.max.as_mut() {
|
||||||
max.forced_push_at(i, values.last().unwrap().clone(), exit)?;
|
max.forced_push_at(
|
||||||
|
i,
|
||||||
|
values
|
||||||
|
.last()
|
||||||
|
.context("expect some")
|
||||||
|
.inspect_err(|_| {
|
||||||
|
dbg!(
|
||||||
|
&values,
|
||||||
|
max.path(),
|
||||||
|
first_indexes.path(),
|
||||||
|
first_index,
|
||||||
|
last_indexes.path(),
|
||||||
|
last_index,
|
||||||
|
source.len(),
|
||||||
|
source.path()
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
.clone(),
|
||||||
|
exit,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(_90p) = self._90p.as_mut() {
|
if let Some(_90p) = self._90p.as_mut() {
|
||||||
|
|||||||
@@ -363,9 +363,11 @@ impl Vecs {
|
|||||||
exit,
|
exit,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
let decremented_starting_height = starting_indexes.height.decremented().unwrap_or_default();
|
||||||
|
|
||||||
let starting_dateindex = self
|
let starting_dateindex = self
|
||||||
.height_to_dateindex
|
.height_to_dateindex
|
||||||
.cached_get(starting_indexes.height.decremented().unwrap_or_default())?
|
.cached_get(decremented_starting_height)?
|
||||||
.map_or_else(Default::default, |v| v.into_inner());
|
.map_or_else(Default::default, |v| v.into_inner());
|
||||||
|
|
||||||
self.height_to_dateindex.compute_transform(
|
self.height_to_dateindex.compute_transform(
|
||||||
@@ -377,7 +379,7 @@ impl Vecs {
|
|||||||
|
|
||||||
let starting_dateindex = if let Some(dateindex) = self
|
let starting_dateindex = if let Some(dateindex) = self
|
||||||
.height_to_dateindex
|
.height_to_dateindex
|
||||||
.cached_get(starting_indexes.height.decremented().unwrap_or_default())?
|
.cached_get(decremented_starting_height)?
|
||||||
.map(|v| v.into_inner())
|
.map(|v| v.into_inner())
|
||||||
{
|
{
|
||||||
starting_dateindex.min(dateindex)
|
starting_dateindex.min(dateindex)
|
||||||
@@ -696,7 +698,7 @@ impl Vecs {
|
|||||||
|
|
||||||
let starting_difficultyepoch = self
|
let starting_difficultyepoch = self
|
||||||
.height_to_difficultyepoch
|
.height_to_difficultyepoch
|
||||||
.cached_get(starting_indexes.height)?
|
.cached_get(decremented_starting_height)?
|
||||||
.map_or_else(Default::default, |v| v.into_inner());
|
.map_or_else(Default::default, |v| v.into_inner());
|
||||||
|
|
||||||
self.height_to_difficultyepoch.compute_transform(
|
self.height_to_difficultyepoch.compute_transform(
|
||||||
@@ -748,7 +750,7 @@ impl Vecs {
|
|||||||
|
|
||||||
let starting_halvingepoch = self
|
let starting_halvingepoch = self
|
||||||
.height_to_halvingepoch
|
.height_to_halvingepoch
|
||||||
.cached_get(starting_indexes.height)?
|
.cached_get(decremented_starting_height)?
|
||||||
.map_or_else(Default::default, |v| v.into_inner());
|
.map_or_else(Default::default, |v| v.into_inner());
|
||||||
|
|
||||||
self.height_to_halvingepoch.compute_transform(
|
self.height_to_halvingepoch.compute_transform(
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::{fs, path::Path};
|
use std::{fs, path::Path};
|
||||||
|
|
||||||
use brk_core::{Sats, StoredU8, StoredU32, StoredU64, Txindex, Txinindex, Txoutindex};
|
use brk_core::{Sats, StoredU32, StoredU64, TxVersion, Txindex, Txinindex, Txoutindex};
|
||||||
use brk_exit::Exit;
|
use brk_exit::Exit;
|
||||||
use brk_indexer::Indexer;
|
use brk_indexer::Indexer;
|
||||||
use brk_vec::{Compressed, DynamicVec, Version};
|
use brk_vec::{Compressed, DynamicVec, Version};
|
||||||
@@ -26,9 +26,6 @@ pub struct Vecs {
|
|||||||
// pub txindex_to_input_sum: ComputedVec<Txindex, Sats>,
|
// pub txindex_to_input_sum: ComputedVec<Txindex, Sats>,
|
||||||
// pub txindex_to_output_sum: ComputedVec<Txindex, Sats>,
|
// pub txindex_to_output_sum: ComputedVec<Txindex, Sats>,
|
||||||
// pub txindex_to_output_value: ComputedVecsFromTxindex<Sats>,
|
// pub txindex_to_output_value: ComputedVecsFromTxindex<Sats>,
|
||||||
pub txindex_to_v1: ComputedVec<Txindex, StoredU8>,
|
|
||||||
pub txindex_to_v2: ComputedVec<Txindex, StoredU8>,
|
|
||||||
pub txindex_to_v3: ComputedVec<Txindex, StoredU8>,
|
|
||||||
pub indexes_to_tx_v1: ComputedVecsFromHeight<StoredU32>,
|
pub indexes_to_tx_v1: ComputedVecsFromHeight<StoredU32>,
|
||||||
pub indexes_to_tx_v2: ComputedVecsFromHeight<StoredU32>,
|
pub indexes_to_tx_v2: ComputedVecsFromHeight<StoredU32>,
|
||||||
pub indexes_to_tx_v3: ComputedVecsFromHeight<StoredU32>,
|
pub indexes_to_tx_v3: ComputedVecsFromHeight<StoredU32>,
|
||||||
@@ -107,21 +104,6 @@ impl Vecs {
|
|||||||
Version::ZERO,
|
Version::ZERO,
|
||||||
compressed,
|
compressed,
|
||||||
)?,
|
)?,
|
||||||
txindex_to_v1: ComputedVec::forced_import(
|
|
||||||
&path.join("txindex_to_v1"),
|
|
||||||
Version::ZERO,
|
|
||||||
compressed,
|
|
||||||
)?,
|
|
||||||
txindex_to_v2: ComputedVec::forced_import(
|
|
||||||
&path.join("txindex_to_v2"),
|
|
||||||
Version::ZERO,
|
|
||||||
compressed,
|
|
||||||
)?,
|
|
||||||
txindex_to_v3: ComputedVec::forced_import(
|
|
||||||
&path.join("txindex_to_v3"),
|
|
||||||
Version::ZERO,
|
|
||||||
compressed,
|
|
||||||
)?,
|
|
||||||
indexes_to_tx_v1: ComputedVecsFromHeight::forced_import(
|
indexes_to_tx_v1: ComputedVecsFromHeight::forced_import(
|
||||||
path,
|
path,
|
||||||
"tx_v1",
|
"tx_v1",
|
||||||
@@ -209,6 +191,37 @@ impl Vecs {
|
|||||||
// Some(indexer.mut_vecs().txoutindex_to_value.mut_vec()),
|
// Some(indexer.mut_vecs().txoutindex_to_value.mut_vec()),
|
||||||
// )?;
|
// )?;
|
||||||
|
|
||||||
|
let mut compute_indexes_to_tx_vany =
|
||||||
|
|indexes_to_tx_vany: &mut ComputedVecsFromHeight<StoredU32>, txversion| {
|
||||||
|
indexes_to_tx_vany.compute_all(
|
||||||
|
indexer,
|
||||||
|
indexes,
|
||||||
|
starting_indexes,
|
||||||
|
exit,
|
||||||
|
|vec, indexer, indexes, starting_indexes, exit| {
|
||||||
|
let indexer_vecs = indexer.mut_vecs();
|
||||||
|
vec.compute_filtered_count_from_indexes(
|
||||||
|
starting_indexes.height,
|
||||||
|
indexer_vecs.height_to_first_txindex.mut_vec(),
|
||||||
|
indexes.height_to_last_txindex.mut_vec(),
|
||||||
|
|txindex| {
|
||||||
|
let v = indexer_vecs
|
||||||
|
.txindex_to_txversion
|
||||||
|
.cached_get(txindex)
|
||||||
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
|
.into_inner();
|
||||||
|
v == txversion
|
||||||
|
},
|
||||||
|
exit,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
};
|
||||||
|
compute_indexes_to_tx_vany(&mut self.indexes_to_tx_v1, TxVersion::ONE)?;
|
||||||
|
compute_indexes_to_tx_vany(&mut self.indexes_to_tx_v2, TxVersion::TWO)?;
|
||||||
|
compute_indexes_to_tx_vany(&mut self.indexes_to_tx_v3, TxVersion::THREE)?;
|
||||||
|
|
||||||
let indexer_vecs = indexer.mut_vecs();
|
let indexer_vecs = indexer.mut_vecs();
|
||||||
|
|
||||||
self.txindex_to_is_coinbase.compute_is_first_ordered(
|
self.txindex_to_is_coinbase.compute_is_first_ordered(
|
||||||
@@ -218,51 +231,6 @@ impl Vecs {
|
|||||||
exit,
|
exit,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
self.txindex_to_v1.compute_transform(
|
|
||||||
starting_indexes.txindex,
|
|
||||||
indexer_vecs.txindex_to_txversion.mut_vec(),
|
|
||||||
|(i, v, ..)| (i, StoredU8::from(v)),
|
|
||||||
exit,
|
|
||||||
)?;
|
|
||||||
// self.indexes_to_tx_v1.compute_all(
|
|
||||||
// indexer,
|
|
||||||
// indexes,
|
|
||||||
// starting_indexes,
|
|
||||||
// exit,
|
|
||||||
// |vec, indexer, indexes, indexes, exit| {
|
|
||||||
// vec.compute_transform(
|
|
||||||
// starting_indexes.height,
|
|
||||||
// indexer.mut_vecs().txindex_to_txversion.mut_vec(),
|
|
||||||
// || {},
|
|
||||||
// exit,
|
|
||||||
// )?;
|
|
||||||
// },
|
|
||||||
// )?;
|
|
||||||
self.txindex_to_v2.compute_transform(
|
|
||||||
starting_indexes.txindex,
|
|
||||||
indexer_vecs.txindex_to_txversion.mut_vec(),
|
|
||||||
|(i, v, ..)| (i, StoredU8::from(v)),
|
|
||||||
exit,
|
|
||||||
)?;
|
|
||||||
// self.indexes_to_tx_v1.compute_rest(
|
|
||||||
// starting_indexes.txindex,
|
|
||||||
// indexer_vecs.txindex_to_txversion.mut_vec(),
|
|
||||||
// |(i, v, ..)| (i, StoredU8::from(v)),
|
|
||||||
// exit,
|
|
||||||
// )?;
|
|
||||||
self.txindex_to_v3.compute_transform(
|
|
||||||
starting_indexes.txindex,
|
|
||||||
indexer_vecs.txindex_to_txversion.mut_vec(),
|
|
||||||
|(i, v, ..)| (i, StoredU8::from(v)),
|
|
||||||
exit,
|
|
||||||
)?;
|
|
||||||
// self.indexes_to_tx_v1.compute_rest(
|
|
||||||
// starting_indexes.txindex,
|
|
||||||
// indexer_vecs.txindex_to_txversion.mut_vec(),
|
|
||||||
// |(i, v, ..)| (i, StoredU8::from(v)),
|
|
||||||
// exit,
|
|
||||||
// )?;
|
|
||||||
|
|
||||||
self.txinindex_to_value.compute_transform(
|
self.txinindex_to_value.compute_transform(
|
||||||
starting_indexes.txinindex,
|
starting_indexes.txinindex,
|
||||||
indexer_vecs.txinindex_to_txoutindex.mut_vec(),
|
indexer_vecs.txinindex_to_txoutindex.mut_vec(),
|
||||||
@@ -297,9 +265,6 @@ impl Vecs {
|
|||||||
vec![
|
vec![
|
||||||
self.txindex_to_is_coinbase.any_vec(),
|
self.txindex_to_is_coinbase.any_vec(),
|
||||||
self.txinindex_to_value.any_vec(),
|
self.txinindex_to_value.any_vec(),
|
||||||
self.txindex_to_v1.any_vec(),
|
|
||||||
self.txindex_to_v2.any_vec(),
|
|
||||||
self.txindex_to_v3.any_vec(),
|
|
||||||
],
|
],
|
||||||
self.height_to_tx_count.any_vecs(),
|
self.height_to_tx_count.any_vecs(),
|
||||||
self.txindex_to_output_count.any_vecs(),
|
self.txindex_to_output_count.any_vecs(),
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_core">
|
<a href="https://deps.rs/crate/brk_core">
|
||||||
<img src="https://deps.rs/crate/brk_core/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_core/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
|
|||||||
|
|
||||||
use crate::{CheckedSub, Error};
|
use crate::{CheckedSub, Error};
|
||||||
|
|
||||||
|
use super::StoredU32;
|
||||||
|
|
||||||
#[derive(
|
#[derive(
|
||||||
Debug,
|
Debug,
|
||||||
PartialEq,
|
PartialEq,
|
||||||
@@ -97,3 +99,9 @@ impl From<Txindex> for ByteView {
|
|||||||
Self::new(value.as_bytes())
|
Self::new(value.as_bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Txindex> for StoredU32 {
|
||||||
|
fn from(value: Txindex) -> Self {
|
||||||
|
Self::from(value.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,9 +4,29 @@ use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
|
|||||||
|
|
||||||
use super::StoredU8;
|
use super::StoredU8;
|
||||||
|
|
||||||
#[derive(Debug, Deref, Clone, Copy, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)]
|
#[derive(
|
||||||
|
Debug,
|
||||||
|
Deref,
|
||||||
|
Clone,
|
||||||
|
Copy,
|
||||||
|
PartialEq,
|
||||||
|
Eq,
|
||||||
|
PartialOrd,
|
||||||
|
Ord,
|
||||||
|
Immutable,
|
||||||
|
IntoBytes,
|
||||||
|
KnownLayout,
|
||||||
|
FromBytes,
|
||||||
|
Serialize,
|
||||||
|
)]
|
||||||
pub struct TxVersion(i32);
|
pub struct TxVersion(i32);
|
||||||
|
|
||||||
|
impl TxVersion {
|
||||||
|
pub const ONE: Self = Self(1);
|
||||||
|
pub const TWO: Self = Self(2);
|
||||||
|
pub const THREE: Self = Self(3);
|
||||||
|
}
|
||||||
|
|
||||||
impl From<bitcoin::transaction::Version> for TxVersion {
|
impl From<bitcoin::transaction::Version> for TxVersion {
|
||||||
fn from(value: bitcoin::transaction::Version) -> Self {
|
fn from(value: bitcoin::transaction::Version) -> Self {
|
||||||
Self(value.0)
|
Self(value.0)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_exit">
|
<a href="https://deps.rs/crate/brk_exit">
|
||||||
<img src="https://deps.rs/crate/brk_exit/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_exit/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_fetcher">
|
<a href="https://deps.rs/crate/brk_fetcher">
|
||||||
<img src="https://deps.rs/crate/brk_fetcher/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_fetcher/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_indexer">
|
<a href="https://deps.rs/crate/brk_indexer">
|
||||||
<img src="https://deps.rs/crate/brk_indexer/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_indexer/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_logger">
|
<a href="https://deps.rs/crate/brk_logger">
|
||||||
<img src="https://deps.rs/crate/brk_logger/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_logger/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_parser">
|
<a href="https://deps.rs/crate/brk_parser">
|
||||||
<img src="https://deps.rs/crate/brk_parser/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_parser/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_query">
|
<a href="https://deps.rs/crate/brk_query">
|
||||||
<img src="https://deps.rs/crate/brk_query/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_query/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_server">
|
<a href="https://deps.rs/crate/brk_server">
|
||||||
<img src="https://deps.rs/crate/brk_server/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_server/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://deps.rs/crate/brk_vec">
|
<a href="https://deps.rs/crate/brk_vec">
|
||||||
<img src="https://deps.rs/crate/brk_vec/latest/status.svg" alt="Dependency status">
|
<img src="https://deps.rs/crate/brk_vec/latest/status.svg" alt="Dependency status">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/Cvrwpv3zEG">
|
<a href="https://discord.gg/HaR3wpH3nr">
|
||||||
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
<img src="https://img.shields.io/discord/1350431684562124850?label=discord" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
<a href="https://primal.net/p/nprofile1qqsfw5dacngjlahye34krvgz7u0yghhjgk7gxzl5ptm9v6n2y3sn03sqxu2e6">
|
||||||
|
|||||||
@@ -122,6 +122,14 @@ where
|
|||||||
StoredVec::Compressed(v) => v.mut_pushed(),
|
StoredVec::Compressed(v) => v.mut_pushed(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn path(&self) -> &Path {
|
||||||
|
match self {
|
||||||
|
StoredVec::Raw(v) => v.path(),
|
||||||
|
StoredVec::Compressed(v) => v.path(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T> GenericVec<I, T> for StoredVec<I, T>
|
impl<I, T> GenericVec<I, T> for StoredVec<I, T>
|
||||||
@@ -160,14 +168,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn path(&self) -> &Path {
|
|
||||||
match self {
|
|
||||||
StoredVec::Raw(v) => v.path(),
|
|
||||||
StoredVec::Compressed(v) => v.path(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn version(&self) -> Version {
|
fn version(&self) -> Version {
|
||||||
match self {
|
match self {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::sync::Arc;
|
use std::{path::Path, sync::Arc};
|
||||||
|
|
||||||
use arc_swap::{ArcSwap, Guard};
|
use arc_swap::{ArcSwap, Guard};
|
||||||
use memmap2::Mmap;
|
use memmap2::Mmap;
|
||||||
@@ -113,4 +113,6 @@ pub trait DynamicVec: Send + Sync {
|
|||||||
Err(Error::IndexTooLow)
|
Err(Error::IndexTooLow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn path(&self) -> &Path;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,8 +61,7 @@ where
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn reset(&mut self) -> Result<()> {
|
fn reset(&mut self) -> Result<()> {
|
||||||
self.file_write_all(&[])?;
|
self.file_truncate_and_write_all(0, &[])
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_mmap(file: File) -> Result<Arc<Mmap>> {
|
fn new_mmap(file: File) -> Result<Arc<Mmap>> {
|
||||||
@@ -174,8 +173,6 @@ where
|
|||||||
Ok(self.collect_range_axum_json(from, to)?.into_response())
|
Ok(self.collect_range_axum_json(from, to)?.into_response())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn path(&self) -> &Path;
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn path_vec(&self) -> PathBuf {
|
fn path_vec(&self) -> PathBuf {
|
||||||
Self::path_vec_(self.path())
|
Self::path_vec_(self.path())
|
||||||
|
|||||||
@@ -278,6 +278,11 @@ where
|
|||||||
fn mut_pushed(&mut self) -> &mut Vec<T> {
|
fn mut_pushed(&mut self) -> &mut Vec<T> {
|
||||||
self.inner.mut_pushed()
|
self.inner.mut_pushed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn path(&self) -> &Path {
|
||||||
|
self.inner.path()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T> GenericVec<I, T> for CompressedVec<I, T>
|
impl<I, T> GenericVec<I, T> for CompressedVec<I, T>
|
||||||
@@ -441,6 +446,15 @@ where
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn reset(&mut self) -> Result<()> {
|
||||||
|
let mut pages_meta = (**self.pages_meta.load()).clone();
|
||||||
|
pages_meta.truncate(0);
|
||||||
|
pages_meta.write()?;
|
||||||
|
self.pages_meta.store(Arc::new(pages_meta));
|
||||||
|
self.reset_caches();
|
||||||
|
self.file_truncate_and_write_all(0, &[])
|
||||||
|
}
|
||||||
|
|
||||||
fn truncate_if_needed(&mut self, index: I) -> Result<()> {
|
fn truncate_if_needed(&mut self, index: I) -> Result<()> {
|
||||||
let index = index.to_usize()?;
|
let index = index.to_usize()?;
|
||||||
|
|
||||||
@@ -453,12 +467,12 @@ where
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut pages_meta = (**self.pages_meta.load()).clone();
|
||||||
|
|
||||||
let page_index = Self::index_to_page_index(index);
|
let page_index = Self::index_to_page_index(index);
|
||||||
|
|
||||||
let guard = self.guard().as_ref().unwrap();
|
let guard = self.guard().as_ref().unwrap();
|
||||||
|
|
||||||
let mut pages_meta = (**self.pages_meta.load()).clone();
|
|
||||||
|
|
||||||
let values = self.decode_page(page_index, guard)?;
|
let values = self.decode_page(page_index, guard)?;
|
||||||
let mut buf = vec![];
|
let mut buf = vec![];
|
||||||
|
|
||||||
@@ -490,11 +504,6 @@ where
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn path(&self) -> &Path {
|
|
||||||
self.inner.path()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn version(&self) -> Version {
|
fn version(&self) -> Version {
|
||||||
self.inner.version()
|
self.inner.version()
|
||||||
|
|||||||
@@ -114,6 +114,11 @@ where
|
|||||||
fn mut_pushed(&mut self) -> &mut Vec<T> {
|
fn mut_pushed(&mut self) -> &mut Vec<T> {
|
||||||
&mut self.pushed
|
&mut self.pushed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn path(&self) -> &Path {
|
||||||
|
self.pathbuf.as_path()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T> GenericVec<I, T> for RawVec<I, T>
|
impl<I, T> GenericVec<I, T> for RawVec<I, T>
|
||||||
@@ -211,11 +216,6 @@ where
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn path(&self) -> &Path {
|
|
||||||
self.pathbuf.as_path()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn version(&self) -> Version {
|
fn version(&self) -> Version {
|
||||||
self.version
|
self.version
|
||||||
|
|||||||
@@ -877,9 +877,10 @@
|
|||||||
background-image: linear-gradient(
|
background-image: linear-gradient(
|
||||||
to bottom,
|
to bottom,
|
||||||
transparent,
|
transparent,
|
||||||
|
var(--background-color) 90%,
|
||||||
var(--background-color)
|
var(--background-color)
|
||||||
);
|
);
|
||||||
height: 24rem;
|
height: 21rem;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
* "Seconds" |
|
* "Seconds" |
|
||||||
* "Transactions" |
|
* "Transactions" |
|
||||||
* "US Dollars" |
|
* "US Dollars" |
|
||||||
|
* "Version" |
|
||||||
* "Virtual Bytes" |
|
* "Virtual Bytes" |
|
||||||
* "Weight Units"
|
* "Weight Units"
|
||||||
* } Unit
|
* } Unit
|
||||||
@@ -868,6 +869,26 @@ function createPartialOptions(colors) {
|
|||||||
title: "Transaction Count",
|
title: "Transaction Count",
|
||||||
key: "tx-count",
|
key: "tx-count",
|
||||||
}),
|
}),
|
||||||
|
{
|
||||||
|
name: "Version",
|
||||||
|
tree: [
|
||||||
|
createBaseSumTotal({
|
||||||
|
name: "1",
|
||||||
|
title: "Transaction V1 Count",
|
||||||
|
key: "tx-v1",
|
||||||
|
}),
|
||||||
|
createBaseSumTotal({
|
||||||
|
name: "2",
|
||||||
|
title: "Transaction V2 Count",
|
||||||
|
key: "tx-v2",
|
||||||
|
}),
|
||||||
|
createBaseSumTotal({
|
||||||
|
name: "3",
|
||||||
|
title: "Transaction V3 Count",
|
||||||
|
key: "tx-v3",
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -916,7 +937,7 @@ function createPartialOptions(colors) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Discord",
|
name: "Discord",
|
||||||
url: () => "https://discord.com/invite/Cvrwpv3zEG",
|
url: () => "https://discord.com/invite/HaR3wpH3nr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Bluesky",
|
name: "Bluesky",
|
||||||
@@ -1254,6 +1275,8 @@ export function initOptions({
|
|||||||
anyPartial.unit = "Weight Units";
|
anyPartial.unit = "Weight Units";
|
||||||
} else if (key.includes("-vbytes")) {
|
} else if (key.includes("-vbytes")) {
|
||||||
anyPartial.unit = "Virtual Bytes";
|
anyPartial.unit = "Virtual Bytes";
|
||||||
|
} else if (key.match(/v[0-9]/g)) {
|
||||||
|
anyPartial.unit = "Version";
|
||||||
} else {
|
} else {
|
||||||
console.log(anyPartial);
|
console.log(anyPartial);
|
||||||
throw Error("Unit not set");
|
throw Error("Unit not set");
|
||||||
|
|||||||
@@ -167,9 +167,6 @@ export function createVecIdToIndexes() {
|
|||||||
txid: [Txindex],
|
txid: [Txindex],
|
||||||
txoutindex: [Txinindex],
|
txoutindex: [Txinindex],
|
||||||
txversion: [Txindex],
|
txversion: [Txindex],
|
||||||
v1: [Txindex],
|
|
||||||
v2: [Txindex],
|
|
||||||
v3: [Txindex],
|
|
||||||
value: [Txinindex, Txoutindex],
|
value: [Txinindex, Txoutindex],
|
||||||
weekindex: [Dateindex, Weekindex],
|
weekindex: [Dateindex, Weekindex],
|
||||||
yearindex: [Monthindex, Yearindex],
|
yearindex: [Monthindex, Yearindex],
|
||||||
|
|||||||
Reference in New Issue
Block a user