eth.zig

WebSocket Subscriptions

Real-time Ethereum event streaming with WebSocket transport in eth.zig.

eth.zig includes a WebSocket transport for real-time subscriptions to Ethereum events -- new blocks, pending transactions, and log events.

Connecting

const eth = @import("eth");

var ws = eth.ws_transport.WebSocketTransport.init(allocator, "wss://eth-mainnet.ws.alchemyapi.io/v2/YOUR_KEY");
defer ws.deinit();

The WebSocket transport supports both ws:// and wss:// (TLS) URLs. TLS is handled natively in pure Zig.

Subscriptions

Subscribe to real-time events:

const eth = @import("eth");

var ws = eth.ws_transport.WebSocketTransport.init(allocator, "wss://rpc.example.com");
defer ws.deinit();

// Subscribe to new block headers
var sub = try eth.subscription.Subscription.init(allocator, &ws, .newHeads);
defer sub.deinit();

// Process incoming events
while (try sub.next()) |event| {
    // Handle new block header
    _ = event;
}

JSON-RPC over WebSocket

You can also use WebSocket for regular JSON-RPC calls (lower latency than HTTP for frequent requests):

const eth = @import("eth");

var ws = eth.ws_transport.WebSocketTransport.init(allocator, "wss://rpc.example.com");
defer ws.deinit();
var provider = eth.provider.Provider.init(allocator, &ws);

const block_number = try provider.getBlockNumber();
const balance = try provider.getBalance(address);

When to Use WebSocket

Use CaseTransport
One-off RPC callsHTTP
High-frequency readsWebSocket
Real-time event streamingWebSocket
Subscription to new blocksWebSocket
Watching for specific eventsWebSocket

URL Format

ws://host:port/path    -- unencrypted
wss://host:port/path   -- TLS encrypted (recommended)

Default ports: 80 for ws://, 443 for wss://.