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).