@[reducible, inline]
Instances For
@[reducible, inline]
Instances For
Equations
Instances For
Getter for the MachineStateOps.mstore*
function
Equations
Instances For
@[reducible, inline]
Equations
- MstoreSummary.EVM.step_mstore op gas gasCost = EvmYul.EVM.step gas gasCost op.get
Instances For
@[reducible, inline]
Equations
Instances For
Different cases for the activeWords
update
Equations
Instances For
theorem
MstoreSummary.mstore_bypass_private
(op : mstore_op)
(symGasPrice symTimestamp symNumber symGaslimit : ℕ)
(symStack : EvmYul.Stack EvmYul.UInt256)
(symPc symGasAvailable symRefund symActiveWords symPrevrandao : EvmYul.UInt256)
(symExecLength : ℕ)
(symReturnData symCode symMemory : ByteArray)
(symAccessedStorageKeys : Batteries.RBSet (EvmYul.AccountAddress × EvmYul.UInt256) EvmYul.Substate.storageKeysCmp)
(symAccounts : EvmYul.AccountMap)
(symCodeOwner symSender symSource symCoinbase : EvmYul.AccountAddress)
(symPerm : Bool)
(symState : EvmYul.EVM.State)
:
let ss :=
{ accountMap := symAccounts, σ₀ := symState.σ₀, totalGasUsedInBlock := symState.totalGasUsedInBlock,
transactionReceipts := symState.transactionReceipts,
substate :=
let __src := symState.substate;
{ selfDestructSet := __src.selfDestructSet, touchedAccounts := __src.touchedAccounts, refundBalance := symRefund,
accessedAccounts := __src.accessedAccounts, accessedStorageKeys := symAccessedStorageKeys,
logSeries := __src.logSeries },
executionEnv :=
let __src := symState.executionEnv;
{ codeOwner := symCodeOwner, sender := symSender, source := symSource, weiValue := __src.weiValue,
inputData := __src.inputData, code := symCode, gasPrice := symGasPrice,
header :=
let __src := symState.executionEnv.header;
{ parentHash := __src.parentHash, ommersHash := __src.ommersHash, beneficiary := symCoinbase,
stateRoot := __src.stateRoot, transRoot := __src.transRoot, receiptRoot := __src.receiptRoot,
logsBloom := __src.logsBloom, difficulty := __src.difficulty, number := symNumber, gasLimit := symGaslimit,
gasUsed := __src.gasUsed, timestamp := symTimestamp, extraData := __src.extraData, nonce := __src.nonce,
prevRandao := symPrevrandao, baseFeePerGas := __src.baseFeePerGas,
parentBeaconBlockRoot := __src.parentBeaconBlockRoot, withdrawalsRoot := __src.withdrawalsRoot,
blobGasUsed := __src.blobGasUsed, excessBlobGas := __src.excessBlobGas },
depth := __src.depth, perm := symPerm, blobVersionedHashes := __src.blobVersionedHashes },
blocks := symState.blocks, genesisBlockHeader := symState.genesisBlockHeader,
createdAccounts := symState.createdAccounts, gasAvailable := symGasAvailable, activeWords := symActiveWords,
memory := symMemory, returnData := symReturnData, H_return := symState.H_return, pc := symPc, stack := symStack,
execLength := symExecLength };
EvmYul.step_mstore op ss = EvmYul.EVM.binaryMachineStateOp op.to_mso ss
Theorem needed to bypass the private
attribute of EVM.dispatchBinaryMachineStateOp
The new amount of activeWords
based after running MSTORE
with offset
and currentAC
amount of active words
Equations
- MstoreSummary.activeWords_comp offset symActiveWords l = EvmYul.UInt256.ofNat (symActiveWords.toNat ⊔ (offset.toNat + l + 31) / 32)
Instances For
Writing value
to symMemory
starting at offset
Equations
- MstoreSummary.mstore_memory_write offset value symMemory = value.toByteArray.write 0 symMemory offset.toNat 32
Instances For
Writing value
to symMemory
starting at offset
Equations
- MstoreSummary.mstore8_memory_write offset value symMemory = { data := #[UInt8.ofNat value.toNat] }.write 0 symMemory offset.toNat 1
Instances For
Different cases to write to memory depending on the mstore*
opcode
Equations
Instances For
theorem
MstoreSummary.EvmYul.step_mstore_summary
(op : mstore_op)
(symGasPrice symTimestamp symNumber symGaslimit : ℕ)
(symStack : EvmYul.Stack EvmYul.UInt256)
(symPc symGasAvailable symRefund offset value symActiveWords symPrevrandao : EvmYul.UInt256)
(symExecLength : ℕ)
(symReturnData symCode symMemory : ByteArray)
(symAccessedStorageKeys : Batteries.RBSet (EvmYul.AccountAddress × EvmYul.UInt256) EvmYul.Substate.storageKeysCmp)
(symAccounts : EvmYul.AccountMap)
(symCodeOwner symSender symSource symCoinbase : EvmYul.AccountAddress)
(symPerm : Bool)
(symState : EvmYul.EVM.State)
:
let ss :=
{ accountMap := symAccounts, σ₀ := symState.σ₀, totalGasUsedInBlock := symState.totalGasUsedInBlock,
transactionReceipts := symState.transactionReceipts,
substate :=
let __src := symState.substate;
{ selfDestructSet := __src.selfDestructSet, touchedAccounts := __src.touchedAccounts, refundBalance := symRefund,
accessedAccounts := __src.accessedAccounts, accessedStorageKeys := symAccessedStorageKeys,
logSeries := __src.logSeries },
executionEnv :=
let __src := symState.executionEnv;
{ codeOwner := symCodeOwner, sender := symSender, source := symSource, weiValue := __src.weiValue,
inputData := __src.inputData, code := symCode, gasPrice := symGasPrice,
header :=
let __src := symState.executionEnv.header;
{ parentHash := __src.parentHash, ommersHash := __src.ommersHash, beneficiary := symCoinbase,
stateRoot := __src.stateRoot, transRoot := __src.transRoot, receiptRoot := __src.receiptRoot,
logsBloom := __src.logsBloom, difficulty := __src.difficulty, number := symNumber, gasLimit := symGaslimit,
gasUsed := __src.gasUsed, timestamp := symTimestamp, extraData := __src.extraData, nonce := __src.nonce,
prevRandao := symPrevrandao, baseFeePerGas := __src.baseFeePerGas,
parentBeaconBlockRoot := __src.parentBeaconBlockRoot, withdrawalsRoot := __src.withdrawalsRoot,
blobGasUsed := __src.blobGasUsed, excessBlobGas := __src.excessBlobGas },
depth := __src.depth, perm := symPerm, blobVersionedHashes := __src.blobVersionedHashes },
blocks := symState.blocks, genesisBlockHeader := symState.genesisBlockHeader,
createdAccounts := symState.createdAccounts, gasAvailable := symGasAvailable, activeWords := symActiveWords,
memory := symMemory, returnData := symReturnData, H_return := symState.H_return, pc := symPc,
stack := offset :: value :: symStack, execLength := symExecLength };
step_mstore op ss = Except.ok
{ toState := ss.toState, gasAvailable := ss.gasAvailable,
activeWords := activeWords_comp offset symActiveWords op.to_l, memory := op.to_write offset value symMemory,
returnData := ss.returnData, H_return := ss.H_return, pc := symPc + EvmYul.UInt256.ofNat 1, stack := symStack,
execLength := ss.execLength }
theorem
MstoreSummary.EVM.step_mstore_summary
(op : mstore_op)
(gas gasCost symGasPrice symTimestamp symNumber symGaslimit : ℕ)
(symStack : EvmYul.Stack EvmYul.UInt256)
(symPc symGasAvailable symRefund offset value symActiveWords symPrevrandao : EvmYul.UInt256)
(symExecLength : ℕ)
(symReturnData symCode symMemory : ByteArray)
(symAccessedStorageKeys : Batteries.RBSet (EvmYul.AccountAddress × EvmYul.UInt256) EvmYul.Substate.storageKeysCmp)
(symAccounts : EvmYul.AccountMap)
(symCodeOwner symSender symSource symCoinbase : EvmYul.AccountAddress)
(symPerm : Bool)
(gas_pos : 0 < gas)
(symState : EvmYul.EVM.State)
:
let ss :=
{ accountMap := symAccounts, σ₀ := symState.σ₀, totalGasUsedInBlock := symState.totalGasUsedInBlock,
transactionReceipts := symState.transactionReceipts,
substate :=
let __src := symState.substate;
{ selfDestructSet := __src.selfDestructSet, touchedAccounts := __src.touchedAccounts, refundBalance := symRefund,
accessedAccounts := __src.accessedAccounts, accessedStorageKeys := symAccessedStorageKeys,
logSeries := __src.logSeries },
executionEnv :=
let __src := symState.executionEnv;
{ codeOwner := symCodeOwner, sender := symSender, source := symSource, weiValue := __src.weiValue,
inputData := __src.inputData, code := symCode, gasPrice := symGasPrice,
header :=
let __src := symState.executionEnv.header;
{ parentHash := __src.parentHash, ommersHash := __src.ommersHash, beneficiary := symCoinbase,
stateRoot := __src.stateRoot, transRoot := __src.transRoot, receiptRoot := __src.receiptRoot,
logsBloom := __src.logsBloom, difficulty := __src.difficulty, number := symNumber, gasLimit := symGaslimit,
gasUsed := __src.gasUsed, timestamp := symTimestamp, extraData := __src.extraData, nonce := __src.nonce,
prevRandao := symPrevrandao, baseFeePerGas := __src.baseFeePerGas,
parentBeaconBlockRoot := __src.parentBeaconBlockRoot, withdrawalsRoot := __src.withdrawalsRoot,
blobGasUsed := __src.blobGasUsed, excessBlobGas := __src.excessBlobGas },
depth := __src.depth, perm := symPerm, blobVersionedHashes := __src.blobVersionedHashes },
blocks := symState.blocks, genesisBlockHeader := symState.genesisBlockHeader,
createdAccounts := symState.createdAccounts, gasAvailable := symGasAvailable, activeWords := symActiveWords,
memory := symMemory, returnData := symReturnData, H_return := symState.H_return, pc := symPc,
stack := offset :: value :: symStack, execLength := symExecLength };
step_mstore op gas gasCost ss = Except.ok
{ toState := ss.toState, gasAvailable := symGasAvailable - EvmYul.UInt256.ofNat gasCost,
activeWords := activeWords_comp offset symActiveWords op.to_l, memory := op.to_write offset value symMemory,
returnData := ss.returnData, H_return := ss.H_return, pc := symPc + EvmYul.UInt256.ofNat 1, stack := symStack,
execLength := symExecLength + 1 }
Opcode map to binary
Equations
- MstoreSummary.mstore_op.mstore.to_bin = { data := #[82] }
- MstoreSummary.mstore_op.mstore8.to_bin = { data := #[83] }
Instances For
@[simp]
def
MstoreSummary.value_and_activeWords_gas
(op : mstore_op)
(value symActiveWords : EvmYul.UInt256)
:
Equations
- MstoreSummary.value_and_activeWords_gas op value symActiveWords = EvmYul.UInt256.ofNat (EvmYul.MachineState.M symActiveWords.toNat value.toNat op.to_l)
Instances For
@[simp]
theorem
MstoreSummary.memoryExpansionCost_mstore
(op : mstore_op)
(symStack : EvmYul.Stack EvmYul.UInt256)
(offset value symActiveWords : EvmYul.UInt256)
(symState : EvmYul.EVM.State)
(stack_ok : symState.stack = offset :: value :: symStack)
(symWords_ok : symState.activeWords = symActiveWords)
:
EvmYul.EVM.memoryExpansionCost symState op.t = EvmYul.EVM.Cₘ (value_and_activeWords_gas op offset symActiveWords) - EvmYul.EVM.Cₘ symActiveWords
theorem
MstoreSummary.X_mstore_summary
(op : mstore_op)
(symGasPrice symTimestamp symNumber symGaslimit : ℕ)
(symStack : EvmYul.Stack EvmYul.UInt256)
(symGasAvailable symRefund offset value symActiveWords symPrevrandao : EvmYul.UInt256)
(symExecLength : ℕ)
(symReturnData symMemory : ByteArray)
(symAccessedStorageKeys : Batteries.RBSet (EvmYul.AccountAddress × EvmYul.UInt256) EvmYul.Substate.storageKeysCmp)
(symAccounts : EvmYul.AccountMap)
(symCodeOwner symSender symSource symCoinbase : EvmYul.AccountAddress)
(symPerm : Bool)
(symValidJumps : Array EvmYul.UInt256)
(symState : EvmYul.EVM.State)
(symStack_ok :
List.length symStack < match op with
| mstore_op.mstore => 1024
| mstore_op.mstore8 => 1025)
:
let ss :=
{ accountMap := symAccounts, σ₀ := symState.σ₀, totalGasUsedInBlock := symState.totalGasUsedInBlock,
transactionReceipts := symState.transactionReceipts,
substate :=
let __src := symState.substate;
{ selfDestructSet := __src.selfDestructSet, touchedAccounts := __src.touchedAccounts, refundBalance := symRefund,
accessedAccounts := __src.accessedAccounts, accessedStorageKeys := symAccessedStorageKeys,
logSeries := __src.logSeries },
executionEnv :=
let __src := symState.executionEnv;
{ codeOwner := symCodeOwner, sender := symSender, source := symSource, weiValue := __src.weiValue,
inputData := __src.inputData, code := op.to_bin, gasPrice := symGasPrice,
header :=
let __src := symState.executionEnv.header;
{ parentHash := __src.parentHash, ommersHash := __src.ommersHash, beneficiary := symCoinbase,
stateRoot := __src.stateRoot, transRoot := __src.transRoot, receiptRoot := __src.receiptRoot,
logsBloom := __src.logsBloom, difficulty := __src.difficulty, number := symNumber, gasLimit := symGaslimit,
gasUsed := __src.gasUsed, timestamp := symTimestamp, extraData := __src.extraData, nonce := __src.nonce,
prevRandao := symPrevrandao, baseFeePerGas := __src.baseFeePerGas,
parentBeaconBlockRoot := __src.parentBeaconBlockRoot, withdrawalsRoot := __src.withdrawalsRoot,
blobGasUsed := __src.blobGasUsed, excessBlobGas := __src.excessBlobGas },
depth := __src.depth, perm := symPerm, blobVersionedHashes := __src.blobVersionedHashes },
blocks := symState.blocks, genesisBlockHeader := symState.genesisBlockHeader,
createdAccounts := symState.createdAccounts, gasAvailable := symGasAvailable, activeWords := symActiveWords,
memory := symMemory, returnData := symReturnData, H_return := symState.H_return, pc := EvmYul.UInt256.ofNat 0,
stack := offset :: value :: symStack, execLength := symExecLength };
GasConstants.Gverylow < symGasAvailable.toNat - EvmYul.EVM.memoryExpansionCost ss op.t →
EvmYul.EVM.memoryExpansionCost ss op.t < EvmYul.UInt256.size →
EvmYul.EVM.X symGasAvailable.toNat symValidJumps ss = Except.ok
(EvmYul.EVM.ExecutionResult.success
{ toState := ss.toState,
gasAvailable :=
symGasAvailable - EvmYul.UInt256.ofNat (EvmYul.EVM.memoryExpansionCost ss op.t) - EvmYul.UInt256.ofNat GasConstants.Gverylow,
activeWords := activeWords_comp offset symActiveWords op.to_l, memory := op.to_write offset value symMemory,
returnData := ByteArray.empty, H_return := ss.H_return, pc := EvmYul.UInt256.ofNat 1, stack := symStack,
execLength := symExecLength + 2 }
ByteArray.empty)