Skip to main content
The tempo-node crate provides the core node implementation for Tempo, built on the Reth SDK. It includes node configuration, RPC implementation, telemetry, and integration with Tempo’s consensus and EVM layers.

Installation

[dependencies]
tempo-node = "0.1.0"

Core Types

TempoNode

The main node type that implements Reth’s NodeTypes trait with Tempo-specific primitives.
use tempo_node::node::TempoNode;

// TempoNode defines:
// - Primitives: TempoPrimitives (blocks, headers, transactions, receipts)
// - ChainSpec: TempoChainSpec
// - StateCommitment: StateRoot
Source: crates/node/src/node.rs

TempoFullNode

Type alias for a fully launched Tempo node with all add-ons.
use tempo_node::TempoFullNode;

// Type alias for:
// FullNode<TempoNodeAdapter, TempoAddOns<TempoNodeAdapter>>
Source: crates/node/src/lib.rs:26-29

RPC Implementation

TempoEthApi

Tempo’s implementation of the Ethereum JSON-RPC API with Tempo-specific behavior.
use tempo_node::rpc::TempoEthApi;

// Key features:
// - Returns placeholder for eth_getBalance (native currency not used)
// - Handles 2D nonces for AA transactions
// - Routes subblock transactions to validators
// - Gas estimation for fee tokens
Key Methods:
  • balance() - Returns NATIVE_BALANCE_PLACEHOLDER
  • caller_gas_allowance() - Calculates gas limit based on fee token balance
  • create_txn_env() - Handles 2D nonce resolution
  • send_transaction() - Routes subblock transactions to validators
Source: crates/node/src/rpc/mod.rs:80-507

Admin API

Administrative RPC methods for node operators.
use tempo_node::rpc::{TempoAdminApi, TempoAdminApiServer};
use alloy_primitives::B256;

// Create admin API
let validator_key = Some(B256::from([1u8; 32]));
let admin = TempoAdminApi::new(validator_key);

// Returns validator key
let key = admin.validator_key().await?;
Methods:
  • admin_validatorKey - Returns the node’s validator public key
Source: crates/node/src/rpc/admin.rs:1-35

Consensus RPC

Query consensus state, finalization events, and network identity transitions.
use tempo_node::rpc::consensus::{
    TempoConsensusRpc, TempoConsensusApiServer,
    Query, ConsensusState, CertifiedBlock
};

// Create consensus RPC (requires ConsensusFeed impl)
let consensus = TempoConsensusRpc::new(feed);

// Get latest finalization
let block = consensus.get_finalization(Query::Latest).await?;

// Get consensus state
let state = consensus.get_latest().await?;

// Subscribe to events
consensus.subscribe_events(sink).await?;

// Get identity transition proofs
let proof = consensus.get_identity_transition_proof(
    Some(epoch),
    false // only most recent transition
).await?;
Methods:
  • consensus_getFinalization - Get finalization by height or latest
  • consensus_getLatest - Get current consensus state snapshot
  • consensus_subscribe - Subscribe to consensus events
  • consensus_getIdentityTransitionProof - Get DKG identity transition proofs
Source: crates/node/src/rpc/consensus/mod.rs:1-122

Token RPC

Query TIP-20 token data and role history.
use tempo_node::rpc::token::{TempoToken, TempoTokenApiServer};

// Create token API
let token_api = TempoToken::new(eth_api);

// Get tokens (paginated)
let tokens = token_api.tokens(params).await?;

// Get tokens by address
let addr_tokens = token_api.tokens_by_address(params).await?;

// Get role history
let history = token_api.role_history(params).await?;
Methods:
  • token_getTokens - Get paginated list of TIP-20 tokens
  • token_getTokensByAddress - Get tokens for an address
  • token_getRoleHistory - Get role change history
Token RPC methods are currently unimplemented stubs.
Source: crates/node/src/rpc/token/mod.rs:1-85

Node Configuration

TempoNodeArgs

Command-line arguments for Tempo node configuration.
use tempo_node::node::TempoNodeArgs;

// Includes:
// - Validator configuration
// - RPC settings  
// - Network parameters
// - Database paths

TempoPoolBuilder

Custom transaction pool builder for Tempo’s AA transactions.
use tempo_node::node::TempoPoolBuilder;

// Implements PoolBuilder<Node> for Tempo
// Handles:
// - AA transaction validation
// - 2D nonce tracking
// - Validity windows (valid_before/valid_after)
// - Fee token balance checks

Telemetry

Tempo includes built-in telemetry for observability.
use tempo_node::telemetry;

// Initialize telemetry with OpenTelemetry
tempo_node::telemetry::init();

Version Metadata

use tempo_node::{version_metadata, init_version_metadata};

// Initialize version info at build time
init_version_metadata();

// Access version info
let version = version_metadata();
println!("Version: {}", version.version);
println!("Commit: {}", version.commit_hash);
Source: crates/node/src/version.rs

Re-exported Crates

For convenience, tempo-node re-exports related crates:
// Re-exports
pub use tempo_consensus as consensus;
pub use tempo_evm as evm;
pub use tempo_primitives as primitives;

Engine API

Engine API implementation for block building and consensus integration.
use tempo_node::engine;

// Located in crates/node/src/engine.rs
// Handles:
// - Engine API RPC methods
// - Block building coordination
// - Payload assembly

Constants

Subblock Transaction Channel Capacity

use tempo_node::rpc::SUBBLOCK_TX_CHANNEL_CAPACITY;

// Channel capacity for subblock transactions: 10,000
// High enough to prevent legitimate transactions from being evicted
// during high-load scenarios
Source: crates/node/src/rpc/mod.rs:78

Native Balance Placeholder

use tempo_node::rpc::NATIVE_BALANCE_PLACEHOLDER;
use alloy_primitives::U256;

// Placeholder returned by eth_getBalance
const PLACEHOLDER: U256 = uint!(4242424242424242424242424242424242424242424242424242424242424242424242424242_U256);
Source: crates/node/src/rpc/mod.rs:70-71

Example: Building a Custom Node

use tempo_node::{
    node::{TempoNode, TempoNodeArgs, TempoPoolBuilder},
    rpc::{TempoEthApiBuilder, TempoAdminApi, TempoConsensusRpc},
};
use reth_node_builder::{NodeBuilder, NodeConfig};

#[tokio::main]
async fn main() -> eyre::Result<()> {
    // Parse CLI args
    let args = TempoNodeArgs::parse();
    
    // Build node
    let node = NodeBuilder::new(NodeConfig::default())
        .with_types::<TempoNode>()
        .with_components(TempoNode::components())
        .with_add_ons(TempoNode::add_ons(args))
        .build()?;
    
    // Launch node
    node.launch().await?;
    
    Ok(())
}

Features

  • asm-keccak - Use optimized assembly Keccak implementation
  • otlp - OpenTelemetry Protocol support
  • js-tracer - JavaScript tracer support for debugging
  • jemalloc - Use jemalloc allocator
  • jemalloc-prof - Enable jemalloc profiling
  • tracy - Tracy profiler integration
  • min-*-logs - Set minimum log level (error/warn/info/debug/trace)

See Also