Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,5 @@ jobs:
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/lantern:${{ github.event.inputs.docker_tag }}
cache-from: type=gha
cache-to: type=gha,mode=max
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ if(LANTERN_BUILD_TESTS)
target_link_libraries(lantern_metrics_test PRIVATE lantern)
add_test(NAME lantern_metrics COMMAND lantern_metrics_test)

add_executable(lantern_checkpoint_sync_test tests/unit/test_checkpoint_sync_api.c)
target_link_libraries(lantern_checkpoint_sync_test PRIVATE lantern)
add_test(NAME lantern_checkpoint_sync COMMAND lantern_checkpoint_sync_test)

add_executable(lantern_validator_duties_integration_test tests/integration/test_validator_duties.c)
target_link_libraries(lantern_validator_duties_integration_test PRIVATE lantern)
add_test(NAME lantern_validator_duties_integration COMMAND lantern_validator_duties_integration_test)
Expand Down
2 changes: 1 addition & 1 deletion external/c-leanvm-xmss
37 changes: 33 additions & 4 deletions include/lantern/core/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ extern "C" {
#define LANTERN_DEFAULT_HTTP_PORT 5052
#define LANTERN_DEFAULT_METRICS_PORT 8080
#define LANTERN_DEFAULT_DEVNET "devnet0"
#define LANTERN_PENDING_BLOCK_LIMIT 1024u

typedef enum
{
Expand All @@ -46,9 +47,17 @@ typedef enum
LANTERN_CLIENT_ERR_GENESIS = -5,
LANTERN_CLIENT_ERR_VALIDATOR = -6,
LANTERN_CLIENT_ERR_RUNTIME = -7,
LANTERN_CLIENT_ERR_NETWORK = -8
LANTERN_CLIENT_ERR_NETWORK = -8,
LANTERN_CLIENT_ERR_IGNORED = -9
} lantern_client_error;

typedef enum
{
LANTERN_SYNC_STATE_IDLE = 0,
LANTERN_SYNC_STATE_SYNCING = 1,
LANTERN_SYNC_STATE_SYNCED = 2
} LanternSyncState;

struct lantern_client_options {
const char *data_dir;
const char *genesis_config_path;
Expand Down Expand Up @@ -80,12 +89,28 @@ struct lantern_pending_block {
LanternRoot parent_root;
char peer_text[128];
bool parent_requested;
uint64_t received_ms;
uint32_t backfill_depth;
};

struct lantern_pending_parent_index_entry {
LanternRoot parent_root;
LanternRoot *child_roots;
size_t length;
size_t capacity;
};

struct lantern_pending_parent_index {
struct lantern_pending_parent_index_entry *entries;
size_t length;
size_t capacity;
};

struct lantern_pending_block_list {
struct lantern_pending_block *items;
size_t length;
size_t capacity;
struct lantern_pending_parent_index parent_index;
};

struct lantern_agg_proof_cache_entry {
Expand Down Expand Up @@ -175,6 +200,7 @@ struct lantern_client {
int validator_stop_flag;
struct lantern_metrics_server metrics_server;
bool metrics_running;
uint64_t start_time_seconds;
struct lantern_http_server http_server;
bool http_running;
bool genesis_fallback_used;
Expand All @@ -184,6 +210,7 @@ struct lantern_client {
struct libp2p_subscription *connection_subscription;
struct lantern_string_list dialer_peers;
struct lantern_string_list connected_peer_ids;
struct lantern_string_list inbound_peer_ids;
struct lantern_string_list status_failure_peer_ids;
struct lantern_pending_block_list pending_blocks;
pthread_mutex_t pending_lock;
Expand All @@ -194,6 +221,8 @@ struct lantern_client {
uint64_t sync_last_log_ms;
uint64_t sync_last_imported_blocks;
uint64_t sync_imported_blocks;
uint64_t sync_target_slot;
LanternSyncState sync_state;
bool sync_in_progress;
size_t status_requests_inflight_total;
size_t status_requests_peak;
Expand Down Expand Up @@ -291,9 +320,9 @@ int lantern_client_debug_import_block(
const char *peer_id_text);
size_t lantern_client_pending_block_count(const struct lantern_client *client);

#define LANTERN_DEBUG_BLOCKS_REQUEST_SUCCESS 0
#define LANTERN_DEBUG_BLOCKS_REQUEST_FAILED 1
#define LANTERN_DEBUG_BLOCKS_REQUEST_ABORTED 2
#define LANTERN_TEST_BLOCKS_REQUEST_SUCCESS 0
#define LANTERN_TEST_BLOCKS_REQUEST_FAILED 1
#define LANTERN_TEST_BLOCKS_REQUEST_ABORTED 2

int lantern_client_debug_enqueue_pending_block(
struct lantern_client *client,
Expand Down
9 changes: 9 additions & 0 deletions include/lantern/http/metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ extern "C" {
#endif

#define LANTERN_METRICS_MAX_PEER_VOTE_STATS 64u
#define LANTERN_METRICS_CONTENT_TYPE "text/plain; version=0.0.4; charset=utf-8"

struct lantern_peer_vote_metric {
char peer_id[128];
Expand All @@ -23,10 +24,14 @@ struct lantern_peer_vote_metric {
};

struct lantern_metrics_snapshot {
uint64_t lean_node_start_time_seconds;
uint64_t lean_head_slot;
uint64_t lean_current_slot;
uint64_t lean_safe_target_slot;
uint64_t lean_latest_justified_slot;
uint64_t lean_latest_finalized_slot;
size_t lean_validators_count;
size_t lean_connected_peers;
struct lean_metrics_snapshot lean_metrics;
size_t peer_vote_metrics_count;
struct lantern_peer_vote_metric peer_vote_metrics[LANTERN_METRICS_MAX_PEER_VOTE_STATS];
Expand All @@ -53,6 +58,10 @@ int lantern_metrics_server_start(
uint16_t port,
const struct lantern_metrics_callbacks *callbacks);
void lantern_metrics_server_stop(struct lantern_metrics_server *server);
int lantern_metrics_format_prometheus(
const struct lantern_metrics_snapshot *snapshot,
char **out_body,
size_t *out_len);

#ifdef __cplusplus
}
Expand Down
16 changes: 16 additions & 0 deletions include/lantern/http/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,20 @@
extern "C" {
#endif

struct lantern_metrics_snapshot;

typedef enum
{
LANTERN_HTTP_CB_OK = 0,
LANTERN_HTTP_CB_ERR_INVALID_PARAM = -1,
LANTERN_HTTP_CB_ERR_NOT_FOUND = -2,
LANTERN_HTTP_CB_ERR_INVALID_STATE = -3,
LANTERN_HTTP_CB_ERR_LOCK_FAILED = -4,
LANTERN_HTTP_CB_ERR_HASH_FAILED = -5,
LANTERN_HTTP_CB_ERR_IO = -6,
LANTERN_HTTP_CB_ERR_UNAVAILABLE = -7,
} lantern_http_callback_error_t;

struct lantern_http_head_snapshot {
uint64_t slot;
LanternRoot head_root;
Expand All @@ -30,6 +44,8 @@ struct lantern_http_server_callbacks {
size_t (*validator_count)(void *context);
int (*validator_info)(void *context, size_t index, struct lantern_http_validator_info *out_info);
int (*set_validator_status)(void *context, uint64_t global_index, bool enabled);
int (*metrics_snapshot)(void *context, struct lantern_metrics_snapshot *out_snapshot);
int (*finalized_state_ssz)(void *context, uint8_t **out_bytes, size_t *out_len);
};

struct lantern_http_server_config {
Expand Down
35 changes: 35 additions & 0 deletions include/lantern/metrics/lean_metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,27 @@ extern "C" {

#define LEAN_METRICS_MAX_BUCKETS 10u

typedef enum {
LEAN_METRICS_DIR_INBOUND = 0,
LEAN_METRICS_DIR_OUTBOUND = 1,
LEAN_METRICS_DIR_COUNT = 2
} lean_metrics_direction_t;

typedef enum {
LEAN_METRICS_CONN_RESULT_SUCCESS = 0,
LEAN_METRICS_CONN_RESULT_TIMEOUT = 1,
LEAN_METRICS_CONN_RESULT_ERROR = 2,
LEAN_METRICS_CONN_RESULT_COUNT = 3
} lean_metrics_connection_result_t;

typedef enum {
LEAN_METRICS_DISCONNECT_TIMEOUT = 0,
LEAN_METRICS_DISCONNECT_REMOTE_CLOSE = 1,
LEAN_METRICS_DISCONNECT_LOCAL_CLOSE = 2,
LEAN_METRICS_DISCONNECT_ERROR = 3,
LEAN_METRICS_DISCONNECT_REASON_COUNT = 4
} lean_metrics_disconnection_reason_t;

struct lean_metrics_histogram_snapshot {
size_t bucket_count;
double buckets[LEAN_METRICS_MAX_BUCKETS];
Expand All @@ -22,9 +43,15 @@ struct lean_metrics_histogram_snapshot {
struct lean_metrics_snapshot {
uint64_t attestations_valid_total;
uint64_t attestations_invalid_total;
uint64_t fork_choice_reorgs_total;
uint64_t finalizations_success_total;
uint64_t finalizations_error_total;
uint64_t peer_connection_events_total[LEAN_METRICS_DIR_COUNT][LEAN_METRICS_CONN_RESULT_COUNT];
uint64_t peer_disconnection_events_total[LEAN_METRICS_DIR_COUNT][LEAN_METRICS_DISCONNECT_REASON_COUNT];
uint64_t state_transition_slots_processed_total;
uint64_t state_transition_attestations_processed_total;
struct lean_metrics_histogram_snapshot fork_choice_block_time;
struct lean_metrics_histogram_snapshot fork_choice_reorg_depth;
struct lean_metrics_histogram_snapshot attestation_validation_time;
struct lean_metrics_histogram_snapshot state_transition_time;
struct lean_metrics_histogram_snapshot state_slots_time;
Expand All @@ -36,13 +63,21 @@ struct lean_metrics_snapshot {

void lean_metrics_reset(void);
void lean_metrics_record_fork_choice_block_time(double seconds);
void lean_metrics_record_fork_choice_reorg(size_t depth);
void lean_metrics_record_attestation_validation(double seconds, bool valid);
void lean_metrics_record_state_transition(double seconds);
void lean_metrics_record_state_transition_slots(uint64_t slots_processed, double seconds);
void lean_metrics_record_state_transition_block(double seconds);
void lean_metrics_record_state_transition_attestations(uint64_t count, double seconds);
void lean_metrics_record_finalization_attempt(bool success);
void lean_metrics_record_pq_signature_signing(double seconds);
void lean_metrics_record_pq_signature_verification(double seconds);
void lean_metrics_record_peer_connection(
lean_metrics_direction_t direction,
lean_metrics_connection_result_t result);
void lean_metrics_record_peer_disconnection(
lean_metrics_direction_t direction,
lean_metrics_disconnection_reason_t reason);
void lean_metrics_snapshot(struct lean_metrics_snapshot *out);

#ifdef __cplusplus
Expand Down
2 changes: 1 addition & 1 deletion include/lantern/networking/reqresp_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#define LANTERN_REQRESP_MAX_CHUNK_BYTES (10u * 1024u * 1024u)
#define LANTERN_REQRESP_MAX_CONTEXT_BYTES (1u << 20)
#define LANTERN_REQRESP_HEADER_MAX_BYTES 10u
#define LANTERN_REQRESP_TTFB_TIMEOUT_MS 5000u
#define LANTERN_REQRESP_TTFB_TIMEOUT_MS 10000u
#define LANTERN_REQRESP_RESP_TIMEOUT_MS 10000u
#define LANTERN_REQRESP_STALL_TIMEOUT_MS LANTERN_REQRESP_TTFB_TIMEOUT_MS
#define LANTERN_REQRESP_RESPONSE_SUCCESS 0u
Expand Down
22 changes: 22 additions & 0 deletions include/lantern/storage/storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define LANTERN_STORAGE_STORAGE_H

#include <stddef.h>
#include <stdint.h>

#include "lantern/consensus/containers.h"
#include "lantern/consensus/state.h"
Expand All @@ -22,6 +23,27 @@ int lantern_storage_load_state(const char *data_dir, LanternState *state);
int lantern_storage_save_votes(const char *data_dir, const LanternState *state);
int lantern_storage_load_votes(const char *data_dir, LanternState *state);
int lantern_storage_store_block(const char *data_dir, const LanternSignedBlock *block);
int lantern_storage_store_state_for_root(
const char *data_dir,
const LanternRoot *root,
const LanternState *state);
int lantern_storage_load_state_bytes_for_root(
const char *data_dir,
const LanternRoot *root,
uint8_t **out_data,
size_t *out_len);
int lantern_storage_store_slot_root(
const char *data_dir,
uint64_t slot,
const LanternRoot *root);
int lantern_storage_store_head_root(
const char *data_dir,
uint64_t slot,
const LanternRoot *root);
int lantern_storage_store_checkpoints(
const char *data_dir,
const LanternCheckpoint *justified,
const LanternCheckpoint *finalized);
int lantern_storage_collect_blocks(
const char *data_dir,
const LanternRoot *roots,
Expand Down
7 changes: 7 additions & 0 deletions include/lantern/support/version.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#ifndef LANTERN_SUPPORT_VERSION_H
#define LANTERN_SUPPORT_VERSION_H

#define LANTERN_VERSION "v0.0.2"
#define LANTERN_CLIENT_NAME "lantern"

#endif /* LANTERN_SUPPORT_VERSION_H */
20 changes: 2 additions & 18 deletions scripts/run_devnet2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,6 @@ DOCKER_NETWORK=${DOCKER_NETWORK:-host}
DOCKER_BUILD=${DOCKER_BUILD:-1}
DOCKER_BUILD_ARGS=${DOCKER_BUILD_ARGS:-}
DOCKER_LISTEN_IP=${DOCKER_LISTEN_IP:-}
LANTERN_DEBUG_FINALIZATION=${LANTERN_DEBUG_FINALIZATION:-}
LANTERN_DEBUG_STATE_HASH=${LANTERN_DEBUG_STATE_HASH:-}
ENABLE_COREDUMP=${ENABLE_COREDUMP:-0}

if [[ -z "${DOCKER_LISTEN_IP}" ]]; then
Expand Down Expand Up @@ -543,15 +541,8 @@ for i in $(seq 0 $((NODES-1))); do
-e "LANTERN_NODES_FILE=/genesis/nodes.yaml"
-e "LANTERN_GENESIS_STATE=/genesis/genesis.ssz"
-e "LANTERN_VALIDATOR_CONFIG=/genesis/validator-config.yaml"
-e "LANTERN_XMSS_AGG_TEST_MODE=0"
-e "LANTERN_EXTRA_ARGS=--xmss-public-template /genesis/${HASH_SIG_KEYS_DIR_NAME}/validator_%u_pk.ssz --xmss-secret-template /genesis/${HASH_SIG_KEYS_DIR_NAME}/validator_%u_sk.ssz --log-level ${LOG_LEVEL}"
-e "LANTERN_EXTRA_ARGS=--hash-sig-key-dir /genesis/${HASH_SIG_KEYS_DIR_NAME} --log-level ${LOG_LEVEL}"
)
if [[ -n "${LANTERN_DEBUG_FINALIZATION}" ]]; then
docker_args+=(-e "LANTERN_DEBUG_FINALIZATION=${LANTERN_DEBUG_FINALIZATION}")
fi
if [[ -n "${LANTERN_DEBUG_STATE_HASH}" ]]; then
docker_args+=(-e "LANTERN_DEBUG_STATE_HASH=${LANTERN_DEBUG_STATE_HASH}")
fi
if [[ "${ENABLE_COREDUMP}" == "1" ]]; then
docker_args+=(--ulimit core=-1)
fi
Expand All @@ -576,12 +567,6 @@ for i in $(seq 0 $((NODES-1))); do
docker "${docker_args[@]}" >/dev/null
echo "${NODE_ID}" >> "${PIDS_FILE}"
else
if [[ -n "${LANTERN_DEBUG_FINALIZATION}" ]]; then
export LANTERN_DEBUG_FINALIZATION
fi
if [[ -n "${LANTERN_DEBUG_STATE_HASH}" ]]; then
export LANTERN_DEBUG_STATE_HASH
fi
nohup "${BIN}" \
--data-dir "${DATA}" \
--genesis-config "${GENESIS_DIR}/config.yaml" \
Expand All @@ -595,8 +580,7 @@ for i in $(seq 0 $((NODES-1))); do
--http-port "${HTTP}" \
--metrics-port "${METRICS}" \
--devnet "${DEVNET}" \
--xmss-public-template "${HASH_SIG_KEYS_DIR}/validator_%u_pk.ssz" \
--xmss-secret-template "${HASH_SIG_KEYS_DIR}/validator_%u_sk.ssz" \
--hash-sig-key-dir "${HASH_SIG_KEYS_DIR}" \
--log-level "${LOG_LEVEL}" \
>"${LOG_DIR}/${NODE_ID}.log" 2>&1 &
echo $! >> "${PIDS_FILE}"
Expand Down
Loading