Skip to content

Commit

Permalink
feat(cmd): when network is specified, use a default genesis file path (
Browse files Browse the repository at this point in the history
  • Loading branch information
dnut authored Oct 1, 2024
1 parent 2cd4d3f commit 5664faa
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 66 deletions.
79 changes: 13 additions & 66 deletions src/cmd/cmd.zig
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const GenesisConfig = sig.accounts_db.GenesisConfig;
const GossipService = sig.gossip.GossipService;
const IpAddr = sig.net.IpAddr;
const Logger = sig.trace.Logger;
const Network = config.Network;
const Pubkey = sig.core.Pubkey;
const ShredCollectorDependencies = sig.shred_collector.ShredCollectorDependencies;
const SingleEpochLeaderSchedule = sig.core.leader_schedule.SingleEpochLeaderSchedule;
Expand Down Expand Up @@ -130,7 +131,7 @@ pub fn run() !void {

var network_option = cli.Option{
.long_name = "network",
.help = "network to use with predefined entrypoints",
.help = "cluster to connect to - adds gossip entrypoints, sets default genesis file path",
.short_alias = 'n',
.value_ref = cli.mkRef(&config.current.gossip.network),
.required = false,
Expand Down Expand Up @@ -235,10 +236,10 @@ pub fn run() !void {

var genesis_file_path = cli.Option{
.long_name = "genesis-file-path",
.help = "path to the genesis file",
.help = "path to the genesis file. defaults to 'data/genesis-files/<network>_genesis.bin' if --network option is set",
.short_alias = 'g',
.value_ref = cli.mkRef(&config.current.genesis_file_path),
.required = true,
.required = false,
.value_name = "genesis_file_path",
};

Expand Down Expand Up @@ -1267,62 +1268,6 @@ fn getMyDataFromIpEcho(
};
}

pub const Network = enum {
mainnet,
devnet,
testnet,

const Self = @This();

pub fn getPredefinedEntrypoints(self: Self, socket_addrs: *std.ArrayList(SocketAddr), logger: Logger) !void {
const E = std.BoundedArray(u8, 100);
var predefined_entrypoints: [10]E = undefined;
@memset(&predefined_entrypoints, .{});
var len: usize = 0;

switch (self) {
.mainnet => {
predefined_entrypoints[len] = try E.fromSlice("entrypoint.mainnet-beta.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint2.mainnet-beta.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint3.mainnet-beta.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint4.mainnet-beta.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint5.mainnet-beta.solana.com:8001");
len += 1;
},
.testnet => {
predefined_entrypoints[len] = try E.fromSlice("entrypoint.testnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint2.testnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint3.testnet.solana.com:8001");
len += 1;
},
.devnet => {
predefined_entrypoints[len] = try E.fromSlice("entrypoint.devnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint2.devnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint3.devnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint4.devnet.solana.com:8001");
len += 1;
predefined_entrypoints[len] = try E.fromSlice("entrypoint5.devnet.solana.com:8001");
len += 1;
},
}

for (predefined_entrypoints[0..len]) |entrypoint| {
logger.infof("adding predefined entrypoint: {s}", .{entrypoint.slice()});
const socket_addr = try resolveSocketAddr(entrypoint.slice(), .noop);
try socket_addrs.append(socket_addr);
}
}
};

fn resolveSocketAddr(entrypoint: []const u8, logger: Logger) !SocketAddr {
const domain_port_sep = std.mem.indexOfScalar(u8, entrypoint, ':') orelse {
logger.field("entrypoint", entrypoint).err("entrypoint port missing");
Expand Down Expand Up @@ -1367,12 +1312,12 @@ fn getEntrypoints(logger: Logger) !std.ArrayList(SocketAddr) {
// try entrypoint_set.ensureTotalCapacity(config.current.gossip.entrypoints.len);
// try entrypoints.ensureTotalCapacityPrecise(config.current.gossip.entrypoints.len);

if (config.current.gossip.network) |network_str| {
const network_t: Network = std.meta.stringToEnum(Network, network_str) orelse {
logger.errf("'{s}': network not valid", .{network_str});
return error.NetworkNotValid;
};
try network_t.getPredefinedEntrypoints(&entrypoints, logger);
if (try config.current.gossip.getNetwork()) |cluster| {
for (cluster.entrypoints()) |entrypoint| {
logger.infof("adding predefined entrypoint: {s}", .{entrypoint});
const socket_addr = try resolveSocketAddr(entrypoint, .noop);
try entrypoints.append(socket_addr);
}
}

for (config.current.gossip.entrypoints) |entrypoint| {
Expand Down Expand Up @@ -1430,6 +1375,9 @@ fn loadSnapshot(
errdefer allocator.destroy(result);
result.allocator = allocator;

const genesis_file_path = try config.current.genesisFilePath() orelse
return error.GenesisPathNotProvided;

const snapshot_dir_str = config.current.accounts_db.snapshot_dir;
var snapshot_dir = try std.fs.cwd().makeOpenPath(snapshot_dir_str, .{ .iterate = true });
defer snapshot_dir.close();
Expand Down Expand Up @@ -1490,7 +1438,6 @@ fn loadSnapshot(

// this should exist before we start to unpack
logger.infof("reading genesis...", .{});
const genesis_file_path = config.current.genesis_file_path orelse return error.GenesisNotProvided;
result.genesis_config = readGenesisConfig(allocator, genesis_file_path) catch |err| {
if (err == error.GenesisNotFound) {
logger.errf("genesis config not found - expecting {s} to exist", .{genesis_file_path});
Expand Down
52 changes: 52 additions & 0 deletions src/cmd/config.zig
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
const std = @import("std");
const sig = @import("../sig.zig");

const ACCOUNT_INDEX_BINS = sig.accounts_db.db.ACCOUNT_INDEX_BINS;
const ShredCollectorConfig = sig.shred_collector.ShredCollectorConfig;
const IpAddr = sig.net.IpAddr;
Expand All @@ -17,6 +19,16 @@ pub const Config = struct {
// general config
log_level: LogLevel = .debug,
metrics_port: u16 = 12345,

pub fn genesisFilePath(self: Config) error{UnknownNetwork}!?[]const u8 {
return if (self.genesis_file_path) |provided_path|
provided_path
else if (try self.gossip.getNetwork()) |n| switch (n) {
.mainnet => "data/genesis-files/mainnet_genesis.bin",
.devnet => "data/genesis-files/devnet_genesis.bin",
.testnet => "data/genesis-files/testnet_genesis.bin",
} else null;
}
};

pub const current: *Config = &default_validator_config;
Expand All @@ -41,6 +53,46 @@ const GossipConfig = struct {
.V6 => |v6| .{ .ipv6 = v6.ip },
};
}

pub fn getNetwork(self: GossipConfig) error{UnknownNetwork}!?Network {
return if (self.network) |network_str|
std.meta.stringToEnum(Network, network_str) orelse
error.UnknownNetwork
else
null;
}
};

pub const Network = enum {
mainnet,
devnet,
testnet,

const Self = @This();

pub fn entrypoints(self: Self) []const []const u8 {
return switch (self) {
.mainnet => &.{
"entrypoint.mainnet-beta.solana.com:8001",
"entrypoint2.mainnet-beta.solana.com:8001",
"entrypoint3.mainnet-beta.solana.com:8001",
"entrypoint4.mainnet-beta.solana.com:8001",
"entrypoint5.mainnet-beta.solana.com:8001",
},
.testnet => &.{
"entrypoint.testnet.solana.com:8001",
"entrypoint2.testnet.solana.com:8001",
"entrypoint3.testnet.solana.com:8001",
},
.devnet => &.{
"entrypoint.devnet.solana.com:8001",
"entrypoint2.devnet.solana.com:8001",
"entrypoint3.devnet.solana.com:8001",
"entrypoint4.devnet.solana.com:8001",
"entrypoint5.devnet.solana.com:8001",
},
};
}
};

const shred_collector_defaults = ShredCollectorConfig{
Expand Down

0 comments on commit 5664faa

Please sign in to comment.