Buffer account's fields for hash (#33788)
* buffer accounts field for hash * use smallvec to allocate hash buffer on stack * sort deps * more opt * clippy --------- Co-authored-by: HaoranYi <haoran.yi@solana.com>
This commit is contained in:
parent
a41b24f185
commit
669bc43bcd
|
@ -5048,9 +5048,9 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.7.0"
|
version = "1.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
|
checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smpl_jwt"
|
name = "smpl_jwt"
|
||||||
|
@ -5214,6 +5214,7 @@ dependencies = [
|
||||||
"seqlock",
|
"seqlock",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
|
"smallvec",
|
||||||
"solana-accounts-db",
|
"solana-accounts-db",
|
||||||
"solana-bucket-map",
|
"solana-bucket-map",
|
||||||
"solana-config-program",
|
"solana-config-program",
|
||||||
|
|
|
@ -298,6 +298,7 @@ sha2 = "0.10.8"
|
||||||
sha3 = "0.10.4"
|
sha3 = "0.10.4"
|
||||||
signal-hook = "0.3.17"
|
signal-hook = "0.3.17"
|
||||||
siphasher = "0.3.11"
|
siphasher = "0.3.11"
|
||||||
|
smallvec = "1.11.1"
|
||||||
smpl_jwt = "0.7.1"
|
smpl_jwt = "0.7.1"
|
||||||
socket2 = "0.5.5"
|
socket2 = "0.5.5"
|
||||||
soketto = "0.7"
|
soketto = "0.7"
|
||||||
|
|
|
@ -43,6 +43,7 @@ regex = { workspace = true }
|
||||||
seqlock = { workspace = true }
|
seqlock = { workspace = true }
|
||||||
serde = { workspace = true, features = ["rc"] }
|
serde = { workspace = true, features = ["rc"] }
|
||||||
serde_derive = { workspace = true }
|
serde_derive = { workspace = true }
|
||||||
|
smallvec = { workspace = true }
|
||||||
solana-bucket-map = { workspace = true }
|
solana-bucket-map = { workspace = true }
|
||||||
solana-config-program = { workspace = true }
|
solana-config-program = { workspace = true }
|
||||||
solana-frozen-abi = { workspace = true }
|
solana-frozen-abi = { workspace = true }
|
||||||
|
|
|
@ -79,6 +79,7 @@ use {
|
||||||
rand::{thread_rng, Rng},
|
rand::{thread_rng, Rng},
|
||||||
rayon::{prelude::*, ThreadPool},
|
rayon::{prelude::*, ThreadPool},
|
||||||
serde::{Deserialize, Serialize},
|
serde::{Deserialize, Serialize},
|
||||||
|
smallvec::SmallVec,
|
||||||
solana_measure::{measure::Measure, measure_us},
|
solana_measure::{measure::Measure, measure_us},
|
||||||
solana_nohash_hasher::IntSet,
|
solana_nohash_hasher::IntSet,
|
||||||
solana_rayon_threadlimit::get_thread_count,
|
solana_rayon_threadlimit::get_thread_count,
|
||||||
|
@ -6274,31 +6275,49 @@ impl AccountsDb {
|
||||||
}
|
}
|
||||||
let mut hasher = blake3::Hasher::new();
|
let mut hasher = blake3::Hasher::new();
|
||||||
|
|
||||||
hasher.update(&lamports.to_le_bytes());
|
// allocate 128 bytes buffer on the stack
|
||||||
|
const BUF_SIZE: usize = 128;
|
||||||
|
const TOTAL_FIELD_SIZE: usize = 8 /* lamports */ + 8 /* slot */ + 8 /* rent_epoch */ + 1 /* exec_flag */ + 32 /* owner_key */ + 32 /* pubkey */;
|
||||||
|
const DATA_SIZE_CAN_FIT: usize = BUF_SIZE - TOTAL_FIELD_SIZE;
|
||||||
|
|
||||||
|
let mut buffer = SmallVec::<[u8; BUF_SIZE]>::new();
|
||||||
|
|
||||||
|
// collect lamports, slot, rent_epoch into buffer to hash
|
||||||
|
buffer.extend_from_slice(&lamports.to_le_bytes());
|
||||||
|
|
||||||
match include_slot {
|
match include_slot {
|
||||||
IncludeSlotInHash::IncludeSlot => {
|
IncludeSlotInHash::IncludeSlot => {
|
||||||
// upon feature activation, stop including slot# in the account hash
|
// upon feature activation, stop including slot# in the account hash
|
||||||
hasher.update(&slot.to_le_bytes());
|
buffer.extend_from_slice(&slot.to_le_bytes());
|
||||||
}
|
}
|
||||||
IncludeSlotInHash::RemoveSlot => {}
|
IncludeSlotInHash::RemoveSlot => {}
|
||||||
IncludeSlotInHash::IrrelevantAssertOnUse => {
|
IncludeSlotInHash::IrrelevantAssertOnUse => {
|
||||||
panic!("IncludeSlotInHash is irrelevant, but we are calculating hash");
|
panic!("IncludeSlotInHash is irrelevant, but we are calculating hash");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
buffer.extend_from_slice(&rent_epoch.to_le_bytes());
|
||||||
|
|
||||||
hasher.update(&rent_epoch.to_le_bytes());
|
if data.len() > DATA_SIZE_CAN_FIT {
|
||||||
|
// For larger accounts whose data can't fit into the buffer, update the hash now.
|
||||||
|
hasher.update(&buffer);
|
||||||
|
buffer.clear();
|
||||||
|
|
||||||
hasher.update(data);
|
// hash account's data
|
||||||
|
hasher.update(data);
|
||||||
if executable {
|
|
||||||
hasher.update(&[1u8; 1]);
|
|
||||||
} else {
|
} else {
|
||||||
hasher.update(&[0u8; 1]);
|
// For small accounts whose data can fit into the buffer, append it to the buffer.
|
||||||
|
buffer.extend_from_slice(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
hasher.update(owner.as_ref());
|
// collect exec_flag, owner, pubkey into buffer to hash
|
||||||
hasher.update(pubkey.as_ref());
|
if executable {
|
||||||
|
buffer.push(1_u8);
|
||||||
|
} else {
|
||||||
|
buffer.push(0_u8);
|
||||||
|
}
|
||||||
|
buffer.extend_from_slice(owner.as_ref());
|
||||||
|
buffer.extend_from_slice(pubkey.as_ref());
|
||||||
|
hasher.update(&buffer);
|
||||||
|
|
||||||
AccountHash(Hash::new_from_array(hasher.finalize().into()))
|
AccountHash(Hash::new_from_array(hasher.finalize().into()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -4402,9 +4402,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.6.1"
|
version = "1.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
|
checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smpl_jwt"
|
name = "smpl_jwt"
|
||||||
|
@ -4517,6 +4517,7 @@ dependencies = [
|
||||||
"seqlock",
|
"seqlock",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
|
"smallvec",
|
||||||
"solana-bucket-map",
|
"solana-bucket-map",
|
||||||
"solana-config-program",
|
"solana-config-program",
|
||||||
"solana-frozen-abi",
|
"solana-frozen-abi",
|
||||||
|
|
Loading…
Reference in New Issue