Skip to content

Subgroves

A subgrove is the basic unit you create and own on Willow. Every subgrove has an id, holds one kind of data, and produces verifiable results. There are three modes.

Automatically indexes events from an external chain. You describe which contracts and events to follow in a manifest; indexer nodes pull the data, submit it with proofs, and validators commit the result. The output is a live dataset you can query with SQL or GraphQL.

This is the default mode and the one most people start with — see Create a subgrove.

Free-form key/value records. Writers sign transactions to store JSON; readers fetch it back with Merkle proofs. Use it for structured application data that you want to be tamper-evident.

Key fields: name, writers (DIDs allowed to write), free_readers (DIDs that read without metering), and optional read_pricing.

Chunked binary storage with Merkle-verified downloads. File metadata goes through consensus; the actual bytes live on dedicated storage nodes, and each download is checked chunk-by-chunk against its Merkle root.

Key fields: name, max_file_size (bytes), replication_factor (storage nodes per file), writers, free_readers, and optional retention_period (seconds; 0 = permanent).

A BlockchainIndexing subgrove is registered with a manifest (which contracts and events to index) and a schema (the shape of the rows):

PartWhat it is
subgrove_idUnique id for the subgrove.
schemaA GraphQL entity schema describing the rows. Provided alongside the manifest at registration.
manifestspec_version ("1.0.0"), a description, and data_sources.
data_sources[]Each contract: name, network, address, abi, start_block, and an events list.
execution_modeHow the indexed data is verified — see Execution modes.
indexer_configHow many indexers run it, their rewards and stake.

A minimal data source is flat — the contract details and the event signatures live directly on it:

{
"name": "USDC",
"network": "mainnet",
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"abi": "ERC20",
"start_block": 6082465,
"events": ["Transfer(address indexed,address indexed,uint256)"]
}

See Create a subgrove for the full manifest, the schema, and every field explained.

Registering a subgrove requires a small amount of WILL to fund the indexers that run it. You set the initial funding when you register.