Entries Subscription

Streams ledger entries as they are produced by the leader.

Type: streaming (via Subscribe)

Overview

The Entries subscription streams raw ledger entries as they are produced within slots. Entries are the lowest-level unit of data in the Solana ledger, each containing a set of transactions that were processed together.

This is primarily used for advanced indexing, validator monitoring, and research applications. Most application developers will prefer the Transactions or Blocks subscriptions instead.

Filters

This subscription does not accept any filters. All entries are streamed.

Update Payload

FieldTypeDescription
slotuint64The slot containing this entry
indexuint64Entry index within the slot
num_hashesuint64Number of PoH hashes
hashbytesEntry hash
executed_transaction_countuint64Number of transactions in this entry

Usage Examples

Node.js

1const grpc = require('@grpc/grpc-js');
2const protoLoader = require('@grpc/proto-loader');
3
4const packageDef = protoLoader.loadSync('geyser.proto', {
5  keepCase: true, longs: String, enums: String, defaults: true, oneofs: true
6});
7const proto = grpc.loadPackageDefinition(packageDef).geyser;
8const client = new proto.Geyser('[IP_ADDRESS]:[PORT]', grpc.credentials.createInsecure());
9
10const stream = client.subscribe(new grpc.Metadata());
11
12stream.on('data', (data) => {
13  console.log('Entries update:', data);
14});
15stream.on('error', (err) => console.error('Error:', err));
16
17// Subscribe to Entries
18stream.write({
19  accounts: {},
20  slots: {},
21  transactions: {},
22  blocks: {},
23  blocksMeta: {},
24  commitment: 'processed',
25  entry: {}
26});

Rust

1use yellowstone_grpc_proto::geyser::geyser_client::GeyserClient;
2use yellowstone_grpc_proto::geyser::SubscribeRequest;
3use tonic::transport::Channel;
4
5#[tokio::main]
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let channel = Channel::from_static("http://[IP_ADDRESS]:[PORT]")
8        .connect().await?;
9    let mut client = GeyserClient::new(channel);
10
11    // Configure your Entries subscription filters here
12    let request = SubscribeRequest {
13        accounts: Default::default(),
14        slots: Default::default(),
15        transactions: Default::default(),
16        blocks: Default::default(),
17        blocks_meta: Default::default(),
18        commitment: Some(1), // Processed
19        entry: Default::default(),
20    };
21
22    let mut stream = client.subscribe(std::iter::once(request)).await?.into_inner();
23    while let Some(msg) = stream.message().await? {
24        println!("Entries update: {:?}", msg);
25    }
26    Ok(())
27}