Skip to content

Commit

Permalink
Jito Patch
Browse files Browse the repository at this point in the history
only reroute if relayer connected (jito-foundation#123)
feat: add client tls config (jito-foundation#121)
remove extra val (jito-foundation#129)
fix clippy (jito-foundation#130)
copy all binaries to docker-output (jito-foundation#131)
Ledger tool halts at slot passed to create-snapshot (jito-foundation#118)
update program submodule (jito-foundation#133)
quick fix for tips and clearing old bundles (jito-foundation#135)
update submodule to new program (jito-foundation#136)
Improve stake-meta-generator usability (jito-foundation#134)
pinning submodule head (jito-foundation#140)
Use BundleAccountLocker when handling tip txs (jito-foundation#147)
Add metrics for relayer + block engine proxy (jito-foundation#149)
Build claim-mev in docker (jito-foundation#141)
Rework bundle receiving and add metrics (jito-foundation#152) (jito-foundation#154)
update submodule + dev files (jito-foundation#158)
Deterministically find tip amounts, add meta to stake info, and cleanup pubkey/strings in MEV tips (jito-foundation#159)
update jito-programs submodule (jito-foundation#160)
Separate MEV tip related workflow (jito-foundation#161)
Add block builder fee protos (jito-foundation#162)
fix jito programs (jito-foundation#163)
update submodule so autosnapshot exits out of ledger tool early (jito-foundation#164)
Pipe through block builder fee (jito-foundation#167)
pull in new snapshot code (jito-foundation#171)
block builder bug (jito-foundation#172)

Pull in new slack autosnapshot submodule (jito-foundation#174)

sort stake meta json and use int math (jito-foundation#176)

add accountsdb conn submod (jito-foundation#169)

Update tip distribution parameters (jito-foundation#177)

new submodules (jito-foundation#180)

Add buildkite link for jito CI (jito-foundation#183)

Fixed broken links to repositories (jito-foundation#184)

Changed from ssh to https transfer for clone

Seg/update submods (jito-foundation#187)

fix tests (jito-foundation#190)

rm geyser submod (jito-foundation#192)

rm dangling geyser references (jito-foundation#193)

fix syntax err (jito-foundation#195)

use deterministic req ids in batch calls (jito-foundation#199)

update jito-programs

revert cargo

update Cargo lock

update with path fix

fix cargo

update autosnapshot with block lookback (jito-foundation#201)

[JIT-460] When claiming mev tips, skip accounts that won't have min rent exempt amount after claiming (jito-foundation#203)

Add logging for sol balance desired (jito-foundation#205)

* add logging

* add logging

* update msg

* tweak vars

update submodule (jito-foundation#204)

use efficient data structures when calling batch_simulate_bundles (jito-foundation#206)

[JIT-504] Add low balance check in uploading merkle roots (jito-foundation#209)

add config to simulate on top of working bank (jito-foundation#211)

rm frozen bank check

simulate_bundle rpc bugfixes (jito-foundation#214)

rm frozen bank check in simulate_bundle rpc method

[JIT-519] Store ClaimStatus address in merkle-root-json (jito-foundation#210)

* add files

* switch to include bump

update submodule (jito-foundation#217)

add amount filter (jito-foundation#218)

update autosnapshot (jito-foundation#222)

Print TX error in Bundles (jito-foundation#223)

add new args to support single relayer and block-engine endpoints (jito-foundation#224)

point to new jito-programs submod and invoke updated init tda instruction (jito-foundation#228)

fix clippy errors (jito-foundation#230)

fix validator start scripts (jito-foundation#232)

Point README to gitbook (jito-foundation#237)

use packaged cargo bin to build (jito-foundation#239)

Add validator identity pubkey to StakeMeta (jito-foundation#226)

The vote account associated with a validator is not a permanent link, so log the validator identity as well.

bugfix: conditionally compile with debug flags (jito-foundation#240)

Seg/tip distributor master (jito-foundation#242)

* validate tree nodes

* fix unit tests

* pr feedback

* bump jito-programs submod

Simplify bootstrapping (jito-foundation#241)

* startup without precompile

* update spacing

* use release mode

* spacing

fix validation

rm validation skip

Account for block builder fee when generating excess tip balance (jito-foundation#247)

Improve docker caching

delay constructing claim mev txs (jito-foundation#253)

fix stake meta tests from bb fee (jito-foundation#254)

fix tests

Buffer bundles that exceed cost model (jito-foundation#225)

* buffer bundles that exceed cost model

clear qos failed bundles buffer if not leader soon (jito-foundation#260)

update Cargo.lock to correct solana versions in jito-programs submodule (jito-foundation#265)

fix simulate_bundle client and better error handling (jito-foundation#267)

update submod (jito-foundation#272)

Preallocate Bundle Cost (jito-foundation#238)

fix Dockerfile (jito-foundation#278)

Fix Tests (jito-foundation#279)

Fix Tests (jito-foundation#281)

* fix tests

update jito-programs submod (jito-foundation#282)

add reclaim rent workflow (jito-foundation#283)

update jito-programs submod

fix clippy errs

rm wrong assertion and swap out file write fn call (jito-foundation#292)

Remove security.md (jito-foundation#293)

demote frequent relayer_stage-stream_error to warn (jito-foundation#275)

account for case where TDA exists but not allocated (jito-foundation#295)

implement better retries for tip-distributor workflows (jito-foundation#297)

limit number of concurrent rpc calls (jito-foundation#298)

Discard Empty Packet Batches (jito-foundation#299)

Identity Hotswap (jito-foundation#290)

small fixes (jito-foundation#305)

Set backend config from admin rpc (jito-foundation#304)

Admin Shred Receiver Change (jito-foundation#306)

Seg/rm bundle UUID (jito-foundation#309)

Fix github workflow to recursively clone (jito-foundation#327)

Add recursive checkout for downstream-project-spl.yaml (jito-foundation#341)

Use cluster info functions for tpu (jito-foundation#345)

Use git rev-parse for git sha

Remove blacklisted tx from message_hash_to_transaction (jito-foundation#374)

Updates bootstrap and start scripts needed for local dev. (jito-foundation#384)

Remove Deprecated Cli Args (jito-foundation#387)

Master Rebase

improve simulate_bundle errors and response (jito-foundation#404)

derive Clone on accountoverrides (jito-foundation#416)

Add upsert to AccountOverrides (jito-foundation#419)

update jito-programs (jito-foundation#430)

[JIT-1661] Faster Autosnapshot (jito-foundation#436)

Reverts simulate_transaction result calls to upstream (jito-foundation#446)

Don't unlock accounts in TransactionBatches used during simulation (jito-foundation#449)

first pass at wiring up jito-plugin (jito-foundation#428)

[JIT-1713] Fix bundle's blockspace preallocation (jito-foundation#489)

[JIT-1708] Fix TOC TOU condition for relayer and block engine config (jito-foundation#491)

[JIT-1710] - Optimize Bundle Consumer Checks (jito-foundation#490)

Add Blockhash Metrics to Bundle Committer (jito-foundation#500)

add priority fee ix to mev-claim (jito-foundation#520)

Update Autosnapshot (jito-foundation#548)

Run MEV claims + reclaiming rent-exempt amounts in parallel. (jito-foundation#582)

Update CI (jito-foundation#584)
- Add recursive submodule checkouts.
- Re-add solana-secondary step

Add more release fixes (jito-foundation#585)

Fix more release urls (jito-foundation#588)

[JIT-1812] Fix blocking mutexs (jito-foundation#495)

 [JIT-1711] Compare the unprocessed transaction storage BundleStorage against a constant instead of VecDeque::capacity() (jito-foundation#587)

Automatically rebase Jito-Solana on a periodic basis. Send message on slack during any failures or success.

Fix periodic rebase jito-foundation#594

Fixes the following bugs in the periodic rebase:
Sends multiple messages on failure instead of one
Cancels entire job if one branch fails

Ignore buildkite curl errors for rebasing and try to keep curling until job times out (jito-foundation#597)

Sleep longer waiting for buildkite to start (jito-foundation#598)

correctly initialize account overrides (jito-foundation#595)

Fix: Ensure set contact info to UDP port instead of QUIC (jito-foundation#603)

Add fast replay branch to daily rebase (jito-foundation#607)

take a snapshot of all bundle accounts before sim (jito-foundation#13) (jito-foundation#615)

update jito-programs submodule

Add 2.0 to daily rebase (jito-foundation#626)

Export agave binaries during docker build (jito-foundation#627)

Buffer bundles that exceed processing time and make the allowed processing time longer (jito-foundation#611)

Publish releases to S3 and GCS (jito-foundation#633)

Rebase from different repos (jito-foundation#637)

Point SECURITY.md to immunefi (jito-foundation#671)

Loosen requirements on tip accounts touchable in BankingStage (jito-foundation#683)

Separate out broadcast + retransmit shredstream (jito-foundation#703)

Add packet flag for staked node (jito-foundation#705)

Fix release github (jito-foundation#745)
  • Loading branch information
buffalu authored and jeffhelius committed Feb 21, 2025
1 parent ea0e1a5 commit bf0d4cf
Show file tree
Hide file tree
Showing 3 changed files with 242 additions and 1 deletion.
1 change: 1 addition & 0 deletions core/src/banking_stage/consumer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,7 @@ impl Consumer {
cost_model_us,
) = measure_us!(self.qos_service.select_and_accumulate_transaction_costs(
bank,
&mut bank.write_cost_tracker().unwrap(),
txs,
pre_results,
reservation_cb
Expand Down
5 changes: 4 additions & 1 deletion core/src/banking_stage/qos_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use {
super::{committer::CommitTransactionDetails, BatchedTransactionDetails},
solana_cost_model::{
cost_model::CostModel, cost_tracker::UpdatedCosts, transaction_cost::TransactionCost,
cost_model::CostModel,
cost_tracker::{CostTracker, UpdatedCosts},
transaction_cost::TransactionCost,
},
solana_feature_set::FeatureSet,
solana_measure::measure::Measure,
Expand Down Expand Up @@ -43,6 +45,7 @@ impl QosService {
pub fn select_and_accumulate_transaction_costs<'a>(
&self,
bank: &Bank,
cost_tracker: &mut CostTracker,
transactions: &'a [SanitizedTransaction],
pre_results: impl Iterator<Item = transaction::Result<()>>,
block_cost_limit_reservation_cb: &impl Fn(&Bank) -> u64,
Expand Down
237 changes: 237 additions & 0 deletions core/src/bundle_stage/bundle_reserved_space_manager.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
use {solana_runtime::bank::Bank, solana_sdk::clock::Slot, std::sync::Arc};

/// Manager responsible for reserving `bundle_reserved_cost` during the first `reserved_ticks` of a bank
/// and resetting the block cost limit to `block_cost_limit` after the reserved tick period is over
pub struct BundleReservedSpaceManager {
// the bank's cost limit
block_cost_limit: u64,
// bundles get this much reserved space for the first reserved_ticks
bundle_reserved_cost: u64,
// a reduced block_compute_limit is reserved for this many ticks, afterwards it goes back to full cost
reserved_ticks: u64,
last_slot_updated: Slot,
}

impl BundleReservedSpaceManager {
pub fn new(block_cost_limit: u64, bundle_reserved_cost: u64, reserved_ticks: u64) -> Self {
Self {
block_cost_limit,
bundle_reserved_cost,
reserved_ticks,
last_slot_updated: u64::MAX,
}
}

/// Call this on creation of new bank and periodically while bundle processing
/// to manage the block_cost_limits
pub fn tick(&mut self, bank: &Arc<Bank>) {
if self.last_slot_updated == bank.slot() && !self.is_in_reserved_tick_period(bank) {
// new slot logic already ran, need to revert the block cost limit to original if
// ticks are past the reserved tick mark
debug!(
"slot: {} ticks: {}, resetting block_cost_limit to {}",
bank.slot(),
bank.tick_height(),
self.block_cost_limit
);
bank.write_cost_tracker()
.unwrap()
.set_block_cost_limit(self.block_cost_limit);
} else if self.last_slot_updated != bank.slot() && self.is_in_reserved_tick_period(bank) {
// new slot, if in the first max_tick - tick_height slots reserve space
// otherwise can leave the current block limit as is
let new_block_cost_limit = self.reduced_block_cost_limit();
debug!(
"slot: {} ticks: {}, reserving block_cost_limit with block_cost_limit of {}",
bank.slot(),
bank.tick_height(),
new_block_cost_limit
);
bank.write_cost_tracker()
.unwrap()
.set_block_cost_limit(new_block_cost_limit);
self.last_slot_updated = bank.slot();
}
}

/// return true if the bank is still in the period where block_cost_limits is reduced
pub fn is_in_reserved_tick_period(&self, bank: &Bank) -> bool {
bank.tick_height() % bank.ticks_per_slot() < self.reserved_ticks
}

/// return the block_cost_limits as determined by the tick height of the bank
pub fn expected_block_cost_limits(&self, bank: &Bank) -> u64 {
if self.is_in_reserved_tick_period(bank) {
self.reduced_block_cost_limit()
} else {
self.block_cost_limit()
}
}

pub fn reduced_block_cost_limit(&self) -> u64 {
self.block_cost_limit
.saturating_sub(self.bundle_reserved_cost)
}

pub fn block_cost_limit(&self) -> u64 {
self.block_cost_limit
}
}

#[cfg(test)]
mod tests {
use {
crate::bundle_stage::bundle_reserved_space_manager::BundleReservedSpaceManager,
solana_ledger::genesis_utils::create_genesis_config, solana_runtime::bank::Bank,
solana_sdk::pubkey::Pubkey, std::sync::Arc,
};

#[test]
fn test_reserve_block_cost_limits_during_reserved_ticks() {
const BUNDLE_BLOCK_COST_LIMITS_RESERVATION: u64 = 100;

let genesis_config_info = create_genesis_config(100);
let bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));

let block_cost_limits = bank.read_cost_tracker().unwrap().block_cost_limit();

let mut reserved_space = BundleReservedSpaceManager::new(
block_cost_limits,
BUNDLE_BLOCK_COST_LIMITS_RESERVATION,
5,
);
reserved_space.tick(&bank);

assert_eq!(
bank.read_cost_tracker().unwrap().block_cost_limit(),
block_cost_limits - BUNDLE_BLOCK_COST_LIMITS_RESERVATION
);
}

#[test]
fn test_dont_reserve_block_cost_limits_after_reserved_ticks() {
const BUNDLE_BLOCK_COST_LIMITS_RESERVATION: u64 = 100;

let genesis_config_info = create_genesis_config(100);
let bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));

let block_cost_limits = bank.read_cost_tracker().unwrap().block_cost_limit();

for _ in 0..5 {
bank.register_default_tick_for_test();
}

let mut reserved_space = BundleReservedSpaceManager::new(
block_cost_limits,
BUNDLE_BLOCK_COST_LIMITS_RESERVATION,
5,
);
reserved_space.tick(&bank);

assert_eq!(
bank.read_cost_tracker().unwrap().block_cost_limit(),
block_cost_limits
);
}

#[test]
fn test_dont_reset_block_cost_limits_during_reserved_ticks() {
const BUNDLE_BLOCK_COST_LIMITS_RESERVATION: u64 = 100;

let genesis_config_info = create_genesis_config(100);
let bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));

let block_cost_limits = bank.read_cost_tracker().unwrap().block_cost_limit();

let mut reserved_space = BundleReservedSpaceManager::new(
block_cost_limits,
BUNDLE_BLOCK_COST_LIMITS_RESERVATION,
5,
);

reserved_space.tick(&bank);
bank.register_default_tick_for_test();
reserved_space.tick(&bank);

assert_eq!(
bank.read_cost_tracker().unwrap().block_cost_limit(),
block_cost_limits - BUNDLE_BLOCK_COST_LIMITS_RESERVATION
);
}

#[test]
fn test_reset_block_cost_limits_after_reserved_ticks() {
const BUNDLE_BLOCK_COST_LIMITS_RESERVATION: u64 = 100;

let genesis_config_info = create_genesis_config(100);
let bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));

let block_cost_limits = bank.read_cost_tracker().unwrap().block_cost_limit();

let mut reserved_space = BundleReservedSpaceManager::new(
block_cost_limits,
BUNDLE_BLOCK_COST_LIMITS_RESERVATION,
5,
);

reserved_space.tick(&bank);

for _ in 0..5 {
bank.register_default_tick_for_test();
}
reserved_space.tick(&bank);

assert_eq!(
bank.read_cost_tracker().unwrap().block_cost_limit(),
block_cost_limits
);
}

#[test]
fn test_block_limits_after_first_slot() {
const BUNDLE_BLOCK_COST_LIMITS_RESERVATION: u64 = 100;
const RESERVED_TICKS: u64 = 5;
let genesis_config_info = create_genesis_config(100);
let bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));

for _ in 0..genesis_config_info.genesis_config.ticks_per_slot {
bank.register_default_tick_for_test();
}
assert!(bank.is_complete());
bank.freeze();
assert_eq!(
bank.read_cost_tracker().unwrap().block_cost_limit(),
solana_cost_model::block_cost_limits::MAX_BLOCK_UNITS_SIMD_0207,
);

let bank1 = Arc::new(Bank::new_from_parent(bank.clone(), &Pubkey::default(), 1));
assert_eq!(bank1.slot(), 1);
assert_eq!(bank1.tick_height(), 64);
assert_eq!(bank1.max_tick_height(), 128);

// reserve space
let block_cost_limits = bank1.read_cost_tracker().unwrap().block_cost_limit();
let mut reserved_space = BundleReservedSpaceManager::new(
block_cost_limits,
BUNDLE_BLOCK_COST_LIMITS_RESERVATION,
RESERVED_TICKS,
);
reserved_space.tick(&bank1);

// wait for reservation to be over
(0..RESERVED_TICKS).for_each(|_| {
bank1.register_default_tick_for_test();
assert_eq!(
bank1.read_cost_tracker().unwrap().block_cost_limit(),
block_cost_limits - BUNDLE_BLOCK_COST_LIMITS_RESERVATION
);
});
reserved_space.tick(&bank1);

// after reservation, revert back to normal limit
assert_eq!(
bank1.read_cost_tracker().unwrap().block_cost_limit(),
solana_cost_model::block_cost_limits::MAX_BLOCK_UNITS_SIMD_0207,
);
}
}

0 comments on commit bf0d4cf

Please sign in to comment.