Expand description
§BRK Server
A crate that serves Bitcoin data and swappable front-ends, built on top of brk_indexer
, brk_computer
and brk_interface
.
The file handler, will serve the website specified by the user if any, which can be no website, default or custom (which is a blank folder for people to experiment). If a website is specified and the server is ran outside of the brk project and thus can’t find the requested website, it will download the whole project with the correct version from Github and store it in .brk
to be able to serve to website. This is due to the crate size limit on crates.io and the various shenanigans that need to be done to have a website in a crate.
The API uses brk_interface
and so inherites all of its features including formats.
§Endpoints
§API
§GET /api/vecs/index-count
Get the count of all existing indexes.
§GET /api/vecs/id-count
Get the count of all existing vec ids.
§GET /api/vecs/vec-count
Get the count of all existing vecs.
Equals to the sum of supported Indexes of each vec id.
§GET /api/vecs/indexes
Get the list of all existing indexes.
§GET /api/vecs/accepted-indexes
Get an object which has all existing indexes as keys and a list of their accepted variants as values.
§GET /api/vecs/ids
Get a paginated list of all existing vec ids.
There are up to 1,000 values per page.
If the page
param is omitted, it will default to page 0
.
§GET /api/vecs/index-to-ids
Get a paginated list of all vec ids which support a given index.
There are up to 1,000 values per page.
If the page
param is omitted, it will default to the first page.
§GET /api/vecs/id-to-indexes
Get a list of all indexes supported by a given vec id. The list will be empty if the vec id isn’t correct.
§GET /api/vecs/{INDEX}-to-{ID}
This endpoint retrieves data based on the specified vector index and id.
Parameters:
Parameter | Type | Required | Description |
---|---|---|---|
from | signed int | No | Inclusive starting index for pagination (default is 0). |
to | signed int | No | Exclusive ending index for pagination (default is the total number of results). Overrides count |
count | unsigned int | No | The number of values requested |
format | string | No | The format of the response. Options include json , csv , tsv , or md (default is json ). |
Examples:
# GET /api/vecs/date-to-close
curl https://bitcoinresearchkit.org/api/vecs/date-to-close
# GET /api/vecs/date-to-close?from=-100
curl https://bitcoinresearchkit.org/api/vecs/date-to-close?from=-100
# GET /api/vecs/date-to-close?count=100&format=csv
curl https://bitcoinresearchkit.org/api/vecs/date-to-close?count=100&format=csv
§GET /api/vecs/query
Get one or multiple vecs depending on given parameters.
If you’d like to request multiple vec ids, simply separate them with a ‘,’.
To get the last value set -1
to the from
parameter.
The response’s format will depend on the given parameters, it will be:
- A value: If requested only one vec and the given range returns one value (for example:
from=-1
) - A list: If requested only one vec and the given range returns multiple values (for example:
from=-1000&count=100
orfrom=-444&to=-333
) - A matrix: When multiple vecs are requested, even if they each return one value.
Parameters:
Parameter | Type | Required | Description |
---|---|---|---|
index | VecIndex | Yes | The vector index to query. |
ids | VecId[] | Yes | A comma or space-separated list of vector IDs to retrieve. |
from | signed int | No | Inclusive starting index for pagination (default is 0). |
to | signed int | No | Exclusive ending index for pagination (default is the total number of results). Overrides count |
count | unsigned int | No | The number of values requested |
format | string | No | The format of the response. Options include json , csv , tsv , or md (default is json ). |
Examples:
# GET /api/vecs/query?index=date&ids=ohlc
curl https://bitcoinresearchkit.org/api/vecs/query?index=date&ids=ohlc
# GET /api/vecs/query?index=week&ids=ohlc,block-interval-average&from=0&to=20&format=md
curl https://bitcoinresearchkit.org/api/vecs/query?index=week&ids=ohlc,block-interval-average&from=0&to=20&format=md
§Meta
§GET /version
The version of the server and thus BRK.
§Files
§GET /*
Catch all.
When no pattern is found, the server will look for a match inside the folder of the chosen website, if any.
§Example
use std::{path::Path, thread::sleep, time::Duration};
use bitcoincore_rpc::RpcApi;
use brk_computer::Computer;
use brk_core::{default_bitcoin_path, default_brk_path};
use brk_exit::Exit;
use brk_fetcher::Fetcher;
use brk_indexer::Indexer;
use brk_parser::Parser;
use brk_server::{Server, Website};
use brk_vecs::{Computation, Format};
pub fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
brk_logger::init(Some(Path::new(".log")));
let process = true;
let bitcoin_dir = default_bitcoin_path();
let brk_dir = default_brk_path();
let rpc = Box::leak(Box::new(bitcoincore_rpc::Client::new(
"http://localhost:8332",
bitcoincore_rpc::Auth::CookieFile(bitcoin_dir.join(".cookie")),
)?));
let exit = Exit::new();
let parser = Parser::new(bitcoin_dir.join("blocks"), brk_dir, rpc);
let outputs_dir = Path::new("../../_outputs");
let format = Format::Compressed;
let mut indexer = Indexer::forced_import(outputs_dir)?;
let fetcher = Some(Fetcher::import(None)?);
let mut computer =
Computer::forced_import(outputs_dir, &indexer, Computation::Lazy, fetcher, format)?;
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()?
.block_on(async {
let served_indexer = indexer.clone();
let served_computer = computer.clone();
let server = Server::new(served_indexer, served_computer, Website::Default)?;
let server = tokio::spawn(async move {
server.serve(true, true).await.unwrap();
});
if process {
loop {
let block_count = rpc.get_block_count()?;
let starting_indexes = indexer.index(&parser, rpc, &exit, true)?;
computer.compute(&mut indexer, starting_indexes, &exit)?;
while block_count == rpc.get_block_count()? {
sleep(Duration::from_secs(1))
}
}
}
#[allow(unreachable_code)]
server.await.unwrap();
Ok(())
}) as color_eyre::Result<()>
}