Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVM: update spec #1757

Merged
merged 1 commit into from
Jun 17, 2024
Merged
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
144 changes: 106 additions & 38 deletions svm/doc/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,6 @@ and `program_cache`.
needed to check the validity of every transaction in a batch when
the transaction accounts are being loaded and checked for
compliance with required fees for transaction execution.
- `runtime_config: Arc<RuntimeConfig>` is a reference to a
RuntimeConfig struct instance. The `RuntimeConfig` is a collection
of fields that control parameters of runtime, such as compute
budget, the maximal size of log messages in bytes, etc.
- `program_cache: Arc<RwLock<ProgramCache<FG>>>` is a reference to
a ProgramCache instance. All on chain programs used in transaction
batch execution are loaded from the program cache.
Expand All @@ -119,45 +115,117 @@ The main entry point to the SVM is the method
`load_and_execute_sanitized_transactions`.

The method `load_and_execute_sanitized_transactions` takes the
following arguments
- `callbacks` is a `TransactionProcessingCallback` trait instance
that enables access to data available from accounts-db and from
Bank,
- `sanitized_txs` a slice of `SanitizedTransaction`
- `SanitizedTransaction` contains
- `SanitizedMessage` is an enum with two kinds of messages
- `LegacyMessage` and `LoadedMessage`
Both `LegacyMessage` and `LoadedMessage` consist of
- `MessageHeader`
- vector of `Pubkey` of accounts used in the transaction
- `Hash` of recent block
- vector of `CompiledInstruction`
In addition `LoadedMessage` contains a vector of
`MessageAddressTableLookup` -- list of address table lookups to
load additional accounts for this transaction.
- a Hash of the message
- a boolean flag `is_simple_vote_tx` -- explain
- a vector of `Signature` -- explain which signatures are in this vector
- `check_results` is a mutable slice of `TransactionCheckResult`
- `error_counters` is a mutable reference to `TransactionErrorMetrics`
- `recording_config` is a value of `ExecutionRecordingConfig` configuration parameters
- `timings` is a mutable reference to `ExecuteTimings`
- `account_overrides` is an optional reference to `AccountOverrides`
- `builtin_programs` is an iterator of `Pubkey` that represents builtin programs
- `log_messages_bytes_limit` is an optional `usize` limit on the size of log messages in bytes
- `limit_to_load_programs` is a boolean flag that instruct the function to only load the
programs and do not execute the transactions.

The method returns a value of
`LoadAndExecuteSanitizedTransactionsOutput` which consists of two
vectors
- a vector of `TransactionLoadResult`, and
- a vector of `TransactionExecutionResult`.
following arguments:

- `callbacks`: A `TransactionProcessingCallback` trait instance which allows
the transaction processor to summon information about accounts, most
importantly loading them for transaction execution.
- `sanitized_txs`: A slice of sanitized transactions.
- `check_results`: A mutable slice of transaction check results.
- `environment`: The runtime environment for transaction batch processing.
- `config`: Configurations for customizing transaction processing behavior.

The method returns a `LoadAndExecuteSanitizedTransactionsOutput`, which is
defined below in more detail.

An integration test `svm_integration` contains an example of
instantiating `TransactionBatchProcessor` and calling its method
`load_and_execute_sanitized_transactions`.

### `TransactionProcessingCallback`

Downstream consumers of the SVM must implement the
`TransactionProcessingCallback` trait in order to provide the transaction
processor with the ability to load accounts and retrieve other account-related
information.

```rust
pub trait TransactionProcessingCallback {
fn account_matches_owners(&self, account: &Pubkey, owners: &[Pubkey]) -> Option<usize>;

fn get_account_shared_data(&self, pubkey: &Pubkey) -> Option<AccountSharedData>;

fn get_program_match_criteria(&self, _program: &Pubkey) -> ProgramCacheMatchCriteria {
ProgramCacheMatchCriteria::NoCriteria
}

fn add_builtin_account(&self, _name: &str, _program_id: &Pubkey) {}
}
```

Consumers can customize this plug-in to use their own Solana account source,
caching, and more.

### `SanitizedTransaction`

A "sanitized" Solana transaction is a transaction that has undergone the
various checks required to evaluate a transaction against the Solana protocol
ruleset. Some of these rules include signature verification and validation
of account indices (`num_readonly_signers`, etc.).

A `SanitizedTransaction` contains:

- `SanitizedMessage`: Enum with two kinds of messages - `LegacyMessage` and
`LoadedMessage` - both of which contain:
- `MessageHeader`: Vector of `Pubkey` of accounts used in the transaction.
- `Hash` of recent block.
- Vector of `CompiledInstruction`.
- In addition, `LoadedMessage` contains a vector of
`MessageAddressTableLookup` - list of address table lookups to
load additional accounts for this transaction.
- A Hash of the message
- A boolean flag `is_simple_vote_tx` - shortcut for determining if the
transaction is merely a simple vote transaction produced by a validator.
- A vector of `Signature` - the hash of the transaction message encrypted using
the signing key (for each signer in the transaction).

### `TransactionCheckResult`

Simply stores details about a transaction, including whether or not it contains
a nonce, the nonce it contains (if applicable), and the lamports per signature
to charge for fees.

### `TransactionProcessingEnvironment`

The transaction processor requires consumers to provide values describing
the runtime environment to use for processing transactions.

- `blockhash`: The blockhash to use for the transaction batch.
- `epoch_total_stake`: The total stake for the current epoch.
- `epoch_vote_accounts`: The vote accounts for the current epoch.
- `feature_set`: Runtime feature set to use for the transaction batch.
- `lamports_per_signature`: Lamports per signature to charge per transaction.
- `rent_collector`: Rent collector to use for the transaction batch.

### `TransactionProcessingConfig`

Consumers can provide various configurations to adjust the default behavior of
the transaction processor.

- `account_overrides`: Encapsulates overridden accounts, typically used for
transaction simulation.
- `compute_budget`: The compute budget to use for transaction execution.
- `log_messages_bytes_limit`: The maximum number of bytes that log messages can
consume.
- `limit_to_load_programs`: Whether to limit the number of programs loaded for
the transaction batch.
- `recording_config`: Recording capabilities for transaction execution.
- `transaction_account_lock_limit`: The max number of accounts that a
transaction may lock.

### `LoadAndExecuteSanitizedTransactionsOutput`

The output of the transaction batch processor's
`load_and_execute_sanitized_transactions` method.

- `error_metrics`: Error metrics for transactions that were processed.
- `execute_timings`: Timings for transaction batch execution.
- `execution_results`: Vector of results indicating whether a transaction was
executed or could not be executed. Note executed transactions can still have
failed!
- `loaded_transactions`: Vector of loaded transactions from transactions that
were processed.

# Functional Model

In this section, we describe the functionality (logic) of the SVM in
Expand Down