Struct solana_entry::entry::Entry
source · pub struct Entry {
pub num_hashes: u64,
pub hash: Hash,
pub transactions: Vec<VersionedTransaction>,
}Expand description
Each Entry contains three pieces of data. The num_hashes field is the number
of hashes performed since the previous entry. The hash field is the result
of hashing hash from the previous entry num_hashes times. The transactions
field points to Transactions that took place shortly before hash was generated.
If you multiply num_hashes by the amount of time it takes to generate a new hash, you
get a duration estimate since the last Entry. Since processing power increases
over time, one should expect the duration num_hashes represents to decrease proportionally.
An upper bound on Duration can be estimated by assuming each hash was generated by the
world’s fastest processor at the time the entry was recorded. Or said another way, it
is physically not possible for a shorter duration to have occurred if one assumes the
hash was computed by the world’s fastest processor at that time. The hash chain is both
a Verifiable Delay Function (VDF) and a Proof of Work (not to be confused with Proof of
Work consensus!)
The solana core protocol currently requires an Entry to contain transactions that are
executable in parallel. Implemented in:
- For TPU:
solana_core::banking_stage::BankingStage::process_and_record_transactions() - For TVU:
solana_core::replay_stage::ReplayStage::replay_blockstore_into_bank()
All transactions in the transactions field have to follow the read/write locking restrictions
with regard to the accounts they reference. A single account can be either written by a single
transaction, or read by one or more transactions, but not both.
This enforcement is done via a call to solana_runtime::accounts::Accounts::lock_accounts()
with the txs argument holding all the transactions in the Entry.
Fields§
§num_hashes: u64The number of hashes since the previous Entry ID.
hash: HashThe SHA-256 hash num_hashes after the previous Entry ID.
transactions: Vec<VersionedTransaction>An unordered list of transactions that were observed before the Entry ID was generated. They may have been observed before a previous Entry ID but were pushed back into this list to ensure deterministic interpretation of the ledger.
Implementations§
source§impl Entry
impl Entry
sourcepub fn new(
prev_hash: &Hash,
num_hashes: u64,
transactions: Vec<Transaction>,
) -> Self
pub fn new( prev_hash: &Hash, num_hashes: u64, transactions: Vec<Transaction>, ) -> Self
Creates the next Entry num_hashes after start_hash.
pub fn new_mut( start_hash: &mut Hash, num_hashes: &mut u64, transactions: Vec<Transaction>, ) -> Self
sourcepub fn verify(&self, start_hash: &Hash) -> bool
pub fn verify(&self, start_hash: &Hash) -> bool
Verifies self.hash is the result of hashing a start_hash self.num_hashes times.
If the transaction is not a Tick, then hash that as well.
pub fn is_tick(&self) -> bool
Trait Implementations§
source§impl<'de> Deserialize<'de> for Entry
impl<'de> Deserialize<'de> for Entry
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl From<&Entry> for EntrySummary
impl From<&Entry> for EntrySummary
source§impl PartialEq for Entry
impl PartialEq for Entry
impl Eq for Entry
impl StructuralPartialEq for Entry
Auto Trait Implementations§
impl Freeze for Entry
impl RefUnwindSafe for Entry
impl Send for Entry
impl Sync for Entry
impl Unpin for Entry
impl UnwindSafe for Entry
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more