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
7 changes: 0 additions & 7 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -233,13 +233,6 @@ verify-keypair = true
# Env: MBV_LEDGER__RESET
reset = false

# (Optional) Override the validator authority pubkey during ledger replay.
# When set, replayed transactions are verified against this key instead of
# the validator's own identity. The override is automatically unset once
# replay completes. Useful when replaying a ledger from a different validator.
# Default: not set (uses the validator's own keypair)
# Env: MBV_LEDGER__REPLAY_AUTHORITY_OVERRIDE
# Example: replay-authority-override = "11111111111111111111111111111111"

# ==============================================================================
# Chainlink (cloning pipeline)
Expand Down
9 changes: 1 addition & 8 deletions magicblock-config/src/config/ledger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::time::Duration;

use serde::{Deserialize, Serialize};

use crate::{consts, types::SerdePubkey};
use crate::consts;

/// Configuration for the ledger database and block production.
#[derive(Deserialize, Serialize, Debug, Clone)]
Expand All @@ -29,12 +29,6 @@ pub struct LedgerConfig {
/// ledger truncation logic kicks in, when the disk space
/// used by the ledger approaches this number.
pub size: u64,

/// If set, overrides the validator authority pubkey during ledger
/// replay (StartingUp mode) so that replayed transactions are
/// verified against this key instead of the validator's own
/// identity. The override is unset once replay completes.
pub replay_authority_override: Option<SerdePubkey>,
}

impl Default for LedgerConfig {
Expand All @@ -48,7 +42,6 @@ impl Default for LedgerConfig {
reset: false,
verify_keypair: true,
size: consts::DEFAULT_LEDGER_SIZE,
replay_authority_override: None,
}
}
}
Expand Down
120 changes: 0 additions & 120 deletions test-integration/test-ledger-restore/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,126 +195,6 @@ pub fn setup_validator_with_local_remote_and_resume_strategy(
(default_tmpdir_config, validator, ctx)
}

/// Like `setup_offline_validator` but uses a new validator authority
/// and sets `replay_authority_override` for ledger replay.
pub fn setup_offline_validator_with_authority_override(
ledger_path: &Path,
programs: Option<Vec<LoadableProgram>>,
millis_per_slot: Option<u64>,
reset_ledger: bool,
replay_authority_override: Pubkey,
) -> (TempDir, Child, IntegrationTestContext) {
let accountsdb_config = AccountsDbConfig::default();

let validator_config = ValidatorConfig::default();
let programs = resolve_programs(programs);

let config = ValidatorParams {
ledger: LedgerConfig {
reset: reset_ledger,
verify_keypair: false,
replay_authority_override: Some(SerdePubkey(
replay_authority_override,
)),
block_time: millis_per_slot
.map(Duration::from_millis)
.unwrap_or_else(|| {
Duration::from_millis(DEFAULT_LEDGER_BLOCK_TIME_MS)
}),
..Default::default()
},
accountsdb: accountsdb_config.clone(),
programs,
validator: validator_config,
lifecycle: LifecycleMode::Offline,
storage: StorageDirectory(ledger_path.to_path_buf()),
..Default::default()
};
let (default_tmpdir_config, Some(mut validator), port) =
start_magicblock_validator_with_config_struct(
config,
&LoadedAccounts::new_with_new_validator_authority(),
)
else {
panic!("validator should set up correctly");
};

let ctx = expect!(
IntegrationTestContext::try_new_with_ephem_port(port),
validator
);
(default_tmpdir_config, validator, ctx)
}

/// Like `setup_validator_with_local_remote` but uses a new validator
/// authority and sets `replay_authority_override` for ledger replay.
pub fn setup_validator_with_local_remote_and_authority_override(
ledger_path: &Path,
programs: Option<Vec<LoadableProgram>>,
reset_ledger: bool,
replay_authority_override: Pubkey,
) -> (TempDir, Child, IntegrationTestContext) {
let accountsdb_config = AccountsDbConfig {
reset: reset_ledger,
..Default::default()
};

let programs = resolve_programs(programs);
let loaded_accounts = LoadedAccounts::new_with_new_validator_authority();

let config = ValidatorParams {
ledger: LedgerConfig {
reset: reset_ledger,
verify_keypair: false,
replay_authority_override: Some(SerdePubkey(
replay_authority_override,
)),
..Default::default()
},
accountsdb: accountsdb_config.clone(),
programs,
task_scheduler: TaskSchedulerConfig {
reset: reset_ledger,
..Default::default()
},
lifecycle: LifecycleMode::Ephemeral,
remotes: vec![
Remote::from_str(IntegrationTestContext::url_chain()).unwrap(),
Remote::from_str(IntegrationTestContext::ws_url_chain()).unwrap(),
],
storage: StorageDirectory(ledger_path.to_path_buf()),
..Default::default()
};
// Fund the NEW validator authority on chain
{
let chain_only_ctx =
IntegrationTestContext::try_new_chain_only().unwrap();
chain_only_ctx
.airdrop_chain(
&loaded_accounts.validator_authority(),
20 * LAMPORTS_PER_SOL,
)
.unwrap();

init_validator_fees_vault(
&chain_only_ctx,
loaded_accounts.validator_authority_keypair(),
);
}

let (default_tmpdir_config, Some(mut validator), port) =
start_magicblock_validator_with_config_struct(config, &loaded_accounts)
else {
panic!("validator should set up correctly");
};

let ctx = expect!(
IntegrationTestContext::try_new_with_ephem_port(port),
validator
);
(default_tmpdir_config, validator, ctx)
}

/// Init validator fees vault for proper validator setup
pub fn init_validator_fees_vault(
chain_ctx: &IntegrationTestContext,
Expand Down
45 changes: 5 additions & 40 deletions test-integration/test-ledger-restore/tests/01_single_transfer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ use std::{path::Path, process::Child};

use cleanass::{assert, assert_eq};
use integration_test_tools::{
expect, loaded_accounts::LoadedAccounts, tmpdir::resolve_tmp_dir, unwrap,
validator::cleanup,
expect, tmpdir::resolve_tmp_dir, unwrap, validator::cleanup,
};
use solana_commitment_config::CommitmentConfig;
use solana_sdk::{
Expand All @@ -14,7 +13,6 @@ use solana_sdk::{
use test_kit::init_logger;
use test_ledger_restore::{
airdrop_and_delegate_accounts, setup_offline_validator,
setup_offline_validator_with_authority_override,
setup_validator_with_local_remote, transfer_lamports,
wait_for_ledger_persist, TMP_DIR_LEDGER,
};
Expand All @@ -31,32 +29,8 @@ fn test_restore_ledger_with_transferred_account() {
test_ledger_restore::kill_validator(&mut validator);
debug!("Transfer sig: {transfer_sig}");

let mut validator = read_ledger(
&ledger_path,
&keypair2.pubkey(),
Some(&transfer_sig),
None,
);
test_ledger_restore::kill_validator(&mut validator);
}

#[test]
fn test_restore_ledger_with_transferred_account_authority_override() {
init_logger!();
let (_tmpdir, ledger_path) = resolve_tmp_dir(TMP_DIR_LEDGER);

let original_authority = LoadedAccounts::default().validator_authority();

let (mut validator, transfer_sig, _slot, _keypair1, keypair2) =
write_ledger(&ledger_path);
test_ledger_restore::kill_validator(&mut validator);

let mut validator = read_ledger(
&ledger_path,
&keypair2.pubkey(),
Some(&transfer_sig),
Some(original_authority),
);
let mut validator =
read_ledger(&ledger_path, &keypair2.pubkey(), Some(&transfer_sig));
test_ledger_restore::kill_validator(&mut validator);
}

Expand Down Expand Up @@ -106,19 +80,10 @@ fn read_ledger(
ledger_path: &Path,
pubkey2: &Pubkey,
transfer_sig1: Option<&Signature>,
authority_override: Option<Pubkey>,
) -> Child {
// Launch another validator reusing ledger
let (_, mut validator, ctx) = match authority_override {
Some(original) => setup_offline_validator_with_authority_override(
ledger_path,
None,
None,
false,
original,
),
None => setup_offline_validator(ledger_path, None, None, false, false),
};
let (_, mut validator, ctx) =
setup_offline_validator(ledger_path, None, None, false, false);

let acc = expect!(
expect!(ctx.try_ephem_client(), validator).get_account(pubkey2),
Expand Down
47 changes: 5 additions & 42 deletions test-integration/test-ledger-restore/tests/04_flexi_counter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ use test_kit::init_logger;
use test_ledger_restore::{
confirm_tx_with_payer_ephem, fetch_counter_ephem,
init_and_delegate_counter_and_payer, setup_offline_validator,
setup_offline_validator_with_authority_override,
setup_validator_with_local_remote_and_resume_strategy,
wait_for_ledger_persist, TMP_DIR_LEDGER,
};
Expand All @@ -38,7 +37,7 @@ fn test_restore_ledger_with_flexi_counter_same_slot() {
let (mut validator, _, payer1, payer2) = write(&ledger_path, false);
test_ledger_restore::kill_validator(&mut validator);

let mut validator = read(&ledger_path, &payer1, &payer2, None);
let mut validator = read(&ledger_path, &payer1, &payer2);
test_ledger_restore::kill_validator(&mut validator);
}

Expand All @@ -51,24 +50,7 @@ fn test_restore_ledger_with_flexi_counter_separate_slot() {
let (mut validator, _, payer1, payer2) = write(&ledger_path, true);
test_ledger_restore::kill_validator(&mut validator);

let mut validator = read(&ledger_path, &payer1, &payer2, None);
test_ledger_restore::kill_validator(&mut validator);
}

#[test]
fn test_restore_ledger_with_flexi_counter_authority_override() {
init_logger!();
let (_tmpdir, ledger_path) = resolve_tmp_dir(TMP_DIR_LEDGER);

let original_authority =
LoadedAccounts::with_delegation_program_test_authority()
.validator_authority();

let (mut validator, _, payer1, payer2) = write(&ledger_path, true);
test_ledger_restore::kill_validator(&mut validator);

let mut validator =
read(&ledger_path, &payer1, &payer2, Some(original_authority));
let mut validator = read(&ledger_path, &payer1, &payer2);
test_ledger_restore::kill_validator(&mut validator);
}

Expand Down Expand Up @@ -217,28 +199,9 @@ fn write(
(validator, slot, payer1.pubkey(), payer2.pubkey())
}

fn read(
ledger_path: &Path,
payer1: &Pubkey,
payer2: &Pubkey,
authority_override: Option<Pubkey>,
) -> Child {
let (_, mut validator, ctx) = match authority_override {
Some(original) => setup_offline_validator_with_authority_override(
ledger_path,
None,
Some(SLOT_MS),
false,
original,
),
None => setup_offline_validator(
ledger_path,
None,
Some(SLOT_MS),
false,
true,
),
};
fn read(ledger_path: &Path, payer1: &Pubkey, payer2: &Pubkey) -> Child {
let (_, mut validator, ctx) =
setup_offline_validator(ledger_path, None, Some(SLOT_MS), false, true);

let counter1_decoded = fetch_counter_ephem(&ctx, payer1, &mut validator);
assert_eq!(
Expand Down
Loading
Loading