Chains and targets
Chains and targets for chainstar. Raw blockchain data to clean dimensional tables in your own warehouse, from one command.
| Chain | Extracted by | RPC you need | --blocks counts |
Identity check |
|---|---|---|---|---|
| Ethereum | cryo 0.3.2 | Ethereum JSON-RPC | blocks | chain id 1 |
| Base | cryo 0.3.2 | Ethereum JSON-RPC | blocks | chain id 8453 |
| Bitcoin | chainstar | Bitcoin Core JSON-RPC, version 23 or later, not pruned below your range | blocks (heights) | getblockchaininfo reports chain main |
| Solana | chainstar | Solana JSON-RPC that serves getBlock for your slots |
slots | getGenesisHash is mainnet's, 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d |
chainstar run checks the identity before extracting anything and stops if the endpoint
serves a different chain (a testnet, devnet or another EVM chain).
Bitcoin. For each block chainstar calls getblockhash and then getblock with
verbosity 3, which includes the spent output (prevout: value, address, script type)
for every input. That is what lets chainstar compute fees and name senders without one
extra call per input. Bitcoin Core returns it only for blocks it still has undo data for,
so a pruned node fails for older blocks, with an error that says so. Amounts arrive as BTC
with 8 decimals and are converted to whole satoshis exactly.
Solana. START:END counts slots. Not every slot has a block: for each chunk
chainstar asks getBlocks which slots have a finalized block, then fetches only those
with getBlock (jsonParsed, full transaction details, maxSupportedTransactionVersion
1, commitment finalized). Skipped slots produce no rows and cost no failed requests. The
end of the range must not be past the latest finalized slot, which chainstar run checks.
Version-1 transactions are live on mainnet: an endpoint or setting that accepts only
version 0 refuses every block that contains one.
Both extractors send one request at a time, honour --requests-per-second, make up to
three attempts per request with a growing delay between them, and ask for gzip (it shrank a
Bitcoin block about 2.5 times and a Solana block about 7 times). Tested in October 2026
against https://bitcoin-rpc.publicnode.com (Bitcoin Core 29.3) and
https://solana-rpc.publicnode.com (solana-core 4.3.0);
https://api.mainnet-beta.solana.com answered the same identity and slot calls. Public
endpoints are fine for trying chainstar on a few blocks; a Bitcoin block with input
values is about 15 MB of JSON (6 MB compressed) and a Solana block about 4 to 8 MB. These
publicnode endpoints are the defaults when no RPC URL is set (see
Public endpoints).
Targets
DuckDB: --target duckdb:path/to/file.duckdb. The file is created if it does not
exist. Avoid naming it chainstar.duckdb: DuckDB names the database after the file, so
chainstar.fct_transfers would become ambiguous and you would have to write
chainstar.chainstar.fct_transfers.
Postgres: --target postgres:postgresql://user@host:5432/dbname. Put the password in
the PGPASSWORD environment variable rather than the URL, so it stays out of your shell
history. chainstar loads raw tables through DuckDB's postgres extension, which DuckDB
downloads from its extension repository the first time it is used. The database user
needs permission to create schemas.
Both targets get three schemas: chainstar_raw (the extracted columns, as loaded: cryo's
for Ethereum and Base, and bitcoin_* and solana_* tables), chainstar_staging (dbt
views and the chains seed) and chainstar (the star schema).