Run Times
The Algorand Virtual Machine has two run-time (execution) modes:
-
Logic Signature (or Stateless) mode: executes Logic Signatures,
-
Application (or Stateful) mode: executes Smart Contracts.
For further details about the execution modes, refer to the AVM normative specification.
Each mode differs in opcode availability, Ledger resources accessibility, program sizes, and computational budget.
Logic Signature Mode
The following diagram shows the general flow when a Logic Signature is executed, starting from a transaction message reception in the Network Layer, going through the AVM for program execution, and all the way up to the transaction approval and subsequent push into the Transaction Pool, to be added to an upcoming block’s payset.
sequenceDiagram
Network->>TxHandler: Incoming message
TxHandler->>+MessageCache: Check for<br/>duplicate message
MessageCache->>-TxHandler: returns
TxHandler->>+RateLimiter: Rate Limit Check
RateLimiter->>-TxHandler: returns
TxHandler->>+SigVerifier: Verify LogicSig
SigVerifier->>+AVM: Run LogicSig
AVM->>-SigVerifier: returns
SigVerifier->>-TxHandler: returns
TxHandler->>+TxPool: Push verified tx to pool
Application Mode
The following diagram shows the execution path of a transaction containing a call to an Application. Note that code execution is done in a different pipeline; applications being stateful, a full block context is needed to evaluate their correctness, and so code execution happens at block evaluation time.
For further details on the block evaluation stage, see the Ledger non-normative specifications.
sequenceDiagram
BlockEvaluator->>+TxGroup: Eval group
TxGroup->>+Tx: Eval transaction
Tx->>+AVM: Application call
AVM->>-Tx: returns
Tx->>-TxGroup: returns
TxGroup->>-BlockEvaluator: returns
A special way of executing an application is the internal cross-application call,
(itxn_begin opcode).
Note that the beginning of this flow is the same as in a regular application call, as this constitutes a subcase of an Application mode call.
sequenceDiagram
BlockEvaluator->>+TxGroup: Eval group
TxGroup->>+Tx: Eval transaction
Tx->>+AVM: Application call
AVM->>+InternalTxGroup: itxn_begin
InternalTxGroup->>+InternalTx: Process each<br/>transaction
InternalTx->>+AVM: Process ApplicationCall transaction
AVM->>-InternalTx: returns
InternalTx->>-InternalTxGroup: returns
InternalTxGroup->>-AVM: returns
AVM->>-Tx: returns
Tx->>-TxGroup: returns
TxGroup->>-BlockEvaluator: returns