diff --git a/src/fuel-vm/index.md b/src/fuel-vm/index.md index cea85fec..533e8442 100644 --- a/src/fuel-vm/index.md +++ b/src/fuel-vm/index.md @@ -149,7 +149,7 @@ If script bytecode is present, transaction validation requires execution. The VM is [initialized](#vm-initialization), then: 1. `$pc` and `$is` are set to the start of the transaction's script bytecode. -1. `$ggas` and `$cgas` are set to `tx.gasLimit`. +1. `$ggas` and `$cgas` are set to `tx.scriptGasLimit`. Following initialization, execution begins. diff --git a/src/fuel-vm/instruction-set.md b/src/fuel-vm/instruction-set.md index ad0c4a68..e6fdf670 100644 --- a/src/fuel-vm/instruction-set.md +++ b/src/fuel-vm/instruction-set.md @@ -2450,7 +2450,7 @@ Get [fields from the transaction](../tx-format/transaction.md). | name | `imm` | set `$rA` to | |-------------------------------------------|---------|-------------------------------------------------------------------| | `GTF_TYPE` | `0x001` | `tx.type` | -| `GTF_SCRIPT_GAS_LIMIT` | `0x002` | `tx.gasLimit` | +| `GTF_SCRIPT_GAS_LIMIT` | `0x002` | `tx.scriptGasLimit` | | `GTF_SCRIPT_SCRIPT_LENGTH` | `0x003` | `tx.scriptLength` | | `GTF_SCRIPT_SCRIPT_DATA_LENGTH` | `0x004` | `tx.scriptDataLength` | | `GTF_SCRIPT_INPUTS_COUNT` | `0x005` | `tx.inputsCount` | @@ -2516,12 +2516,11 @@ Get [fields from the transaction](../tx-format/transaction.md). | `GTF_OUTPUT_CONTRACT_CREATED_STATE_ROOT` | `0x308` | Memory address of `tx.outputs[$rB].stateRoot` | | `GTF_WITNESS_DATA_LENGTH` | `0x400` | `tx.witnesses[$rB].dataLength` | | `GTF_WITNESS_DATA` | `0x401` | Memory address of `tx.witnesses[$rB].data` | -| `GTF_POLICY_COUNT` | `0x500` | `count_ones(tx.policyTypes)` | -| `GTF_POLICY_TYPE` | `0x501` | `tx.policies[$rB].type` | -| `GTF_POLICY_GAS_PRICE` | `0x502` | `tx.policies[0x00].gasPrice` | -| `GTF_POLICY_WITNESS_LIMIT` | `0x504` | `tx.policies[count_ones(0b11 & tx.policyTypes) - 1].witnessLimit` | -| `GTF_POLICY_MATURITY` | `0x505` | `tx.policies[count_ones(0b111 & tx.policyTypes) - 1].maturity` | -| `GTF_POLICY_MAX_FEE` | `0x506` | `tx.policies[count_ones(0b1111 & tx.policyTypes) - 1].maxFee` | +| `GTF_POLICY_TYPES` | `0x500` | `tx.policies.policyTypes` | +| `GTF_POLICY_GAS_PRICE` | `0x501` | `tx.policies[0x00].gasPrice` | +| `GTF_POLICY_WITNESS_LIMIT` | `0x502` | `tx.policies[count_ones(0b11 & tx.policyTypes) - 1].witnessLimit` | +| `GTF_POLICY_MATURITY` | `0x503` | `tx.policies[count_ones(0b111 & tx.policyTypes) - 1].maturity` | +| `GTF_POLICY_MAX_FEE` | `0x504` | `tx.policies[count_ones(0b1111 & tx.policyTypes) - 1].maxFee` | Panic if: diff --git a/src/tx-format/transaction.md b/src/tx-format/transaction.md index 6dc1adb3..b1729f22 100644 --- a/src/tx-format/transaction.md +++ b/src/tx-format/transaction.md @@ -55,23 +55,24 @@ enum ReceiptType : uint8 { } ``` -| name | type | description | -|--------------------|-----------------------------|------------------------------------------------------| -| `gasLimit` | `uint64` | Gas limit for transaction (including predicate gas). | -| `scriptLength` | `uint16` | Script length, in instructions. | -| `scriptDataLength` | `uint16` | Length of script input data, in bytes. | -| `policyTypes` | `uint32` | Bitfield of used policy types. | -| `inputsCount` | `uint8` | Number of inputs. | -| `outputsCount` | `uint8` | Number of outputs. | -| `witnessesCount` | `uint8` | Number of witnesses. | -| `receiptsRoot` | `byte[32]` | Merkle root of receipts. | -| `script` | `byte[]` | Script to execute. | -| `scriptData` | `byte[]` | Script input data (parameters). | -| `policies` | [Policy](./policy.md)`[]` | List of policies, sorted by PolicyType. | -| `inputs` | [Input](./input.md)`[]` | List of inputs. | -| `outputs` | [Output](./output.md)`[]` | List of outputs. | -| `witnesses` | [Witness](./witness.md)`[]` | List of witnesses. | - +| name | type | description | +|--------------------|-----------------------------|-----------------------------------------| +| `scriptGasLimit` | `uint64` | Gas limits the script execution. | +| `scriptLength` | `uint16` | Script length, in instructions. | +| `scriptDataLength` | `uint16` | Length of script input data, in bytes. | +| `policyTypes` | `uint32` | Bitfield of used policy types. | +| `inputsCount` | `uint8` | Number of inputs. | +| `outputsCount` | `uint8` | Number of outputs. | +| `witnessesCount` | `uint8` | Number of witnesses. | +| `receiptsRoot` | `byte[32]` | Merkle root of receipts. | +| `script` | `byte[]` | Script to execute. | +| `scriptData` | `byte[]` | Script input data (parameters). | +| `policies` | [Policy](./policy.md)`[]` | List of policies, sorted by PolicyType. | +| `inputs` | [Input](./input.md)`[]` | List of inputs. | +| `outputs` | [Output](./output.md)`[]` | List of outputs. | +| `witnesses` | [Witness](./witness.md)`[]` | List of witnesses. | + +Given helper `max_gas()` returns the maximum gas that the transaction can use. Given helper `len()` that returns the number of bytes of a field. Given helper `count_ones()` that returns the number of ones in the binary representation of a field. Given helper `count_variants()` that returns the number of variants in an enum. @@ -85,7 +86,7 @@ Transaction is invalid if: - `scriptDataLength > MAX_SCRIPT_DATA_LENGTH` - `scriptLength * 4 != len(script)` - `scriptDataLength != len(scriptData)` -- `gasLimit > MAX_GAS_PER_TX` +- `max_gas(tx) > MAX_GAS_PER_TX` - No policy of type `PolicyType.GasPrice` - `count_ones(policyTypes) > count_variants(PolicyType)` - `policyTypes > sum_variants(PolicyType)` @@ -117,6 +118,7 @@ The receipts root `receiptsRoot` is the root of the [binary Merkle tree](../prot | `outputs` | [Output](./output.md)`[]` | List of outputs. | | `witnesses` | [Witness](./witness.md)`[]` | List of witnesses. | +Given helper `max_gas()` returns the maximum gas that the transaction can use. Given helper `count_ones()` that returns the number of ones in the binary representation of a field. Given helper `count_variants()` that returns the number of variants in an enum. Given helper `sum_variants()` that sums all variants of an enum. @@ -134,6 +136,7 @@ Transaction is invalid if: - The keys of `storageSlots` are not in ascending lexicographic order - The computed contract ID (see below) is not equal to the `contractID` of the one `OutputType.ContractCreated` output - `storageSlotsCount > MAX_STORAGE_SLOTS` +- `max_gas(tx) > MAX_GAS_PER_TX` - The [Sparse Merkle tree](../protocol/cryptographic-primitives.md#sparse-merkle-tree) root of `storageSlots` is not equal to the `stateRoot` of the one `OutputType.ContractCreated` output - No policy of type `PolicyType.GasPrice` - `count_ones(policyTypes) > count_variants(PolicyType)`