mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-06-27 14:44:28 -07:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ec960bfefa | |||
| 79f689dde1 | |||
| 3b3654df56 |
Generated
+15
-15
@@ -477,7 +477,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_bundler",
|
||||
"brk_cli",
|
||||
@@ -497,7 +497,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_bundler"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_rolldown",
|
||||
"log",
|
||||
@@ -508,7 +508,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_cli"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"bitcoincore-rpc",
|
||||
"brk_computer",
|
||||
@@ -531,7 +531,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_computer"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"bincode",
|
||||
"bitcoin",
|
||||
@@ -557,7 +557,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_core"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"bincode",
|
||||
"bitcoin",
|
||||
@@ -578,7 +578,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_exit"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_logger",
|
||||
"ctrlc",
|
||||
@@ -587,7 +587,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_fetcher"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_core",
|
||||
"brk_logger",
|
||||
@@ -599,7 +599,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_indexer"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"bitcoin",
|
||||
"bitcoincore-rpc",
|
||||
@@ -617,7 +617,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_interface"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_computer",
|
||||
"brk_core",
|
||||
@@ -635,7 +635,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_logger"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"color-eyre",
|
||||
"env_logger",
|
||||
@@ -645,7 +645,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_mcp"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"brk_interface",
|
||||
@@ -655,7 +655,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_parser"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"bitcoin",
|
||||
"bitcoincore-rpc",
|
||||
@@ -1024,7 +1024,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_server"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"bitcoincore-rpc",
|
||||
@@ -1054,7 +1054,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_store"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"brk_core",
|
||||
"byteview",
|
||||
@@ -1076,7 +1076,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brk_vec"
|
||||
version = "0.0.79"
|
||||
version = "0.0.80"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"brk_core",
|
||||
|
||||
+15
-15
@@ -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.license = "MIT"
|
||||
package.edition = "2024"
|
||||
package.version = "0.0.79"
|
||||
package.version = "0.0.80"
|
||||
package.homepage = "https://bitcoinresearchkit.org"
|
||||
package.repository = "https://github.com/bitcoinresearchkit/brk"
|
||||
|
||||
@@ -26,22 +26,22 @@ axum = "0.8.4"
|
||||
bincode = { version = "2.0.1", features = ["serde"] }
|
||||
bitcoin = { version = "0.32.6", features = ["serde"] }
|
||||
bitcoincore-rpc = "0.19.0"
|
||||
brk_bundler = { version = "0.0.79", path = "crates/brk_bundler" }
|
||||
brk_cli = { version = "0.0.79", path = "crates/brk_cli" }
|
||||
brk_computer = { version = "0.0.79", path = "crates/brk_computer" }
|
||||
brk_core = { version = "0.0.79", path = "crates/brk_core" }
|
||||
brk_exit = { version = "0.0.79", path = "crates/brk_exit" }
|
||||
brk_fetcher = { version = "0.0.79", path = "crates/brk_fetcher" }
|
||||
brk_indexer = { version = "0.0.79", path = "crates/brk_indexer" }
|
||||
brk_interface = { version = "0.0.79", path = "crates/brk_interface" }
|
||||
brk_logger = { version = "0.0.79", path = "crates/brk_logger" }
|
||||
brk_mcp = { version = "0.0.79", path = "crates/brk_mcp" }
|
||||
brk_parser = { version = "0.0.79", path = "crates/brk_parser" }
|
||||
brk_bundler = { version = "0.0.80", path = "crates/brk_bundler" }
|
||||
brk_cli = { version = "0.0.80", path = "crates/brk_cli" }
|
||||
brk_computer = { version = "0.0.80", path = "crates/brk_computer" }
|
||||
brk_core = { version = "0.0.80", path = "crates/brk_core" }
|
||||
brk_exit = { version = "0.0.80", path = "crates/brk_exit" }
|
||||
brk_fetcher = { version = "0.0.80", path = "crates/brk_fetcher" }
|
||||
brk_indexer = { version = "0.0.80", path = "crates/brk_indexer" }
|
||||
brk_interface = { version = "0.0.80", path = "crates/brk_interface" }
|
||||
brk_logger = { version = "0.0.80", path = "crates/brk_logger" }
|
||||
brk_mcp = { version = "0.0.80", path = "crates/brk_mcp" }
|
||||
brk_parser = { version = "0.0.80", path = "crates/brk_parser" }
|
||||
brk_rmcp = { version = "0.2.1", features = ["transport-streamable-http-server", "transport-worker"]}
|
||||
# brk_rmcp = { path = "../rust-sdk/crates/rmcp", features = ["transport-streamable-http-server", "transport-worker"]}
|
||||
brk_server = { version = "0.0.79", path = "crates/brk_server" }
|
||||
brk_store = { version = "0.0.79", path = "crates/brk_store" }
|
||||
brk_vec = { version = "0.0.79", path = "crates/brk_vec" }
|
||||
brk_server = { version = "0.0.80", path = "crates/brk_server" }
|
||||
brk_store = { version = "0.0.80", path = "crates/brk_store" }
|
||||
brk_vec = { version = "0.0.80", path = "crates/brk_vec" }
|
||||
byteview = "=0.6.1"
|
||||
clap = { version = "4.5.41", features = ["string"] }
|
||||
clap_derive = "4.5.41"
|
||||
|
||||
@@ -46,8 +46,7 @@ The toolkit can be used in various ways to accommodate as many needs as possible
|
||||
Just like the website, it's entirely free, with no authentication or rate-limiting.
|
||||
- **[AI](https://github.com/bitcoinresearchkit/brk/blob/main/crates/brk_mcp/README.md#brk-mcp)** \
|
||||
LLMs have to possibility to connect to BRK's backend through a [MCP](https://modelcontextprotocol.io/introduction). \
|
||||
It will give them access to the same tools as the API, with no restrictions, and allow you to have your very own data analysts. \
|
||||
One-shot output examples: [Document](https://claude.ai/public/artifacts/71194d29-f965-417c-ba09-fdf0e4ecb1d5) // [Dashboard](https://claude.ai/public/artifacts/beef143f-399a-4ed4-b8bf-c986b776de42) // [Dashboard 2](https://claude.ai/public/artifacts/5430ae49-bb3d-4fc1-ab24-f1e33deb40dc)
|
||||
It will give them access to the same tools as the API, with no restrictions, and allow you to have your very own data analysts.
|
||||
- **[CLI](https://crates.io/crates/brk_cli)** \
|
||||
Node runners are strongly encouraged to try out and self-host their own instance using BRK's command line interface. \
|
||||
The CLI has multiple cogs available for users to tweak to adapt to all situations with even the possibility for web developers to create their own custom website which could later on be added as an alternative front-end.
|
||||
|
||||
@@ -47,11 +47,3 @@ Verify that it has access to BRK's tools.
|
||||
Optionally and highly recommended, giving it unsupervised access gives a more fluid experience and prevents possible issues and errors.
|
||||
|
||||

|
||||
|
||||
#### Results
|
||||
|
||||
Some examples of dashboard and documents generated by Claude using BRK's tools:
|
||||
|
||||
- [Document](https://claude.ai/public/artifacts/71194d29-f965-417c-ba09-fdf0e4ecb1d5)
|
||||
- [Dashboard](https://claude.ai/public/artifacts/beef143f-399a-4ed4-b8bf-c986b776de42)
|
||||
- [Dashboard2](https://claude.ai/public/artifacts/5430ae49-bb3d-4fc1-ab24-f1e33deb40dc)
|
||||
|
||||
@@ -57,7 +57,7 @@ where
|
||||
}
|
||||
|
||||
pub fn import(parent: &Path, name: &str, version: Version) -> Result<Self> {
|
||||
let inner = RawVec::import(parent, name, version)?;
|
||||
let mut inner = RawVec::import(parent, name, version)?;
|
||||
|
||||
let pages_meta = {
|
||||
let path = inner
|
||||
@@ -66,12 +66,19 @@ where
|
||||
if inner.is_empty() {
|
||||
let _ = fs::remove_file(&path);
|
||||
}
|
||||
Arc::new(ArcSwap::new(Arc::new(CompressedPagesMetadata::read(
|
||||
&path,
|
||||
)?)))
|
||||
CompressedPagesMetadata::read(&path)?
|
||||
};
|
||||
|
||||
Ok(Self { inner, pages_meta })
|
||||
inner.set_stored_len(if let Some(last) = pages_meta.last() {
|
||||
(pages_meta.len() - 1) * Self::PER_PAGE + last.values_len as usize
|
||||
} else {
|
||||
0
|
||||
});
|
||||
|
||||
Ok(Self {
|
||||
inner,
|
||||
pages_meta: Arc::new(ArcSwap::new(Arc::new(pages_meta))),
|
||||
})
|
||||
}
|
||||
|
||||
fn decode_page(&self, page_index: usize, mmap: &Mmap) -> Result<Vec<T>> {
|
||||
@@ -130,14 +137,6 @@ where
|
||||
page_index * Self::PER_PAGE
|
||||
}
|
||||
|
||||
fn stored_len__(pages_meta: &Guard<Arc<CompressedPagesMetadata>>) -> usize {
|
||||
if let Some(last) = pages_meta.last() {
|
||||
(pages_meta.len() - 1) * Self::PER_PAGE + last.values_len as usize
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn iter(&self) -> CompressedVecIterator<'_, I, T> {
|
||||
self.into_iter()
|
||||
@@ -186,7 +185,7 @@ where
|
||||
|
||||
#[inline]
|
||||
fn stored_len(&self) -> usize {
|
||||
Self::stored_len__(&self.pages_meta.load())
|
||||
self.inner.stored_len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -486,14 +485,15 @@ where
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
let pages_meta = self.pages_meta.load();
|
||||
let stored_len = CompressedVec::<I, T>::stored_len__(&pages_meta);
|
||||
let stored_len = self.stored_len();
|
||||
|
||||
CompressedVecIterator {
|
||||
vec: self,
|
||||
mmap: self.create_mmap().unwrap(),
|
||||
decoded_page: None,
|
||||
pages_meta,
|
||||
stored_len,
|
||||
index: 0,
|
||||
stored_len,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ pub struct RawVec<I, T> {
|
||||
parent: PathBuf,
|
||||
name: &'static str,
|
||||
pushed: Vec<T>,
|
||||
stored_len: Arc<AtomicUsize>,
|
||||
local_stored_len: Option<usize>,
|
||||
shared_stored_len: Arc<AtomicUsize>,
|
||||
phantom: PhantomData<I>,
|
||||
}
|
||||
|
||||
@@ -94,11 +95,17 @@ where
|
||||
name: Box::leak(Box::new(name.to_string())),
|
||||
parent: parent.to_owned(),
|
||||
pushed: vec![],
|
||||
stored_len: Arc::new(AtomicUsize::new(stored_len)),
|
||||
local_stored_len: Some(stored_len),
|
||||
shared_stored_len: Arc::new(AtomicUsize::new(stored_len)),
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn set_stored_len(&mut self, len: usize) {
|
||||
self.local_stored_len.replace(len);
|
||||
self.shared_stored_len.store(len, Ordering::Relaxed);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn iter(&self) -> RawVecIterator<'_, I, T> {
|
||||
self.into_iter()
|
||||
@@ -151,7 +158,8 @@ where
|
||||
|
||||
#[inline]
|
||||
fn stored_len(&self) -> usize {
|
||||
self.stored_len.load(Ordering::SeqCst)
|
||||
self.local_stored_len
|
||||
.unwrap_or_else(|| self.shared_stored_len.load(Ordering::Relaxed))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -195,7 +203,11 @@ where
|
||||
let mut file = file_opt.unwrap_or(self.open_file()?);
|
||||
self.file_write_all(&mut file, &bytes)?;
|
||||
|
||||
self.stored_len.fetch_add(pushed_len, Ordering::SeqCst);
|
||||
if let Some(local_stored_len) = self.local_stored_len.as_mut() {
|
||||
*local_stored_len += pushed_len;
|
||||
}
|
||||
self.shared_stored_len
|
||||
.fetch_add(pushed_len, Ordering::Relaxed);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -212,7 +224,7 @@ where
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
self.stored_len.store(index, Ordering::SeqCst);
|
||||
self.set_stored_len(index);
|
||||
|
||||
let len = index * Self::SIZE_OF_T + HEADER_OFFSET;
|
||||
|
||||
@@ -223,7 +235,7 @@ where
|
||||
}
|
||||
|
||||
fn reset(&mut self) -> Result<()> {
|
||||
self.stored_len.store(0, Ordering::SeqCst);
|
||||
self.set_stored_len(0);
|
||||
self.reset_()
|
||||
}
|
||||
}
|
||||
@@ -267,7 +279,8 @@ impl<I, T> Clone for RawVec<I, T> {
|
||||
name: self.name,
|
||||
pushed: vec![],
|
||||
phantom: PhantomData,
|
||||
stored_len: self.stored_len.clone(),
|
||||
local_stored_len: None,
|
||||
shared_stored_len: self.shared_stored_len.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user