From 00a26c250ee99c0f302987cc3e17765425d8c790 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Tue, 16 Jan 2024 22:40:32 +0000 Subject: [PATCH 01/19] chore(yellowpaper): refresh avm instruction set --- .../InstructionSet/InstructionSet.js | 863 +++++++++--------- 1 file changed, 429 insertions(+), 434 deletions(-) diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index ff3fd87fb47..97a0159486a 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -15,7 +15,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "add", "Name": "`ADD`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -36,7 +36,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "sub", "Name": "`SUB`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -57,7 +57,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "mul", "Name": "`MUL`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -78,7 +78,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "div", "Name": "`DIV`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -99,7 +99,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "eq", "Name": "`EQ`", - "Category": "conditional", + "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -120,7 +120,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "lt", "Name": "`LT`", - "Category": "conditional", + "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -141,7 +141,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "lte", "Name": "`LTE`", - "Category": "conditional", + "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -162,7 +162,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "and", "Name": "`AND`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -183,7 +183,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "or", "Name": "`OR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -204,7 +204,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "xor", "Name": "`XOR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -225,7 +225,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "not", "Name": "`NOT`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -245,7 +245,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "shl", "Name": "`SHL`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -266,7 +266,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "shr", "Name": "`SHR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, @@ -287,7 +287,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "cast", "Name": "`CAST`", - "Category": "types", + "Category": "Type Conversions", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "dst-tag", "description": DST_TAG_DESCRIPTION}, @@ -305,339 +305,261 @@ const INSTRUCTION_SET_RAW = [ "Tag updates": "`T[dstOffset] = dst-tag`", }, { - "id": "set", - "Name": "`SET`", - "Category": "memory", + "id": "address", + "Name": "`ADDRESS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, ], "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "const", "description": "an N-bit constant value from the bytecode to store in memory (any type except `field`)", "mode": "immediate"}, - {"name": "dstOffset", "description": "memory offset specifying where to store the constant"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = const`", - "Summary": "Set a memory word from a constant in the bytecode.", - "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_!", + "Expression": "`M[dstOffset] = context.environment.address`", + "Summary": "Get the address of the currently executing l2 contract", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "mov", - "Name": "`MOV`", - "Category": "memory", + "id": "storageaddress", + "Name": "`STORAGEADDRESS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", + "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "srcOffset", "description": "memory offset of word to move"}, - {"name": "dstOffset", "description": "memory offset specifying where to store that word"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = M[srcOffset]`", - "Summary": "Move a word from source memory location to destination`.", - "Details": "", + "Expression": "`M[dstOffset] = context.environment.storageAddress`", + "Summary": "Get the _storage_ address of the currently executing context", + "Details": "The storage address is used for public storage accesses.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = T[srcOffset]`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "cmov", - "Name": "`CMOV`", - "Category": "memory", + "id": "origin", + "Name": "`ORIGIN`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", + "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "aOffset", "description": "memory offset of word 'a' to conditionally move"}, - {"name": "bOffset", "description": "memory offset of word 'b' to conditionally move"}, - {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`", - "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`).", - "Details": "One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", + "Expression": "`M[dstOffset] = context.environment.origin`", + "Summary": "Get the transaction's origination address", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "calldatacopy", - "Name": "`CALLDATACOPY`", - "Category": "contract calls", + "id": "sender", + "Name": "`SENDER`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "`s1`", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "cdOffset", "description": "offset into calldata to copy from"}, - {"name": "copySize", "description": "number of words to copy", "mode": "immediate", "type": "u32"}, - {"name": "dstOffset", "description": "memory offset specifying where to copy the first word to"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]`", - "Summary": "Copy calldata into memory.", - "Details": "Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.", + "Expression": "`M[dstOffset] = context.environment.sender`", + "Summary": "Get the address of the sender (caller of the current context)", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset:dstOffset+copySize] = field`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sload", - "Name": "`SLOAD`", - "Category": "storage & messaging", + "id": "portal", + "Name": "`PORTAL`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", + "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "slotOffset", "description": "memory offset of the storage slot to load from"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = storage[M[slotOffset]]`", - "Summary": "Load a word from storage.", - "Details": "Load a word from this contract's persistent public storage into memory.", + "Expression": "`M[dstOffset] = context.environment.portal`", + "Summary": "Get the address of the l1 portal contract", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sstore", - "Name": "`SSTORE`", - "Category": "storage & messaging", + "id": "feeperl1gas", + "Name": "`FEEPERL1GAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "srcOffset", "description": "memory offset of the word to store"}, - {"name": "slotOffset", "description": "memory offset containing the storage slot to store to"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`storage[M[slotOffset]] = M[srcOffset]`", - "Summary": "Write a word to storage.", - "Details": "Store a word from memory into this contract's persistent public storage.", + "Expression": "`M[dstOffset] = context.environment.feePerL1Gas`", + "Summary": "The fee to be paid per \"L1 gas\" - constant for entire transaction", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "emitnotehash", - "Name": "`EMITNOTEHASH`", - "Category": "storage & messaging", + "id": "feeperl2gas", + "Name": "`FEEPERL2GAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "noteHashOffset", "description": "memory offset of the note hash"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": `emitNoteHash(M[contentOffset])`, - "Summary": "Emit a new note hash to be inserted into the notes tree", + "Expression": "`M[dstOffset] = context.environment.feePerL2Gas`", + "Summary": "The fee to be paid per \"L2 gas\" - constant for entire transaction", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "emitnullifier", - "Name": "`EMITNULLIFIER`", - "Category": "storage & messaging", + "id": "feeperdagas", + "Name": "`FEEPERDAGAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "nullifierOffset", "description": "memory offset of nullifier"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": `emitNullifier(M[nullifierOffset])`, - "Summary": "Emit a new nullifier to be inserted into the nullifier tree", + "Expression": "`M[dstOffset] = context.environment.feePerDaGas`", + "Summary": "The fee to be paid per \"DA gas\" - constant for entire transaction", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sendl2tol1msg", - "Name": "`SENDL2TOL1MSG`", - "Category": "storage & messaging", + "id": "contractcalldepth", + "Name": "`CONTRACTCALLDEPTH`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", - "Args": [ - {"name": "contentOffset", "description": "memory offset of the message content"}, - ], - "Expression": `sendL2ToL1Message(M[contentOffset])`, - "Summary": "Send an L2-to-L1 message", - "Details": "", - "Tag checks": "", - "Tag updates": "", - }, - { - "id": "jump", - "Name": "`JUMP`", - "Category": "control", - "Flags": [], "#memreads": "0", - "#memwrites": "0", + "#memwrites": "1", "Args": [ - {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`PC = loc`", - "Summary": "Jump to a location in the bytecode.", - "Details": "Target location is an immediate value (a constant in the bytecode).", + "Expression": "`M[dstOffset] = context.environment.contractCallDepth`", + "Summary": "Get how many contract calls deep the current call context is", + "Details": "Note: security issues with EVM's tx.origin can be resolved by asserting `calldepth == 0`.", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u8`", }, { - "id": "jumpi", - "Name": "`JUMPI`", - "Category": "control", + "id": "chainid", + "Name": "`CHAINID`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "loc", "description": "target location conditionally jump to", "mode": "immediate", "type": "u32"}, - {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`PC = M[condOffset] > 0 ? loc : PC`", - "Summary": "Conditionally jump to a location in the bytecode.", - "Details": "Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", + "Expression": "`M[dstOffset] = context.environment.globals.chainId`", + "Summary": "Get this rollup's L1 chain ID", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "return", - "Name": "`RETURN`", - "Category": "contract calls", + "id": "version", + "Name": "`VERSION`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "retOffset", "description": "memory offset of first word to return"}, - {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`return(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `success`, optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": "`M[dstOffset] = context.environment.globals.version`", + "Summary": "Get this rollup's L2 version ID", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "revert", - "Name": "`REVERT`", - "Category": "contract calls", + "id": "blocknumber", + "Name": "`BLOCKNUMBER`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "retOffset", "description": "memory offset of first word to return"}, - {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`revert(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `failure`, reverting state changes and optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": "`M[dstOffset] = context.environment.globals.blocknumber`", + "Summary": "Get this L2 block's number", + "Details": "", "Tag checks": "", - "Tag updates": "", - }, - { - "id": "call", - "Name": "`CALL`", - "Category": "contract calls", - "Flags": [ - {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - ], - "#memreads": "7", - "#memwrites": "`1+retSize`", - "Args": [ - {"name": "gasOffset", "description": "offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee"}, - {"name": "addrOffset", "description": "address of the contract to call"}, - {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, - {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, - {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, - {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, - {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, - ], - "Expression":` -M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize]) -`, - "Summary": "Call into another contract.", - "Details": `Creates a new CallContext, triggers execution of the corresponding contract code, - and then resumes execution in the current CallContext. A non-existent contract or one - with no code will return success. Nested call has an incremented \`CallContext.calldepth\`.`, - "Tag checks": "`T[gasOffset] == T[gasOffset+1] == u32`", - "Tag updates": ` -T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field -`, + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "staticcall", - "Name": "`STATICCALL`", - "Category": "contract calls", + "id": "timestamp", + "Name": "`TIMESTAMP`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "7", - "#memwrites": "`1+retSize`", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "gasOffset", "description": "offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee"}, - {"name": "addrOffset", "description": "address of the contract to call"}, - {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, - {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, - {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, - {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, - {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": ` -M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize]) -`, - "Summary": "Call into another contract, disallowing persistent state modifications.", - "Details": "Same as `CALL`, but the callee is cannot modify persistent state. Disallowed instructions are `SSTORE`, `ULOG`, `CALL`.", - "Tag checks": "`T[gasOffset] == T[gasOffset+1] == u32`", - "Tag updates": ` -T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field -`, + "Expression": "`M[dstOffset] = context.environment.globals.timestamp`", + "Summary": "Get this L2 block's timestamp", + "Details": "", + "Tag checks": "", + "Tag updates": "`T[dstOffset] = u64`", }, { - "id": "ulog", - "Name": "`ULOG`", - "Category": "logging", + "id": "coinbase", + "Name": "`COINBASE`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", + "#memreads": "0", + "#memwrites": "1", "Args": [ - {"name": "logOffset", "description": "memory offset of the data to log"}, - {"name": "logSize", "description": "number of words to log", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`ulog(M[logOffset:logOffset+logSize])`", - "Summary": "Emit an unencrypted log with data from the `field` memory page", + "Expression": "`M[dstOffset] = context.environment.globals.coinbase`", + "Summary": "Get the block's beneficiary address", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "chainid", - "Name": "`CHAINID`", - "Category": "block info", + "id": "blockl1gaslimit", + "Name": "`BLOCKL1GASLIMIT`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -646,16 +568,16 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.chainId`", - "Summary": "Get this rollup's L1 chain ID", + "Expression": "`M[dstOffset] = context.environment.globals.l1GasLimit`", + "Summary": "Total amount of \"L1 gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "version", - "Name": "`VERSION`", - "Category": "block info", + "id": "blockl2gaslimit", + "Name": "`BLOCKL2GASLIMIT`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -664,16 +586,16 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.version`", - "Summary": "Get this rollup's L2 version ID", + "Expression": "`M[dstOffset] = context.environment.globals.l2GasLimit`", + "Summary": "Total amount of \"L2 gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blocknumber", - "Name": "`BLOCKNUMBER`", - "Category": "block info", + "id": "blockdagaslimit", + "Name": "`BLOCKDAGASLIMIT`", + "Category": "Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -682,34 +604,36 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.blocknumber`", - "Summary": "Get this block's number", + "Expression": "`M[dstOffset] = context.environment.globals.daGasLimit`", + "Summary": "Total amount of \"DA gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "timestamp", - "Name": "`TIMESTAMP`", - "Category": "block info", + "id": "calldatacopy", + "Name": "`CALLDATACOPY`", + "Category": "Execution Environment - Calldata", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "`s1`", + "#memwrites": "`s1`", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "cdOffset", "description": "offset into calldata to copy from"}, + {"name": "copySize", "description": "number of words to copy", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to copy the first word to"}, ], - "Expression": "`M[dstOffset] = Globals.timestamp`", - "Summary": "Get this L2 block's timestamp", - "Details": "", + "Expression": "`M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]`", + "Summary": "Copy calldata into memory.", + "Details": "Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u64`", + "Tag updates": "`T[dstOffset:dstOffset+copySize] = field`", }, { - "id": "coinbase", - "Name": "`COINBASE`", - "Category": "block info", + "id": "l1gasleft", + "Name": "`L1GASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -718,16 +642,16 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.coinbase`", - "Summary": "Get the block's beneficiary address", + "Expression": "`M[dstOffset] = context.machineState.l1GasLeft`", + "Summary": "Remaining \"L1 gas\" for this call (after this instruction).", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blockl1gaslimit", - "Name": "`BLOCKL1GASLIMIT`", - "Category": "block info", + "id": "l2gasleft", + "Name": "`L2GASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -736,16 +660,16 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.l1GasLimit`", - "Summary": "Total amount of \"L1 gas\" that a block can consume", + "Expression": "`M[dstOffset] = context.MachineState.l2GasLeft`", + "Summary": "Remaining \"L2 gas\" for this call (after this instruction).", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blockl2gaslimit", - "Name": "`BLOCKL2GASLIMIT`", - "Category": "block info", + "id": "dagasleft", + "Name": "`DAGASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -754,130 +678,162 @@ T[retOffset:retOffset+retSize] = field "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.l2GasLimit`", - "Summary": "Total amount of \"L2 gas\" that a block can consume", + "Expression": "`M[dstOffset] = context.machineState.daGasLeft`", + "Summary": "Remaining \"DA gas\" for this call (after this instruction).", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "`T[dstOffset] = u32`", + }, + { + "id": "jump", + "Name": "`JUMP`", + "Category": "Control Flow - Internal", + "Flags": [], + "#memreads": "0", + "#memwrites": "0", + "Args": [ + {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, + ], + "Expression": "`context.machineState.pc = loc`", + "Summary": "Jump to a location in the bytecode.", + "Details": "Target location is an immediate value (a constant in the bytecode).", + "Tag checks": "", + "Tag updates": "", }, { - "id": "notesroot", - "Name": "`NOTESROOT`", - "Category": "historical access", + "id": "jumpi", + "Name": "`JUMPI`", + "Category": "Control Flow - Internal", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", + "#memreads": "3", + "#memwrites": "0", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "loc", "description": "target location conditionally jump to", "mode": "immediate", "type": "u32"}, + {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`", - "Summary": "Get the historical note-hash tree root as of the specified block number.", - "Details": "", + "Expression": "`context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc`", + "Summary": "Conditionally jump to a location in the bytecode.", + "Details": "Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "", }, { - "id": "nullroot", - "Name": "`NULLIFIERSROOT`", - "Category": "historical access", - "Flags": [ - {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - ], - "#memreads": "1", - "#memwrites": "1", + "id": "internalcall", + "Name": "`internalcall`", + "Category": "Control Flow - Internal", + "Flags": [], + "#memreads": "3", + "#memwrites": "0", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "loc", "description": "target location to jump/call to", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root`", - "Summary": "Get the historical nullifier tree root as of the specified block number.", + "Expression": ` +context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc +`, + "Summary": "Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location.", + "Details": "Target location is an immediate value (a constant in the bytecode).", + "Tag checks": "", + "Tag updates": "", + }, + { + "id": "internalreturn", + "Name": "`internalreturn`", + "Category": "Control Flow - Internal", + "Flags": [], + "#memreads": "3", + "#memwrites": "0", + "Args": [], + "Expression": "`context.machineState.pc = context.machineState.internalCallStack.pop()`", + "Summary": "Return from an internal call. Pops from the internal call stack and jumps there.", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "", }, { - "id": "contractsroot", - "Name": "`CONTRACTSROOT`", - "Category": "historical access", + "id": "internalcalldepth", + "Name": "`INTERNALCALLDEPTH`", + "Category": "Machine State - Control Flow", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", + "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root`", - "Summary": "Get the historical contracts tree root as of the specified block number.", + "Expression": "`M[dstOffset] = context.machineState.internalCallStack.length`", + "Summary": "Depth of the current context's internal call stack", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "msgsroot", - "Name": "`MSGSROOT`", - "Category": "historical access", + "id": "set", + "Name": "`SET`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, + {"name": "in-tag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, ], - "#memreads": "1", + "#memreads": "0", "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "const", "description": "an N-bit constant value from the bytecode to store in memory (any type except `field`)", "mode": "immediate"}, + {"name": "dstOffset", "description": "memory offset specifying where to store the constant"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root`", - "Summary": "Get the historical l1-to-l2 message tree root as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = const`", + "Summary": "Set a memory word from a constant in the bytecode.", + "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_!", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = in-tag`", }, { - "id": "publicdataroot", - "Name": "`PUBLICDATAROOT`", - "Category": "historical access", + "id": "mov", + "Name": "`MOV`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], "#memreads": "1", "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "srcOffset", "description": "memory offset of word to move"}, + {"name": "dstOffset", "description": "memory offset specifying where to store that word"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root`", - "Summary": "Get the historical public data tree root as of the specified block number.", + "Expression": "`M[dstOffset] = M[srcOffset]`", + "Summary": "Move a word from source memory location to destination`.", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = T[srcOffset]`", }, { - "id": "globalshash", - "Name": "`GLOBALSHASH`", - "Category": "historical access", + "id": "cmov", + "Name": "`CMOV`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", + "#memreads": "3", "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, + {"name": "aOffset", "description": "memory offset of word 'a' to conditionally move"}, + {"name": "bOffset", "description": "memory offset of word 'b' to conditionally move"}, + {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash`", - "Summary": "Get the historical global variables hash as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`", + "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`).", + "Details": "One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`", }, { - "id": "blocksroot", - "Name": "`BLOCKSROOT`", - "Category": "historical access", + "id": "blockheaderbynum", + "Name": "`BLOCKHEADERBYNUM`", + "Category": "World State", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -885,212 +841,251 @@ T[retOffset:retOffset+retSize] = field "#memwrites": "1", "Args": [ {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result's 0th word"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root`", - "Summary": "Get the historical blocks tree root as of the specified block number.", + "Expression": "`M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]`", + "Summary": "Get the block header as of the specified block number.", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field`", }, { - "id": "grandroot", - "Name": "`GRANDROOT`", - "Category": "historical access", + "id": "sload", + "Name": "`SLOAD`", + "Category": "World State - Public Storage", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", + "#memreads": "2", "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, + {"name": "slotOffset", "description": "memory offset of the storage slot to load from"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root`", - "Summary": "Get the historical grandfather tree root as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]`", + "Summary": "Load a word from storage.", + "Details": "Load a word from this contract's persistent public storage into memory.", "Tag checks": "", "Tag updates": "`T[dstOffset] = field`", }, { - "id": "origin", - "Name": "`ORIGIN`", - "Category": "tx context", + "id": "sstore", + "Name": "`SSTORE`", + "Category": "World State - Public Storage", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "2", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "srcOffset", "description": "memory offset of the word to store"}, + {"name": "slotOffset", "description": "memory offset containing the storage slot to store to"}, ], - "Expression": "`M[dstOffset] = TxContext.origin`", - "Summary": "Get the transaction's origination address", - "Details": "", + "Expression": "`context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]`", + "Summary": "Write a word to storage.", + "Details": "Store a word from memory into this contract's persistent public storage.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "refundee", - "Name": "`REFUNDEE`", - "Category": "tx context", + "id": "readl1tol2msg", + "Name": "`READL1TOL2MSG`", + "Category": "World State - Messaging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "1", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "msgKeyOffset", "description": "memory offset of the message's key"}, + {"name": "dstOffset", "description": "memory offset to place the 0th word of the message content"}, + {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = TxContext.refundee`", - "Summary": "The recipient of fee refunds for this transaction", + "Expression": `M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset])`, + "Summary": "Reads an L1-to-L2 message", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "`T[dstOffset:dstOffset+msgSize] = field`", }, { - "id": "feeperl1gas", - "Name": "`FEEPERL1GAS`", - "Category": "tx context", + "id": "sendl2tol1msg", + "Name": "`SENDL2TOL1MSG`", + "Category": "World State - Messaging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "1", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "msgOffset", "description": "memory offset of the message content"}, + {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = TxContext.feePerL1Gas`", - "Summary": "The fee to be paid per \"L1 gas\" - set by the transaction's original caller", + "Expression": `l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])`, + "Summary": "Send an L2-to-L1 message", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "feeperl2gas", - "Name": "`FEEPERL2GAS`", - "Category": "tx context", + "id": "emitnotehash", + "Name": "`EMITNOTEHASH`", + "Category": "World State - Notes & Nullifiers", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "1", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "noteHashOffset", "description": "memory offset of the note hash"}, ], - "Expression": "`M[dstOffset] = TxContext.feePerL2Gas`", - "Summary": "The fee to be paid per \"L2 gas\" - set by the transaction's original caller", + "Expression": `newHashes.append(M[noteHashOffset])`, + "Summary": "Emit a new note hash to be inserted into the notes tree", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "caller", - "Name": "`CALLER`", - "Category": "call context", + "id": "emitnullifier", + "Name": "`EMITNULLIFIER`", + "Category": "World State - Notes & Nullifiers", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "1", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "nullifierOffset", "description": "memory offset of nullifier"}, ], - "Expression": "`M[dstOffset] = CallContext.sender`", - "Summary": "Get the address of the sender (the caller's context)", + "Expression": `nullifiers.append(M[nullifierOffset])`, + "Summary": "Emit a new nullifier to be inserted into the nullifier tree", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "address", - "Name": "`ADDRESS`", - "Category": "call context", + "id": "ulog", + "Name": "`ULOG`", + "Category": "Accrued Substate - Logging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "`s1`", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "logOffset", "description": "memory offset of the data to log"}, + {"name": "logSize", "description": "number of words to log", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = CallContext.storageContractAddress`", - "Summary": "Get the address of the currently executing l2 contract", + "Expression": "`ulog(M[logOffset:logOffset+logSize])`", + "Summary": "Emit an unencrypted log with data from the `field` memory page", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "portal", - "Name": "`PORTAL`", - "Category": "call context", + "id": "call", + "Name": "`CALL`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "7", + "#memwrites": "`1+retSize`", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, + {"name": "addrOffset", "description": "address of the contract to call"}, + {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, + {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, + {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, + {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, + {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, ], - "Expression": "`M[dstOffset] = CallContext.portalAddress`", - "Summary": "Get the address of the l1 portal contract", - "Details": "", - "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Expression":` +M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize]) +`, + "Summary": "Call into another contract.", + "Details": `Creates a new execution context, triggers execution within it, + and then resumes execution in the current/calling context. A non-existent contract or one + with no code will return success. Nested call has an incremented \`context.environment.contractCallDepth\`.`, + "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", + "Tag updates": ` +T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field +`, }, { - "id": "calldepth", - "Name": "`CALLDEPTH`", - "Category": "call context", + "id": "staticcall", + "Name": "`STATICCALL`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "7", + "#memwrites": "`1+retSize`", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, + {"name": "addrOffset", "description": "address of the contract to call"}, + {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, + {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, + {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, + {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, + {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, ], - "Expression": "`M[dstOffset] = CallContext.calldepth`", - "Summary": "Get how many calls deep the current call context is", - "Details": "Note: security issues with EVM's tx.origin can be resolved by asserting the `calldepth == 0`.", - "Tag checks": "", - "Tag updates": "`T[dstOffset] = u8`", + "Expression": ` +M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize]) +`, + "Summary": "Call into another contract, disallowing World State modifications.", + "Details": "Same as `CALL`, but the callee is cannot modify World State.", + "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", + "Tag updates": ` +T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field +`, }, { - "id": "l1gas", - "Name": "`L1GAS`", - "Category": "latest context", + "id": "return", + "Name": "`RETURN`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "`s1`", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "retOffset", "description": "memory offset of first word to return"}, + {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = LatestContext.l1Gas`", - "Summary": "Remaining \"L1 gas\" for this call (after this instruction).", - "Details": "", + "Expression": "`return(M[retOffset:retOffset+retSize])`", + "Summary": "Halt execution with `success`, optionally returning some data.", + "Details": "Return control flow to the calling context/contract.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "l2gas", - "Name": "`L2GAS`", - "Category": "latest context", + "id": "revert", + "Name": "`REVERT`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", + "#memreads": "`s1`", + "#memwrites": "0", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "retOffset", "description": "memory offset of first word to return"}, + {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = LatestContext.l2Gas`", - "Summary": "Remaining \"L2 gas\" for this call (after this instruction).", - "Details": "", + "Expression": "`revert(M[retOffset:retOffset+retSize])`", + "Summary": "Halt execution with `failure`, reverting state changes and optionally returning some data.", + "Details": "Return control flow to the calling context/contract.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, ]; const INSTRUCTION_SET = INSTRUCTION_SET_RAW.map((instr) => {instr['Bit-size'] = instructionSize(instr); return instr;}); From 68cad646abeeaf32f23630a8565d01e189d24ee5 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Tue, 16 Jan 2024 22:41:43 +0000 Subject: [PATCH 02/19] preprocess --- yellow-paper/docs/public-vm/avm.md | 31 +- .../docs/public-vm/gen/_InstructionSet.mdx | 1182 ++++++++--------- 2 files changed, 597 insertions(+), 616 deletions(-) diff --git a/yellow-paper/docs/public-vm/avm.md b/yellow-paper/docs/public-vm/avm.md index 2f06f409f1e..669de1f0aa2 100644 --- a/yellow-paper/docs/public-vm/avm.md +++ b/yellow-paper/docs/public-vm/avm.md @@ -69,14 +69,13 @@ ExecutionEnvironment { address: AztecAddress, storageAddress: AztecAddress, origin: AztecAddress, - l1GasPrice: field, - l2GasPrice: field, - daGasPrice: field, sender: AztecAddress, portal: AztecAddress, - blockHeader: BlockHeader, - globalVariables: PublicGlobalVariables, + feePerL1Gas: field, + feePerL2Gas: field, + feePerDaGas: field, contractCallDepth: field, + globals: PublicGlobalVariables, isStaticCall: boolean, isDelegateCall: boolean, calldata: [field; ], @@ -365,14 +364,13 @@ INITIAL_EXECUTION_ENVIRONMENT = ExecutionEnvironment { address = PublicCallRequest.contractAddress, storageAddress = PublicCallRequest.CallContext.storageContractAddress, origin = TxRequest.origin, - l1GasPrice = TxRequest.l1GasPrice, - l2GasPrice = TxRequest.l2GasPrice, - daGasPrice = TxRequest.daGasPrice, sender = PublicCallRequest.CallContext.msgSender, portal = PublicCallRequest.CallContext.portalContractAddress, - blockHeader = , - globalVariables = + feePerL1Gas = TxRequest.feePerL1Gas, + feePerL2Gas = TxRequest.feePerL2Gas, + feePerDaGas = TxRequest.feePerDaGas, contractCallDepth = 0, + globals = isStaticCall = PublicCallRequest.CallContext.isStaticCall, isDelegateCall = PublicCallRequest.CallContext.isDelegateCall, calldata = PublicCallRequest.args, @@ -442,17 +440,16 @@ calldataStart = instr.args.argsOffset calldataEnd = calldataStart + instr.args.argsSize nestedExecutionEnvironment = ExecutionEnvironment { - address: instr.args.addr, - storageAddress: isDelegateCall ? callingContext.environment.storageAddress : instr.args.addr, origin: callingContext.origin, - l1GasPrice: callingContext.l1GasPrice, - l2GasPrice: callingContext.l2GasPrice, - daGasPrice: callingContext.daGasPrice, sender: callingContext.address, + address: instr.args.addr, + storageAddress: isDelegateCall ? callingContext.environment.storageAddress : instr.args.addr, portal: contract.portal, - blockHeader: callingContext.blockHeader, - globalVariables: callingContext.globalVariables, + feePerL1Gas: callingContext.feePerL1Gas, + feePerL2Gas: callingContext.feePerL2Gas, + feePerDaGas: callingContext.feePerDaGas, contractCallDepth: callingContext.contractCallDepth + 1, + globals: callingContext.globals, isStaticCall: isStaticCall, isDelegateCall: isDelegateCall, calldata: callingContext.memory[calldataStart:calldataEnd], diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index c362c88b840..75da1ddf194 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -31,7 +31,7 @@ Click on an instruction name to jump to its section. 0x02 [`MUL`](#isa-section-mul) - Subtraction (a - b) + Multiplication (a * b) 128 { `M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k` @@ -126,331 +126,332 @@ Click on an instruction name to jump to its section. } - 0x0e [`SET`](#isa-section-set) - Set a memory word from a constant in the bytecode. - 64+N + 0x0e [`ADDRESS`](#isa-section-address) + Get the address of the currently executing l2 contract + 56 { - `M[dstOffset] = const` + `M[dstOffset] = context.environment.address` } - 0x0f [`MOV`](#isa-section-mov) - Move a word from source memory location to destination`. - 88 + 0x0f [`STORAGEADDRESS`](#isa-section-storageaddress) + Get the _storage_ address of the currently executing context + 56 { - `M[dstOffset] = M[srcOffset]` + `M[dstOffset] = context.environment.storageAddress` } - 0x10 [`CMOV`](#isa-section-cmov) - Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). - 152 + 0x10 [`ORIGIN`](#isa-section-origin) + Get the transaction's origination address + 56 { - `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` + `M[dstOffset] = context.environment.origin` } - 0x11 [`CALLDATACOPY`](#isa-section-calldatacopy) - Copy calldata into memory. - 120 + 0x11 [`SENDER`](#isa-section-sender) + Get the address of the sender (caller of the current context) + 56 { - `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]` + `M[dstOffset] = context.environment.sender` } - 0x12 [`SLOAD`](#isa-section-sload) - Load a word from storage. - 88 + 0x12 [`PORTAL`](#isa-section-portal) + Get the address of the l1 portal contract + 56 { - `M[dstOffset] = storage[M[slotOffset]]` + `M[dstOffset] = context.environment.portal` } - 0x13 [`SSTORE`](#isa-section-sstore) - Write a word to storage. - 88 + 0x13 [`FEEPERL1GAS`](#isa-section-feeperl1gas) + The fee to be paid per "L1 gas" - constant for entire transaction + 56 { - `storage[M[slotOffset]] = M[srcOffset]` + `M[dstOffset] = context.environment.feePerL1Gas` } - 0x14 [`EMITNOTEHASH`](#isa-section-emitnotehash) - Emit a new note hash to be inserted into the notes tree + 0x14 [`FEEPERL2GAS`](#isa-section-feeperl2gas) + The fee to be paid per "L2 gas" - constant for entire transaction 56 - emitNoteHash(M[contentOffset]) + { + `M[dstOffset] = context.environment.feePerL2Gas` + } - 0x15 [`EMITNULLIFIER`](#isa-section-emitnullifier) - Emit a new nullifier to be inserted into the nullifier tree + 0x15 [`FEEPERDAGAS`](#isa-section-feeperdagas) + The fee to be paid per "DA gas" - constant for entire transaction 56 - emitNullifier(M[nullifierOffset]) + { + `M[dstOffset] = context.environment.feePerDaGas` + } - 0x16 [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) - Send an L2-to-L1 message + 0x16 [`CONTRACTCALLDEPTH`](#isa-section-contractcalldepth) + Get how many contract calls deep the current call context is 56 - sendL2ToL1Message(M[contentOffset]) - - - 0x17 [`JUMP`](#isa-section-jump) - Jump to a location in the bytecode. - 48 { - `PC = loc` + `M[dstOffset] = context.environment.contractCallDepth` } - 0x18 [`JUMPI`](#isa-section-jumpi) - Conditionally jump to a location in the bytecode. - 88 + 0x17 [`CHAINID`](#isa-section-chainid) + Get this rollup's L1 chain ID + 56 { - `PC = M[condOffset] > 0 ? loc : PC` + `M[dstOffset] = context.environment.globals.chainId` } - 0x19 [`RETURN`](#isa-section-return) - Halt execution with `success`, optionally returning some data. - 88 + 0x18 [`VERSION`](#isa-section-version) + Get this rollup's L2 version ID + 56 { - `return(M[retOffset:retOffset+retSize])` + `M[dstOffset] = context.environment.globals.version` } - 0x1a [`REVERT`](#isa-section-revert) - Halt execution with `failure`, reverting state changes and optionally returning some data. - 88 + 0x19 [`BLOCKNUMBER`](#isa-section-blocknumber) + Get this L2 block's number + 56 { - `revert(M[retOffset:retOffset+retSize])` + `M[dstOffset] = context.environment.globals.blocknumber` } - 0x1b [`CALL`](#isa-section-call) - Call into another contract. - 248 - -{`M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - - - - 0x1c [`STATICCALL`](#isa-section-staticcall) - Call into another contract, disallowing persistent state modifications. - 248 - -{`M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - + 0x1a [`TIMESTAMP`](#isa-section-timestamp) + Get this L2 block's timestamp + 56 + { + `M[dstOffset] = context.environment.globals.timestamp` + } - 0x1d [`ULOG`](#isa-section-ulog) - Emit an unencrypted log with data from the `field` memory page - 88 + 0x1b [`COINBASE`](#isa-section-coinbase) + Get the block's beneficiary address + 56 { - `ulog(M[logOffset:logOffset+logSize])` + `M[dstOffset] = context.environment.globals.coinbase` } - 0x1e [`CHAINID`](#isa-section-chainid) - Get this rollup's L1 chain ID + 0x1c [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) + Total amount of "L1 gas" that a block can consume 56 { - `M[dstOffset] = Globals.chainId` + `M[dstOffset] = context.environment.globals.l1GasLimit` } - 0x1f [`VERSION`](#isa-section-version) - Get this rollup's L2 version ID + 0x1d [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) + Total amount of "L2 gas" that a block can consume 56 { - `M[dstOffset] = Globals.version` + `M[dstOffset] = context.environment.globals.l2GasLimit` } - 0x20 [`BLOCKNUMBER`](#isa-section-blocknumber) - Get this block's number + 0x1e [`BLOCKDAGASLIMIT`](#isa-section-blockdagaslimit) + Total amount of "DA gas" that a block can consume 56 { - `M[dstOffset] = Globals.blocknumber` + `M[dstOffset] = context.environment.globals.daGasLimit` } - 0x21 [`TIMESTAMP`](#isa-section-timestamp) - Get this L2 block's timestamp - 56 + 0x1f [`CALLDATACOPY`](#isa-section-calldatacopy) + Copy calldata into memory. + 120 { - `M[dstOffset] = Globals.timestamp` + `M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]` } - 0x22 [`COINBASE`](#isa-section-coinbase) - Get the block's beneficiary address + 0x20 [`L1GASLEFT`](#isa-section-l1gasleft) + Remaining "L1 gas" for this call (after this instruction). 56 { - `M[dstOffset] = Globals.coinbase` + `M[dstOffset] = context.machineState.l1GasLeft` } - 0x23 [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) - Total amount of "L1 gas" that a block can consume + 0x21 [`L2GASLEFT`](#isa-section-l2gasleft) + Remaining "L2 gas" for this call (after this instruction). 56 { - `M[dstOffset] = Globals.l1GasLimit` + `M[dstOffset] = context.MachineState.l2GasLeft` } - 0x24 [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) - Total amount of "L2 gas" that a block can consume + 0x22 [`DAGASLEFT`](#isa-section-dagasleft) + Remaining "DA gas" for this call (after this instruction). 56 { - `M[dstOffset] = Globals.l2GasLimit` + `M[dstOffset] = context.machineState.daGasLeft` } - 0x25 [`NOTESROOT`](#isa-section-notesroot) - Get the historical note-hash tree root as of the specified block number. - 88 + 0x23 [`JUMP`](#isa-section-jump) + Jump to a location in the bytecode. + 48 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root` + `context.machineState.pc = loc` } - 0x26 [`NULLIFIERSROOT`](#isa-section-nullroot) - Get the historical nullifier tree root as of the specified block number. + 0x24 [`JUMPI`](#isa-section-jumpi) + Conditionally jump to a location in the bytecode. 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root` + `context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc` } - 0x27 [`CONTRACTSROOT`](#isa-section-contractsroot) - Get the historical contracts tree root as of the specified block number. - 88 + 0x25 [`internalcall`](#isa-section-internalcall) + Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location. + 48 + +{`context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc`} + + + + 0x26 [`internalreturn`](#isa-section-internalreturn) + Return from an internal call. Pops from the internal call stack and jumps there. + 16 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root` + `context.machineState.pc = context.machineState.internalCallStack.pop()` } - 0x28 [`MSGSROOT`](#isa-section-msgsroot) - Get the historical l1-to-l2 message tree root as of the specified block number. - 88 + 0x27 [`INTERNALCALLDEPTH`](#isa-section-internalcalldepth) + Depth of the current context's internal call stack + 56 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root` + `M[dstOffset] = context.machineState.internalCallStack.length` } - 0x29 [`PUBLICDATAROOT`](#isa-section-publicdataroot) - Get the historical public data tree root as of the specified block number. - 88 + 0x28 [`SET`](#isa-section-set) + Set a memory word from a constant in the bytecode. + 64+N { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root` + `M[dstOffset] = const` } - 0x2a [`GLOBALSHASH`](#isa-section-globalshash) - Get the historical global variables hash as of the specified block number. + 0x29 [`MOV`](#isa-section-mov) + Move a word from source memory location to destination`. 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash` + `M[dstOffset] = M[srcOffset]` } - 0x2b [`BLOCKSROOT`](#isa-section-blocksroot) - Get the historical blocks tree root as of the specified block number. - 88 + 0x2a [`CMOV`](#isa-section-cmov) + Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). + 152 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root` + `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` } - 0x2c [`GRANDROOT`](#isa-section-grandroot) - Get the historical grandfather tree root as of the specified block number. + 0x2b [`BLOCKHEADERBYNUM`](#isa-section-blockheaderbynum) + Get the block header as of the specified block number. 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root` + `M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]` } - 0x2d [`ORIGIN`](#isa-section-origin) - Get the transaction's origination address - 56 + 0x2c [`SLOAD`](#isa-section-sload) + Load a word from storage. + 88 { - `M[dstOffset] = TxContext.origin` + `M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]` } - 0x2e [`REFUNDEE`](#isa-section-refundee) - The recipient of fee refunds for this transaction - 56 + 0x2d [`SSTORE`](#isa-section-sstore) + Write a word to storage. + 88 { - `M[dstOffset] = TxContext.refundee` + `context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]` } - 0x2f [`FEEPERL1GAS`](#isa-section-feeperl1gas) - The fee to be paid per "L1 gas" - set by the transaction's original caller - 56 - { - `M[dstOffset] = TxContext.feePerL1Gas` - } + 0x2e [`READL1TOL2MSG`](#isa-section-readl1tol2msg) + Reads an L1-to-L2 message + 120 + M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset]) - 0x30 [`FEEPERL2GAS`](#isa-section-feeperl2gas) - The fee to be paid per "L2 gas" - set by the transaction's original caller - 56 - { - `M[dstOffset] = TxContext.feePerL2Gas` - } + 0x2f [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) + Send an L2-to-L1 message + 88 + l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize]) - 0x31 [`CALLER`](#isa-section-caller) - Get the address of the sender (the caller's context) + 0x30 [`EMITNOTEHASH`](#isa-section-emitnotehash) + Emit a new note hash to be inserted into the notes tree 56 - { - `M[dstOffset] = CallContext.sender` - } + newHashes.append(M[noteHashOffset]) - 0x32 [`ADDRESS`](#isa-section-address) - Get the address of the currently executing l2 contract + 0x31 [`EMITNULLIFIER`](#isa-section-emitnullifier) + Emit a new nullifier to be inserted into the nullifier tree 56 - { - `M[dstOffset] = CallContext.storageContractAddress` - } + nullifiers.append(M[nullifierOffset]) - 0x33 [`PORTAL`](#isa-section-portal) - Get the address of the l1 portal contract - 56 + 0x32 [`ULOG`](#isa-section-ulog) + Emit an unencrypted log with data from the `field` memory page + 88 { - `M[dstOffset] = CallContext.portalAddress` + `ulog(M[logOffset:logOffset+logSize])` } - 0x34 [`CALLDEPTH`](#isa-section-calldepth) - Get how many calls deep the current call context is - 56 - { - `M[dstOffset] = CallContext.calldepth` - } + 0x33 [`CALL`](#isa-section-call) + Call into another contract. + 248 + +{`M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + - 0x35 [`L1GAS`](#isa-section-l1gas) - Remaining "L1 gas" for this call (after this instruction). - 56 + 0x34 [`STATICCALL`](#isa-section-staticcall) + Call into another contract, disallowing World State modifications. + 248 + +{`M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + + + + 0x35 [`RETURN`](#isa-section-return) + Halt execution with `success`, optionally returning some data. + 88 { - `M[dstOffset] = LatestContext.l1Gas` + `return(M[retOffset:retOffset+retSize])` } - 0x36 [`L2GAS`](#isa-section-l2gas) - Remaining "L2 gas" for this call (after this instruction). - 56 + 0x36 [`REVERT`](#isa-section-revert) + Halt execution with `failure`, reverting state changes and optionally returning some data. + 88 { - `M[dstOffset] = LatestContext.l2Gas` + `revert(M[retOffset:retOffset+retSize])` } @@ -463,7 +464,7 @@ Addition (a + b) [See in table.](#isa-table-add) -- **Category**: arithmetic +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -483,7 +484,7 @@ Subtraction (a - b) [See in table.](#isa-table-sub) -- **Category**: arithmetic +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -499,11 +500,11 @@ Subtraction (a - b) [![](./images/bit-formats/SUB.png)](./images/bit-formats/SUB.png) ### `MUL` (0x02) -Subtraction (a - b) +Multiplication (a * b) [See in table.](#isa-table-mul) -- **Category**: arithmetic +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -522,7 +523,7 @@ Unsigned division (a / b) [See in table.](#isa-table-div) -- **Category**: arithmetic +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -542,7 +543,7 @@ Equality check (a == b) [See in table.](#isa-table-eq) -- **Category**: conditional +- **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -562,7 +563,7 @@ Less-than check (a < b) [See in table.](#isa-table-lt) -- **Category**: conditional +- **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -582,7 +583,7 @@ Less-than-or-equals check (a <= b) [See in table.](#isa-table-lte) -- **Category**: conditional +- **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -602,7 +603,7 @@ Bitwise AND (a & b) [See in table.](#isa-table-and) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -622,7 +623,7 @@ Bitwise OR (a | b) [See in table.](#isa-table-or) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -642,7 +643,7 @@ Bitwise XOR (a ^ b) [See in table.](#isa-table-xor) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -662,7 +663,7 @@ Bitwise NOT (inversion) [See in table.](#isa-table-not) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -681,7 +682,7 @@ Bitwise leftward shift (a << b) [See in table.](#isa-table-shl) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -701,7 +702,7 @@ Bitwise rightward shift (a >> b) [See in table.](#isa-table-shr) -- **Category**: bitwise +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -721,7 +722,7 @@ Type cast [See in table.](#isa-table-cast) -- **Category**: types +- **Category**: Type Conversions - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **dst-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against. @@ -735,717 +736,700 @@ Type cast [![](./images/bit-formats/CAST.png)](./images/bit-formats/CAST.png) -### `SET` (0x0e) -Set a memory word from a constant in the bytecode. +### `ADDRESS` (0x0e) +Get the address of the currently executing l2 contract -[See in table.](#isa-table-set) +[See in table.](#isa-table-address) -- **Category**: memory +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. - **Args**: - - **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`) - - **dstOffset**: memory offset specifying where to store the constant -- **Expression**: `M[dstOffset] = const` -- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_! -- **Tag updates**: `T[dstOffset] = in-tag` -- **Bit-size**: 64+N + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.address` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png) +[![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png) -### `MOV` (0x0f) -Move a word from source memory location to destination`. +### `STORAGEADDRESS` (0x0f) +Get the _storage_ address of the currently executing context -[See in table.](#isa-table-mov) +[See in table.](#isa-table-storageaddress) -- **Category**: memory +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **srcOffset**: memory offset of word to move - - **dstOffset**: memory offset specifying where to store that word -- **Expression**: `M[dstOffset] = M[srcOffset]` -- **Tag updates**: `T[dstOffset] = T[srcOffset]` -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.storageAddress` +- **Details**: The storage address is used for public storage accesses. +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png) -### `CMOV` (0x10) -Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). +### `ORIGIN` (0x10) +Get the transaction's origination address -[See in table.](#isa-table-cmov) +[See in table.](#isa-table-origin) -- **Category**: memory +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **aOffset**: memory offset of word 'a' to conditionally move - - **bOffset**: memory offset of word 'b' to conditionally move - - **condOffset**: memory offset of the operations 'conditional' input - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` -- **Details**: One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. -- **Tag updates**: `T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]` -- **Bit-size**: 152 +- **Expression**: `M[dstOffset] = context.environment.origin` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png) +[![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png) -### `CALLDATACOPY` (0x11) -Copy calldata into memory. +### `SENDER` (0x11) +Get the address of the sender (caller of the current context) -[See in table.](#isa-table-calldatacopy) +[See in table.](#isa-table-sender) -- **Category**: contract calls +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **cdOffset**: offset into calldata to copy from - - **copySize**: number of words to copy - - **dstOffset**: memory offset specifying where to copy the first word to -- **Expression**: `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]` -- **Details**: Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally. -- **Tag updates**: `T[dstOffset:dstOffset+copySize] = field` -- **Bit-size**: 120 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.sender` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png) -### `SLOAD` (0x12) -Load a word from storage. +### `PORTAL` (0x12) +Get the address of the l1 portal contract -[See in table.](#isa-table-sload) +[See in table.](#isa-table-portal) -- **Category**: storage & messaging +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **slotOffset**: memory offset of the storage slot to load from - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = storage[M[slotOffset]]` -- **Details**: Load a word from this contract's persistent public storage into memory. -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 +- **Expression**: `M[dstOffset] = context.environment.portal` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png) +[![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png) -### `SSTORE` (0x13) -Write a word to storage. +### `FEEPERL1GAS` (0x13) +The fee to be paid per "L1 gas" - constant for entire transaction -[See in table.](#isa-table-sstore) +[See in table.](#isa-table-feeperl1gas) -- **Category**: storage & messaging +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **srcOffset**: memory offset of the word to store - - **slotOffset**: memory offset containing the storage slot to store to -- **Expression**: `storage[M[slotOffset]] = M[srcOffset]` -- **Details**: Store a word from memory into this contract's persistent public storage. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerL1Gas` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png) +[![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png) -### `EMITNOTEHASH` (0x14) -Emit a new note hash to be inserted into the notes tree +### `FEEPERL2GAS` (0x14) +The fee to be paid per "L2 gas" - constant for entire transaction -[See in table.](#isa-table-emitnotehash) +[See in table.](#isa-table-feeperl2gas) -- **Category**: storage & messaging +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **noteHashOffset**: memory offset of the note hash -- **Expression**: emitNoteHash(M[contentOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerL2Gas` +- **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png) +[![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png) -### `EMITNULLIFIER` (0x15) -Emit a new nullifier to be inserted into the nullifier tree +### `FEEPERDAGAS` (0x15) +The fee to be paid per "DA gas" - constant for entire transaction -[See in table.](#isa-table-emitnullifier) +[See in table.](#isa-table-feeperdagas) -- **Category**: storage & messaging +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **nullifierOffset**: memory offset of nullifier -- **Expression**: emitNullifier(M[nullifierOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerDaGas` +- **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png) -### `SENDL2TOL1MSG` (0x16) -Send an L2-to-L1 message +### `CONTRACTCALLDEPTH` (0x16) +Get how many contract calls deep the current call context is -[See in table.](#isa-table-sendl2tol1msg) +[See in table.](#isa-table-contractcalldepth) -- **Category**: storage & messaging +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **contentOffset**: memory offset of the message content -- **Expression**: sendL2ToL1Message(M[contentOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.contractCallDepth` +- **Details**: Note: security issues with EVM's tx.origin can be resolved by asserting `calldepth == 0`. +- **Tag updates**: `T[dstOffset] = u8` - **Bit-size**: 56 -[![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png) - -### `JUMP` (0x17) -Jump to a location in the bytecode. - -[See in table.](#isa-table-jump) - -- **Category**: control -- **Args**: - - **loc**: target location to jump to -- **Expression**: `PC = loc` -- **Details**: Target location is an immediate value (a constant in the bytecode). -- **Bit-size**: 48 - -[![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png) -### `JUMPI` (0x18) -Conditionally jump to a location in the bytecode. +### `CHAINID` (0x17) +Get this rollup's L1 chain ID -[See in table.](#isa-table-jumpi) +[See in table.](#isa-table-chainid) -- **Category**: control +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **loc**: target location conditionally jump to - - **condOffset**: memory offset of the operations 'conditional' input -- **Expression**: `PC = M[condOffset] > 0 ? loc : PC` -- **Details**: Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.chainId` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) +[![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png) -### `RETURN` (0x19) -Halt execution with `success`, optionally returning some data. +### `VERSION` (0x18) +Get this rollup's L2 version ID -[See in table.](#isa-table-return) +[See in table.](#isa-table-version) -- **Category**: contract calls +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **retOffset**: memory offset of first word to return - - **retSize**: number of words to return -- **Expression**: `return(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.version` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png) +[![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png) -### `REVERT` (0x1a) -Halt execution with `failure`, reverting state changes and optionally returning some data. +### `BLOCKNUMBER` (0x19) +Get this L2 block's number -[See in table.](#isa-table-revert) +[See in table.](#isa-table-blocknumber) -- **Category**: contract calls +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **retOffset**: memory offset of first word to return - - **retSize**: number of words to return -- **Expression**: `revert(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.blocknumber` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png) +[![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png) -### `CALL` (0x1b) -Call into another contract. +### `TIMESTAMP` (0x1a) +Get this L2 block's timestamp -[See in table.](#isa-table-call) +[See in table.](#isa-table-timestamp) -- **Category**: contract calls +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee - - **addrOffset**: address of the contract to call - - **argsOffset**: memory offset to args (will become the callee's calldata) - - **argsSize**: number of words to pass via callee's calldata - - **retOffset**: destination memory offset specifying where to store the data returned from the callee - - **retSize**: number of words to copy from data returned by callee - - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) -- **Expression**: - -{`M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - -- **Details**: Creates a new CallContext, triggers execution of the corresponding contract code, - and then resumes execution in the current CallContext. A non-existent contract or one - with no code will return success. Nested call has an incremented `CallContext.calldepth`. -- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32` -- **Tag updates**: - -{`T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field`} - -- **Bit-size**: 248 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.timestamp` +- **Tag updates**: `T[dstOffset] = u64` +- **Bit-size**: 56 -[![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png) +[![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png) -### `STATICCALL` (0x1c) -Call into another contract, disallowing persistent state modifications. +### `COINBASE` (0x1b) +Get the block's beneficiary address -[See in table.](#isa-table-staticcall) +[See in table.](#isa-table-coinbase) -- **Category**: contract calls +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee - - **addrOffset**: address of the contract to call - - **argsOffset**: memory offset to args (will become the callee's calldata) - - **argsSize**: number of words to pass via callee's calldata - - **retOffset**: destination memory offset specifying where to store the data returned from the callee - - **retSize**: number of words to copy from data returned by callee - - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) -- **Expression**: - -{`M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - -- **Details**: Same as `CALL`, but the callee is cannot modify persistent state. Disallowed instructions are `SSTORE`, `ULOG`, `CALL`. -- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32` -- **Tag updates**: - -{`T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field`} - -- **Bit-size**: 248 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.coinbase` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png) +[![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png) -### `ULOG` (0x1d) -Emit an unencrypted log with data from the `field` memory page +### `BLOCKL1GASLIMIT` (0x1c) +Total amount of "L1 gas" that a block can consume -[See in table.](#isa-table-ulog) +[See in table.](#isa-table-blockl1gaslimit) -- **Category**: logging +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **logOffset**: memory offset of the data to log - - **logSize**: number of words to log -- **Expression**: `ulog(M[logOffset:logOffset+logSize])` -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.l1GasLimit` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/ULOG.png)](./images/bit-formats/ULOG.png) +[![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png) -### `CHAINID` (0x1e) -Get this rollup's L1 chain ID +### `BLOCKL2GASLIMIT` (0x1d) +Total amount of "L2 gas" that a block can consume -[See in table.](#isa-table-chainid) +[See in table.](#isa-table-blockl2gaslimit) -- **Category**: block info +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.chainId` +- **Expression**: `M[dstOffset] = context.environment.globals.l2GasLimit` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png) +[![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png) -### `VERSION` (0x1f) -Get this rollup's L2 version ID +### `BLOCKDAGASLIMIT` (0x1e) +Total amount of "DA gas" that a block can consume -[See in table.](#isa-table-version) +[See in table.](#isa-table-blockdagaslimit) -- **Category**: block info +- **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.version` +- **Expression**: `M[dstOffset] = context.environment.globals.daGasLimit` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png) -### `BLOCKNUMBER` (0x20) -Get this block's number +### `CALLDATACOPY` (0x1f) +Copy calldata into memory. -[See in table.](#isa-table-blocknumber) +[See in table.](#isa-table-calldatacopy) -- **Category**: block info +- **Category**: Execution Environment - Calldata - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.blocknumber` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **cdOffset**: offset into calldata to copy from + - **copySize**: number of words to copy + - **dstOffset**: memory offset specifying where to copy the first word to +- **Expression**: `M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]` +- **Details**: Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally. +- **Tag updates**: `T[dstOffset:dstOffset+copySize] = field` +- **Bit-size**: 120 -[![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png) +[![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png) -### `TIMESTAMP` (0x21) -Get this L2 block's timestamp +### `L1GASLEFT` (0x20) +Remaining "L1 gas" for this call (after this instruction). -[See in table.](#isa-table-timestamp) +[See in table.](#isa-table-l1gasleft) -- **Category**: block info +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.timestamp` -- **Tag updates**: `T[dstOffset] = u64` +- **Expression**: `M[dstOffset] = context.machineState.l1GasLeft` +- **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png) -### `COINBASE` (0x22) -Get the block's beneficiary address +### `L2GASLEFT` (0x21) +Remaining "L2 gas" for this call (after this instruction). -[See in table.](#isa-table-coinbase) +[See in table.](#isa-table-l2gasleft) -- **Category**: block info +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.coinbase` +- **Expression**: `M[dstOffset] = context.MachineState.l2GasLeft` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png) -### `BLOCKL1GASLIMIT` (0x23) -Total amount of "L1 gas" that a block can consume +### `DAGASLEFT` (0x22) +Remaining "DA gas" for this call (after this instruction). -[See in table.](#isa-table-blockl1gaslimit) +[See in table.](#isa-table-dagasleft) -- **Category**: block info +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.l1GasLimit` +- **Expression**: `M[dstOffset] = context.machineState.daGasLeft` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png) -### `BLOCKL2GASLIMIT` (0x24) -Total amount of "L2 gas" that a block can consume +### `JUMP` (0x23) +Jump to a location in the bytecode. -[See in table.](#isa-table-blockl2gaslimit) +[See in table.](#isa-table-jump) -- **Category**: block info -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. +- **Category**: Control Flow - Internal - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.l2GasLimit` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **loc**: target location to jump to +- **Expression**: `context.machineState.pc = loc` +- **Details**: Target location is an immediate value (a constant in the bytecode). +- **Bit-size**: 48 -[![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png) +[![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png) -### `NOTESROOT` (0x25) -Get the historical note-hash tree root as of the specified block number. +### `JUMPI` (0x24) +Conditionally jump to a location in the bytecode. -[See in table.](#isa-table-notesroot) +[See in table.](#isa-table-jumpi) -- **Category**: historical access +- **Category**: Control Flow - Internal - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root` -- **Tag updates**: `T[dstOffset] = field` + - **loc**: target location conditionally jump to + - **condOffset**: memory offset of the operations 'conditional' input +- **Expression**: `context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc` +- **Details**: Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. - **Bit-size**: 88 -[![](./images/bit-formats/NOTESROOT.png)](./images/bit-formats/NOTESROOT.png) +[![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) -### `NULLIFIERSROOT` (0x26) -Get the historical nullifier tree root as of the specified block number. +### `internalcall` (0x25) +Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location. -[See in table.](#isa-table-nullroot) +[See in table.](#isa-table-internalcall) -- **Category**: historical access -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. +- **Category**: Control Flow - Internal - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 + - **loc**: target location to jump/call to +- **Expression**: + +{`context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc`} + +- **Details**: Target location is an immediate value (a constant in the bytecode). +- **Bit-size**: 48 -[![](./images/bit-formats/NULLIFIERSROOT.png)](./images/bit-formats/NULLIFIERSROOT.png) -### `CONTRACTSROOT` (0x27) -Get the historical contracts tree root as of the specified block number. +### `internalreturn` (0x26) +Return from an internal call. Pops from the internal call stack and jumps there. -[See in table.](#isa-table-contractsroot) +[See in table.](#isa-table-internalreturn) -- **Category**: historical access +- **Category**: Control Flow - Internal +- **Expression**: `context.machineState.pc = context.machineState.internalCallStack.pop()` +- **Bit-size**: 16 + + +### `INTERNALCALLDEPTH` (0x27) +Depth of the current context's internal call stack + +[See in table.](#isa-table-internalcalldepth) + +- **Category**: Machine State - Control Flow - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 +- **Expression**: `M[dstOffset] = context.machineState.internalCallStack.length` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/CONTRACTSROOT.png)](./images/bit-formats/CONTRACTSROOT.png) -### `MSGSROOT` (0x28) -Get the historical l1-to-l2 message tree root as of the specified block number. +### `SET` (0x28) +Set a memory word from a constant in the bytecode. -[See in table.](#isa-table-msgsroot) +[See in table.](#isa-table-set) -- **Category**: historical access +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. + - **in-tag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 + - **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`) + - **dstOffset**: memory offset specifying where to store the constant +- **Expression**: `M[dstOffset] = const` +- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_! +- **Tag updates**: `T[dstOffset] = in-tag` +- **Bit-size**: 64+N -[![](./images/bit-formats/MSGSROOT.png)](./images/bit-formats/MSGSROOT.png) +[![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png) -### `PUBLICDATAROOT` (0x29) -Get the historical public data tree root as of the specified block number. +### `MOV` (0x29) +Move a word from source memory location to destination`. -[See in table.](#isa-table-publicdataroot) +[See in table.](#isa-table-mov) -- **Category**: historical access +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root` -- **Tag updates**: `T[dstOffset] = field` + - **srcOffset**: memory offset of word to move + - **dstOffset**: memory offset specifying where to store that word +- **Expression**: `M[dstOffset] = M[srcOffset]` +- **Tag updates**: `T[dstOffset] = T[srcOffset]` - **Bit-size**: 88 -[![](./images/bit-formats/PUBLICDATAROOT.png)](./images/bit-formats/PUBLICDATAROOT.png) +[![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png) -### `GLOBALSHASH` (0x2a) -Get the historical global variables hash as of the specified block number. +### `CMOV` (0x2a) +Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). -[See in table.](#isa-table-globalshash) +[See in table.](#isa-table-cmov) -- **Category**: historical access +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input + - **aOffset**: memory offset of word 'a' to conditionally move + - **bOffset**: memory offset of word 'b' to conditionally move + - **condOffset**: memory offset of the operations 'conditional' input - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 +- **Expression**: `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` +- **Details**: One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. +- **Tag updates**: `T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]` +- **Bit-size**: 152 -[![](./images/bit-formats/GLOBALSHASH.png)](./images/bit-formats/GLOBALSHASH.png) +[![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png) -### `BLOCKSROOT` (0x2b) -Get the historical blocks tree root as of the specified block number. +### `BLOCKHEADERBYNUM` (0x2b) +Get the block header as of the specified block number. -[See in table.](#isa-table-blocksroot) +[See in table.](#isa-table-blockheaderbynum) -- **Category**: historical access +- **Category**: World State - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root` -- **Tag updates**: `T[dstOffset] = field` + - **dstOffset**: memory offset specifying where to store operation's result's 0th word +- **Expression**: `M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]` +- **Tag updates**: `T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field` - **Bit-size**: 88 -[![](./images/bit-formats/BLOCKSROOT.png)](./images/bit-formats/BLOCKSROOT.png) -### `GRANDROOT` (0x2c) -Get the historical grandfather tree root as of the specified block number. +### `SLOAD` (0x2c) +Load a word from storage. -[See in table.](#isa-table-grandroot) +[See in table.](#isa-table-sload) -- **Category**: historical access +- **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input + - **slotOffset**: memory offset of the storage slot to load from - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root` +- **Expression**: `M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]` +- **Details**: Load a word from this contract's persistent public storage into memory. - **Tag updates**: `T[dstOffset] = field` - **Bit-size**: 88 -[![](./images/bit-formats/GRANDROOT.png)](./images/bit-formats/GRANDROOT.png) +[![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png) -### `ORIGIN` (0x2d) -Get the transaction's origination address +### `SSTORE` (0x2d) +Write a word to storage. -[See in table.](#isa-table-origin) +[See in table.](#isa-table-sstore) -- **Category**: tx context +- **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.origin` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **srcOffset**: memory offset of the word to store + - **slotOffset**: memory offset containing the storage slot to store to +- **Expression**: `context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]` +- **Details**: Store a word from memory into this contract's persistent public storage. +- **Bit-size**: 88 -[![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png) +[![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png) -### `REFUNDEE` (0x2e) -The recipient of fee refunds for this transaction +### `READL1TOL2MSG` (0x2e) +Reads an L1-to-L2 message -[See in table.](#isa-table-refundee) +[See in table.](#isa-table-readl1tol2msg) -- **Category**: tx context +- **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.refundee` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **msgKeyOffset**: memory offset of the message's key + - **dstOffset**: memory offset to place the 0th word of the message content + - **msgSize**: number of words in the message +- **Expression**: M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset]) +- **Tag updates**: `T[dstOffset:dstOffset+msgSize] = field` +- **Bit-size**: 120 -[![](./images/bit-formats/REFUNDEE.png)](./images/bit-formats/REFUNDEE.png) -### `FEEPERL1GAS` (0x2f) -The fee to be paid per "L1 gas" - set by the transaction's original caller +### `SENDL2TOL1MSG` (0x2f) +Send an L2-to-L1 message -[See in table.](#isa-table-feeperl1gas) +[See in table.](#isa-table-sendl2tol1msg) -- **Category**: tx context +- **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.feePerL1Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **msgOffset**: memory offset of the message content + - **msgSize**: number of words in the message +- **Expression**: l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize]) +- **Bit-size**: 88 -[![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png) +[![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png) -### `FEEPERL2GAS` (0x30) -The fee to be paid per "L2 gas" - set by the transaction's original caller +### `EMITNOTEHASH` (0x30) +Emit a new note hash to be inserted into the notes tree -[See in table.](#isa-table-feeperl2gas) +[See in table.](#isa-table-emitnotehash) -- **Category**: tx context +- **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.feePerL2Gas` -- **Tag updates**: `T[dstOffset] = u32` + - **noteHashOffset**: memory offset of the note hash +- **Expression**: newHashes.append(M[noteHashOffset]) - **Bit-size**: 56 -[![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png) +[![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png) -### `CALLER` (0x31) -Get the address of the sender (the caller's context) +### `EMITNULLIFIER` (0x31) +Emit a new nullifier to be inserted into the nullifier tree -[See in table.](#isa-table-caller) +[See in table.](#isa-table-emitnullifier) -- **Category**: call context +- **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.sender` -- **Tag updates**: `T[dstOffset] = u32` + - **nullifierOffset**: memory offset of nullifier +- **Expression**: nullifiers.append(M[nullifierOffset]) - **Bit-size**: 56 -[![](./images/bit-formats/CALLER.png)](./images/bit-formats/CALLER.png) +[![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png) -### `ADDRESS` (0x32) -Get the address of the currently executing l2 contract +### `ULOG` (0x32) +Emit an unencrypted log with data from the `field` memory page -[See in table.](#isa-table-address) +[See in table.](#isa-table-ulog) -- **Category**: call context +- **Category**: Accrued Substate - Logging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.storageContractAddress` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **logOffset**: memory offset of the data to log + - **logSize**: number of words to log +- **Expression**: `ulog(M[logOffset:logOffset+logSize])` +- **Bit-size**: 88 -[![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png) +[![](./images/bit-formats/ULOG.png)](./images/bit-formats/ULOG.png) -### `PORTAL` (0x33) -Get the address of the l1 portal contract +### `CALL` (0x33) +Call into another contract. -[See in table.](#isa-table-portal) +[See in table.](#isa-table-call) -- **Category**: call context +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.portalAddress` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **gasOffset**: offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee + - **addrOffset**: address of the contract to call + - **argsOffset**: memory offset to args (will become the callee's calldata) + - **argsSize**: number of words to pass via callee's calldata + - **retOffset**: destination memory offset specifying where to store the data returned from the callee + - **retSize**: number of words to copy from data returned by callee + - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) +- **Expression**: + +{`M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + +- **Details**: Creates a new execution context, triggers execution within it, + and then resumes execution in the current/calling context. A non-existent contract or one + with no code will return success. Nested call has an incremented `context.environment.contractCallDepth`. +- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` +- **Tag updates**: + +{`T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field`} + +- **Bit-size**: 248 -[![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png) +[![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png) -### `CALLDEPTH` (0x34) -Get how many calls deep the current call context is +### `STATICCALL` (0x34) +Call into another contract, disallowing World State modifications. -[See in table.](#isa-table-calldepth) +[See in table.](#isa-table-staticcall) -- **Category**: call context +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.calldepth` -- **Details**: Note: security issues with EVM's tx.origin can be resolved by asserting the `calldepth == 0`. -- **Tag updates**: `T[dstOffset] = u8` -- **Bit-size**: 56 + - **gasOffset**: offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee + - **addrOffset**: address of the contract to call + - **argsOffset**: memory offset to args (will become the callee's calldata) + - **argsSize**: number of words to pass via callee's calldata + - **retOffset**: destination memory offset specifying where to store the data returned from the callee + - **retSize**: number of words to copy from data returned by callee + - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) +- **Expression**: + +{`M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + +- **Details**: Same as `CALL`, but the callee is cannot modify World State. +- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` +- **Tag updates**: + +{`T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field`} + +- **Bit-size**: 248 -[![](./images/bit-formats/CALLDEPTH.png)](./images/bit-formats/CALLDEPTH.png) +[![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png) -### `L1GAS` (0x35) -Remaining "L1 gas" for this call (after this instruction). +### `RETURN` (0x35) +Halt execution with `success`, optionally returning some data. -[See in table.](#isa-table-l1gas) +[See in table.](#isa-table-return) -- **Category**: latest context +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = LatestContext.l1Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **retOffset**: memory offset of first word to return + - **retSize**: number of words to return +- **Expression**: `return(M[retOffset:retOffset+retSize])` +- **Details**: Return control flow to the calling context/contract. +- **Bit-size**: 88 -[![](./images/bit-formats/L1GAS.png)](./images/bit-formats/L1GAS.png) +[![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png) -### `L2GAS` (0x36) -Remaining "L2 gas" for this call (after this instruction). +### `REVERT` (0x36) +Halt execution with `failure`, reverting state changes and optionally returning some data. -[See in table.](#isa-table-l2gas) +[See in table.](#isa-table-revert) -- **Category**: latest context +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = LatestContext.l2Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **retOffset**: memory offset of first word to return + - **retSize**: number of words to return +- **Expression**: `revert(M[retOffset:retOffset+retSize])` +- **Details**: Return control flow to the calling context/contract. +- **Bit-size**: 88 -[![](./images/bit-formats/L2GAS.png)](./images/bit-formats/L2GAS.png) +[![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png) From 177c26ad4212a663a3f3de59ef7a70babf0734d2 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 01:44:54 +0000 Subject: [PATCH 03/19] refresh --- yellow-paper/docs/public-vm/avm.md | 18 +- .../docs/public-vm/gen/_InstructionSet.mdx | 434 ++++++++++-------- .../docs/public-vm/instruction-set.mdx | 8 + yellow-paper/docs/public-vm/state-model.md | 20 +- .../InstructionSet/InstructionSet.js | 291 ++++-------- .../preprocess/InstructionSet/genMarkdown.js | 3 +- 6 files changed, 377 insertions(+), 397 deletions(-) diff --git a/yellow-paper/docs/public-vm/avm.md b/yellow-paper/docs/public-vm/avm.md index 669de1f0aa2..f6988dd03f9 100644 --- a/yellow-paper/docs/public-vm/avm.md +++ b/yellow-paper/docs/public-vm/avm.md @@ -22,7 +22,7 @@ A **caller** is a contract call's initiator. The caller of an initial contract c - [**Public contract bytecode**](#public-contract-bytecode) (aka AVM bytecode) - [**Execution context**](#execution-context), outlining the AVM's environment and state -- [**Execution**](#execution), outlining control flow, gas tracking, halting, and reverting +- [**Execution**](#execution), outlining control flow, gas tracking, normal halting, and exceptional halting - [**Initial contract calls**](#initial-contract-calls), outlining the initiation of a contract call from a public execution request - [**Nested contract calls**](#nested-contract-calls), outlining the initiation of a contract call from an instruction as well as the processing of nested execution results, gas refunds, and state reverts @@ -120,7 +120,7 @@ WorldState { contracts: AztecAddress => {bytecode, portalAddress}, // read-only from within AVM blockHeaders: Vector, // read-only from within AVM publicStorage: (AztecAddress, field) => value, // read/write - l1ToL2Messages: (AztecAddress, field) => message, // read-only from within AVM + l1ToL2Messages: field => message, // read-only from within AVM l2ToL1Messages: Vector<[field; ]>, // append-only (no reads) from within AVM noteHashes: Vector, // append-only (no reads) from within AVM nullifiers: Vector, // append-only (no reads) from within AVM @@ -216,7 +216,7 @@ machineState.daGasLeft = 0 An instruction's gas cost is meant to reflect the computational cost of generating a proof of its correct execution. For some instructions, this computational cost changes based on inputs. Here are some examples and important notes: - [`JUMP`](./instruction-set/#isa-section-jump) is an example of an instruction with constant gas cost. Regardless of its inputs, the instruction always incurs the same `l1GasCost`, `l2GasCost`, and `daGasCost`. -- The [`SET`](./instruction-set/#isa-section-set) instruction operates on a different sized constant (based on its `dst-type`). Therefore, this instruction's gas cost increases with the size of its input. +- The [`SET`](./instruction-set/#isa-section-set) instruction operates on a different sized constant (based on its `dstTag`). Therefore, this instruction's gas cost increases with the size of its input. - Instructions that operate on a data range of a specified "size" scale in cost with that size. An example of this is the [`CALLDATACOPY`](./instruction-set/#isa-section-calldatacopy) argument which copies `copySize` words from `environment.calldata` to `machineState.memory`. - The [`CALL`](./instruction-set/#isa-section-call)/[`STATICCALL`](./instruction-set/#isa-section-call)/`DELEGATECALL` instruction's gas cost is determined by its `*Gas` arguments, but any gas unused by the nested contract call's execution is refunded after its completion ([more on this later](#updating-the-calling-context-after-nested-call-halts)). - An instruction with "offset" arguments (like [`ADD`](./instruction-set/#isa-section-add) and many others), has increased cost for each offset argument that is flagged as "indirect". @@ -225,11 +225,11 @@ An instruction's gas cost is meant to reflect the computational cost of generati > An instruction's gas cost takes into account the costs of associated downstream computations. An instruction that triggers accesses to the public data tree (`SLOAD`/`SSTORE`) incurs a cost that accounts for state access validation in later circuits (public kernel or rollup). A contract call instruction (`CALL`/`STATICCALL`/`DELEGATECALL`) incurs a cost accounting for the nested call's complete execution as well as any work required by the public kernel circuit for this additional call. -## Halting +### Halting A context's execution can end with a **normal halt** or **exceptional halt**. A halt ends execution within the current context and returns control flow to the calling context. -### Normal halting +#### Normal halting A normal halt occurs when the VM encounters an explicit halting instruction ([`RETURN`](./instruction-set#isa-section-return) or [`REVERT`](./instruction-set#isa-section-revert)). Such instructions consume gas normally and optionally initialize some output data before finally halting the current context's execution. @@ -245,7 +245,7 @@ results.output = machineState.memory[instr.args.retOffset:instr.args.retOffset+i > `results.output` is only relevant when the caller is a contract call itself. In other words, it is only relevant for [nested contract calls](#nested-contract-calls). When an [initial contract call](#initial-contract-calls) (initiated by a public execution request) halts normally, its `results.output` is ignored. -### Exceptional halting +#### Exceptional halting An exceptional halt is not explicitly triggered by an instruction but instead occurs when an exceptional condition is met. @@ -351,7 +351,7 @@ context = AvmContext { worldState = , journal = INITIAL_JOURNAL, accruedSubstate = INITIAL_ACCRUED_SUBSTATE, - results = INITIAL_MESSAGE_CALL_RESULTS, + results = INITIAL_CONTRACT_CALL_RESULTS, } ``` @@ -400,7 +400,7 @@ INITIAL_ACCRUED_SUBSTATE = AccruedSubstate { unencryptedLogs = [], // initialized as empty } -INITIAL_MESSAGE_CALL_RESULTS = ContractCallResults { +INITIAL_CONTRACT_CALL_RESULTS = ContractCallResults { reverted = false, output = [], // initialized as empty } @@ -421,7 +421,7 @@ nestedContext = AvmContext { worldState: callingContext.worldState, journal: callingContext.journal, accruedSubstate: INITIAL_ACCRUED_SUBSTATE, - results: INITIAL_MESSAGE_CALL_RESULTS, + results: INITIAL_CONTRACT_CALL_RESULTS, } ``` diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index 75da1ddf194..33dba9f514f 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -122,7 +122,7 @@ Click on an instruction name to jump to its section. Type cast 96 { - `M[dstOffset] = cast(M[aOffset])` + `M[dstOffset] = cast(M[aOffset])` } @@ -167,7 +167,7 @@ Click on an instruction name to jump to its section. 0x13 [`FEEPERL1GAS`](#isa-section-feeperl1gas) - The fee to be paid per "L1 gas" - constant for entire transaction + Get the fee to be paid per "L1 gas" - constant for entire transaction 56 { `M[dstOffset] = context.environment.feePerL1Gas` @@ -175,7 +175,7 @@ Click on an instruction name to jump to its section. 0x14 [`FEEPERL2GAS`](#isa-section-feeperl2gas) - The fee to be paid per "L2 gas" - constant for entire transaction + Get the fee to be paid per "L2 gas" - constant for entire transaction 56 { `M[dstOffset] = context.environment.feePerL2Gas` @@ -183,7 +183,7 @@ Click on an instruction name to jump to its section. 0x15 [`FEEPERDAGAS`](#isa-section-feeperdagas) - The fee to be paid per "DA gas" - constant for entire transaction + Get the fee to be paid per "DA gas" - constant for entire transaction 56 { `M[dstOffset] = context.environment.feePerDaGas` @@ -263,7 +263,7 @@ Click on an instruction name to jump to its section. 0x1f [`CALLDATACOPY`](#isa-section-calldatacopy) - Copy calldata into memory. + Copy calldata into memory 120 { `M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]` @@ -271,7 +271,7 @@ Click on an instruction name to jump to its section. 0x20 [`L1GASLEFT`](#isa-section-l1gasleft) - Remaining "L1 gas" for this call (after this instruction). + Remaining "L1 gas" for this call (after this instruction) 56 { `M[dstOffset] = context.machineState.l1GasLeft` @@ -279,7 +279,7 @@ Click on an instruction name to jump to its section. 0x21 [`L2GASLEFT`](#isa-section-l2gasleft) - Remaining "L2 gas" for this call (after this instruction). + Remaining "L2 gas" for this call (after this instruction) 56 { `M[dstOffset] = context.MachineState.l2GasLeft` @@ -287,7 +287,7 @@ Click on an instruction name to jump to its section. 0x22 [`DAGASLEFT`](#isa-section-dagasleft) - Remaining "DA gas" for this call (after this instruction). + Remaining "DA gas" for this call (after this instruction) 56 { `M[dstOffset] = context.machineState.daGasLeft` @@ -295,7 +295,7 @@ Click on an instruction name to jump to its section. 0x23 [`JUMP`](#isa-section-jump) - Jump to a location in the bytecode. + Jump to a location in the bytecode 48 { `context.machineState.pc = loc` @@ -303,7 +303,7 @@ Click on an instruction name to jump to its section. 0x24 [`JUMPI`](#isa-section-jumpi) - Conditionally jump to a location in the bytecode. + Conditionally jump to a location in the bytecode 88 { `context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc` @@ -311,7 +311,7 @@ Click on an instruction name to jump to its section. 0x25 [`internalcall`](#isa-section-internalcall) - Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location. + Make an internal call. Push the current PC to the internal call stack and jump to the target location. 48 {`context.machineState.internalCallStack.push(context.machineState.pc) @@ -319,8 +319,8 @@ context.machineState.pc = loc`} - 0x26 [`internalreturn`](#isa-section-internalreturn) - Return from an internal call. Pops from the internal call stack and jumps there. + 0x26 [`INTERNALRETURN`](#isa-section-internalreturn) + Return from an internal call. Pop from the internal call stack and jump to the popped location. 16 { `context.machineState.pc = context.machineState.internalCallStack.pop()` @@ -328,7 +328,7 @@ context.machineState.pc = loc`} 0x27 [`INTERNALCALLDEPTH`](#isa-section-internalcalldepth) - Depth of the current context's internal call stack + Get the depth of the current context's internal call stack 56 { `M[dstOffset] = context.machineState.internalCallStack.length` @@ -336,7 +336,7 @@ context.machineState.pc = loc`} 0x28 [`SET`](#isa-section-set) - Set a memory word from a constant in the bytecode. + Set a memory word from a constant in the bytecode 64+N { `M[dstOffset] = const` @@ -344,7 +344,7 @@ context.machineState.pc = loc`} 0x29 [`MOV`](#isa-section-mov) - Move a word from source memory location to destination`. + Move a word from source memory location to destination 88 { `M[dstOffset] = M[srcOffset]` @@ -352,7 +352,7 @@ context.machineState.pc = loc`} 0x2a [`CMOV`](#isa-section-cmov) - Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). + Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`) 152 { `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` @@ -360,7 +360,7 @@ context.machineState.pc = loc`} 0x2b [`BLOCKHEADERBYNUM`](#isa-section-blockheaderbynum) - Get the block header as of the specified block number. + Get the block header as of the specified block number 88 { `M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]` @@ -368,55 +368,63 @@ context.machineState.pc = loc`} 0x2c [`SLOAD`](#isa-section-sload) - Load a word from storage. + Load a word from storage 88 { - `M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]` + `M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]` } 0x2d [`SSTORE`](#isa-section-sstore) - Write a word to storage. + Write a word to storage 88 { - `context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]` + `context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]` } 0x2e [`READL1TOL2MSG`](#isa-section-readl1tol2msg) Reads an L1-to-L2 message 120 - M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset]) + { + `M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])` + } 0x2f [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) Send an L2-to-L1 message 88 - l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize]) + { + `context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])` + } 0x30 [`EMITNOTEHASH`](#isa-section-emitnotehash) Emit a new note hash to be inserted into the notes tree 56 - newHashes.append(M[noteHashOffset]) + { + `context.worldState.newHashes.append(M[noteHashOffset])` + } 0x31 [`EMITNULLIFIER`](#isa-section-emitnullifier) Emit a new nullifier to be inserted into the nullifier tree 56 - nullifiers.append(M[nullifierOffset]) + { + `context.worldState.nullifiers.append(M[nullifierOffset])` + } - 0x32 [`ULOG`](#isa-section-ulog) - Emit an unencrypted log with data from the `field` memory page + 0x32 [`EMITUNENCRYPTEDLOG`](#isa-section-emitunencryptedlog) + Emit an unencrypted log 88 { - `ulog(M[logOffset:logOffset+logSize])` + `context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])` } 0x33 [`CALL`](#isa-section-call) - Call into another contract. + Call into another contract 248 {`M[successOffset] = call( @@ -428,7 +436,7 @@ context.machineState.pc = loc`} 0x34 [`STATICCALL`](#isa-section-staticcall) - Call into another contract, disallowing World State modifications. + Call into another contract, disallowing World State and Accrued Substate modifications 248 {`M[successOffset] = staticcall( @@ -440,307 +448,325 @@ context.machineState.pc = loc`} 0x35 [`RETURN`](#isa-section-return) - Halt execution with `success`, optionally returning some data. + Halt execution within this context (without revert), optionally returning some data 88 - { - `return(M[retOffset:retOffset+retSize])` - } + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt`} + 0x36 [`REVERT`](#isa-section-revert) - Halt execution with `failure`, reverting state changes and optionally returning some data. + Halt execution within this context as `reverted`, optionally returning some data 88 - { - `revert(M[retOffset:retOffset+retSize])` - } + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt`} + ## Instructions -### `ADD` (0x00) +### `ADD` Addition (a + b) [See in table.](#isa-table-add) +- **Opcode**: 0x00 - **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/ADD.png)](./images/bit-formats/ADD.png) -### `SUB` (0x01) +### `SUB` Subtraction (a - b) [See in table.](#isa-table-sub) +- **Opcode**: 0x01 - **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SUB.png)](./images/bit-formats/SUB.png) -### `MUL` (0x02) +### `MUL` Multiplication (a * b) [See in table.](#isa-table-mul) +- **Opcode**: 0x02 - **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 -### `DIV` (0x03) +### `DIV` Unsigned division (a / b) [See in table.](#isa-table-div) +- **Opcode**: 0x03 - **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] / M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/DIV.png)](./images/bit-formats/DIV.png) -### `EQ` (0x04) +### `EQ` Equality check (a == b) [See in table.](#isa-table-eq) +- **Opcode**: 0x04 - **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/EQ.png)](./images/bit-formats/EQ.png) -### `LT` (0x05) +### `LT` Less-than check (a < b) [See in table.](#isa-table-lt) +- **Opcode**: 0x05 - **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/LT.png)](./images/bit-formats/LT.png) -### `LTE` (0x06) +### `LTE` Less-than-or-equals check (a <= b) [See in table.](#isa-table-lte) +- **Opcode**: 0x06 - **Category**: Compute - Conditionals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/LTE.png)](./images/bit-formats/LTE.png) -### `AND` (0x07) +### `AND` Bitwise AND (a & b) [See in table.](#isa-table-and) +- **Opcode**: 0x07 - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] AND M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/AND.png)](./images/bit-formats/AND.png) -### `OR` (0x08) +### `OR` Bitwise OR (a | b) [See in table.](#isa-table-or) +- **Opcode**: 0x08 - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] OR M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/OR.png)](./images/bit-formats/OR.png) -### `XOR` (0x09) +### `XOR` Bitwise XOR (a ^ b) [See in table.](#isa-table-xor) +- **Opcode**: 0x09 - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] XOR M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/XOR.png)](./images/bit-formats/XOR.png) -### `NOT` (0x0a) +### `NOT` Bitwise NOT (inversion) [See in table.](#isa-table-not) +- **Opcode**: 0x0a - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = NOT M[aOffset]` -- **Tag checks**: `T[aOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 96 [![](./images/bit-formats/NOT.png)](./images/bit-formats/NOT.png) -### `SHL` (0x0b) +### `SHL` Bitwise leftward shift (a << b) [See in table.](#isa-table-shl) +- **Opcode**: 0x0b - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] << M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SHL.png)](./images/bit-formats/SHL.png) -### `SHR` (0x0c) +### `SHR` Bitwise rightward shift (a >> b) [See in table.](#isa-table-shr) +- **Opcode**: 0x0c - **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] >> M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SHR.png)](./images/bit-formats/SHR.png) -### `CAST` (0x0d) +### `CAST` Type cast [See in table.](#isa-table-cast) +- **Opcode**: 0x0d - **Category**: Type Conversions - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **dst-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against. + - **dstTag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against. - **Args**: - **aOffset**: memory offset of word to cast - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = cast(M[aOffset])` -- **Details**: Cast a word in memory based on the `dst-tag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details. -- **Tag updates**: `T[dstOffset] = dst-tag` +- **Expression**: `M[dstOffset] = cast(M[aOffset])` +- **Details**: Cast a word in memory based on the `dstTag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details. +- **Tag updates**: `T[dstOffset] = dstTag` - **Bit-size**: 96 [![](./images/bit-formats/CAST.png)](./images/bit-formats/CAST.png) -### `ADDRESS` (0x0e) +### `ADDRESS` Get the address of the currently executing l2 contract [See in table.](#isa-table-address) +- **Opcode**: 0x0e - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -752,11 +778,12 @@ Get the address of the currently executing l2 contract [![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png) -### `STORAGEADDRESS` (0x0f) +### `STORAGEADDRESS` Get the _storage_ address of the currently executing context [See in table.](#isa-table-storageaddress) +- **Opcode**: 0x0f - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -768,11 +795,12 @@ Get the _storage_ address of the currently executing context - **Bit-size**: 56 -### `ORIGIN` (0x10) +### `ORIGIN` Get the transaction's origination address [See in table.](#isa-table-origin) +- **Opcode**: 0x10 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -784,11 +812,12 @@ Get the transaction's origination address [![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png) -### `SENDER` (0x11) +### `SENDER` Get the address of the sender (caller of the current context) [See in table.](#isa-table-sender) +- **Opcode**: 0x11 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -799,11 +828,12 @@ Get the address of the sender (caller of the current context) - **Bit-size**: 56 -### `PORTAL` (0x12) +### `PORTAL` Get the address of the l1 portal contract [See in table.](#isa-table-portal) +- **Opcode**: 0x12 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -815,11 +845,12 @@ Get the address of the l1 portal contract [![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png) -### `FEEPERL1GAS` (0x13) -The fee to be paid per "L1 gas" - constant for entire transaction +### `FEEPERL1GAS` +Get the fee to be paid per "L1 gas" - constant for entire transaction [See in table.](#isa-table-feeperl1gas) +- **Opcode**: 0x13 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -831,11 +862,12 @@ The fee to be paid per "L1 gas" - constant for entire transaction [![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png) -### `FEEPERL2GAS` (0x14) -The fee to be paid per "L2 gas" - constant for entire transaction +### `FEEPERL2GAS` +Get the fee to be paid per "L2 gas" - constant for entire transaction [See in table.](#isa-table-feeperl2gas) +- **Opcode**: 0x14 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -847,11 +879,12 @@ The fee to be paid per "L2 gas" - constant for entire transaction [![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png) -### `FEEPERDAGAS` (0x15) -The fee to be paid per "DA gas" - constant for entire transaction +### `FEEPERDAGAS` +Get the fee to be paid per "DA gas" - constant for entire transaction [See in table.](#isa-table-feeperdagas) +- **Opcode**: 0x15 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -862,11 +895,12 @@ The fee to be paid per "DA gas" - constant for entire transaction - **Bit-size**: 56 -### `CONTRACTCALLDEPTH` (0x16) +### `CONTRACTCALLDEPTH` Get how many contract calls deep the current call context is [See in table.](#isa-table-contractcalldepth) +- **Opcode**: 0x16 - **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -878,11 +912,12 @@ Get how many contract calls deep the current call context is - **Bit-size**: 56 -### `CHAINID` (0x17) +### `CHAINID` Get this rollup's L1 chain ID [See in table.](#isa-table-chainid) +- **Opcode**: 0x17 - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -894,11 +929,12 @@ Get this rollup's L1 chain ID [![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png) -### `VERSION` (0x18) +### `VERSION` Get this rollup's L2 version ID [See in table.](#isa-table-version) +- **Opcode**: 0x18 - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -910,11 +946,12 @@ Get this rollup's L2 version ID [![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png) -### `BLOCKNUMBER` (0x19) +### `BLOCKNUMBER` Get this L2 block's number [See in table.](#isa-table-blocknumber) +- **Opcode**: 0x19 - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -926,11 +963,12 @@ Get this L2 block's number [![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png) -### `TIMESTAMP` (0x1a) +### `TIMESTAMP` Get this L2 block's timestamp [See in table.](#isa-table-timestamp) +- **Opcode**: 0x1a - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -942,11 +980,12 @@ Get this L2 block's timestamp [![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png) -### `COINBASE` (0x1b) +### `COINBASE` Get the block's beneficiary address [See in table.](#isa-table-coinbase) +- **Opcode**: 0x1b - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -958,11 +997,12 @@ Get the block's beneficiary address [![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png) -### `BLOCKL1GASLIMIT` (0x1c) +### `BLOCKL1GASLIMIT` Total amount of "L1 gas" that a block can consume [See in table.](#isa-table-blockl1gaslimit) +- **Opcode**: 0x1c - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -974,11 +1014,12 @@ Total amount of "L1 gas" that a block can consume [![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png) -### `BLOCKL2GASLIMIT` (0x1d) +### `BLOCKL2GASLIMIT` Total amount of "L2 gas" that a block can consume [See in table.](#isa-table-blockl2gaslimit) +- **Opcode**: 0x1d - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -990,11 +1031,12 @@ Total amount of "L2 gas" that a block can consume [![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png) -### `BLOCKDAGASLIMIT` (0x1e) +### `BLOCKDAGASLIMIT` Total amount of "DA gas" that a block can consume [See in table.](#isa-table-blockdagaslimit) +- **Opcode**: 0x1e - **Category**: Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1005,11 +1047,12 @@ Total amount of "DA gas" that a block can consume - **Bit-size**: 56 -### `CALLDATACOPY` (0x1f) -Copy calldata into memory. +### `CALLDATACOPY` +Copy calldata into memory [See in table.](#isa-table-calldatacopy) +- **Opcode**: 0x1f - **Category**: Execution Environment - Calldata - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1024,11 +1067,12 @@ Copy calldata into memory. [![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png) -### `L1GASLEFT` (0x20) -Remaining "L1 gas" for this call (after this instruction). +### `L1GASLEFT` +Remaining "L1 gas" for this call (after this instruction) [See in table.](#isa-table-l1gasleft) +- **Opcode**: 0x20 - **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1039,11 +1083,12 @@ Remaining "L1 gas" for this call (after this instruction). - **Bit-size**: 56 -### `L2GASLEFT` (0x21) -Remaining "L2 gas" for this call (after this instruction). +### `L2GASLEFT` +Remaining "L2 gas" for this call (after this instruction) [See in table.](#isa-table-l2gasleft) +- **Opcode**: 0x21 - **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1054,11 +1099,12 @@ Remaining "L2 gas" for this call (after this instruction). - **Bit-size**: 56 -### `DAGASLEFT` (0x22) -Remaining "DA gas" for this call (after this instruction). +### `DAGASLEFT` +Remaining "DA gas" for this call (after this instruction) [See in table.](#isa-table-dagasleft) +- **Opcode**: 0x22 - **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1069,11 +1115,12 @@ Remaining "DA gas" for this call (after this instruction). - **Bit-size**: 56 -### `JUMP` (0x23) -Jump to a location in the bytecode. +### `JUMP` +Jump to a location in the bytecode [See in table.](#isa-table-jump) +- **Opcode**: 0x23 - **Category**: Control Flow - Internal - **Args**: - **loc**: target location to jump to @@ -1083,11 +1130,12 @@ Jump to a location in the bytecode. [![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png) -### `JUMPI` (0x24) -Conditionally jump to a location in the bytecode. +### `JUMPI` +Conditionally jump to a location in the bytecode [See in table.](#isa-table-jumpi) +- **Opcode**: 0x24 - **Category**: Control Flow - Internal - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1100,11 +1148,12 @@ Conditionally jump to a location in the bytecode. [![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) -### `internalcall` (0x25) -Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location. +### `internalcall` +Make an internal call. Push the current PC to the internal call stack and jump to the target location. [See in table.](#isa-table-internalcall) +- **Opcode**: 0x25 - **Category**: Control Flow - Internal - **Args**: - **loc**: target location to jump/call to @@ -1117,21 +1166,23 @@ context.machineState.pc = loc`} - **Bit-size**: 48 -### `internalreturn` (0x26) -Return from an internal call. Pops from the internal call stack and jumps there. +### `INTERNALRETURN` +Return from an internal call. Pop from the internal call stack and jump to the popped location. [See in table.](#isa-table-internalreturn) +- **Opcode**: 0x26 - **Category**: Control Flow - Internal - **Expression**: `context.machineState.pc = context.machineState.internalCallStack.pop()` - **Bit-size**: 16 -### `INTERNALCALLDEPTH` (0x27) -Depth of the current context's internal call stack +### `INTERNALCALLDEPTH` +Get the depth of the current context's internal call stack [See in table.](#isa-table-internalcalldepth) +- **Opcode**: 0x27 - **Category**: Machine State - Control Flow - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1142,30 +1193,32 @@ Depth of the current context's internal call stack - **Bit-size**: 56 -### `SET` (0x28) -Set a memory word from a constant in the bytecode. +### `SET` +Set a memory word from a constant in the bytecode [See in table.](#isa-table-set) +- **Opcode**: 0x28 - **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. + - **inTag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. - **Args**: - **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`) - **dstOffset**: memory offset specifying where to store the constant - **Expression**: `M[dstOffset] = const` -- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_! -- **Tag updates**: `T[dstOffset] = in-tag` +- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `inTag`. It _cannot be 254 (`field` type)_! +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 64+N [![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png) -### `MOV` (0x29) -Move a word from source memory location to destination`. +### `MOV` +Move a word from source memory location to destination [See in table.](#isa-table-mov) +- **Opcode**: 0x29 - **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1178,11 +1231,12 @@ Move a word from source memory location to destination`. [![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png) -### `CMOV` (0x2a) -Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). +### `CMOV` +Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`) [See in table.](#isa-table-cmov) +- **Opcode**: 0x2a - **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1198,11 +1252,12 @@ Move a word (conditionally chosen) from one memory location to another (`d = con [![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png) -### `BLOCKHEADERBYNUM` (0x2b) -Get the block header as of the specified block number. +### `BLOCKHEADERBYNUM` +Get the block header as of the specified block number [See in table.](#isa-table-blockheaderbynum) +- **Opcode**: 0x2b - **Category**: World State - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1214,46 +1269,49 @@ Get the block header as of the specified block number. - **Bit-size**: 88 -### `SLOAD` (0x2c) -Load a word from storage. +### `SLOAD` +Load a word from storage [See in table.](#isa-table-sload) +- **Opcode**: 0x2c - **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **slotOffset**: memory offset of the storage slot to load from - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]` +- **Expression**: `M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]` - **Details**: Load a word from this contract's persistent public storage into memory. - **Tag updates**: `T[dstOffset] = field` - **Bit-size**: 88 [![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png) -### `SSTORE` (0x2d) -Write a word to storage. +### `SSTORE` +Write a word to storage [See in table.](#isa-table-sstore) +- **Opcode**: 0x2d - **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **srcOffset**: memory offset of the word to store - **slotOffset**: memory offset containing the storage slot to store to -- **Expression**: `context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]` +- **Expression**: `context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]` - **Details**: Store a word from memory into this contract's persistent public storage. - **Bit-size**: 88 [![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png) -### `READL1TOL2MSG` (0x2e) +### `READL1TOL2MSG` Reads an L1-to-L2 message [See in table.](#isa-table-readl1tol2msg) +- **Opcode**: 0x2e - **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1261,78 +1319,82 @@ Reads an L1-to-L2 message - **msgKeyOffset**: memory offset of the message's key - **dstOffset**: memory offset to place the 0th word of the message content - **msgSize**: number of words in the message -- **Expression**: M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset]) +- **Expression**: `M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])` - **Tag updates**: `T[dstOffset:dstOffset+msgSize] = field` - **Bit-size**: 120 -### `SENDL2TOL1MSG` (0x2f) +### `SENDL2TOL1MSG` Send an L2-to-L1 message [See in table.](#isa-table-sendl2tol1msg) +- **Opcode**: 0x2f - **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **msgOffset**: memory offset of the message content - **msgSize**: number of words in the message -- **Expression**: l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize]) +- **Expression**: `context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])` - **Bit-size**: 88 [![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png) -### `EMITNOTEHASH` (0x30) +### `EMITNOTEHASH` Emit a new note hash to be inserted into the notes tree [See in table.](#isa-table-emitnotehash) +- **Opcode**: 0x30 - **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **noteHashOffset**: memory offset of the note hash -- **Expression**: newHashes.append(M[noteHashOffset]) +- **Expression**: `context.worldState.newHashes.append(M[noteHashOffset])` - **Bit-size**: 56 [![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png) -### `EMITNULLIFIER` (0x31) +### `EMITNULLIFIER` Emit a new nullifier to be inserted into the nullifier tree [See in table.](#isa-table-emitnullifier) +- **Opcode**: 0x31 - **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **nullifierOffset**: memory offset of nullifier -- **Expression**: nullifiers.append(M[nullifierOffset]) +- **Expression**: `context.worldState.nullifiers.append(M[nullifierOffset])` - **Bit-size**: 56 [![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png) -### `ULOG` (0x32) -Emit an unencrypted log with data from the `field` memory page +### `EMITUNENCRYPTEDLOG` +Emit an unencrypted log -[See in table.](#isa-table-ulog) +[See in table.](#isa-table-emitunencryptedlog) +- **Opcode**: 0x32 - **Category**: Accrued Substate - Logging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **logOffset**: memory offset of the data to log - **logSize**: number of words to log -- **Expression**: `ulog(M[logOffset:logOffset+logSize])` +- **Expression**: `context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])` - **Bit-size**: 88 -[![](./images/bit-formats/ULOG.png)](./images/bit-formats/ULOG.png) -### `CALL` (0x33) -Call into another contract. +### `CALL` +Call into another contract [See in table.](#isa-table-call) +- **Opcode**: 0x33 - **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1352,9 +1414,9 @@ Call into another contract. M[argsOffset], M[argsSize], M[retOffset], M[retSize])`} -- **Details**: Creates a new execution context, triggers execution within it, - and then resumes execution in the current/calling context. A non-existent contract or one - with no code will return success. Nested call has an incremented `context.environment.contractCallDepth`. +- **Details**: Creates a new (nested) execution context and triggers execution within it until the nested context halts. + Then resumes execution in the current/calling context. A non-existent contract or one + with no code will return success. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. - **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` - **Tag updates**: @@ -1365,11 +1427,12 @@ T[retOffset:retOffset+retSize] = field`} [![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png) -### `STATICCALL` (0x34) -Call into another contract, disallowing World State modifications. +### `STATICCALL` +Call into another contract, disallowing World State and Accrued Substate modifications [See in table.](#isa-table-staticcall) +- **Opcode**: 0x34 - **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. @@ -1389,7 +1452,7 @@ Call into another contract, disallowing World State modifications. M[argsOffset], M[argsSize], M[retOffset], M[retSize])`} -- **Details**: Same as `CALL`, but the callee is cannot modify World State. +- **Details**: Same as `CALL`, but disallows World State and Accrued Substate modifications. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. - **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` - **Tag updates**: @@ -1400,36 +1463,47 @@ T[retOffset:retOffset+retSize] = field`} [![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png) -### `RETURN` (0x35) -Halt execution with `success`, optionally returning some data. +### `RETURN` +Halt execution within this context (without revert), optionally returning some data [See in table.](#isa-table-return) +- **Opcode**: 0x35 - **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **retOffset**: memory offset of first word to return - **retSize**: number of words to return -- **Expression**: `return(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. +- **Expression**: + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt`} + +- **Details**: Return control flow to the calling context/contract. Caller will accept World State and Accrued Substate modifications. See ["Halting"](./avm#halting) to learn more. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. - **Bit-size**: 88 [![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png) -### `REVERT` (0x36) -Halt execution with `failure`, reverting state changes and optionally returning some data. +### `REVERT` +Halt execution within this context as `reverted`, optionally returning some data [See in table.](#isa-table-revert) +- **Opcode**: 0x36 - **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **retOffset**: memory offset of first word to return - **retSize**: number of words to return -- **Expression**: `revert(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. +- **Expression**: + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt`} + +- **Details**: Return control flow to the calling context/contract. Caller will reject World State and Accrued Substate modifications. See ["Halting"](./avm#halting) to learn more. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. - **Bit-size**: 88 [![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png) diff --git a/yellow-paper/docs/public-vm/instruction-set.mdx b/yellow-paper/docs/public-vm/instruction-set.mdx index ce5eb82ffc9..1693295d2de 100644 --- a/yellow-paper/docs/public-vm/instruction-set.mdx +++ b/yellow-paper/docs/public-vm/instruction-set.mdx @@ -1,5 +1,13 @@ # Instruction Set +This page lists all of the instructions supported by the Aztec Virtual Machine (AVM). + +The following notes are relevant to the table and sections below: +- `M[offset]` notation is shorthand for `context.machineState.memory[offset]` +- Any instruction whose description does not mention a program counter change simply increments it: `context.machineState.pc++` +- All instructions update `context.machineState.*GasLeft` as detailed in ["Gas limits and tracking"](./avm#gas-limits-and-tracking) +- Any instruction can lead to an exceptional halt as specified in ["Exceptional halting"](./avm#exceptional-halting) + import GeneratedInstructionSet from "./gen/_InstructionSet.mdx"; diff --git a/yellow-paper/docs/public-vm/state-model.md b/yellow-paper/docs/public-vm/state-model.md index a52bbbe7504..d6087cba3e8 100644 --- a/yellow-paper/docs/public-vm/state-model.md +++ b/yellow-paper/docs/public-vm/state-model.md @@ -52,11 +52,11 @@ Memory addresses must be tagged to be a `u32` type. - `M[X]`: main memory cell at offset `X` - `tag`: a value referring to a memory cell's type (its maximum potential value) - `T[X]`: the tag associated with memory cell at offset `X` -- `in-tag`: an instruction's tag to check input operands against. Present for many but not all instructions. -- `dst-tag`: the target type of a `CAST` instruction, also used to tag the destination memory cell -- `ADD`: shorthand for an `ADD` instruction with `in-tag = X` -- `ADD aOffset bOffset dstOffset`: an full `ADD` instruction with `in-tag = X`. See [here](./instruction-set#isa-section-add) for more details. -- `CAST`: a `CAST` instruction with `dst-tag`: `X`. `CAST` is the only instruction with a `dst-tag`. See [here](./instruction-set#isa-section-cast) for more details. +- `inTag`: an instruction's tag to check input operands against. Present for many but not all instructions. +- `dstTag`: the target type of a `CAST` instruction, also used to tag the destination memory cell +- `ADD`: shorthand for an `ADD` instruction with `inTag = X` +- `ADD aOffset bOffset dstOffset`: an full `ADD` instruction with `inTag = X`. See [here](./instruction-set#isa-section-add) for more details. +- `CAST`: a `CAST` instruction with `dstTag`: `X`. `CAST` is the only instruction with a `dstTag`. See [here](./instruction-set#isa-section-cast) for more details. ### Tags and tagged memory @@ -80,7 +80,7 @@ The purpose of a tag is to inform the VM of the maximum possible length of an op #### Checking input operand tags -Many AVM instructions explicitly operate over range-constrained input parameters (e.g. `ADD`). The maximum allowable value for an instruction's input parameters is defined via an `in-tag` (instruction/input tag). Two potential scenarios result: +Many AVM instructions explicitly operate over range-constrained input parameters (e.g. `ADD`). The maximum allowable value for an instruction's input parameters is defined via an `inTag` (instruction/input tag). Two potential scenarios result: 1. A VM instruction's tag value matches the input parameter tag values 2. A VM instruction's tag value does _not_ match the input parameter tag values @@ -95,8 +95,8 @@ It is required that all VM instructions that write into main memory explicitly d ``` # ADD aOffset bOffset dstOffset -assert T[aOffset] == T[bOffset] == u32 // check inputs against in-tag, revert on mismatch -T[dstOffset] = u32 // tag destination with in-tag +assert T[aOffset] == T[bOffset] == u32 // check inputs against inTag, revert on mismatch +T[dstOffset] = u32 // tag destination with inTag M[dstOffset] = M[aOffset] + M[bOffset] // perform the addition ``` @@ -110,7 +110,7 @@ T[dstOffset] = T[srcOffset] // preserve tag M[dstOffset] = M[srcOffset] // perform the move ``` -Note that `MOV` does not have an `in-tag` and therefore does not need to make any assertions regarding the source memory cell's type. +Note that `MOV` does not have an `inTag` and therefore does not need to make any assertions regarding the source memory cell's type. #### `CAST` and tag conversions @@ -125,7 +125,7 @@ Case 2 is trivial as no additional consistency checks must be performed between ``` # CAST srcOffset dstOffset -T[dstOffset] = u64 // tag destination with dst-tag +T[dstOffset] = u64 // tag destination with dstTag M[dstOffset] = cast(M[srcOffset]) // perform cast ``` diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index 97a0159486a..682ba164b5a 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -18,10 +18,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -30,8 +28,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k`", "Summary": "Addition (a + b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "sub", @@ -39,10 +37,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -51,8 +47,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k`", "Summary": "Subtraction (a - b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "mul", @@ -60,10 +56,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -72,8 +66,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k`", "Summary": "Multiplication (a * b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "div", @@ -81,10 +75,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -93,8 +85,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] / M[bOffset]`", "Summary": "Unsigned division (a / b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "eq", @@ -102,10 +94,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -114,8 +104,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0`", "Summary": "Equality check (a == b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "lt", @@ -123,10 +113,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -135,8 +123,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0`", "Summary": "Less-than check (a < b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "lte", @@ -144,10 +132,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Conditionals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -156,8 +142,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0`", "Summary": "Less-than-or-equals check (a <= b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "and", @@ -165,10 +151,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -177,8 +161,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] AND M[bOffset]`", "Summary": "Bitwise AND (a & b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "or", @@ -186,10 +170,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -198,8 +180,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] OR M[bOffset]`", "Summary": "Bitwise OR (a | b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "xor", @@ -207,10 +189,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -219,8 +199,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] XOR M[bOffset]`", "Summary": "Bitwise XOR (a ^ b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "not", @@ -228,10 +208,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, @@ -239,8 +217,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = NOT M[aOffset]`", "Summary": "Bitwise NOT (inversion)", "Details": "", - "Tag checks": "`T[aOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "shl", @@ -248,10 +226,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -260,8 +236,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] << M[bOffset]`", "Summary": "Bitwise leftward shift (a << b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "shr", @@ -269,10 +245,8 @@ const INSTRUCTION_SET_RAW = [ "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -281,8 +255,8 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] >> M[bOffset]`", "Summary": "Bitwise rightward shift (a >> b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "cast", @@ -290,19 +264,17 @@ const INSTRUCTION_SET_RAW = [ "Category": "Type Conversions", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "dst-tag", "description": DST_TAG_DESCRIPTION}, + {"name": "dstTag", "description": DST_TAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of word to cast"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = cast(M[aOffset])`", + "Expression": "`M[dstOffset] = cast(M[aOffset])`", "Summary": "Type cast", - "Details": "Cast a word in memory based on the `dst-tag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details.", + "Details": "Cast a word in memory based on the `dstTag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = dst-tag`", + "Tag updates": "`T[dstOffset] = dstTag`", }, { "id": "address", @@ -311,8 +283,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -329,8 +299,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -347,8 +315,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -365,8 +331,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -383,8 +347,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -401,13 +363,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.environment.feePerL1Gas`", - "Summary": "The fee to be paid per \"L1 gas\" - constant for entire transaction", + "Summary": "Get the fee to be paid per \"L1 gas\" - constant for entire transaction", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -419,13 +379,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.environment.feePerL2Gas`", - "Summary": "The fee to be paid per \"L2 gas\" - constant for entire transaction", + "Summary": "Get the fee to be paid per \"L2 gas\" - constant for entire transaction", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -437,13 +395,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.environment.feePerDaGas`", - "Summary": "The fee to be paid per \"DA gas\" - constant for entire transaction", + "Summary": "Get the fee to be paid per \"DA gas\" - constant for entire transaction", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -455,8 +411,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -473,8 +427,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -491,8 +443,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -509,8 +459,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -527,8 +475,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -545,8 +491,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -563,8 +507,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -581,8 +523,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -599,8 +539,6 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], @@ -617,15 +555,13 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "`s1`", "Args": [ {"name": "cdOffset", "description": "offset into calldata to copy from"}, {"name": "copySize", "description": "number of words to copy", "mode": "immediate", "type": "u32"}, {"name": "dstOffset", "description": "memory offset specifying where to copy the first word to"}, ], "Expression": "`M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]`", - "Summary": "Copy calldata into memory.", + "Summary": "Copy calldata into memory", "Details": "Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.", "Tag checks": "", "Tag updates": "`T[dstOffset:dstOffset+copySize] = field`", @@ -637,13 +573,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.machineState.l1GasLeft`", - "Summary": "Remaining \"L1 gas\" for this call (after this instruction).", + "Summary": "Remaining \"L1 gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -655,13 +589,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.MachineState.l2GasLeft`", - "Summary": "Remaining \"L2 gas\" for this call (after this instruction).", + "Summary": "Remaining \"L2 gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -673,13 +605,11 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.machineState.daGasLeft`", - "Summary": "Remaining \"DA gas\" for this call (after this instruction).", + "Summary": "Remaining \"DA gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -689,13 +619,11 @@ const INSTRUCTION_SET_RAW = [ "Name": "`JUMP`", "Category": "Control Flow - Internal", "Flags": [], - "#memreads": "0", - "#memwrites": "0", "Args": [ {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, ], "Expression": "`context.machineState.pc = loc`", - "Summary": "Jump to a location in the bytecode.", + "Summary": "Jump to a location in the bytecode", "Details": "Target location is an immediate value (a constant in the bytecode).", "Tag checks": "", "Tag updates": "", @@ -707,14 +635,12 @@ const INSTRUCTION_SET_RAW = [ "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", - "#memwrites": "0", "Args": [ {"name": "loc", "description": "target location conditionally jump to", "mode": "immediate", "type": "u32"}, {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, ], "Expression": "`context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc`", - "Summary": "Conditionally jump to a location in the bytecode.", + "Summary": "Conditionally jump to a location in the bytecode", "Details": "Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", "Tag updates": "", @@ -724,8 +650,6 @@ const INSTRUCTION_SET_RAW = [ "Name": "`internalcall`", "Category": "Control Flow - Internal", "Flags": [], - "#memreads": "3", - "#memwrites": "0", "Args": [ {"name": "loc", "description": "target location to jump/call to", "mode": "immediate", "type": "u32"}, ], @@ -733,21 +657,19 @@ const INSTRUCTION_SET_RAW = [ context.machineState.internalCallStack.push(context.machineState.pc) context.machineState.pc = loc `, - "Summary": "Make an internal call. Pushes the current PC to the internal call stack and jumps to the target location.", + "Summary": "Make an internal call. Push the current PC to the internal call stack and jump to the target location.", "Details": "Target location is an immediate value (a constant in the bytecode).", "Tag checks": "", "Tag updates": "", }, { "id": "internalreturn", - "Name": "`internalreturn`", + "Name": "`INTERNALRETURN`", "Category": "Control Flow - Internal", "Flags": [], - "#memreads": "3", - "#memwrites": "0", "Args": [], "Expression": "`context.machineState.pc = context.machineState.internalCallStack.pop()`", - "Summary": "Return from an internal call. Pops from the internal call stack and jumps there.", + "Summary": "Return from an internal call. Pop from the internal call stack and jump to the popped location.", "Details": "", "Tag checks": "", "Tag updates": "", @@ -759,13 +681,11 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = context.machineState.internalCallStack.length`", - "Summary": "Depth of the current context's internal call stack", + "Summary": "Get the depth of the current context's internal call stack", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", @@ -776,19 +696,17 @@ context.machineState.pc = loc "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, + {"name": "inTag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "const", "description": "an N-bit constant value from the bytecode to store in memory (any type except `field`)", "mode": "immediate"}, {"name": "dstOffset", "description": "memory offset specifying where to store the constant"}, ], "Expression": "`M[dstOffset] = const`", - "Summary": "Set a memory word from a constant in the bytecode.", - "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_!", + "Summary": "Set a memory word from a constant in the bytecode", + "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `inTag`. It _cannot be 254 (`field` type)_!", "Tag checks": "", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "mov", @@ -797,14 +715,12 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "srcOffset", "description": "memory offset of word to move"}, {"name": "dstOffset", "description": "memory offset specifying where to store that word"}, ], "Expression": "`M[dstOffset] = M[srcOffset]`", - "Summary": "Move a word from source memory location to destination`.", + "Summary": "Move a word from source memory location to destination", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = T[srcOffset]`", @@ -816,8 +732,6 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of word 'a' to conditionally move"}, {"name": "bOffset", "description": "memory offset of word 'b' to conditionally move"}, @@ -825,7 +739,7 @@ context.machineState.pc = loc {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], "Expression": "`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`", - "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`).", + "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`)", "Details": "One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", "Tag updates": "`T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`", @@ -837,14 +751,12 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "blockNumOffset", "description": "memory offset of the block number input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result's 0th word"}, ], "Expression": "`M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]`", - "Summary": "Get the block header as of the specified block number.", + "Summary": "Get the block header as of the specified block number", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field`", @@ -856,14 +768,12 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "slotOffset", "description": "memory offset of the storage slot to load from"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = context.worldState.publicStorage[M[slotOffset]]`", - "Summary": "Load a word from storage.", + "Expression": "`M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]`", + "Summary": "Load a word from storage", "Details": "Load a word from this contract's persistent public storage into memory.", "Tag checks": "", "Tag updates": "`T[dstOffset] = field`", @@ -875,14 +785,12 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "0", "Args": [ {"name": "srcOffset", "description": "memory offset of the word to store"}, {"name": "slotOffset", "description": "memory offset containing the storage slot to store to"}, ], - "Expression": "`context.worldState.publicStorage[M[slotOffset]] = M[srcOffset]`", - "Summary": "Write a word to storage.", + "Expression": "`context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]`", + "Summary": "Write a word to storage", "Details": "Store a word from memory into this contract's persistent public storage.", "Tag checks": "", "Tag updates": "", @@ -894,14 +802,12 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ {"name": "msgKeyOffset", "description": "memory offset of the message's key"}, {"name": "dstOffset", "description": "memory offset to place the 0th word of the message content"}, {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": `M[dstOffset:dstOffset+msgSize] = l1ToL2Messages(M[msgKeyOffset])`, + "Expression": "`M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])`", "Summary": "Reads an L1-to-L2 message", "Details": "", "Tag checks": "", @@ -914,13 +820,11 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ {"name": "msgOffset", "description": "memory offset of the message content"}, {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": `l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])`, + "Expression": "`context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])`", "Summary": "Send an L2-to-L1 message", "Details": "", "Tag checks": "", @@ -933,12 +837,10 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ {"name": "noteHashOffset", "description": "memory offset of the note hash"}, ], - "Expression": `newHashes.append(M[noteHashOffset])`, + "Expression": "`context.worldState.newHashes.append(M[noteHashOffset])`", "Summary": "Emit a new note hash to be inserted into the notes tree", "Details": "", "Tag checks": "", @@ -951,32 +853,28 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ {"name": "nullifierOffset", "description": "memory offset of nullifier"}, ], - "Expression": `nullifiers.append(M[nullifierOffset])`, + "Expression": "`context.worldState.nullifiers.append(M[nullifierOffset])`", "Summary": "Emit a new nullifier to be inserted into the nullifier tree", "Details": "", "Tag checks": "", "Tag updates": "", }, { - "id": "ulog", - "Name": "`ULOG`", + "id": "emitunencryptedlog", + "Name": "`EMITUNENCRYPTEDLOG`", "Category": "Accrued Substate - Logging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ {"name": "logOffset", "description": "memory offset of the data to log"}, {"name": "logSize", "description": "number of words to log", "mode": "immediate", "type": "u32"}, ], - "Expression": "`ulog(M[logOffset:logOffset+logSize])`", - "Summary": "Emit an unencrypted log with data from the `field` memory page", + "Expression": "`context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])`", + "Summary": "Emit an unencrypted log", "Details": "", "Tag checks": "", "Tag updates": "", @@ -988,8 +886,6 @@ context.machineState.pc = loc "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "7", - "#memwrites": "`1+retSize`", "Args": [ {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, {"name": "addrOffset", "description": "address of the contract to call"}, @@ -1006,10 +902,10 @@ M[successOffset] = call( M[argsOffset], M[argsSize], M[retOffset], M[retSize]) `, - "Summary": "Call into another contract.", - "Details": `Creates a new execution context, triggers execution within it, - and then resumes execution in the current/calling context. A non-existent contract or one - with no code will return success. Nested call has an incremented \`context.environment.contractCallDepth\`.`, + "Summary": "Call into another contract", + "Details": `Creates a new (nested) execution context and triggers execution within it until the nested context halts. + Then resumes execution in the current/calling context. A non-existent contract or one + with no code will return success. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.`, "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", "Tag updates": ` T[successOffset] = u8 @@ -1023,8 +919,6 @@ T[retOffset:retOffset+retSize] = field "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "7", - "#memwrites": "`1+retSize`", "Args": [ {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, {"name": "addrOffset", "description": "address of the contract to call"}, @@ -1041,8 +935,8 @@ M[successOffset] = staticcall( M[argsOffset], M[argsSize], M[retOffset], M[retSize]) `, - "Summary": "Call into another contract, disallowing World State modifications.", - "Details": "Same as `CALL`, but the callee is cannot modify World State.", + "Summary": "Call into another contract, disallowing World State and Accrued Substate modifications", + "Details": "Same as `CALL`, but disallows World State and Accrued Substate modifications. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", "Tag updates": ` T[successOffset] = u8 @@ -1056,15 +950,16 @@ T[retOffset:retOffset+retSize] = field "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ {"name": "retOffset", "description": "memory offset of first word to return"}, {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`return(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `success`, optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": ` +context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt +`, + "Summary": "Halt execution within this context (without revert), optionally returning some data", + "Details": "Return control flow to the calling context/contract. Caller will accept World State and Accrued Substate modifications. See [\"Halting\"](./avm#halting) to learn more. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", "Tag checks": "", "Tag updates": "", }, @@ -1075,15 +970,17 @@ T[retOffset:retOffset+retSize] = field "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ {"name": "retOffset", "description": "memory offset of first word to return"}, {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`revert(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `failure`, reverting state changes and optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": ` +context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt +`, + "Summary": "Halt execution within this context as `reverted`, optionally returning some data", + "Details": "Return control flow to the calling context/contract. Caller will reject World State and Accrued Substate modifications. See [\"Halting\"](./avm#halting) to learn more. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", "Tag checks": "", "Tag updates": "", }, diff --git a/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js b/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js index e26940ef03f..fbb9792b111 100644 --- a/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js +++ b/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js @@ -86,9 +86,10 @@ function markdownInstructionSetSection(pathToGenDir) { for (let i = 0; i < INSTRUCTION_SET.length; i++) { const instr = INSTRUCTION_SET[i]; const name = instr['Name']; - let subsection = `### ${name} (${toOpcode(i)})\n`; + let subsection = `### ${name}\n`; subsection += `${instr['Summary']}\n\n`; subsection += `[See in table.](#isa-table-${instr['id']})\n\n`; + subsection += `- **Opcode**: ${toOpcode(i)}\n`; for (let t = 0; t < TOPICS_IN_SECTIONS.length; t++) { const topic = TOPICS_IN_SECTIONS[t]; let field = instr[topic]; From 01a081e50fec3cf50476d07c4df445406e73f5ca Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 01:46:17 +0000 Subject: [PATCH 04/19] cleanup --- yellow-paper/docs/public-vm/gen/_InstructionSet.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index 33dba9f514f..57e8ebcb276 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -1415,8 +1415,8 @@ Call into another contract M[retOffset], M[retSize])`} - **Details**: Creates a new (nested) execution context and triggers execution within it until the nested context halts. - Then resumes execution in the current/calling context. A non-existent contract or one - with no code will return success. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. + Then resumes execution in the current/calling context. A non-existent contract or one with no code will return success. + See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. - **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` - **Tag updates**: From 40191db0adac6f4bfcdf038dedaad6e0df7b47a6 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 02:07:53 +0000 Subject: [PATCH 05/19] avm isa images --- .../public-vm/gen/images/bit-formats/ADD.png | Bin 5422 -> 5314 bytes .../gen/images/bit-formats/ADDRESS.png | Bin 3561 -> 3593 bytes .../public-vm/gen/images/bit-formats/AND.png | Bin 5445 -> 5324 bytes .../images/bit-formats/BLOCKDAGASLIMIT.png | Bin 0 -> 3694 bytes .../images/bit-formats/BLOCKHEADERBYNUM.png | Bin 0 -> 4570 bytes .../images/bit-formats/BLOCKL1GASLIMIT.png | Bin 3541 -> 3686 bytes .../images/bit-formats/BLOCKL2GASLIMIT.png | Bin 3564 -> 3698 bytes .../gen/images/bit-formats/BLOCKNUMBER.png | Bin 3517 -> 3710 bytes .../gen/images/bit-formats/BLOCKSROOT.png | Bin 4449 -> 0 bytes .../public-vm/gen/images/bit-formats/CALL.png | Bin 8813 -> 8731 bytes .../gen/images/bit-formats/CALLDATACOPY.png | Bin 5315 -> 5491 bytes .../gen/images/bit-formats/CALLDEPTH.png | Bin 3552 -> 0 bytes .../gen/images/bit-formats/CALLER.png | Bin 3546 -> 0 bytes .../public-vm/gen/images/bit-formats/CAST.png | Bin 4686 -> 4652 bytes .../gen/images/bit-formats/CHAINID.png | Bin 3521 -> 3546 bytes .../public-vm/gen/images/bit-formats/CMOV.png | Bin 5853 -> 5835 bytes .../gen/images/bit-formats/COINBASE.png | Bin 3542 -> 3627 bytes .../images/bit-formats/CONTRACTCALLDEPTH.png | Bin 0 -> 3667 bytes .../gen/images/bit-formats/CONTRACTSROOT.png | Bin 4467 -> 0 bytes .../gen/images/bit-formats/DAGASLEFT.png | Bin 0 -> 3583 bytes .../public-vm/gen/images/bit-formats/DIV.png | Bin 5438 -> 5307 bytes .../gen/images/bit-formats/EMITNOTEHASH.png | Bin 3653 -> 3734 bytes .../gen/images/bit-formats/EMITNULLIFIER.png | Bin 3593 -> 3647 bytes .../images/bit-formats/EMITUNENCRYPTEDLOG.png | Bin 0 -> 4501 bytes .../public-vm/gen/images/bit-formats/EQ.png | Bin 5438 -> 5318 bytes .../gen/images/bit-formats/FEEPERDAGAS.png | Bin 0 -> 3650 bytes .../gen/images/bit-formats/FEEPERL1GAS.png | Bin 3539 -> 3636 bytes .../gen/images/bit-formats/FEEPERL2GAS.png | Bin 3553 -> 3650 bytes .../gen/images/bit-formats/GLOBALSHASH.png | Bin 4450 -> 0 bytes .../gen/images/bit-formats/GRANDROOT.png | Bin 4453 -> 0 bytes .../images/bit-formats/INTERNALCALLDEPTH.png | Bin 0 -> 3651 bytes .../gen/images/bit-formats/INTERNALRETURN.png | Bin 0 -> 1955 bytes .../public-vm/gen/images/bit-formats/JUMP.png | Bin 2873 -> 2764 bytes .../gen/images/bit-formats/JUMPI.png | Bin 4232 -> 4181 bytes .../gen/images/bit-formats/L1GAS.png | Bin 3554 -> 0 bytes .../gen/images/bit-formats/L1GASLEFT.png | Bin 0 -> 3566 bytes .../gen/images/bit-formats/L2GAS.png | Bin 3565 -> 0 bytes .../gen/images/bit-formats/L2GASLEFT.png | Bin 0 -> 3583 bytes .../public-vm/gen/images/bit-formats/LT.png | Bin 5422 -> 5234 bytes .../public-vm/gen/images/bit-formats/LTE.png | Bin 5441 -> 5255 bytes .../public-vm/gen/images/bit-formats/MOV.png | Bin 4293 -> 4204 bytes .../gen/images/bit-formats/MSGSROOT.png | Bin 4441 -> 0 bytes .../public-vm/gen/images/bit-formats/MUL.png | Bin 0 -> 5274 bytes .../public-vm/gen/images/bit-formats/NOT.png | Bin 4670 -> 4529 bytes .../gen/images/bit-formats/NOTESROOT.png | Bin 4464 -> 0 bytes .../gen/images/bit-formats/NULLIFIERSROOT.png | Bin 4462 -> 0 bytes .../public-vm/gen/images/bit-formats/OR.png | Bin 5424 -> 5312 bytes .../gen/images/bit-formats/ORIGIN.png | Bin 3550 -> 3548 bytes .../gen/images/bit-formats/PORTAL.png | Bin 3547 -> 3546 bytes .../gen/images/bit-formats/PUBLICDATAROOT.png | Bin 4473 -> 0 bytes .../gen/images/bit-formats/READL1TOL2MSG.png | Bin 0 -> 5724 bytes .../gen/images/bit-formats/REFUNDEE.png | Bin 3553 -> 0 bytes .../gen/images/bit-formats/RETURN.png | Bin 4341 -> 4324 bytes .../gen/images/bit-formats/REVERT.png | Bin 4341 -> 4319 bytes .../gen/images/bit-formats/SENDER.png | Bin 0 -> 3558 bytes .../gen/images/bit-formats/SENDL2TOL1MSG.png | Bin 3591 -> 4670 bytes .../public-vm/gen/images/bit-formats/SET.png | Bin 6614 -> 6516 bytes .../public-vm/gen/images/bit-formats/SHL.png | Bin 5419 -> 5314 bytes .../public-vm/gen/images/bit-formats/SHR.png | Bin 5425 -> 5354 bytes .../gen/images/bit-formats/SLOAD.png | Bin 4292 -> 4327 bytes .../gen/images/bit-formats/SSTORE.png | Bin 4329 -> 4354 bytes .../gen/images/bit-formats/STATICCALL.png | Bin 8813 -> 8847 bytes .../gen/images/bit-formats/STORAGEADDRESS.png | Bin 0 -> 3683 bytes .../public-vm/gen/images/bit-formats/SUB.png | Bin 5414 -> 5353 bytes .../gen/images/bit-formats/TIMESTAMP.png | Bin 3552 -> 3587 bytes .../public-vm/gen/images/bit-formats/ULOG.png | Bin 4435 -> 0 bytes .../gen/images/bit-formats/VERSION.png | Bin 3530 -> 3599 bytes .../public-vm/gen/images/bit-formats/XOR.png | Bin 5451 -> 5345 bytes .../gen/images/bit-formats/internalcall.png | Bin 0 -> 2934 bytes .../InstructionSet/InstructionSet.js | 6 +++--- 70 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CONTRACTCALLDEPTH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CONTRACTSROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERDAGAS.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALCALLDEPTH.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALRETURN.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L1GASLEFT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L2GAS.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/NOTESROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/SENDER.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/ULOG.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png index ee1a32d95b71b328c86e10fcddb325013c8d6472..696324a4c45274d06205402d7b42689c0a3f78b0 100644 GIT binary patch literal 5314 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 r2)Mk2YTm8!|EHoKa{3>AO`{=<C@s+J^oE1UxgE literal 5422 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png index 4314acef2a15e859191d557429db52a4884c1a74..75a307347f35d312d34545d25640ae896a194176 100644 GIT binary patch delta 2798 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 delta 2790 zcmYjT3pCUH8~@Ev{B+-+gM@rokCrXsgUy2y38 zmaT+bvb-`yY@&qNSeiBCKmYTd|9QXXJm-AB&+|FY`F@}0^L(G@y2h+}wl=!f{>UHa z@P!NGW4TY7>!qBcd_@~ZQCh*MKf;}LKJQbVdenC7B)h(lPL;&6_%?ueF-5F#%gqfp zn(QoJMh3SkkxBAUR;q$}7Fk?1&!&tH@g1B_9gEgQ#FIGJ7pO^2XgI1CZLNs9&- zTj=FK5^d};T{b~SpFm{Aigzi0PITZ+jzofM(l~KrS!jXX6X;fxBG_cSVv>GYd#u2aQ~4&5pN=aBq4@|H-d2-;FI4Qw6L8PhY1{Dv0*ngIqmUS6|7wk8k zjncAlye}|8>2{eu)yX{pacpf^eFt0!GwrI3!AxJX_JXiOG{? z|HT}5y{vpjU;4vqIZ6h_@7hJ8O^_QpaIZ($T-0(#4_dzuJZ_3B%(pui)>6r^7rr7# zm~2p3t%Jj5$dmE_O>+i&5>QX5S?;$Dns||R zK&2_|4eh!>fEIABJr;U41g$$0=3^Slng}!YkGtgGfiF*XUCQ}=*jq8qxlWw`s6{}$;f-#ac2-zoi8D^ zOj@o)xOs(YX);XDbxe>=dA4ov;*@c)TS6};A3Arbv1>b+&$+gkX(nlqxeuIUJd~M} zqjMI0A1XobBt_;-k0VeqXG9qR{GK|qw|slz@#qPSvi^q1eT|Fv7i1I?be0lw-%kpm zTs7T1%L-K=1EfZ9w%}2x@TKx0yijsREt7~EnsFiP%Ut#Ed5XK@Z2D)! z3ezxNg6k&cn~Q%b{j$QwGOc>7R%9=1K|iXfnoeXo4!sxwZab$#%n(p1(kVgePIjy~ z;!;Q_pqV1XKtDO^OF!IgOVH>xWN&+ah%~0(3EaK#3Ys&aYEl{^ns6?DDJ`yhhrmP0 z#?Z~5c{ew;TNPF06CtjC;*MP?6XJ)CRS3}jU`1KmpPU4>2icqLg?>QXNr<#|4rT$o zyfXl&S!(g6ULe__rNE3m$lAf)Ca(U#58=Uy1C#_tN9;BrSWA zr-lZegYzm|r+&5v2f9zj*Y>m}9P9ffO0~<^hnnhoH&4WI&r_2Ec9dETx=(n=DY*&D zd=}nNS3%|1zNZR|r!~pHnc93jRK7PreImnSoy`xkX7DR)qjIl?3L&}@oBiCnZBFZNcVbg79X|#k~4mYe*1h$qeUt7{eMcWM(bR4L~pnq z&#oTk-J*uz;T@JPg@Zc)^Wo1HT0mMu%8c7CUGQ`k&H_<&=R%uIr@JCqK2unz-elBt z--3J;brty(=^jbx#9R_s_ckd8gyF`2jn-%jYlzqo7*4LiNA2#c75G1A<*LD%g4VD87M!{#JphTc2Eyi(Rl# z00mtk!j{<>NTIg38Rp7E2mIgo;x&Wb+i@h_ouyV-|Kbxzt-SH+Cy84Ei`q(zBRDhG z;BdtIQ6j0xOzL&zV$X^KVSyuT066|KjB-QtxBH*);N64O_UkS_wy(W||vjyV+ z$V1Q@V6(*-U$LzF>z3tc)%m*ug*V?xl^@TVv0S^E%M|t7Y7mW1Im*|CLJ6lk6ML)) z`GP&y`mK-L43@DEI2{DRXYq@?_j>0HAEIv)GbJ$1CMRr3KQ4p+;|goAs09hSgjrfk zkXkwg(GGA^7C#+0EJ68t-o~Wd*V$k}P1m=_=$b;P46vVwU`BuDw!2C?iQj4GaOk!(>tCZq?coxvD|7im!pOavEjQZH9rgAti(6Ht2;+@|_x-4aDB`qIB{!Su0Cb`Bw$xgc@1%KjgPs!t= zL{G=|vIGJn6v0wu%lVgDxeLq@7Rgy09ZS$OXgMcx@&Q&GrE4{&daMs7_BVj+vzKqd z&ktj-D!NxM!b+>kLW|E~ar?t6b#|wlaZSZ894G5}H)_;8!7qpBvtBTwcY5$CPVCl@==^hv%UfUX-ou2 zH9?{^aaRDyQ2G5@RMGaYEY3*G_;}mq*zmd_Yj=U7)8=--Uq&(KUjDzPjLnHdY1b+k XntXYFcA<536J>wY@ksSypXC1n#1UK- diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png index 9bfc38479f18a03e6125819b8976ebc8db798134..fe56f671f423d8f2cc04c1e0b714f4bc2d41e3ff 100644 GIT binary patch literal 5324 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 literal 5445 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 T^`>TN$I2Ja>uKbxTi*L8V(gm4 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png new file mode 100644 index 0000000000000000000000000000000000000000..d95eac60812d9775a8dc5c6874ceb40c11937da8 GIT binary patch literal 3694 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 Qx_LAfX4a-9r?1@lC#P27C;$Ke literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png new file mode 100644 index 0000000000000000000000000000000000000000..1a83a1d8dc544e60da1419306156439f5949c2d7 GIT binary patch literal 4570 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 M%;prqfimz(Q%ppPBvBCr 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 delta 2754 zcmX|D2{_bS8~-z+x@OwAOtuz6M2wq#W{QZ(UJ1z-vae;I86_%9Wh~b^E*W{UB}=x3 zB*r$jFv$#cC+ir^#25_U==r|yJkR?)?>Xmp&Uw%Io%1{I59!ZR&rid_`DVr!uSMoF zrl->LT8|1_zxAW;W>O?}z8CAbO*p4d28uJ1f-qQ0Ixb-60OIEk=+Jy2`8iig=jJF;Sm$Du`$Cm^(WzhiHfR zJw<2ZXwOD)vsRA7zSupe)~q(uO$S=68z7?eqi}D5dNj-;ae_IG;4ti;G=MTp>{R&8 zk(DOZ^eKon-v!i${yM%Lo7)zk&abo{?!d`*uzmE90{q&$Lf%LqOz=OQtRi@Gp5)NQsC2J-5^$$35rAR+A<33H~eR^ zx~IQNE_Pbaspn*n z4tft3cyIK5|3ba8p^h)jxDTy|I6zBEt2pk!+YEN3GyW2{x4-X-y*Q|KCiP@DZ>VAShyYuopJpvR>D#5SfBls zQc2fiFl)71StEJ&mQCN#vhGQ5$OF4u|g73lehBQOs4A=Ts)xWp9rHbN`uhpVIiEluTfv>?%7^{ zhqwH`-uLl#Of&BQ@r|m=6E_cRlG&e=Yc39(_ev#Ckd79rs5%#mC5UwsxP#Y_9ey|=3M48fa{$WNPHz2AL`wwScjxF$72Pdob%W3GWLgencRaE9pL)(>;F zHTbOW%GiY9Q5Oafjg;HQRwIyu%4ix)iEO^82X?!*ew9hx9Cl+67KyTMI=9-#| z`y1wqUj`5AG~o;CZ+Bi7YR_D$j4{_}&xR@urPRg{{>?_>&&pK~y<$@bC?wOsI-yom za1yFi5;Joe8HJ5GSXyRVBvyFX=!F-b;D4PvwUkvgdD+ytl>a zmXpM^a2~vxv{gFScstl`YL+>^YDmgk+ZDw`4&G!6Rou2ZaOTwm zRn_XVm&b}sIl5}E8En6{6|K314J|h$7fjPwFDVLX1rj>{)+yu4ozD>0VmR!d2jN7K zK_lHe$$)yu2A2wT5{bNkiYx-7*#5ZWnk=;T=-iDG%%nlPK3wo}PBL(p!hz{k)&PG!^?1zOH<&ovXwp8MrlIB*|2gPRKb`Zww z7&@x^?tTlahQYfe3Yyt*l@aSC>+2o`KnRK(dPf&#}eIzscA{p9YTnql`zTBHv`yG;#?TgKc1w-N7%<5`Ss z%w;YMVhs~8XK1pG4}RlXOu$H4THVuDl1&^ox@S5UE_^chA8ov~4C@P?LlZQ}Q!u!m z7dJ$T{$6=YlGuIsukp>wU`P<@O)p`$pW5Vg;i)spn-dgg*GF--xUU~4o~RUD6ibnI zbZHDVneF8`G^_<<6bAkKe4^~@;x}{RM;g{t@Cw|{bdaRM$fn|Emi`yj>v;>1o@MNp zW#v5bYY$XZZz?JkNOKo9XE#_1JTGh=4?kl3L$=toKH(*dPzQ{CkD9Y5+25&$tO8zq zCMFd}z(F)|+1bK~aPP&G%qh!ffUEC)xbvvUz+BrYEao{-8ny3Pe=rRvar}%sN&PXz z{{YaB)))`}w%TehR5N(A&^$Hkk~B+xm?>BBHR_+W7Mh}|V+d+e9ub+MRb*2VGs&p% zO2TXX+0%MTTq+WPSufUxhp{Na_(wG!(K8u^t7|b%og7X|)-50MfnV`Y0;s(pRgl=mIxyD%j9?BA@_r-W6b3Xyz=Ru{uOWjX~kAz2RQ%b8fv-ECZ z2D_qBXC(>)woUq==bArpTo(=SPPe)mEUc&KD^L<;~QaUo9<=VgW@L_-Eiv zuVt@SAIBb)+2~N8U(Di5vXb=^quxG$#hgMPPQF&5@7%Fu@qi*n!HnYrRmTTZsW}1d zd6gBr$15M|lz4K{Z-?Vi1KH@1QJ>AiN=0?~8-dRGM6r-G$Z~eY<)mv9cN!6!G?P{_`jHL4zIKFCWh5B0_#>0h%V}GZB q!F=uFrvg^EU9io64J^^VE3lO4wz*T=qt6!;!0fW6an&W)2mb+Y^l3Q& diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png index f952f689f04028de22ba6d466fdd24efb78d99ca..2eb40c349490d28a316cc16cd4219cbd38df9019 100644 GIT binary patch literal 3698 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKNUMBER.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKNUMBER.png index c7217f8452a30efc43a5cc98b2bc743226fa969f..59ea492d9d309155f5ce414ed07b9c6b180da69f 100644 GIT binary patch literal 3710 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png deleted file mode 100644 index d844d63bb4fd303052f1180b1fd0681458f01ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4449 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 S4l(N1+09N_8et7D#r_Q@T8{Am diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png deleted file mode 100644 index 1cca7c9e725c8395cd138dfacd054cc2e4c75293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3552 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png deleted file mode 100644 index dfb24671c96d0ab2aec10d92d580ae1e5824898a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CAST.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CAST.png index d663c342ae7c2522263c5470c0de8a393c0c73e3..8ee381fba7f04da25da322cca4cf2ea78bc22b15 100644 GIT binary patch literal 4652 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 g&A`9&HArg+OevbU>5rM~r^1|)E035cnEdT%j literal 4686 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 C1HKag diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CHAINID.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CHAINID.png index d197552c9dc472b79c773efbb8da8eebb006509f..e7fa8d7b431aba4f351e6565107dfec4880202f8 100644 GIT binary patch delta 2776 zcmZuzc|6VJ5pC^jNT`uPQ9|u&i&2%J zrAVYf(bQT>+7SCXnuQ`X!HaqG-e2#2KIii}_kPd)eD3|8@45H1$`W@ZWmNb{x?`j?HjS3kHBVF0(b7KH>z$1HpmE9&_w&$ z@4S<}v<3DbYw+~?ZM&EoLBNQB+q zf?ScZEdz&}pD?ikJ^;$_`ULQwj9oxe1kyr45U;qI9 zEg1ww74E}ZiuHi65V>_S+pD?dZ;!g|2nPvqb+rG5w4FB4M>99!oejt+XAJvBIYnzX z@w(WPO7J{9Ij!YA-+OiunKqD)@V7eV3jBJCRq`bI*AL%MgX=DKZ>7Lyy<@UGT575-G_Aw| z0=V1FN{51W7s`Bf(-yJtD0$J9pW1@_$ZpfkeC&o*LHfjGv^H6oE5ZHfWA;+`%8sU4 z-8x$OZWpL_kON9hXp#pQ%n6uxg3+Ng#J2 zbf&gH6W`}^69FBkdo&+becJhWQ7bb@@jtzzREd17?I@jCG0MiS`Y62f4t z4g36M^pUGj=(DGtm3+Tfrbc}evOfl)QhbFITpBhF@)I*MAFV5sH-G9V zMP|(9c32;L$D>^K_9I~4-lE7b3g!Kbb(GhC%-+E7gST%bReOiN!H*O!o=l2XzxnhB z&f$?XuJdWdDPnUxU8)h<=IyPlieYHuGXI%Dmt@LKo}+{Vbj>*wscu zMEy9TS&^qXCHmofQxaY4bi42B#i1q%ujIL;AI(_vj` zn{nj8?R0%f z>?KH}iB0c1r9L;T&lMn53agqNVuE~i>QSwwCku5EVQasy@IuK+dj7UTnGU0uu%5EM zXr|bUD>nn8^`uwp50Ux}*<0a+MTm>0`4FAg+BB!kr`rCf%YJZ$o!zF0 zBGKg8QOW6_>bWtd#I9@xQe#qFX?LW1YKGP@`lYBq;ds^8p`6au?RF_8kNXAF?+2V} z+qcWy_;e6{MgyMJaOhA)jdC;-zV`F8@WzLEF!wg zAXK*NzbuvNDPw>4QBqy-xJD*{$8({X4r@__{I76VuWtxeOgk3Yb8Xja7xfx4_z90` zTFxsVd_acrMc2(RYr$G|5vgh1NZv%?h{bhBC*HtjU!wHn2aa!HTsiw+auXIBLD}!- z`tpHLYIa{0bH%|~63;I{-?5e;ymL}8&}Iwrg4UW|?&wl2kuo$<)!-c7=9w3Va#}*0 z;2xk{MgN~IJ}huY>Kfql?ba!P@5k7{Rwe;5ecLk6<9T5-_Fhf;lTT&k!c)d%LhFxv zpSy23KuS(1su#+sowTVIozHc4ZN7g@2-Dno?5-R8+*`I3DEvfI_L(KHtV zW{a04h{j1gvg3i;K2>;DE4#{R)j1(()0D|l<3-oJU{tO7<7U!pd+-)HUxqMB(ZRb) zFYgkIZj4$kNL78N$PC5~*(G-~()Pmq8@J~|U?_t_0cY87^ic$t$8%RKj3c{E8imjL zxms?0Jm$U{6^9lQwolhkYtVW~Ezb6B^{^qAp&|xO>zK%v2rH^@Ty-&!4wLHSz3Nrg zVmU*NUzgqPPw5s3sOQ|9ZN1tkOU;EUIX$4^N3FGsPND__S9^i6gCFib`zz8j0GWqT zr&Ab9h~LU)9J@n#vt}ve_3v8ZOnW{`>PiT8$VgSP>0#o@`8xp_y}k0k;%lNH#kXGG z1HVy4{C1~i-NZkeL&-)d%copYrd@n3>qMUTYQK8@TO9pn*fLf7sC>50!rP=jZ72a$ zXZ!LNwMwJPCZ=XP(c$Jt5mpsXFUs+tpz8NOd<9QI6IfKiomEy$Z_`p*;+^Ov(2%kT z)sFkE;2$B17lZ$4&ldh}<9u;X#O42wiA!^|`!#=o4d+(T1sj3OW;VazFWrv&H<7Aw AcK`qY delta 2714 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 JId%27zX3s{R=5BF diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CMOV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CMOV.png index a46692edd84c5bba21d558c003a5f121c71dc0d3..f90abd3b274bef82426c2bc537d950740e9889be 100644 GIT binary patch literal 5835 zcmeHLc{r3^8$XOp$yO5C#*%E6${RvPQA(neEMcroN|q)J!x;5`FIl3+Qe+gO5>l42 zdu`d5?E4Z58Dkq}7~eB_OYe7m*Z0SJeed=C^F4peob#OfKIgvA{X4(=e$L%<2D)4v zLL2}9uG6PMnHTn>t0l=={-XoJ1Hr+K z-fl@P&W+yP|EmG;Ki!g*eqYv}2qOj~VKNWbxDir94y`tI(Z5aecN*0?_-^|pPjLob zx(LO-5j<5LIfwnp-R_n|LFfI=-PZ_$8)FU1Iq9y!!aUS&ZeEo~ts7eL`yLJr;>kmr zAG$4`XMF{3!S`=$sP!j5v$)>FV!QDsw|QW(j4LSsNi=kvyj8rAe>8`#urWMi?`yp< zw|vV|Wy!5~um;nUI`lKzGTIyaWHzLMh3?NrZr>)pVHiP&EpP+i;@f^U;*`#x)EqUn zEc8h99ROHIdh-K<%!PDTFk?Sq3_x7!f_K*P&nECvanvm(M`=@j9q!b)E%nR78Us>Q zu9CLSu_3xUIDPz3ZxHfV#M)_bH$o8YhwzIWmy@Zx%LVfs=pAI%=6Q{;6ezMl&n+=qiDxc%J2hinY738)z56lB!=_xVj7Ht zL8gb&JX(?EyO2}A9I~#i!qBkDb^8t3T6&b@%uVkDWZT zJU%@4?8u_nm3O64Z|HEcy3~_{Dh444$%)GivWa)2dv#E&`c2ex2dz6BWhHIXx)0(5 z1;Y>vO2Yd6Y=*0Ku{BjY@2nBtT6;Ij+O`a@C@o8^n28{n2BclO!;%nmrN!PmcUHm1M1X168C z1?G{iReg}K)xftlrq23~kCu+)#PXbtDTo=avMA>slf2}nBDnZD&p@Kye5BE+9+`Sb zKuUSj{ZcX$q;hqA$PQ0*SLFwZs~SDngfp=em_`8Y@zW3yU_SJu;_Z%>Df>?uK`dor zl{~J&q}yGII$|E;d!$qftlyP(goH@9-z4r(UMebUz>;~Tg0d_MpnbQAph(y8N`5#u zw0i=*GjtrGwB4BfwdV~>HesbpyY}h` zBU`&H1=;l`F%Bp-07_slO;`Z-(1JVwhA*r(fx&9?bd#@t2cNIWC4JUK(wf8Y^9hJm zs2M=TJW5`*`soeLOBbo@)lE+NHoiVU^ql{9VsH5V+ByG=^ze79CEl|1q#l_vTBo4z z?Diq)%jRhaNUnqzC@^iTH@C~%*?uJ>fbt_Rf4$}l>m}wJe%FBhbMO63ReyUT`T*Id z1=ExBTWfajD@3!#Cax)wS62(e5NpxQI%WM4Lc?tdt$K0~<%X)^KPVZ?qRtEZ`c^^t zyBKiVqs1BCK~*k$=r~1&e?9%9u9)FQdJ+MkzKc@&F03W?r;>zeNVtLAD7~uM5(&Q{ zzpo=ZOvJaz$qm(FO)SBL$b?d)gc*^FG5HgH%yOwjIbg5rS8 zA!$=pb(IV~)(N3O`@|xA*?SPn^7TRFt{)y~8=%#Zb>OcQ6x839QS1NpeBZ z*>#O@td{oNCS&xKCfty7@wBB+SdiPu2eFogNE}V%Jz4moM~7)Ib|l>LtyjF#3nAuI zxpiaiE@y0*O^t_u(#CBF!h~I>F^3XJ6HUH$yM_aeYfCZehHT`2t4d`mvsx46?&ze`zqzcSMj0@v-W77NLBNBh=23Y*1Hwf8^}TC%NUBac%OKJm-wMRq9AZ`Xm0Y zbz|B2Vwcqo*bzj*E6fFAC5lS;(Q-^65t5go3fCyQS80&1U&>>py!66EZItl6qFgbx zj`6B}ZDR5CaeC=>t4E|e=H2+WT-w(U_%4jmRFaqzHOc-Fs7TSk^qnY1jMEW;a!zHd z5Fsj;N1P1WRJbg3>b#rFdy|aZ^9#i^r7^a-Z}5#Gc^<4;k4Z-cjB-N$ST**yn@u<8 z_!_4l+P&!}AIa6N@WP!k@$Sdm3LY~&xAq!^gIBI%0?jrvt%f~)-)q0_06G&!aWA4$ zSMdiJ^CY-b4^LH?X4lP3N^kQ%hd7z&1WW#$qv|o25j^Orpn9*$xiadcx(e>1H=W_; zJZ6?9s?PMpDci&Ux^d$G(wu`yB!eET-P9hX>pb$ zO=U3G)7t(A68Az>;rg;T)VPxPw9|DHG(?DcyN(6BExgEk?%Luo%(wG-`ujBaY0V#0 z1G%a8C%X7gUoel-CZ{z6EcN6(iA)>*cu2p9mS(|z{_dHD%0Q9$FKjAQ`K0Buxup9P zW*!IOp)@%7aB>v}>=PI)AX6@>*Ow!|)BmSh`mdI$|NT64e*nrJ1jtunWAbF)1v*i^ zyh|4@o10eOe4=b?Je+kP75Di4UVZ4c|CR245Ii5OYd?jLwYQhBz zGSTmQ@%^r{>e8@!uL0?{i=3eKr5^y7&O_0wzl)lVPy-#j;`kJjOU@&sY|AryicRO- z9Q5KF>D=s%xt(eW(&$N4@MT880B&A&K!B|~^OaLD%7-2N_}ZGp_l;YF=7C#c!!l7mg*K>Qb(D5CT^p zLD974ALRoxwvflc5Z}AWqrAEbR%h%3iuxW@VaoNK%3`qRv?*?$l*~pSSi#lzb?xpvQsRGG z30>e6Z0IJur_A`BgKvv6KMW9)Txu0HO(0xZ>@8v!GpjGM_Qf}8LGhT%F^$yEj&&+d z-n$EV{w2&c6{-mcYnX|sE9_CRgQN9SY`+AfFICC>W;)3PJxeLQLq~NP=@mSzuEdO! zCaA2~_?nA56??b^NNV#u>@qii_`AU#eaMv=HcG^}wT){(tzdQwP&F*rdsl${wX8eX zFQv6|E?A(L@!+GM-5B|PO?wQTr>3?XMNu-J)uOg%QanXpN1kO7n?66e`E}9k+hRT- zo~&!Ubpiq6JwLpVkJ)0*F*_mxC{@XIjX9g{j!53Q?2y z)w2#arDb2qAQ?Xpb`jqM-VaAoqv;SB#bcIg=4@>;#>Kot+YJy*n;YUXKlz&YByrE! zdWiqFmtEmfL_NOY>Xu_@Cr8d1wi|tEvP*|QXXE9-HweyD)nLM*4g6f_g0oEG4u_7z zKzy-ru0@7rhHv@o{mBPjgM#90YTu$dGjVKaQ0J$Sy~}pJk#O6+Fl%h!m;~iM>yDo zd2d!#l~>OB)p+<$)hXB$rRXef(o`JU$1aGHdR>ei++%K=*z<@8G!yW$_kR~RfZ+6) z2`96W$$@Nz;o;G1P1Y+8LIMRHpHVeSDXJOLCfygb$cjZO^9Pm>7cuUW;XFRXLEMg# zkE#10L=|vd@M*axalC%dc)qhpYZ7E(92SmDf28j;Wm z_4W|Q$Kv^h8|xy*THWFOXvzsPylvM$QcDAJhV}`w*sS7txC`sN^cd!k%gVHJo$z`R z!~(^r4aJ;W*L8F`W$SA8f*0h1Yc7{V_31CHN!%rer?ggd0%Q~wMD@ImPjas)^f$Hb z(?#LV@rk;o8^3F^tIa0iE;-@UK)6{!+Bt~5Ow{Z{y)j&_!)lbhgx=tse zp~))P0uk4yYuu*tv_HwF*_@>_CXAAv?CRAXN{Q@gjESi9OAbgspCw>LqOVMRVd^Jx7Mg;7RC9S`ay9vjRX@iXR|2wIYF*GIXNEW7;PXP>TGXtia!K zVP^!fBVEMfTR!`-5ct$`i!JA0?nj`~b3*`h{P)w=f4a;0|7rmI%k|d(a!VNSNq)Sd UcE#2EOh}wQVW5+C-1_!E0mBoyX#fBK literal 5853 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 AK>z>% delta 2741 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png new file mode 100644 index 0000000000000000000000000000000000000000..96f93a3418eced7b6553f3470340cc6fc8be1462 GIT binary patch literal 3583 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/DIV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/DIV.png index 58fee0f68533d9140e600fa64632c6e19a644da1..a87e44962f320ed2aa28165a40dbc4f36a0b3419 100644 GIT binary patch literal 5307 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 vw2x;W0DwtX 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 G@B9za=YKx{ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITNOTEHASH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITNOTEHASH.png index fd31987d317df00d3cc9b984b615a6895d7f5353..036785120e898e43d0e0a1b94b7d517a984ae3d9 100644 GIT binary patch delta 2971 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 SdLR5`E2|53mZj#`@BIhiOoyWY delta 2802 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 bXgko*{D-@7|Ej+Yx*&Gej#i|z*Y5lWQ}K9# diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png new file mode 100644 index 0000000000000000000000000000000000000000..43ed04808e8c9949f5152e7460172a26dc8abf60 GIT binary patch literal 4501 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 v{zpF8fcXKcqil^m>iP$ literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EQ.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EQ.png index 426d47621b060ebd7ee72baaccf245a42381881e..4ee5f60980f3938b5ed2dc8a7b0e7d256eb905ec 100644 GIT binary patch literal 5318 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 Raf^5ZgVSeD6`r&Y`)`EANLc^? literal 5438 zcmeHLcT`hb);|Q0A|fC~REVI6bOfa+O#!KbA|;g26$GWIh(I8*!UF}QDaa(CNRtqd zZYX)6AVm{I5FbUP2C1P31I~?z?|pyFTJx=0-?wJgn)An5``o+tKKt(b+vS|!PFoml zmrp*a#H;THM_4%Cfm&Ga)he`Y|{Y zFzlN&-+q>@oAh2|nD8d87tbcYNn`eMAvS4n{J$Ig^u<4R5!wf**Q?A^hu+y#Je>+a zuUB+P#Cf+kJx;Jv?Ma&d_Jj|jvdkIt``BQh_FQ117yo?ePFR@(i|@KgTU|06Sb0Pv z;H*_rm?Bx@?=0tfi~wfFBw{|9CmMh>H6H!B17tzYBWe5}e4xLkNAA7K3UuV{M}2l~ zk>CRqp)y?-48g%j10EH!tN-R~PM*0sz!ag@LIB1xEmBVs4l;I36y>~L3kE=?{7KsD znvBte_MSpaCk1^N=pim|tslqvr1JyPR9E0TcO`LvQ4;;`Q0F{?0wDhp_LZ;S*7|Ze z2w@9(RRw5(QOzzg5@Z9Y$KD)(+QIQ8BeSo>?urng{;pMqrgaVt8UhTt`{mU9jmLoi zm^8061-k)~G`?=kq58eM;D>;}fDie-Q|A|SF}D8-b~8qI6y0^p4ToYcP5_Ft8vb9? z1?}|CH+?Jl8g+A!T0Axq> zr3dLD=EwI-HIYM05pRr5V^eUSF#MeD5>QBT{<(`1Mv<4|*^|fuX z11vFIO>L|I)#;Z$^d5T;KPIfQ&Gp5xhzxasB5J!?tE)#xA{8 zJ1=263=a`BKI<-fqJ;DID>7-`{8&q51sV8Yr~v+=%FVf7NtyDLW}2W%%kH4Yk9(O3A5uW+5^3#c$Jyd@J=jrVSPlX+W# z^Tx9A^eD|kaggl`Uu5n{bKLp|=vPzgyVga-Z?gH7VK4Q1KTW5xlDsPCU|@Cl2W7Go-8xvOC>O?5s2Atvi>tCLj8 z+Ne_gZ$B$4McR=MM&d2&`pMQU`DcRJ`$qV-rQ_t8QTuYEpo=ux88=&++wq{s52CK9ZGLZR@rSX}tF8#R+=6A@t3J#-6e{6LW|9XYi zSg+G8hi>%itIWDTCdt?aSa!B zUqO_3AF^qnfm?|*@Bb;3Xch!1PPlk{=b z`)OK#mq#xkY}Bsfznz>Zd;Jm;%DCWP89rou|8BkdCW$ zOy1T%6Z^QX87b5s@K6+z@W~59PW}+ElyyC>%G;MGgKC^EChCri+s~RT-(T_!tkl0l zg*XRP`vZv0&yGSKirnvdgfRV#NZjJD8ap(o)-mG(U(f12b5miY=a%@IwnK0KqAw@J zNN!OgwN`C>g#sro9yL0iQ+cv|^?ppnus@tFwl+-H{W%#fRp#Q#@LeBNg`0jk8A*vF z5&GRjaTgc;TbRgj+)(h48(}F|$FL~xHT9IaSp7Kv$PtYYZ0{HEU1ytBuLYfby8k@Q zglN$jeN=y#G z)oW$xkDCUMsf{!>h}nF~NLgfP!oNF~_-0qoT`JCx>W>I85iuX@jDdd*S-1NEZ}a`G z+F!ldlYAZft@~PPZgDtW?#bORJ#%Qph!BRos;FFtL~u+b?1NfZy-3A6m(ZqmNXd$T zBj1VL*tO#6Fgn0CX6gwf_H>aU+b$+#@6nZo(`{PmfGbqrj-^|=9nFu3_ z=Q8~-yP?nw)-_S-$3b#{m;qssi5UzJ6#mR5bNo|1_diUVR)0wxRLiLym3keb0UwU= zycN0eRB|X%^&T85egM-S1@&GVQ)w+Lmizy?Q^$liDDyO&{lW^;2 zMl71mS>gf#E&eCkG-4~3>Vl$(alCc+4r3hg^S%|?y>lr5xY5J-KZ?6cLKPWH)62b* zV9d4mB)dH3ZYSO>OV&y^+bmo5qs5k;r10`_LVLGjs~W{D;Klq9J4r{ zFjH-|nv~Btl&ZB#_tK6X5>pr&+xE~(cU<$&EhPHl97P=vt3eiY59^4ya0XpUkR#0S^#Wu?$RManJUli#4$fv~!>ug_;G$G#d z&1t#ZyO~4Y>W}#mH%0$u8$X4m5=Tw7(?`A46O}qN7+1vdajznUrYpA2I^2<)nP!yN zCcUX%_HLcqlG;c_+PAP|=%@Aw4nl_nu44RJ!W7xy$b@=y5-5BI>oQYFiS%^-FasYo zGmBX3pGw>=XQ@;9R4PbJcB$k#jUi36xtUu{>k5%|U%+&G9J1>??X;{~n8fJlbLP%hTFH7 znPYw2DkgCCd~0fQBC|FVixb25>}m}fg**CIXPZ+d3_n}(0>)(DTh3r6UZ-u>%UYdu z3M=6BKBtE8Z?r)t>`| z+KSsTlls@fm+ImZ_K<^=xe)%Pi_hj5$$hW{qM>Pd?Exh%skHb{b(hyawh8-tIW&?V z-%6+(unQ{d`BG-2R2{Ez)a4Gras}%tHYDo>J55FLcBz{6w?Cs(@*JS(mcu*E#Xx%? z@A$4seSRl+P0k8dX)@n)`_uTnjmo0Yu#z{j``FYjX1e^5Gk;7DacFB241{KO3vCp+ zfGXyx84O6&+0RcLF32t!XO>*3624^KK7~K<`&kB@pyqc&0-FD+OQc7qTtL(v(S_lNa6s4AW{TH6FLz@0zuqR41}O!Py`e*6a|6> zaHJ{HQDDGGZ&CtC2t7gwVTgnllMU{fEr0CUa`x;wyMMg<-nsYtz3<(7-@E0mqrLTR z31tZY0CwA)wmb&_qK$%e+YTWCO_&oK1puj?HkPMcBC?p&Q)$mkWkntP3pfpzZ%k+# z1;O_05NRC)Z$i&#g}|kjE#kdZS`-98fWf=IDz&{B%LYURlbRX~B$#&WaNK4J3CRg4 z9{;~AY9tkg=Z@=2viOQEzm1x2Yc~g>jd`Z(u(EO4ER0zDR?k-+!ht3&kW5_oaE)v0 zkPn@=Dg|xZx;L)pEnyxRzx3rmZU%PS)>W&S0s3Eg5bkvDZm2skX_rqfx+R3@dU3x7dylAR zK7|3Xu$uKQ45-k<4Y#kyrYmWh^-qC-ADeYM#XJ3tO$cfybilSUO4HENJYBNpcfKBx z_f=Q!t48e21yEi~z~J08Qc>&{;i{N)(hc(ln$iQcp*Xc7~pMd9b z9GT9@eJs`6H!H6Ba3AQYYS=%I)CWm8Am5DsCx|Z6x`b_ofSPkjf z7!xyZ4c!c&2bZ3KZuU8V!?Et0eaSdn@_*&-HybCpvYL-K>$<($CAbl=BF2uXo#~e&p87kV4G0*Zi~5Ldg}YT2Rc-5)-jQ-S1cA z&uNJbzn3JY5`E*5IR0Q+RIhF2*Z`fPqrUb0XiVajabp9*i?L7#k|%SQ!-qDmGmi0- zYciau40wRM>xe%1Vi8S$uo)=RsATE-Z{UUevoXpYj{1h#Nk#4(Hr-@ue<(emf5_(i zB+fMPlg?f&bDs14Tc1m=vdtd=sQM+Zj)pQ0!&VQLf{5sT#gWhZ?sH_h2;>;ZHBDY!ZgA3(MOA*fG zDNY=QZGb2TYgJCN{8U=VCoS!91zAq!mw24l#nUs4FH~LOoP4r!$@Vd~6|4-i;6XmF zn3lG!eqJD5mpl zwhP~f0WlfM-+;6QS~BNkF6aF0{2HSX6dp2RaF?F?T#BZOC-uD;6X=S_j1A4%n35}{ z#*(>CrGZQ~!V^_991+Bj%47a;{dVoF-~N#|_kyTJnxmN%LaF!eFv#fS`dwhpL8~IKcXu@TPBvzeuPSWud zJ`|jUXx#e(1Ef3O0~ucX`&lFQ$y&uTvs=3b@u0RBBjPQ#owZ;S3I~11FgM8+cb;t7 zT>Pup!BW!`{*UGPn38c25TO`VFn#Y~&<7%Vb4+{0|#p6DQv^YmGJr)x^Q1Vr(CSrHYHPfH^ zAst=%5|kqgWhtQqsRbMM&hO(8@1)Q>ffGMBq^sb~MKr4n+`Xn|AXUM>tuM(7@=W zwv>#`&0Xn~Y?HT#tw(C_^yPCVJDJ%>G~*gp2dg(R#a$?eFsTPF;enk#TTzn|JtGpX z#w*bm7DMWy! z`%()ix21R44HhqBWHECl=Xvt89pJ|7%-FI^kX`79kHR0muNuxfzVGE?(xAh7D6?Q}cykit3wXBUE3C z@8DU!mQFQ?ib4N%}{>nOc;k}Hg6jA4~^X%3IxLipT34`d-!MYx2-7^e{ z37)Kp^PXZiXSduJ-a7jHOdHFdZQiz4Q)&5Q!!I&!C2kVOFZKB`{}5R(tPh?D<`BDR zg}#B2?QvDgAQiGCv8%f#{ZNB3g9qtZd{WZW)Z~{`AIW}Po*GU%@KH7eZWjQmPNqHf zco=1MJQ@Ur;a4cdN!|ojr_%usEVge-PM$Wr*2-Unmy6)(8BoTnwN)yPB@enSa9MA# zU(43%p)cT|gzk=Lb<%jt0A=t=r-6_ZYA3)Q&&#D@t$@oyMAfw#;|FFLT^ioOj}E1b zrJ+YPz%!HTgU7s6xf6OH@%GW#mzhO=k8_-dPS45zGTbQrD*h-x^^y_ps)OqWM4?Xh z*MSXgTytv1zGEi+IX$hs9#<>rxZcWFikxou^EP-3Oijjo$dz)aN`r@XN;05*@`k=W?{T@DTr@(b=&f}8RFrn-eMKQE*d zV{J7<_7aHc<_aa+ym=8Y>0;3p;i|*1$lKhT>dbE8mvwN)vA2owu6my~ZQJ4HMKrXb z>GB13lg3h3u|~sbVnTC{st_ur$co@XK~~Y_s*0^5`b)G&8_hA$uJLT4MQ`pa!f(w7 zKS%@1C*G0x8L|JUBL16VIksN4iF@PS9q;NJ+kFiFB4v-|+Mf#OKtV|&VErGpF#l@* a#TP{-Ppjc#64V5C0Bo%6ElYm%y7@<5_`dl7 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL1GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL1GAS.png index 428bb22433d9b80ca2f35467c30c475d1a32187f..3b31baa617d0c9264b66285f94dfd9013bf182ac 100644 GIT binary patch delta 2829 zcmX|D3pmsJ8~=^D)FF|iD5sSBPT{ySPUV(sCD+^vk>wgAY@9-o`@PsW%9IefwN@b{wo8g;yD?OMj)=mhg>|LGru7j3pT;(D9WHx^$@#oQapOEk zaTuS^A$Qv1gcii{EVjb5KD9%M@6i46?(9xUSttCSA&nuLkIUjR-=L5RdzQ+_)0+jT zLGO9( z8Q%kV+dUk_TAkl$!SV%`h%jzV6y-q9>jIraPKcZIB200DQWg4w2n_4(8y*p}Z5^+N{8B3{Hm?=wBAQ|pH z0Wu4eO`!{G-?7g;DGDKGN?q*RM3dZ$Z>XQT=@tt!of$_=W&uJzBFLK})h!hJ6yMiB z9f$fZpl;(OTNH{#9b+nE{X&pt)GuGOcyr&^D~$S3j(60wYF0%me1eS{wzC^3_VQM% z0Rqz0_wO%!p#MnnbaqG_JwW;Ux z7X67QgWT?vuI1i>a+3@c9b*&~C0=Yq36Wa<_6mr*>j$# zF3k{u~9nS4y*24AJlC4wp%=ClW*nmTe~;Y|B|nRfL%W-QU)r zK#%l^ymCQ9WVb229yl(WGQ~9Q3-5&6C0bOWIWtUlSNwLRG{2yiEXsk-ujj;SR0kH) z`La7--quv(r+8Zo2u)&V@wU#NsyXR>&-liGDi+|QAprnjunPYU0O)E=-G+`ZV*MqP z+V3^`?I*oMh7h-%$aN8|0B$Z{pkqt5$vAp4llYQ_8M6P&~Iau ze}AaKd9Zmg#7op6CH3eeP%Y()5lx$2m{inr7obk>>#%t)JBd^@~8EMTT@{?60bM7D}UzVNrZK8)%vwAC68@&RRD7}4WuTU6w!QN!g}0L(oXk4W#K4> zmp@+N6%Z4~NLiYB>@G9BR^;})5e-j)z2=_L&Yo-CLfjZCmBc@)4&1GDfOGGm@5q+J(PVU>gB z*B9PL-pXo){oej}*Qx+UUe{l%nK)B~VBXv5OrtR$O*`7Vo$9tJMRbyH%mcU~=@UQj zU-ZAtoPJe{8(M24ld~V3e>3wDj#X`cZ5YQW)B(jnp3C~2Rdk%x#d!1T8M-i9pb5O$ zIKP00s>R=>>2&+&|J%%<$t!hX0u*~y;c6f7exN8~Hz@I&YAJxUb&kX1C3Dwky$F zoqr4qW#3LdyT!nVjx-{$Q%)8HU}E4%9qk)O?Q6F-*2D}MTP4GN>?>1?o@q^!ffy`P9lpWE!-{&sojBE`1INoV0lGIEb)n7+?>({F z{6jlG%V0l}tiI5g8<85lU`+%mCcp5)w1R;r1kxFiNl_4CdNB0d&lxEGOiKN$uW9C) ze%6Bt2|aY~hf-?po6}59Co)vN4GW+5K;|yuwi51Sz#O6vWIO5U1T-gfg(as(C#%bI zpz6;0-c2<$qi#>*sgnktad>Qg&HB_IDeVQY_W}diGKPM&$Yd|i+(c3zlKxiPnN@rn=oa)xqN|{GO z3|uByXgZ~klfzhWIr`zt3)ii>!YN3p7Tns&Fi~d3KeEm^^tt&If$i41#=FBL&^BDp{wfI>j>zlOR98uY8RdC)Ix^cK(h(n|IrU%btF1Q1z zX?BXsXFgQ6ur=9HQ7WsC6AyU^064hn4>ncOtOTI<+Z_=>{x()ZFQVIW zZ(xim&)Ux{=F(zdL1vh)h}8R|Fmfc}*g&V^VYy9E$SIpc9ZIuZ@@5S^-$!ysEe~YM0A{IJq;6@|Y^#RBf9kH2qWKdo zx8a=2lJr7IA#@kBvYvsoMbo8kBKDhL-v*=G{oPj=PKe?j2H^uoa@CI;H&VD<6Zrh7 zXRWS1bwhUYVOryObvxCS@GW=K4|ex%(tQUF=l?d};`+15AeKR2+gduD5M L`-^qweg6ChJ$9f| delta 2739 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 R_mTsE*~Kdt$i}z+`VWI)SC;?) diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL2GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL2GAS.png index db94bc190a3f21e2746413298df7350e02a5f7d4..441f9782688cd522ac29fee1e8ab4a171d7ba146 100644 GIT binary patch literal 3650 zcmdT{cTkhr7XRo)1VpM*bXi2I6qgnZxPmO8geOX*Nf8kYy@MeMDj=}n(g`I&Tr9K* z7*Il6X;LE~#SofE6GB3j5Xwt*?BYXk9+Q&d+s^+yT5bJ@4GkN+RE%O z|1o|501lh~WO4-nxSE*b4qkSqOq}H=0e~Q%xykvf;dzv?(aa}$B3#zmC42i>XdY-p zAGheqfQ*lf7a&U|e|tgN`FpO??Gj8wU~w;OLy$Ef=L1~K?!*aWHfG1mYt5QuXBTBk z6zcz3)r2hxD;U!dpzceyuaM5MPB#mlAUmg>q2?p7tZ3D)2Q|@>je13 zflU)%tkr!iw5Eo_L=>gCRb)o1s}(!|wAYo7wT-bcisedJxPU1EPR`S;j_ttschx-D z7!9^Pw&eq+(xiWH^~iC8(1D}m&ABf!C>Xqw7$A)sJ6gLYYdDZ{Q!k}L$7)udzu^*Y zI4U-w^Fo;yUK8>B)=pEGfGEam1ppqqO3rf3YUkx$5YEYxQF!?C3U>HPwwq{*CeE-; zD56cMj?WrU&ITD*(e(k8gZA5EeT^K=)(}1 z^E+=Mc|zZB9B;zMK4u7{9Fj6(o*Mul0}M`H%W&3~|7CR|%g5OaGz6L%Mr{Fgp%B!4 zICxf$N@VQJohf4GtC-9_K;z(Wqcyx=K|GivQAybvc%nc08pvPS^DQE9} z9+Mj|-6FC;_YB)Nj&R{4er%X+I&)*AENaQLAvHzDO<9sWaN{2Qk-8s$5ckS!6mANWAc`kgtR&?{LdY2$frhzbC=E4ML%Vo6)3~4Zd434rn0{T z6-gFEOP#(wy7fys{!C#Vzkj}Q@;&_ay7-C_eUPrr(N?@_>_j=zG>CW(U}py^bzM%@iufV2<=>2uV~Po@Ag zQyIa7J-2gxbP#TdQqw;Z z@e1jQrK|7_^fph}lhal$Rn`~Sf2w+We0QVWsPGm8(Oll0&Q_at#<4MscI{R4-N;B( zAjC{sJJxlif9g|6JT$-pIcmE)l_C%8SEO!juk}KzlRZ27z|>X+Bn?)BnTu3@nH=K-H? zWBMYA`b*+4P2$;2>Au@fOK>GpGj=Bv38c)7bWpH0BnKj?q`E<>R{;E<@7MB-nl4z)cgN=wff-yb=h4Kwfkf~`@}5dm znOKgMy?!vkXkqb@-PUp0zSJoE<$W~H2aS27-jFeMCqK3fiWl&kx+;rx&X+7~N?yGc zR9xpf^YCp3waRCaK02P!MJPN>#wr-rXk3CLUaw>am|(FO*xg*J`N@h-@?OE6zX7zO zovHfI$vUu@TMZmqph@5A^qz^5o3Mz^7|SGJ(~a8#A2g)(0LmS@RMojW%()8H5zp#1 z*q-f?@KS_gDg7d;$=Utv{&J1F_21DG9JkpKDCSWdWST=K&{0p)>J9S39IEw9TXi?p zR+07c_UuhT-B_0q#_kw`D#rGJ^K^}WONxg9?B)dZm7=sn7bp)NDQDvhjng9Xj#MZB zw7XgNSS!<+d`h1C)YNw0&LhwR;n3iP_0EdRJzMiY`I;_Ns~;sBH6u6*=_f5y>YsG0 zT&akbn>#e^BtyDR3DVON12UmII*@3QxU#vzp9E&_{*i`7Ry_7^KP6Y_> zMAPb*kys-Y(Dv&*xG8-V^Uv*TmE;mJbyXer~0G|%H;(8yquO(`gH>M*k&eu1qoF5V# z3O_7{$zR6{etMWmVO%bf$;y!c2h4e&qnj2wN>}d)7g$t^Q?59rjbUuacM|;v%aut@ z=R%Bn#x2;YHCUwNdT5#l2+tWOBD??GyTf=w$Q4n4qglhT{t%PTj7t}J3mFH`lu6G_ o+FwO+e|$~@3r-|-AYu?fI;(;rN^=+>ARtN=P(v32u^@;P$3R335B%MqoeO-TAls%E7T`Nxh&{_;}-c7{2IsU|8*yP^kHS6@xO7}dOf zt7?Pi3#`k{T=;n8bBY|4NaERo=YTz8+MwlH=VH8s3aC&hKpIp#cGy8cwQij&C;^H8 z>!nmrp53o?T+(V8Pkde|1-_@?>oQ_hKBd*{Ycy$4O^=;A%OfxF=hmJYRn8N;T{ccG z-&`xB2afGFrOavGK<_N1$Dsmeq2LT-=t2dRFH92BV#OY1GeG&kn>9@Qst4GDNZGYB zfbPd_3Mn>ytfsBtfHm%zJ1#QOz^$!d+c#>0>JNDNw`7!Ya*YW;g2dx%{-f2VvhOQ> zha_h)enF9PAZ0X!EgYVO_K6f9OmxGr-Co;t>B`dD?c7*$NvVJ^M0l%eTNCt+(j~9L z3R?t#k~(gM_V9*6jD}7|)=DwWw;)jE7g()Tr&404QZm#P_<3JEDx7}lb!^d# z!w0UVTMgbY%+gv?#_=86yBS|lt>pu+m!kzMzo|#NJYF;~uII{@1cYH#ZO@(Py16Ng zbpqA4{a#`>32RO0nN|vD%y>GgV?|z#>ChY~2y28Py0_Ar5gcfVVLqUNxb>(DH* z;B=!gOZ`s8U}vtMAWKWtSTfDbcMYBwCqUL6oFHzrA_PYMsLic;8*@Tqy= zBmJoIDkx7bG0Ifu9#R<`zmiwMSqIyLe4x7t2eb}fETl$kJCHnp1wGB`1>?Dw1Nl9o z1E91~hv@MT{MS0&@hX1)mycO$qDw`|AaB*HS@whbqkW)yYXnm!MWKEz~u!2B3Kpjl2<{~u0VIf$=IeWf~`f;AQPm=W^Bk7rb2at&2W6ykIDTrbpa>T8> zcy}MLFL#`bOixWp=l*zMXmx+`7p#)bbJq;rN>zB7V4?mE`Hlp^vRoB+RZTBsZ0UAh zxmGE)^UND#5I|$uH}sn9oyNl%b=js;2HE zp}^*IY$Y;AQ3~5D7mH;=ZlT)NS!fDuzt}NO`UN|qD`=U=GTlOCw4Y~ywJrRpo z%099QrcMbs1*f?P^eqBr#gsk;FWU`G3#QiMFP}0w6Spv=lO(~1ABR!kAaFr(Bb*$c7eWBD({58?&W_%{eYdS9V4Wv*y?m>=g~iu9(z3Lg z_N4%*<}jr6O|?IbyVi&V7K=N03|3&hK<~Y03$u4x|)!=&X(p zM_JPr+;QgAwgZ;Ylc#)RMET^~aVcq@4Ohm%oQ+%Gl|^i)R<*NceWq3f+LIZWh+*M! z+S);l@xCgTG4x zmEMe9sx9y$LOa}*$`lmDH6s=?+mIP)O7j_*=^)cO{Zt3h;zaLEqmTbr^tshRUbQc$ ztsipdGp4h*iMF+lPwbd~_@tDUsnNf6=Ce@o;^zIXQQMa z#>U0CI@NiQl-)%gGsV-dqtyl3cNe1v#S#aPks>tbUGK}ej0t#p{w&Ds2^1opqhsn6 z*>*N$Vz)lEb`F?LY3pwE7k$I${5rHK8PTA>!zRY1zxh>CD$7=mAA#XB-cDb0?#XU$ zt{k%vn!%ermb`L9sie;ptG%q}!KRspll5cGq^h82*9lfOM~hTTDLI0m=*O*5oQ$@7 zUVRjI;y88`Ll@MAN(w_{j*s<_lY!v;>X$n44c-=~AIzcW%9(PeM8R?!TA6>cKE=Sh9qN4PbK-Vk4D zF7kP-j`VdVl_e+AB4BLQ@pZvC23&LyW^q-Kx62Y~5+?WsA*!Wk@}s|HW3=Ijifs0% zn}T^FckpzY61;9!4Odedq50EkqdigSyLM!nUNi#@I8TI3Dc{{D$jzHeQk@NBi%*z6 ziFJWWM+M#$7>_wtOpQHgicAiC0%iyX%#dKu?BFfDJqNtP(N+O1_Mt874G0e09XX-i zWOhx%d-pjH&by4-3wS3{@elgj38$ZKnQ=djWqUKh=YVot{|>|NuoCl%TmA0)rmW@X<0P4)7>s=)sAlI~v^ aT#<`4OyrPxdyUsz<7n@Er0!6_)xQFld#Ts} diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png deleted file mode 100644 index 0cea4cc32d0286db06d94d3042726d70e36c10c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4450 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png deleted file mode 100644 index 34d66c5a33146a4177a765465d920ced947428fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4453 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALRETURN.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALRETURN.png new file mode 100644 index 0000000000000000000000000000000000000000..56c484afde15b32c56401881aae14e3bef1b4867 GIT binary patch literal 1955 zcmcgtX;9O55d9?v1yn#sT7}}tVL_xCjG(|D0Y%JkO1Oe@XjCqt970eCia-?+TZ)#; zfC_;ihY-S%04f%gBM}G$LL^veT56KkdHRFS~EwzP;w;V7pdX zLm2?D*6yf{3jpxt6ueOU7&!h~VgObJ+Swd(jme#U)qVS($p!_dygs?SgJB&tM6p_< zwsm$&W_(| zw~fx$QT1*-7yDHcpCGkN6IDpg1_=Vqx0eJ3zs$CvmZY+{$7U(L9@X*?E&z4UI(ErV zu3d9_3WUwHqIx6bhoA;;{{RYCZc+~&Ow$4u4Z)|Bexk0-OKnvF07X;P@UHbUqV+0` zri2vfjH1_>ay>Lm02pXlul8?42a3VleT=;oj#+F{=j3seWD z{L2MAP#)E+N>F*0bOeIcAQ1nt$O+9RrOxiVKG6$>o?>17<%#rxuNk>V*Y%SW+V>?? zH=0>qx}XrTxNS74h9OzpXG;iJ{4uR2oM;*93i$Orp%59><){o1U-5&b?f04IO=xnA z6mj4I+{6yAQDzntAK-a6&;VP`;ddlwN*@FZGJ`QKnb?^@K3e)T&vaii8EWY6yADjS z^PAo`&c2Cb#J9R>Nd`SuvOF+`hM7TINGzFQv|ChADkoj$ilh1~jjutIAWhvt!5Zm@ zAvaqhbr&&Z_jCreUF3%A=#mB(HtCxeAi1uAQ@vFTMG`Y&4EK#;pFAJ6yFaIG zbPp{#e(vDd?u2a~@B=M99Gq-LSvxzxK&VTGB+02gy&-x1Cnjgx7E<{1?=x51M_MU_ zQSq;DutBg9q|c|Wk$V9R7?&k0S+$ssGvRvRA|hCML-ay5#xDT z%e|$KTUz~koPoTV4>w^-|CkC{x+;w?<+?~E_nFk(5PD?fU|4QDK1}Z3slka*kHun+ z>A=Fs=1bGlq4<}Bje-vdbP4@}Ue{7R37KizOeONV)~nrkEo+#W=O@Vx<@9i35N5dA zhp>PlY!JDEu&lN7?p?Y$73#H|*JS%_b_MG=>~CY(1&gvRS)FUG@DFn+4y{w1!d{v3 zd#{FGu1sj^gC+Z_EJE#7^CL!EFrQTPWrou9Iv`(YVR28$huvbH5i%1my~B(l<$)TG z={2mmLP#XbmGw=9b_{)U0W+=_N8X}sOW_WO-Xy{6UP&$%O}Y?JOY`|qWi30+lj$iQ zlf@EC($Cp35tgJ2j53ma*WQuUEGEmA@~0KA9$`%DblLp#7-8dsc>AJC46cLEI7^G1 zhJ0Okjtz6(6nv9s60Y%$q2RXiNQFbP@QwPr9aQ}v1gaA_?G3|iJG^?-VQ-U)6t1Ul zhXQ9TOv-iQBn+MWE>8IwIziiOnoC}7?;%tD*xUilsw8BIv&4>gvei*`xI))Za0`e- z1XOASS8teREP6ytsyZbny73(I3AYneC}+=bq0+lZqa4|)xp?M>o}p+P^zu20Cpp`F zIce=QbcZb092@#v{f&_mgt~d|#Tdf!+oB9X0g;$@5Go@YyAwhO))@*ifVizDu`d36 z*~2!~9?(Q(=Qqs5z` zE^JSZkgjMZ&4T2unNOp~@1XGVSQ)C6+E_`<9XW;QhdTVM(XmDF-}baWJ`ro>oQ3os zNde=Go$j7kQG~`Rkt#c=Z*EdunRjQE>37}X7n@Cge~ZgLmSKKl%i_kk_r;$zQr3Pm w<)=&b11;ih{R2FI;EP0Ce*O3KdD#}rVJ@}Z+Op2UGE^e{V^DNdNGU32Ld1lSDe`A#J{9^ik*0FVZ*py3mb@p2C-fQjkJZryu@8^A9j!N_9JKG3rnTH(q zow$-Y@#Ry*6RwKv(XkUNtEqc2eJ;nuXJa{k?0t8x{Jy5lIH$7a8&}dxKtP4!#_pxdrDzDR>5=#B`l&o~9OhG7v7KWRV#*(q`Uj{mSB%cM|q&Izqq0AHMKm!vW+o z+f1T8STnK`?Goo3$Iz%7coVn20p$a2wsDhOu~ZXkwOV%>=UDj&Ta?Ml^vfiH>(I+J zT@Ue|CfkuomeE-|qa1H@2Ht$P*Ei>FFP=`IHdOIC^i%ET`?+V6$@^J9@NcNfnHyX{+&o)9&}5_B=;P0pRgy-oC&AoTBb5z554^oqo(Ink>mdXH zH-$RFlDT=)YL~u${p<*MG}QaU!fTcMV@{{3(FUR0WBQgljeBT@d=LeMDb0ZO{N658 zYl}jYN}HZx|E0!!*XoPKtL{`8;76z2XIH0nds}vGqC)lN$e6oBYNz+EEOtb2$nIrC z{&2mf@sj`PWwq7vi!E9!5l!BUQgY3dzc?d|ANHj~*1B2DZf*sv3-c&^XeFnu zfl(CHN%d1Nf0x^o!bw?bEDf(=OTQPNpLiT!xHPg$iF|D6(3J%oC9FS^e)(7l24MUY zX4S>dYAkOw`_^jFqYCpeUZ!pKt#b|44~9P(dxc6UW^;MUM?R`UO%v|B=_8IJxesZG z(7w_fC##+V%VtHi>M9z8PGM0zT2{@%sGo9C&{b~TNU$ht6NCzYM3Tt#Fji9?zEvc! z{SZ^vT~lxvlyibR>63#p<9JjA#7sxT2ZU4vmanK3+w<%FpkYqkNN9xi?Z8NI9wii$ zytpS?Dn_`W(>lFO`tgDnKwtYiI=A%s=j83a3!QB`i_mu++^+)e|{Yk!&2>=kLc?7q+0M=smQUgOj;!WYWWs1ZIMb=Tv<6 zyZ0G8SAw6s^g%!6l#z{kKmg?Gws48%{$~hnpo3am=sq)X-%ncKA`)2VMb~wc*a#Q= z3v!ZRDP+t)^-l!(n!0d?5!M>BtYuY?-E1zXrj0Ri2AXXbNQQ(X=afGGD1UWbI=!jj zLY^`mgpvy?B_C#{Sd;@X{Kj3-b7jbNu4%Yi+BcouLn@s?RS+%tj6X7;(Z&Q4171>O zp};XjTi9a~8*ka1Pst;`v6=77uo2`+oBI~?3l|@O2@U5nm946vu=MK_59 z&rR?}xvzeRMmY@cajry4K)m;b4*`&T05nOCIQTOkt0wuxNVrwspAk|i{rWlb{E?PN z(<_n7tsh)9U zqu|8kc~M=ri4~aT#Iuwq?>3fs(*@kgkIDdq))IIzdn$*S-S^$%uWKmQ8N&pjBX)E2 z!k{&+!%#y$P)==YSKA=ALmBFKu}Suuo~@V~RC*q)n+c>bSj_lD;@8g<#(R;(8}cyO zG!{3!A!)A@Qe+Y<#w#qS+dL>XBOtNm$n@Qjx>pSxi6Az+^A;=k72LLY*zkeb^n;hS8Ce# zlJ?dR1puPp&&iq`pPF~3uA3zVjhDjELYJ=bOD= zSj4HKfg(zH6|S)2(3Yz5(aSQp7~R48U7T&6q5WZy^*}F)86r5NP`)43TGTjq9Co6K zeu`B8vu&~Dw{a0|wRLkEsH6zuo8_HSa=<@x{s delta 2165 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 IcU0p40FsK5O#lD@ delta 3056 zcmY*bc|2768$Lr>5+h6Yt(0ykjI3#tY$GJJFqTq`Yso%SmNQc~LY8YHCR>e*YZ)p_ zmMn=&Xe`;cAq>V=V`-YfZ}7W+-1Fag&-1?L^L^gueZNni{8NQQMJ;Rd%NOl1=}Ti{ zAw~H|xw;0Auk3uzj7?w4{|luG9?75=)M!09DRdd$NLpda0ejC+>Kg|Y2v|*GG85`n zXv@5N(ba(7!PoQh#6Af#uzsz6;-}v}8X#%MsX9P49QYIW13Km-kZZAj%Is&UWx?XM zw?luKI}QsZIgBY67sIjx0iu>8|>yDw^+3^a@C1%}nW>BShH;<$kOJlN8 z3-#xNHAceqPujiR@!z5MPa1OEY#cqJ^|As_qG`%%^^Wp_X; z(;Lp!BYjEi@-=^eXGzGAf0~QvlXJK}ydm;vnm=N}7Ohvy^!_AKZcvpx5UY_GPK3jnIETwWo zpbJZ)ZEq7-nAM>i>34s^M|qPsO4_)>8PR)2RI5Vd_h6@`CuP!hCJk7KgB z()Z+sfm#egT+fK@LIrvLFIOIw+vxIc$*awI+p)CEsvXeQ7i8}(r8fnAk$O00YKUa7 zwH8a&r5~+&gAZu15s;vW*55hB1NedN@=kfQ>JH11DhT>J{Z2;nkG5j5`kO_deMW;< zXRs}!&bJR7fB-rpqsgujf4H-gx(>h+&%BjxQq0PdOh(FTDp`;U0@s@FW~j8oiQ1~^ zX+{;u0P76m4hKBWooC~-dekBUSW&y~^KL4i zbFP+%zrrmG)|PqF`|H2Nd=vQczUnIS+>8KP9RS9&m*2Nv6$G-+z!I}1M#j^gyF6mq zF)-048EDN|Jh>Ld4^X_(;v^~d!R-_ce|H{x_0EPlwifOZ7S+{k`dM`B<;)9f~o=>N|@bfhk~&usJ@?+_`ooL&w=6dHQ;sOypF8%fiVbgoe81K&`1J1X5Muc!{fpYG-ax<0A zDz{Y5R|Xp~=!${Q?fu(_hB^X5b=X{9=pglBrhTtETQXh4knsWn zd}n}74khw{*^A+g_%0$MQ?sUZaEl`fS#eLJxqZ6Q84Z`a-!!p;qbCXs9Rq+oJ=R0| zvtmxRI=L(cFG|h!KQKFUNoRBHN`_ZlZjOqGg>QHt)L1yCQ0)4UFaVs{6XhW``Gh7V z(7SNMi-F$=v^T%iP45^x=~n~+WXZej;dPgX`2A*`$^q1-ypjhDjXDfDDAzz}iq(n? zh9Uw`z8_|bN%ELswahnn3jbO#a0n>5wIq+bwFLn8-B_GJttCx4KMjXhfVhDWAY{IJnM%!D zVcOENMm`NWa%ZFF(&6)Q5Uht|-Gwpah%0G0%p4n~&dHm7yXjN~M(H~n1OQn6YLc>Z zixs@%#Q}^WEOFT@=(OHOcjQzKZU&#_p)6Uxiupo4vclYcmNc>{C2%iSguPDQ8LY(r zp?oV_57HykX)p}>^{|kcKCPi9mMA@v9#PRlD&9ER1v6Gmo!`V#)AV=P{9N^)?IKSh z7QvLW?zHh4wHD50Lu`;fUtUy(M3OMnm|+rZV!lzx90_5w3*@8d8JcKapiW4BY1pFdE|`SwZR+u(&cQ}R z6YB{T=^+>*;Q7>53`2aT9b7W$_YGfGZu_OZgA9xnS5)T4WD@mm0u=inoR2$PzdfS$ z+Tg1Gai)?4wUHL2>OthTYE{xf-bHk!ka znHV4d84a@Jkp%I-nK$ZdeS_alCz$Z4y?T5Q(9)TH)zkSRt#~xq zVg1weHiE5A-Wo@#4{j%IfBG$poNocC4o~5+rW?Lmxz-GXv!ZwY@HvK z!|14v@{pr6ri4bHzF$U=lCVY_y7QKP9uU}|S2VA=K(Oe~(8E6-$Gw(v&XNW1oUtx= z|5dhu%U%8)Swt`?*X!%uahnHr=4N_s2w|Xb&J}{i;Vxba_?W0vfvZTx1$k}3#qJL% z4!zL1`)a)N#O~EbxQ^6n`f!Aze!#5LaecwfnFbT-ARE97cJHW$LuTV93eHHWs8TEflkT5)kZdsDB|AGA*C?}`6X(pdWA&Z;-hM!w{kOBtwqqZa z<72!!WrE{_5TTiqsSyV6J)Tb^LVw}5!doLHk2;s=5w<~Bw9-p%S#Lc=`pXLE^T{*? z2xW$?43?|g;}W+dmQyTVQLL!lh3;OFdiHQBUc#)hA`Br8W<)dVb~@5EU>??;S?{Au zxPwrtyVdn~Fs9+H&5jdD`!}mddT%|1oT7VirKpo31C0NstERJ>Hp@SdCtC8;$`Xrg z;}A{5u_xliOkY+3;5*j|9wgJ|gV$iO1EPGZ?tC=4_}q*Pn*e6SyB=KOX>z!K-_tO1f9yo(T1>km8RY4D zUE=h;pw7RkitQ+JSPhhCUL;m(&XnlHuyU_`%>v?RK8bNJx9It(tkvcy2tFGh&v?l1k>x=;X*8!)TSbPV88bH`!p`)wtxowF*&7*zR Pc59d$TU{nya((na^uVm( diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png deleted file mode 100644 index 7ec775889c516d20ce5ff8b4f8731c39c6b64599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3554 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb4674b10b418d188d2d61cb5f861205ee36944 GIT binary patch literal 3583 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 X!7XscA%)$7rva=i?959{FJAv6TStm6 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/LT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/LT.png index 59927272c47fff681b09ffbb1ab3e84fc4a8fe86..442a7021a2ba0264331f5fd650e9e8a172f361b4 100644 GIT binary patch literal 5234 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 A3IG5A literal 5422 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 P8r(qFR0nqkdFwv_YW;Pe diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/LTE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/LTE.png index 1b0e35cf2908875181345a8eaf6e7a66497de406..7f2383fdb4d3fbc8f7f3a98663890d22e97eb13e 100644 GIT binary patch literal 5255 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 H9K!zw(Gxa< literal 5441 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 N&CRS16z{`a{6DM4e%Sy3 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MOV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MOV.png index 4d79281a5e34e1e15c15370d027e49081da1130c..f1e83baa411bacc7c0dec67e4a412924466ad7e1 100644 GIT binary patch literal 4204 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png deleted file mode 100644 index d39c81f4564772e9c7711bd57f1a842b8f1d2872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4441 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png new file mode 100644 index 0000000000000000000000000000000000000000..28095b7457b710151e4301f4dd2848ca0dbb319c GIT binary patch literal 5274 zcmeHLcTm&W_P?P81i=joDAj@}-9-UeAT&ja6h&!L1O@4`C%#;>?K9t)D_5X3o_^FQ)R%5o8u}KR~+zt0aDMgSp8UN|Bv3l;y;Q5u{c1&TPTc( zzTamRU9yAZm+0b(rRv-+|P-NH>^N_+vzJUtRVP972BC50Ftbp zX~=2fkU-*MUbgiGZg=_nRDa}~Fh&{zR4a>XtFE1WpuqwTdD{)jCfBlpNy$Dm{nP7F zKA^R$E$K$HMri&RFMK=1U4D)aT&=a3e-#SwK4-_^*0R>FqeYbqLAfkIBUXP!P+UXa z9%^-;K+zO06GDP~w?f90wGfyzptqC@yFYpro zCY?%SwIVBiq_P9Neijbksjq%aMfS|2;(vQ|pmd&BOZ2S&uOjso7#%;x!IofJtVw@o zf)sr>yIFN`v2Xu3*_rVCB|DF{#3T3cF9a4SYFOWnppsa0zY-2FEg%@DVksv0;&b6b z!84tBk>R=e)#oZ|j_=c&D-gWf$@$5OZP(7IUA;mWwFXJ1ul)hbW4~qN+Wy zuexLAk`PBU@&>*=Or}ZPyP#~y=L~|+N>=r}80dM;OBczUKQP)=8r2C7hR+~__Tx`P z(hO|F5z}MMF}*3_3*oe(5O#GRpW=dTkM@U9(xBL9`QuOQeTn5rcKy7!-oDtG5#_9b z``Du877-~YfWsFz&EB`J$so_U&g4ycu~^NXBI}M1jBsUo+LMX}5GQghg^>!=&4ZCT z@wQOS4=8J-(GE9E`@=Y0-be{Hs`HGS7`kJhycw_WUGJLNVTd}=5}Z%Q^&UKx`fAR- zPe&Mn0yN2Sf}mAO@J0EbO}#t$!`=-;(XU|-dio~(R$gPBT*7KG*i*ZU#+TV7er)Kl zI!Rb{e_xdTpT2jNSS@;;xpS=o^uLZi%ZPGmvkxE;xtx!`(AA~;g)FzTgQ45YNHFx^ z$8?%L7rAc9TjT#2ESNq*9DPFds&z*m`rda=JXlvw`TADjZ#y5T^C7#x|1Q$^WWHpA zvUOUdPiXKpTmE-RK%c*1M0D(0y zin088rX@8gn-zelRMrmN4@WYZR#F6PGfclIm8u`3edAWDKOn~xtDLJluF>?t)_%8N z!CH~_w{a3#80ju{+Y$kxk0uUXA^JCVkfIY*?Z^>fmL*7k4ypvf#opRH zrw(3IETlk~F@bM{F|p|h>2|>j>e#t6uwD057_$JJ#SmkoGcuT0Mw8~eN1agwQ9ujg)nF^zv-Z-ju0N-9!kvX2b zr>a@?;XR5m4i~a0HEn-?*v zYoEPT5ND&VO$OCaW6?J5MABl*YOO2wP#mAyZ7dshPJps<$tT!I9&*_^uwfUv&@SYd zvlu@LLBfbu7jB;8cI)1X0hg<@@$rSu_6H}qT&4_$&lS|fyNPl@JGxULMcEKHC=D70 zN;`U$r_qTrDHtObjY%3&i3yCfD;IN#c$8OFdGCCcL(n<(mD{0ok2mM`z{|Y5)I|NW zc>&Oh=e25yTX+^vjAagB6lg`nM%+TPoQet+6Yvbx*wC~$>8{MvcgpF5x)HgaW|W|{ z#1!tU!bY};grA_a*Kjsey6utj>UdJY%Ci;9TMN5kEk}~XeSYREa_=E=K_I<5 z$>h?>vZkYWoeugW^>G4G5@=a1+td(zj;!m_awGL)`Kffa9ciorTI7)ui4P#luPyKi zzck)|OvBiJ&502MfKLVk0Xoypu$1W_-za;YeEvz{AgV1>nP&8>OKmqXrt{~w-B)Fj zDz;5IY@0OcmT3@aMBtCYLbWwv)m=NCZITBeyI6Ku;TR9u1wS$9aPy3lkzoQ>;2eWY ze~Zyvu&wHL+7`jddfST{xfmV%WHM#;v2AIS-ytMGeMAGT@Sk6^KShzE+4A=&4cLj; zlo??!S~wZyzFr}YxpqBoW;JsXfLxQ7*Ypft&A3mSYbe{lb ze=V0sVUX|(_G zxv219X-RxNr{gh4wF=|jZ$wL!oxOy9guW`b%F�r^mRCN8;Q2?-;J)KRCyuNa2JL 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 H<9zcU)-Qo> literal 4670 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 PrrRukwK1(a>3QvMWG|3J diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png deleted file mode 100644 index fc8d2cd1050905e2e464dff88b46cfe9beb0895f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4462 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 literal 5424 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 PyD)5PjkF?tb?Npm3LAYH delta 2790 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 X=T#&v<_A(DpQo+QA}lJ;xW)b*e3XP~ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png deleted file mode 100644 index 44ddaf86bc26a92d81bee504b3b19bcc2f9acab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmd^DXH-+$wqA*HX#y$&A|MW}mbCo&gH`h1!<7-!q z1o)2d0RRL{j4xRLz|+W_M$n2Ma>=Ch#-^0PN>b6eowfOG;^s1p`BfIGV3t8 zR837pS12qoOky#%zFay^y!qU%_iwV`E2QbjD2iBE=Z*OFPe{AyKO|t0kcY{&xTl&~ zdFQh)E|c)1B(78vYvsdT@v92QTqaiB;nN;)NzE6qr||UhA*)rL+X=H@(y=UegK!n> zVis%p4pbH+RVtvQQ-T zy~ZdhGFTpR5Ow?Oslb}hCdGK+YY_)VMN1n5Sa(~+Nm(JN{I4mRKJXJgR(br#Jp2x@ zrs2+{mU_WjnaYw*bh+fjJbg(RU~Fth;UCS$GD!Z$IdlzNb!y=@_;QokaRDKy4^c=7 zKCX?r=H*96dq38xtGMQj4{2wZ0K}m%as0Vow{B)`>@VO=efh@s;EJ1G4jmpUJ5jvR zDij)X42b`ev))1fONe{PVjJ=3+G``-g^j6D&ybNVi{#M0{G)4qC52B4>y>s!uA7hl z(@^053dGko&}e$G7i)2KTZeWdzaS^cIg+Lq&6mRj)i#6b*gXH^i?PScIf)HJ8`y*% zzA^Mao5dIt5m2>UYAt~^x5b=LgKPcBHr(#(RwYj2)2WbT)=@V2`Zf=>K~Pb>^>oYqpL-;Hgo5 z*w=|`kc}VN`7Bv<#p&0=!AT*7$}E$Qys(v1{yZ|t>AE5JE4uh_W zBRI2av8V>y*;^aaBr&IITNX|$dJsV^_z^LV%iIHeD=Sbj8{#={WPrYKv3_kEdS5y| z%G1I>tmoO8nzvm<{`9~ySXA-^-uI5cFq(Kg@aktFE{!EcMlj{(@78`g-Qo@c0BD|O zPPm=s0o{C%p8g_v{gtNXKt;!Va^PIvyM3oz1_$#hv}tK!7bH)GEF(uJ3<9OU^bWRB zRNj+QJ-MZ6hhfx%aM8bj+_>qzs4Y39lBURB5Pa^&ki*TzgWea6Rj<0wun^QaO4=yZ zd0^osZgI_#nARLPkme*3^pWVBxTyE1adKW21XLT8cx15;)3{<6-G>h=>{48^NoDO{ zq1OMP&xs7y+!@^bu$Z4&5=SwdjnE1dGlhVZ)%){R92HoxeoW!pvI!*2yr}x&nU(H> zsr)E=kyhbnettLo1~cUCn*j*E7dGoq5CZ_c49c5xeZAu)Lv*_EbE~P^0^U5p?|U|P z2?RV_veYkfJ?+SMp>vKU1C_QY$f`tJ}VH z%7lVt^($NuaO4(OPydfza&sC|Y%2W$+|cY|^u1Z4_c^-L?%Oh&zoE z@yL+}Oj^mCRdH5C+~n#BoDnMAI4?QG*gpG#aWZPPIW7LdV3N=2s28`B$`pLgYd;{J=Iesvk$ufufW*oyn0j6=~k@w|%5FUo7% z#4VA7c&F$04k+hJ=`WON^j+#;=c>rK6tyv8rEhGpycMtY0R{*)CBdhs~eVBJa zSN#c73ynCr3;J#KkB?N0E%~ZB2yt{QlnoiD#Lo~J;P+S=IzVkxvgS{6U%mc zK)5bv11H$1ZG1I$lMgH-I35;w59P&}Zjak)5zvzlEdi!-Ng>{M!^7>)=Txx+!@ zXch|qRPUys=WqXVCPv`!zu3DD^p%xf`u3Z(QmLtL`FjoxEmhAnx8S~Yr_B!IHc-Kf z&u2`bKxma=m*~N(FRqXRj%Zx*7E`(xNhd*qi*Z!Z*oPZJD{>IPm-PflvSTE`tflZY zT|0p~_If$tVnAl%7Usm_p9yJSX9cY7PH~khsD5+oWz&q4sJj4TL=@^QkOPDJWpqg+ z+k!@hsm&4!k$PNURL-L*g?=TcJG?B=(4xn)c{ zBC%Z~lmV5}@xaw^IW{i40tUCB6K{O5=nK+;!!uh%O%-&@n93zc2Q&H`DaNZ)0X8ZvDSnq69ZbxuvOG^_)EB)ywFRL}Wv~<{b8FPd3L@8cw z7F)-LecV@qMv}MCl-oW|tW?-W_f;+`5Rd~8UlCtxybi!Mx_HqKR_TyV_bQoPR%9wP z+Lj0|x=5=xNct{6A}WsT^ImM~Obi=gU%Hant`X!pF9bAPSs^8-Du}mj-Aur3Z20rV z4$UDuB+M=2{!7&-Y7l#rjr7+Sy$RDOqLnCkF|$>mRUp?GW*fcgz74nblu(lY?6p}= z#k!NkwZ)zuh3LQUIJ;SCU>t9H-RZ{!B-ewi`6!C44gG11>BBpG@n)_lb1xVPK9@{Z z?h;JbY_mGU3%pK-RgQ(7=`!8^E12A9K<#HW1nqs-DT)?SALje^^O{wqTSj@J!oA0JW7B8tBG3ruvQ5wLVy^D&ocej+R0!KfneU#6xb%qB%m(xaLz0s+~OCLAJGfzp4ML<52_=VJbdRD*MFv^=2Ax==tE^%jUbM z<&X*lF{4kG+Sv>jr7wEj!@`*9mum2&+eukU`v5INToLJD_xa1z6;n{erW~Zo*2hGi zoEpEtlBVRR^X-2bS@Ww@E`OqW+5go&)piqU|L>&uw}> zc%k~LE@UXFzJ42Lsjda|qo*4YUq@Zb5WNR6>1u?|jOS%+`u-=+F7=%B?uY`IDvt=J z3)g?EK6W6}gRq}|aTpwr;1vDrW@%=0w(}naV4o|$_HOt8w>tb^_H%(D?WPrX|5UrY QKgX~p23IfPeszxd8|o>S2LJ#7 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2a43c54e18e715d4983cecf7d48cbd64b811c2 GIT binary patch literal 5724 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png deleted file mode 100644 index 70ccb4c1f5a91a886e62f0c399de9e395d585873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3553 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 KJ?Yzk8-D{HsCw=I diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/RETURN.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/RETURN.png index e1bf7d6a19d527b8831e47e82329dfd6deeb7755..90d42f5ad0f01e26ca9f5d4da5e412be064ac62d 100644 GIT binary patch literal 4324 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 BKS%%o literal 4341 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 D(N$&@ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/REVERT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/REVERT.png index 67c12bd2d06e75353f09906558ebdc098920661e..01aa918429fd494ab3e4f70bf810f0272172d54d 100644 GIT binary patch literal 4319 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 delta 3236 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SENDL2TOL1MSG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SENDL2TOL1MSG.png index 04611cd6a436c4c044f521bd731a3124d0c9307b..253882ebc65061f99f5e8eacbda19ddd39275a50 100644 GIT binary patch literal 4670 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 s^}sAG+6z%}YdhZmJF$lLGXMYp literal 3591 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 Fe*kto-rE2G literal 6614 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

|hc+!HZPvYqg?<4Fuz0BN-#yCn_| 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 literal 5419 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SHR.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SHR.png index ed85ae15c1f59a61244d04577cb793ac3b9f70e6..d6e76948abe8386af596340ae34a9d6082862200 100644 GIT binary patch literal 5354 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 Uwc1?1?1SwafNyj8|X&N+2ks?)8YB2N; zQ3MP{P#_eghxU*fybvJpzMy#D`{T{LnK!@R%$s@p$L8!ed-j|?`#ERNo(G1Pwb=F@ z+6Mq&)6v$r0st!-qKQm&P=9AXVhex+t2!F0#(qh&0|P#J;zgjNTx)PER*COI%SdK~ z*{1N>$!^{7i$#fHS6Vy|HZAUj7hrm;mjBU zk!^qKJ||ev=}br^cWVLkypA4iN*I7YJLM(I z`UkY;)WiN%KrqD}OX7I1$c6}B$jsK41895@%^#o*62n!F!a*AM3_i1AavlKt+nTZ% zFV!}Yj4~@&Zu*uJG?RRcDbuFA_ZUEb!Hp#~6!`&AYro-03y7t`K$cx4_nQhW&Qhyw z*#>P6G#IYv#7w<{u&9NuZ3ayR;5`0?xh>*5Z#nmCp(((x)KI`&)aIawxa5rz^PgePYF$+J+6>uWrv z@nAy|OXsYsuj#~l|H&%9Uy5@$m*uC&i|P-)ukJ_C`?g#!HQS&k?JIJOJR0RQnM%ek zxN_mAo(6|sZ|UP^*GVDB^1;e1+JECc-Q3oMRY}x?c3I`%DX6bXcGXn4$S$H7%;|?E zcPb)VHIsx7k8*ZLOn17?3Iep$ZKbVum!1%Cq@qXMt}!x5u*#}s4dEy$V&eF*aCO#$ z@|lq8SEvd22G^sFTw4D9?1sq=7@0^odji6x0eI|r7JW~N$t zBt35J=wcJAc{f7*z;4G<8F{=&h38Y5*9(|>*WI_rvx+xc&2TKm91{~Z+jUm2dA4mK71sho6{RejcKH$sBZ#LG9f zqamNu8hu*+4JYNjPaj6Y(|9QyKc?7x4uGA&3N!37{NLX$+uEG7Js4JpiX1cZH2^vB zuip}fg36J!CS&FwYIN}P;DK$YG%N8`E*bMvwY%Dkr_z*i3U|ZO=_3$gK2JF0NA)2o zeBJMVUXWAKTAXwQ_7c)hw%()v0IUzkm{LpqE}9hP=q_Ejmarxz9u5PB3Ic#;<-rR@8Qc`F-g5qQ7S&mXn zx=56KW*S9gTbCr;mn)nQvLC(*mIsavixP8=&1igsF;s$&)heQy8dq`!=!H zl@(e5e$5Z0pjt>@1aqKN)!F-c6KExZY%p{F1?BzuNQ-g82{ebJYT@FQZa5w zE7~C4H0c{InG>k#;hllb1pT^ZWclg#F3|Z|Xht_*otgq%P#(+g@#C0R$zRv*nEd8f zr*L`mL~71LSWzn^#!zoy%r5+I5Owbgj3v=yO8?S`k`FeSCT7qcY*6V|EQ+ZY6xY~J zz)}~(Ixn$zLy&;tajw5N$3U{I-*b<{e3=QG$e`6|&x_2ZF$kgMsTC)WfSw*sNQsnK zI6BVj$B|-%gVdH%GE+wnY0k(=4MrjEarUmwQ6q55sF*I~{l!!&rakCnD2IFqlA$&L zGkveHyH1P`l6z--#|&2Dwo15-1%*COiKnmdi+6HJUBhIgXLyFQzQ{^%_oYWs@eQKm zjtvSE`V?u1?NpbNna{T94uNf0=$sR4S2ZtYty`Q^t{|mDhF|F&Fs(n;NlCydI5(_A zoEZiu&m)==UqL&Z>bMkMzq8j5S79?3C~H?Jd@Vz@-|cj$xl1@v%M$`_t^?U2>jx%| z2- zBR}lVg|}|{OJQHAhEkG z82S4=fidwTIs=NKwM>V3_z_7rHr&G&>A~{Fjot3`chTYO|L^p_SB|w_nzdx*XZ#!X z-hMYIyzY{?u=}oHsVnhC`zGY)VYdS=S`B6MWxckD>O3-stA`(B8@@KP(T@`=s}=z& zz4VzU8xTN6a=z}6#1*;-=vGd<;XT8Z{jdu={Up1&AR4yEJryU~ns0N;4N8)4jluz1 z@~8+}#+VTBreW)tRF_q&@)pyUiGLQx*uJ1<` zV!1Y>ZQ5qS{GWLOVRgvvceA7|IK^O!I&`ENds3u(ZI|G^CH`^x;m6OCOjl4}9BHn^ z@ne*9xGU=JOhOZ}XTSs<#}rO`rwG!Fc6AS@nFj9tz~8jEMGSt_sa}h`Mg7nzfr<4TQ1?$2QBa@Z zh5ObjwvJ0yG~*hOK6UH&KdV+H1SK?%)Xf;ujw_#{;EmBI4&+x?QNFAh9;FOsNVW*r zADZ`Z5ZjApces2t0tL_~-V4pf-A0|rF|RXv$>1)@gSU1mP|P#M*oUbiX@j#~cM9w( zt`Af$k^fMzxYCnuhloS1l<9KD$_@4#XhsTgR!QEXJ?jlGoO8S`M(zG;mwvaCqa(ld zir>j^b=Uj{-Y#jv!Ib%k^S(t6uwXGBXT`46o}Q%5JbZ==KPXjHY@bv8UiVYTO3207 zCNtk+a_HZXZ7o>&=BxDC5~yQ(pJgnEXp$-t);urZx)sVp%%CIFRFefVkMMkyQ@YVn zku-H7)m0Z1rWwB&L9icVS-&po$1}$~f9_+70yX-Qa(RYG&%j`G+@X*XZHege z^xY(4+cibQrphjG(bu}vAd{08o8vz8+ErS@mHRwvrYxIb=v2&Qqlb`*CSz@U5?Y#g zd^K1g4CZE`yGw&6-is*NbRSs|8jrm%w7%vR+CtU)cuVv|;Tv>*aS7d>WQSZc00&N* z89PuXd`);V5eWN3n|W252cMY9us@W<;qm2=q;GMEnr}?kXlOod)!qh{+C$PX^%JnO zL>+*F)aqVP-n`PR@E`__gkaz@hB!SReQ{us>^!pH@Y8DDS;9B z0Dx@l9y{N_GqjEYJ~{-K!Ab@roYF|!MBjL*4l`dVLv7C73+~>v(fv!&dMhl$x~^?T z!~?yhn+yQ04mk|Lq?XS#X#OI19z**{D}jkjtn|6iLB(MxMEAQ-{xdcF8Ue z`gW)P^PV6xYDJD*2(6QS!&Rxm#j**8&fNypX|V?q%@1OLPzD{T>Ud8bRju56K%~fB zXx3{skV9aOw9Gt*jDZeY$B}M|@^&SmQe$RCYTp4Xza(Mv$tMqo7MC7m;pHei3pza? zpTR<98C&>hQIgN(_5h1AWlgb77)UfM47T~67q*mJ2^~sHHe?>Ew_QQ-q;>f$RoJ$D&60dFTe^Nl(k=*y0``ue7FB2D4YU+#5PQ` zxG;2g2AP--OOqSVt%I!Z_nhDm_dNe&L<~qt-*$efTj5t@+n4#Bm=&kr&EHDP6}LoG z8g=%BHg3gkbkAYpZp)je`L$4S^j)6CABIF|*YDKGC;2OYj-sVnzchJ zhwBgmGH{q?im4Ba_8hNRUuA$*x!$=WlsqC8o1j&l?94yp#xA}kwYRc=cA+1~C!}p( z=+exg*?Rk)F6m5up(qIbIBBa?L>9D4pyr^u6K&* sw~78$jOrTQAF{jb|0-7h?M1z*El^YH(pG-aZ>LnLqj^~)U(Gi7@7%46761SM diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SLOAD.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SLOAD.png index f9c6540667d42534817b11d9f7c9873120712302..05fd89e17ca6d8144f658c9879f5692eb710150f 100644 GIT binary patch literal 4327 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 JrQcq@_jg7iNbLXs diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SSTORE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SSTORE.png index 5580d4237a774225ed61e8347e0d05d2d8efc1f9..14742f8d60e0c3a861d15a7a15f9dc809d79939b 100644 GIT binary patch literal 4354 zcmd^CXH-+$wq6M!MIeIGq@II#1w>F#Kw^Rykq%N4qzH%}ij>e41X2`*djJgw1*NM< zmvW>S>4zqvg^1D;n$koN5Fro}xB&ECv9D1OFF4vtGyKu2Rimv7djf_Mz-;IqdCKUusAK zbxz=A!}gDc?PbdTT?RlvJ;xB9K)vxNH;w0qg%cd(=Xb4ym<<>2AB>p^ML%yn{Ts`8 znceO%NvFX*`j-N7MhxLuwIw5Yd!K_hYgBoiZTHgoli_i`sxq!!(|?NV^D7V=<*7Ma z@C;HS0j`r=K*B^gME~N~fw*a|Km9w$lf{rf?}F5A1vie8_Y)v={v2`CYNns$nJVE%HAq*eRWz!tqoTC3y&y9i@8ryJjo`S zYg#k?!-3<6E%kC0PF3S^ZHQ>i*mlVtcpL0?8*CG6-#O=*crhk6B_@86`IfOxv~Eef zTA95y(aniI)ysNK9?gL^rYFM&yT*T__%_S6!BCM1e_P}ut+RGr#;@K>8}5TO?t>l~ zo!v}^@NnO@&CX#3f8Xep@gWY*Ym!M^PbzcUeqA1DjpH2Tf{Q$>Y+sISx`CFTyr?g^B?c#EFLau=A0h8>w z^$0w{T9a}1>D{N=s0B&g+P=k)e*vIWqY{5NjWpEO{*$*3ZN23I{4*~JwyLQor3<7l z-)WH^x*gShF%+Yn++OaqUpf*qdWv-vD8^Pg*A6zXUrm}&>N@Z<`O<{KoTs?ZjJ&2O zrk^zcW9~Bqr<~P6dq5pfXkLX9;`>V_(Eqgr`;lc6i~Er+&z_z6gZ&}s%}fpl8X=hl zG%K~x2p1-m$gyTs{~OcS{}meWxa4aIBIb&zvVGQ`%ILfHiF9#@zjVG&9So@CYzQXp zmqN~8W$okz-0ACnH{YwgyE*bdB}_{ZtNgtLn~pL0>XMo@b3#-kt{b_98;c=sKiv^# zFwXNz9~xF^)8S>R#Z=hoSrX;AYTE+!JSa=v z)s25u+p01>Ck!l~TC-)u_%+o*J^_=Z%d~R0FA~B+87I@VqKUriR}g;RQWwPm!LjgA zST^#-A#OlIswVW^z5E8^#~*qF*6} zeZHE63Z(an*a`t4G0dvBQsx7_0+9DZg@4g+ZcE#gVaMY>K1V+I#aOCnRM=wV_7nPk zcdO0}46Xk}p%dH+qsZuN!9`TFFV|iRp*FVIrCe=?97 z>i1>7nXU3&-JLUjORlaPYw1wA<-0XYL$?M#|Ll@c9hU=uakarl@y?WcV#WcXsQw6x zDHE}QgkS0_yjQ3a_N{@uMv)|qYM%~SL@NMcQ9fT!aOi5Re5HTa!*{diB};rVrsJKN z)*Q(`IAl3R-H{9E49j-h+!=JA+qk=?Dg<3QW-)Lxd+eu>@2XR>BWY7_teo{M!{y~A zJph<#mk7IUdL9rq%kPg!<<{3IH4s_ep*$BNX`rjBWkAh82Q2X zutXt)B5f?zd=+B~0bznW-ZS8M gz>!-VVKJxXl`-dOiWh-#qreVpW!Nk!@>O;2z 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%0Arg5 z%Ev8>1?OF!N&kMlvsW0q+IFO1mAA4^q4xS8(g~~K<~=e-hJYS8i~=K zApPJFL&D?AO1FslEQY*&rf2=aV@)Bz^4ZKwenn>JSa7a*k-T0JQQ2AKCkp1Yo}Yzt z4FP3La2^7mn?X@Tq7I-03FeT?g85qAZ>Z>5icApz$wmBt`ridp=uaIK6{TqaE+Ta# zK$j?T@V~t9+$>-5b47b%R(=rh0|568_crk@+Qe`HpU8KiZng^83lVj}c7y+K69-W$ zD?7o$u`*(wFW-{Q@fR=ryKh|r6F`{lKqL$X!!liiaRG|e>>cp%cNB~Bkd`G6VL&v5 zD#byHmF2B~7ygE5SH-VMInbfpdJG_ctqnmpKjrB)Y618)z8vAJP9KP z2j<|~0a<){R*}%}Y)H;0kCI-GE5^+-mPR0AW_^W~P#mFQ^;SriSUmZV=N@g1p}c1j zd2+}>dM9;il!d<%&_8PuGeKT7Jo5l*Qa-;fg&Q51+so=eX9PP;0!pfO68O4Ho$g+I zkc6M~9~_$~&r#34^i8$V;A5Lf4j(&6gw)&8XiI1C(F zdLB^9#!s`ehD*;X@edj(t4^m=-F&|6`7}fcVAk{o%ru#C?>-9JU@T3$WVp9LSb30l zz6UKw3e9GsGy#R|R0tAdPD#oezUsl!Ix zpw%{K(%I!TIfOX7A>iYXrTsBetYWS9nYMx3HtFP%Pcs&rrZ8qj&3ygoL`=dlFyg{P zH4;10RGv%i5gd7MJ3R37S{idK`z7m9|Hd=j>(Ban{PoQNUMmb&XHz6D9gfU!IDElb z3}{bB6_cEl%mOqXK9h(N(@!C|hHk&RJb9_`Uc8ptAD%u)+ma&%l6mCcozGcXURbP$ zO-0LsHxHyvDJN;L9`Su!&C5+?uXF5R@0$`7++JYV>7c82$nCMNi9!RXUW9@)ru%(^ z3ekRq2Qmu%K89+UN8hKN(z~u}*8~+}75j#=ueWI>7&T%*lw{GmbfXrliJuzho)=I$ z&89PBmdy@w4={Vtp^{nSrpZsmMyUR?yo4)Gyf2D-9wfBK7+n^D_fpf38wz5gCo*-> z_jKgJWMhI%%)@NW0vp<~*itVT6XFq3s4+&tLrcvJA`Q5WELUO7Eg^9QuiX8x<}ata z()KfB;-Y9XM;ecSunWbGe$izC0fssDM)E&;J<}F8ek+~t;Q`aS?~smV;(Q(Oc+$b5 z&jp@Rl7yw|3Z-ZyzaDysyDMp-T^mlIE@fH`lb zvdJ}i-nUD9W0UknrqC{j>%8Jzw}n}5+gQLDM7A+r&3zh_$PQ(HIOn7H20fxOOV5)5 zG!m-8BH~NnD(>g)B38TL=EC`=1W$ECQWSkg?9C8$E%CWkMBvq$jn_jjSS3``2C*mf zm_^ffJ?Y38Cf8Zi`~4j9fLE41Id+sqj+AAfUWf&Q*9q8y&VkUo9;cV_vkF!q&7iUU zNm`}xNdZwNYA&k*R`4enpnR^nxbYXO{!9Jni2*jZuT?;Vu4-HDEaiOfF1w|Fw!J^Q mz1^|N#Q*R5-v6;?enY%HefrjExsrH+V-Z#kr^-)y-~0zbVL6!q diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/STATICCALL.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/STATICCALL.png index e433c5063c3509b0ed94ecfeeb326a364b003ce2..61ba39ba7fbc4beead09e57e864f02bdb011ec52 100644 GIT binary patch literal 8847 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 literal 8813 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png new file mode 100644 index 0000000000000000000000000000000000000000..d0455038b2e6bd8fc3ea0a8cb829eeedb68af197 GIT binary patch literal 3683 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 literal 5414 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 Bd$s@o diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/TIMESTAMP.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/TIMESTAMP.png index 8ac215faa811c009b8d3f58fece01e2c0f637a8a..e505abdd032927ecfd17d688ad46509c7540cc46 100644 GIT binary patch delta 2815 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 delta 2757 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 Mj#cTKe2k&>5i2wiq diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/VERSION.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/VERSION.png index dc95ff9b5caa13d4160b28b3608d800564555c3a..c7cb9e18eefe26d0b08af1368d9bfb5150090f3c 100644 GIT binary patch delta 2775 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 In=5zz0&(hFaR2}S delta 2703 zcmYLLdpOhkAOFrUxy(sIG3w;{bD60`8*`!y3gw)}uc4I4lBC@8UFqm#nwU}{tCLn@ zE1LVF%iOvwkzvezQrj%6F>^W7?>W!!kN5MuFR$nGc|Onk{eFF3IVK&(*UYiG-d?}` zo>U|nv1OFN6M6cN+*G+qD-6};mtb6 zWPbJ=f@Ja6tRO04Y3<(?3Q0)K?{J!g!O` z>O(scmn=DF1vmYUmA|9NvoD%;NzV;Ex;OKL`>g*aRv59=yc?!D{j3&B{NSi9T_r8{ zBX87r_lB(J)iPJYIdC)FAQ#2J2y~MLx(lnRfRLI962qm*PTCpmo+!#?%%{vvZ_VcP zsFGb>Z39chMrNPW!sMvvE;_~ET4wJ=;_AN4WG06%T|<>v!S5$;hG@p#mtKo^O*ve^ zMm9&U<{2PIwiRPnVB2!lh_(ww<%+ts4`ZE#5rS)57|zeX=S40x zqx0eV{5_K!+3D|xZ}|!*qLG?=8EcA$uC!-|Bhg5*BbZbrj@1~yvrA&?KK*}Vf&6on zP8};72&7|q!L5D3r3LlAxYhN|U}!;H_R*pgv8+D(sL5D&d<{3kWXxzXnQ~VLm)i_S z8MVZnWa(Vie)S<`rHRBK?&{Y~J;tXm(uaWl^_k+$UhADemzN6=fd61tU86ukxuAmv zmzaEDyQB82AuxNaH^GJmNfZz zzabbGw-9nvg~6P)!A4xy9R9P1{CZ~X0UPz+ov@Cb)kpt2mcCpyF7vak8>gedbd;+l zZ)Wl@fmUS7U)2Q|Cjn>1*uSNHAuwHZ9G4TFzaDUhksFkkfh<*P9NGVDIg@abduh{J zPbMT(T-z^7N7g*L$NVuJ8-CKQuKMr?2xVHSvAS4an#B zhy>6FB{{P_U|8%oH5>dU&`-Fr1ACzCu;>U*KQUlzIQ=PM5kB-QK<};=+pq!fEY)LM zhxk@rlWKigTH_Ad7gizZ-R@J*R2y3n2?ai=W^gxg28c-vk=;(*OdcC`^KwY1ne1l; zFU>q&m_;yLm*!*O7nSQ!_2S-58dVE>hdZEM5{L-cuU;=1Qh? z8OecphMM2Z)dIiL(#}_0W!wjf{A|>%snCgNm|0$>Z0DA`(?(1?_ld|t#Fq$J%P-)q zc(0hhbzb<;sShc2iL5-uKMMLsrS;hoQRr1;MUr zgv1XCFe`UT65ssXybQqXDm_EfhYCxf6WgVQfoX7&+Z%} z2P8D~`H%jzYQi>Vl5T;Hu;5fB+!V9a zYqJk%KOw>O0fz}~E01^|lm`T14d6Q#X^`82SrAQ)fK#pMT1ikQoa$O?bl6b2zZ)Uz zoQzVM67wUUD9PW$u%5i(>`!u4y(2Liqpz`BS^L5#QEdw&8d4aLRLEy+=)6FAqT>yM z725!!XXcT)H1{!=g9tEYEt3oXP%NrUh7H*-{Fm3gkO#z4p=#8lL!LZ2N<7AeH-{=| z;Gj^hEA>@rybRA*%=cl73un9X*ET2cl?7IRf&*ruM|akGpU73;)kby2y#6BLVc2y@QnbAQc}*o zMWLx6mBfzKASk9!7_1Q|8SwttV)*@($j^dn=Y5DU?I-xA**er0f;cUouR@jgY2a9QAXVDXY!3|1hYr{u_hvi`Nd z;0E))7SHsT%tk`)ytBa6RL@ZV!fNqU?k#X(G$+%}16kQiS)`()= zQ!7MtA#3-@U_&Sk90}vP}rt0}8+^5$tK}+7Nx~q;B@SyvC;3Z8n=CIPs^M>WMcZdJ1EZAyW^b6I{iK3=@?aTVhji$Zs#mAFco(cg zbTUoUIQ)AClJ%i@4Ypd%b8Bz|?UKs2IG^NT6Z6e8xfv~GaQCM{|C{RFVI3H%dYA@83RVhRFTqVES3H@ofnw(kQd1P$>t1*GhJ% s*9};4qvKcUQigSmC>wNomCC_j4t!qhWav^Oidw09@AUJc?>Kz%A6p_ru>b%7 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/XOR.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/XOR.png index 83610f677e960426e92dcbad394529a680ac7696..668629f573f3162aaf66950a280a12e29d850970 100644 GIT binary patch literal 5345 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 Xi}|}{vi8%HC7`2uR-@>&ZSda#A45j@ literal 5451 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2930a7fe2697b36b8ec481238cb032408f7a27 GIT binary patch literal 2934 zcmdT`c{J2}8~^^sk~PT<*^;_ch$uUyxRxmtQHB}CMcJk#OqO4_PI)QI?V^~BC9*V@ zEHT5-t+*wPp^V*FvLu7X7&Df+Q|~$NKli-v>HhJa^S*z4pY#2G&+~kj=lOh|=lO?= zlby7Lk^}%i+QHuD6aXTEDR?c05J=Wpv1i{1A`;j$&1DbwMsCQtNWsT!kbQZak?LzdF-l|NM8|-k< z3~I6Srb|cOpJGm^AWZD}bYC5*>_3X5hMe(YX~%)+8HVo1&1KKQ6m}x7eAdidYVE0T zmQC!)VPy2A(5IqhdCAvs!Cke0_srt^{m!2c`<;R`)6x%rMlwZ`jYz^guCvFTgjNfV zib9CEmf&wSZDyK@==q)Ty#WbY;NCP_gLDD59WKuu$b{vt#9OxJ*!b*~Lq2GWmngk6((7pR*U7;qD53W2A(Br&`%o0M1y8{DsE# zn^uCU*A(LK4nJS%@h|$=wVY0DKC~K@@^h6lu&-;Mu;QhCcnq4F(mZ=$1sL7%m z#el`8S=kLJJhS3Gr)?;(#evj`jz{d*HF5ne50)TGj>Lk)q_5v1Zx+?gbtvn-e3B5h zLudJQBk$10xp7D7c*@5NtC4=H#e;?~&TQfU8P==D4G;d@BbuNA2q7F{^Wa7jm3F5p zu$$UyfPIzUomQgFc~y%=d4^hqc#?`o$4wr#Lc06ZZcZIGU@t}lD5M_%G24;3RQ=N% zp0WlQxyc0#r=J(p&NZ8GBYX~`45Nb^NYtkH9zWvs72)=|Ll;74+FnXOIthgi*Scn6 zpC zOP~-=FB+kV^hSzJ04-POmj4rSKz*EKU*4xhMaJsjDAt&i+-hhJA4FhT(iDsTKppXN$8H**mgIhOhcGMudH&ydGV#~MNID}BexCt_|h?!+AIpQ=u%Fn4v(5e zKHaFG>*cVJd-vCf`jDR)UVlt$^$&nC`&t49R#Jy;=L5a7f-yE z@Uwv;tXT{Q0a4+TzTpfN%0B^y4F%!xSIYeD$|qnZEP2J76J^1pG~?8t zu~zRzhxf~rQrJOl;()CG5W?$~Bi8W2KLw}?9z{8QUSvhA^vz%o%ae-b$23X3=d8=> z(o>WHSe93S2~$k-oUHg02e|Bj%Nxe0M|id4!SBKe^Q6#EcAQoAE>DF1t1F^dNW?VD%1H z9bt8qxi|CKm%6~{jS3%51_*YuNK>p^>s3>~F0qhMvd~b~@*%?eN5d2&)WIBHTgpmu zqHixHLf&*tJ}9yR!k0v89Qbg#$nwZ$Xl1t{tE1MH_K8R@pvj^F6qp+#fwt>5=QG8X z7^p&>>u8TsrKa{p?yJ#ecg=KKS|d@N$Z_9373i_5N#*9LHAN(%F_@+M>qJ%BR@hs| ztnktq(WnB1*V9WI_Z|NrJ0l;b&lvfuu?~Ruv4UsDs^#^``|K%1#Klpg#g13vB0?(7rjP~38m;@ZIA%e3n6oz zBSP$p8;?bm@P4K5s&k^PRUb>Dx}F`{3bRaq5V~^;+89r;FpBYemGNw2`1$lP6DQ^7 z)Aa+=gmZEJNFdJ@I3buJJqK9%+AU;fsr1d+*EaWj3cHy3Yegq{sEzQp+VSgM@+B%h z#>juPduRBh*Yxa|6WbYPbwDk^FUaC`EU%?(N zJ!t+rdT-5&YE!L6;H Date: Wed, 17 Jan 2024 02:14:57 +0000 Subject: [PATCH 06/19] align avm opcodes ts with isa --- .../acir-simulator/src/avm/opcodes/opcodes.ts | 101 ++++++++++-------- .../docs/public-vm/gen/_InstructionSet.mdx | 26 +++-- .../InstructionSet/InstructionSet.js | 8 +- 3 files changed, 78 insertions(+), 57 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index c277c055628..befe35ad507 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -1,48 +1,38 @@ /** - * All avm opcodes + * All AVM opcodes */ export enum Opcodes { - // Arithmetic + // Compute + // Compute - Arithmetic ADD, SUB, MUL, DIV, + // Compute - Conditionals EQ, LT, LTE, + // Compute - Bitwise AND, OR, XOR, NOT, SHL, SHR, + // Compute - Type Conversions CAST, - // Memory - SET, - MOV, - CMOV, - CALLDATACOPY, - - // Logs - EMITNOTEHASH, - EMITNULLIFIER, - SENDL2TOL1MSG, - ULOG, - // Control flow - JUMP, - JUMPI, - INTERNALCALL, - INTERNALRETURN, - - // Storage - SLOAD, - SSTORE, - // Contract call control flow - RETURN, - REVERT, - CALL, - STATICCALL, + // Execution Environment + ADDRESS, + STORAGEADDRESS, + ORIGIN, + SENDER, + PORTAL, + FEEPERL1GAS, + FEEPERL2GAS, + FEEPERDAGAS, + CONTRACTCALLDEPTH, + // Execution Environment - Globals CHAINID, VERSION, BLOCKNUMBER, @@ -50,28 +40,45 @@ export enum Opcodes { COINBASE, BLOCKL1GASLIMIT, BLOCKL2GASLIMIT, - NULLIFIERSOOT, - CONTRACTSROOT, - MSGSROOT, - NOTESROOT, - PUBLICDATAROOT, - GLOBALSHASH, - BLOCKSROOT, - GRANDROOT, + BLOCKDAGASLIMIT, + // Execution Environment - Calldata + CALLDATACOPY, - // Call context - ORIGIN, - REFUNDEE, - FEEPERL1GAS, - FEEPERL2GAS, - CALLER, - ADDRESS, - PORTAL, - CALLDEPTH, - l1GAS, - L2GAS, + // Machine State + // Machine State - Gas + L1GASLEFT, + L2GASLEFT, + DAGASLEFT, + // Machine State - Internal Control Flow + JUMP, + JUMPI, + INTERNALCALL, + INTERNALRETURN, + INTERNALCALLDEPTH, + // Machine State - Memory + SET, + MOV, + CMOV, + + // World State + BLOCKHEADERBYNUMBER, + SLOAD, // Public Storage + SSTORE, // Public Storage + READL1TOL2MSG, // Messages + SENDL2TOL1MSG, // Messages + EMITNOTEHASH, // Notes & Nullifiers + EMITNULLIFIER, // Notes & Nullifiers + + // Accrued Substate + EMITUNENCRYPTEDULOG, + + // Control Flow - Contract Calls + CALL, + STATICCALL, + RETURN, + REVERT, - // Black box + // Gadgets KECCAK, POSEIDON, } diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index 57e8ebcb276..27c529d62c2 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -310,7 +310,7 @@ Click on an instruction name to jump to its section. } - 0x25 [`internalcall`](#isa-section-internalcall) + 0x25 [`INTERNALCALL`](#isa-section-internalcall) Make an internal call. Push the current PC to the internal call stack and jump to the target location. 48 @@ -531,6 +531,7 @@ Multiplication (a * b) - **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 +[![](./images/bit-formats/MUL.png)](./images/bit-formats/MUL.png) ### `DIV` Unsigned division (a / b) @@ -794,6 +795,7 @@ Get the _storage_ address of the currently executing context - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/STORAGEADDRESS.png)](./images/bit-formats/STORAGEADDRESS.png) ### `ORIGIN` Get the transaction's origination address @@ -827,6 +829,7 @@ Get the address of the sender (caller of the current context) - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/SENDER.png)](./images/bit-formats/SENDER.png) ### `PORTAL` Get the address of the l1 portal contract @@ -894,6 +897,7 @@ Get the fee to be paid per "DA gas" - constant for entire transaction - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/FEEPERDAGAS.png)](./images/bit-formats/FEEPERDAGAS.png) ### `CONTRACTCALLDEPTH` Get how many contract calls deep the current call context is @@ -911,6 +915,7 @@ Get how many contract calls deep the current call context is - **Tag updates**: `T[dstOffset] = u8` - **Bit-size**: 56 +[![](./images/bit-formats/CONTRACTCALLDEPTH.png)](./images/bit-formats/CONTRACTCALLDEPTH.png) ### `CHAINID` Get this rollup's L1 chain ID @@ -1046,6 +1051,7 @@ Total amount of "DA gas" that a block can consume - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/BLOCKDAGASLIMIT.png)](./images/bit-formats/BLOCKDAGASLIMIT.png) ### `CALLDATACOPY` Copy calldata into memory @@ -1082,6 +1088,7 @@ Remaining "L1 gas" for this call (after this instruction) - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/L1GASLEFT.png)](./images/bit-formats/L1GASLEFT.png) ### `L2GASLEFT` Remaining "L2 gas" for this call (after this instruction) @@ -1098,6 +1105,7 @@ Remaining "L2 gas" for this call (after this instruction) - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/L2GASLEFT.png)](./images/bit-formats/L2GASLEFT.png) ### `DAGASLEFT` Remaining "DA gas" for this call (after this instruction) @@ -1114,6 +1122,7 @@ Remaining "DA gas" for this call (after this instruction) - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/DAGASLEFT.png)](./images/bit-formats/DAGASLEFT.png) ### `JUMP` Jump to a location in the bytecode @@ -1121,7 +1130,7 @@ Jump to a location in the bytecode [See in table.](#isa-table-jump) - **Opcode**: 0x23 -- **Category**: Control Flow - Internal +- **Category**: Machine State - Control Flow - **Args**: - **loc**: target location to jump to - **Expression**: `context.machineState.pc = loc` @@ -1136,7 +1145,7 @@ Conditionally jump to a location in the bytecode [See in table.](#isa-table-jumpi) - **Opcode**: 0x24 -- **Category**: Control Flow - Internal +- **Category**: Machine State - Control Flow - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -1148,13 +1157,13 @@ Conditionally jump to a location in the bytecode [![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) -### `internalcall` +### `INTERNALCALL` Make an internal call. Push the current PC to the internal call stack and jump to the target location. [See in table.](#isa-table-internalcall) - **Opcode**: 0x25 -- **Category**: Control Flow - Internal +- **Category**: Machine State - Control Flow - **Args**: - **loc**: target location to jump/call to - **Expression**: @@ -1172,10 +1181,11 @@ Return from an internal call. Pop from the internal call stack and jump to the p [See in table.](#isa-table-internalreturn) - **Opcode**: 0x26 -- **Category**: Control Flow - Internal +- **Category**: Machine State - Control Flow - **Expression**: `context.machineState.pc = context.machineState.internalCallStack.pop()` - **Bit-size**: 16 +[![](./images/bit-formats/INTERNALRETURN.png)](./images/bit-formats/INTERNALRETURN.png) ### `INTERNALCALLDEPTH` Get the depth of the current context's internal call stack @@ -1192,6 +1202,7 @@ Get the depth of the current context's internal call stack - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 +[![](./images/bit-formats/INTERNALCALLDEPTH.png)](./images/bit-formats/INTERNALCALLDEPTH.png) ### `SET` Set a memory word from a constant in the bytecode @@ -1268,6 +1279,7 @@ Get the block header as of the specified block number - **Tag updates**: `T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field` - **Bit-size**: 88 +[![](./images/bit-formats/BLOCKHEADERBYNUM.png)](./images/bit-formats/BLOCKHEADERBYNUM.png) ### `SLOAD` Load a word from storage @@ -1323,6 +1335,7 @@ Reads an L1-to-L2 message - **Tag updates**: `T[dstOffset:dstOffset+msgSize] = field` - **Bit-size**: 120 +[![](./images/bit-formats/READL1TOL2MSG.png)](./images/bit-formats/READL1TOL2MSG.png) ### `SENDL2TOL1MSG` Send an L2-to-L1 message @@ -1388,6 +1401,7 @@ Emit an unencrypted log - **Expression**: `context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])` - **Bit-size**: 88 +[![](./images/bit-formats/EMITUNENCRYPTEDLOG.png)](./images/bit-formats/EMITUNENCRYPTEDLOG.png) ### `CALL` Call into another contract diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index 27c7c1cb75f..f477ea1f94a 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -617,7 +617,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "jump", "Name": "`JUMP`", - "Category": "Control Flow - Internal", + "Category": "Machine State - Control Flow", "Flags": [], "Args": [ {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, @@ -631,7 +631,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "jumpi", "Name": "`JUMPI`", - "Category": "Control Flow - Internal", + "Category": "Machine State - Control Flow", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -648,7 +648,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "internalcall", "Name": "`INTERNALCALL`", - "Category": "Control Flow - Internal", + "Category": "Machine State - Control Flow", "Flags": [], "Args": [ {"name": "loc", "description": "target location to jump/call to", "mode": "immediate", "type": "u32"}, @@ -665,7 +665,7 @@ context.machineState.pc = loc { "id": "internalreturn", "Name": "`INTERNALRETURN`", - "Category": "Control Flow - Internal", + "Category": "Machine State - Control Flow", "Flags": [], "Args": [], "Expression": "`context.machineState.pc = context.machineState.internalCallStack.pop()`", From e009523da50994384236b91a215054d697c6a101 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 02:19:41 +0000 Subject: [PATCH 07/19] comparators, not conditionals --- yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts | 2 +- yellow-paper/docs/public-vm/gen/_InstructionSet.mdx | 6 +++--- .../src/preprocess/InstructionSet/InstructionSet.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index befe35ad507..922edd6ff1d 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -8,7 +8,7 @@ export enum Opcodes { SUB, MUL, DIV, - // Compute - Conditionals + // Compute - Comparators EQ, LT, LTE, diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index 27c529d62c2..eb682843f13 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -560,7 +560,7 @@ Equality check (a == b) [See in table.](#isa-table-eq) - **Opcode**: 0x04 -- **Category**: Compute - Conditionals +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -581,7 +581,7 @@ Less-than check (a < b) [See in table.](#isa-table-lt) - **Opcode**: 0x05 -- **Category**: Compute - Conditionals +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. @@ -602,7 +602,7 @@ Less-than-or-equals check (a <= b) [See in table.](#isa-table-lte) - **Opcode**: 0x06 -- **Category**: Compute - Conditionals +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index f477ea1f94a..8c9afc29d55 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -91,7 +91,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "eq", "Name": "`EQ`", - "Category": "Compute - Conditionals", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "inTag", "description": IN_TAG_DESCRIPTION}, @@ -110,7 +110,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "lt", "Name": "`LT`", - "Category": "Compute - Conditionals", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "inTag", "description": IN_TAG_DESCRIPTION}, @@ -129,7 +129,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "lte", "Name": "`LTE`", - "Category": "Compute - Conditionals", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, {"name": "inTag", "description": IN_TAG_DESCRIPTION}, From b3e0bf38a413f6c5f8b7150aabf09240b00c6ea7 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 02:33:01 +0000 Subject: [PATCH 08/19] prettier --- yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index 922edd6ff1d..e9256c778f6 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -62,11 +62,11 @@ export enum Opcodes { // World State BLOCKHEADERBYNUMBER, - SLOAD, // Public Storage + SLOAD, // Public Storage SSTORE, // Public Storage READL1TOL2MSG, // Messages SENDL2TOL1MSG, // Messages - EMITNOTEHASH, // Notes & Nullifiers + EMITNOTEHASH, // Notes & Nullifiers EMITNULLIFIER, // Notes & Nullifiers // Accrued Substate From 5ddd1aceff03c11fc9aeb1a08779ae3e470a7e7f Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 13:22:37 +0000 Subject: [PATCH 09/19] fix category --- .../docs/public-vm/gen/_InstructionSet.mdx | 16 ++++++++-------- .../preprocess/InstructionSet/InstructionSet.js | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index eb682843f13..cbc75189aca 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -923,7 +923,7 @@ Get this rollup's L1 chain ID [See in table.](#isa-table-chainid) - **Opcode**: 0x17 -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -940,7 +940,7 @@ Get this rollup's L2 version ID [See in table.](#isa-table-version) - **Opcode**: 0x18 -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -957,7 +957,7 @@ Get this L2 block's number [See in table.](#isa-table-blocknumber) - **Opcode**: 0x19 -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -974,7 +974,7 @@ Get this L2 block's timestamp [See in table.](#isa-table-timestamp) - **Opcode**: 0x1a -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -991,7 +991,7 @@ Get the block's beneficiary address [See in table.](#isa-table-coinbase) - **Opcode**: 0x1b -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -1008,7 +1008,7 @@ Total amount of "L1 gas" that a block can consume [See in table.](#isa-table-blockl1gaslimit) - **Opcode**: 0x1c -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -1025,7 +1025,7 @@ Total amount of "L2 gas" that a block can consume [See in table.](#isa-table-blockl2gaslimit) - **Opcode**: 0x1d -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: @@ -1042,7 +1042,7 @@ Total amount of "DA gas" that a block can consume [See in table.](#isa-table-blockdagaslimit) - **Opcode**: 0x1e -- **Category**: Environment - Globals +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index 8c9afc29d55..08b1d6233ab 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -423,7 +423,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "chainid", "Name": "`CHAINID`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -439,7 +439,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "version", "Name": "`VERSION`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -455,7 +455,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "blocknumber", "Name": "`BLOCKNUMBER`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -471,7 +471,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "timestamp", "Name": "`TIMESTAMP`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -487,7 +487,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "coinbase", "Name": "`COINBASE`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -503,7 +503,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "blockl1gaslimit", "Name": "`BLOCKL1GASLIMIT`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -519,7 +519,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "blockl2gaslimit", "Name": "`BLOCKL2GASLIMIT`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], @@ -535,7 +535,7 @@ const INSTRUCTION_SET_RAW = [ { "id": "blockdagaslimit", "Name": "`BLOCKDAGASLIMIT`", - "Category": "Environment - Globals", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], From dedcd3d8aff3506e79ec209e28429c922b32234e Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 16:30:21 +0000 Subject: [PATCH 10/19] fix memory size --- yellow-paper/docs/public-vm/avm.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yellow-paper/docs/public-vm/avm.md b/yellow-paper/docs/public-vm/avm.md index f6988dd03f9..b3417afcb29 100644 --- a/yellow-paper/docs/public-vm/avm.md +++ b/yellow-paper/docs/public-vm/avm.md @@ -94,7 +94,7 @@ MachineState { daGasLeft: field, pc: field = 0, internalCallStack: Vector = [], // initialized as empty - memory: [field; 32768] = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory: [field; 2^32] = [0, ..., 0], // all 2^32 entries are initialized to zero } ``` @@ -383,7 +383,7 @@ INITIAL_MACHINE_STATE = MachineState { daGasLeft = TxRequest.daGasLimit, pc = 0, internalCallStack = [], // initialized as empty - memory = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory = [0, ..., 0], // all 2^32 entries are initialized to zero } INITIAL_JOURNAL = Journal { @@ -462,7 +462,7 @@ nestedMachineState = MachineState { daGasLeft: callingContext.machineState.memory[instr.args.gasOffset+2], pc = 0, internalCallStack = [], // initialized as empty - memory = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory = [0, ..., 0], // all 2^32 entries are initialized to zero } ``` > The nested context's machine state's `*GasLeft` is initialized based on the call instruction's `gasOffset` argument. The caller allocates some amount of L1, L2, and DA gas to the nested call. It does so using the instruction's `gasOffset` argument. In particular, prior to the contract call instruction, the caller populates `M[gasOffset]` with the nested context's initial `l1GasLeft`. Likewise it populates `M[gasOffset+1]` with `l2GasLeft` and `M[gasOffset+2]` with `daGasLeft`. From ca5ce3a813aa2342e7e375e35a0fca5f07b6b167 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 17:38:47 +0000 Subject: [PATCH 11/19] opcode typo --- yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index e9256c778f6..2a7fa5a1758 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -70,7 +70,7 @@ export enum Opcodes { EMITNULLIFIER, // Notes & Nullifiers // Accrued Substate - EMITUNENCRYPTEDULOG, + EMITUNENCRYPTEDLOG, // Control Flow - Contract Calls CALL, From b1601202ef8173bd928b9df65fe1b2e6c3100f65 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 20:55:34 +0000 Subject: [PATCH 12/19] opcodes map --- .../src/avm/interpreter/interpreter.test.ts | 4 +- .../src/avm/opcodes/from_bytecode.test.ts | 4 +- .../src/avm/opcodes/from_bytecode.ts | 43 +++----- .../src/avm/opcodes/instruction.ts | 3 + .../src/avm/opcodes/instruction_set.ts | 99 +++++++++++++++++++ .../acir-simulator/src/avm/opcodes/memory.ts | 2 +- .../acir-simulator/src/avm/opcodes/opcodes.ts | 2 +- 7 files changed, 119 insertions(+), 38 deletions(-) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts diff --git a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts index 3b86414ab63..19fb0e99b54 100644 --- a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts +++ b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts @@ -7,7 +7,7 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Add } from '../opcodes/arithmetic.js'; import { Return } from '../opcodes/control_flow.js'; import { Instruction } from '../opcodes/instruction.js'; -import { CallDataCopy } from '../opcodes/memory.js'; +import { CalldataCopy } from '../opcodes/memory.js'; import { AvmInterpreter } from './interpreter.js'; describe('interpreter', () => { @@ -17,7 +17,7 @@ describe('interpreter', () => { const instructions: Instruction[] = [ // Copy the first two elements of the calldata to memory regions 0 and 1 - new CallDataCopy(0, 2, 0), + new CalldataCopy(0, 2, 0), // Add the two together and store the result in memory region 2 new Add(0, 1, 2), // 1 + 2 // Return the result diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts index e7f95b89b4f..b5ba48bd23a 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts @@ -1,5 +1,5 @@ import { Add, Sub } from './arithmetic.js'; -import { OPCODE_BYTE_LENGTH, OPERAND_BTYE_LENGTH, interpretBytecode } from './from_bytecode.js'; +import { OPCODE_BYTE_LENGTH, OPERAND_BYTE_LENGTH, interpretBytecode } from './from_bytecode.js'; import { Instruction } from './instruction.js'; describe('Avm Interpreter', () => { @@ -9,7 +9,7 @@ describe('Avm Interpreter', () => { return buf; }; const to4Byte = (num: number): Buffer => { - const buf = Buffer.alloc(OPERAND_BTYE_LENGTH); + const buf = Buffer.alloc(OPERAND_BYTE_LENGTH); buf.writeUInt32BE(num); return buf; }; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts index 697ff6be13b..e74719aa373 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts @@ -1,37 +1,12 @@ -import { Add, Mul, Sub } from './arithmetic.js'; import { Instruction } from './instruction.js'; +import { Opcode } from './opcodes.js'; +import { INSTRUCTION_SET } from './instruction_set.js'; export const OPERAND_BIT_LENGTH = 32; -export const OPERAND_BTYE_LENGTH = 4; +export const OPERAND_BYTE_LENGTH = 4; export const OPCODE_BIT_LENGTH = 8; export const OPCODE_BYTE_LENGTH = 1; -const OPERANDS_LOOKUP: { [key: number]: number } = { - 0x1: Add.numberOfOperands, - 0x2: Sub.numberOfOperands, - 0x3: Mul.numberOfOperands, -}; - -/** - * Given the opcode and operands that have been parsed by the interpreter - * We return a construction of the opcode - * - * @param opcode - Opcode value - * @param operands - Array of operands - */ -function instructionLookup(opcode: number, operands: number[]): Instruction { - switch (opcode) { - case 0x1: - return new Add(operands[0], operands[1], operands[2]); - case 0x2: - return new Sub(operands[0], operands[1], operands[2]); - case 0x3: - return new Mul(operands[0], operands[1], operands[2]); - default: - throw new Error(`Opcode ${opcode} not found`); - } -} - /** * Convert a buffer of bytecode into an array of instructions * @param bytecode - Buffer of bytecode @@ -44,18 +19,22 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { const instructions: Instruction[] = []; while (readPtr < bytecodeLength) { - const opcode = bytecode[readPtr]; + const opcode = bytecode[readPtr] as Opcode; readPtr += 1; - const numberOfOperands = OPERANDS_LOOKUP[opcode]; + const instructionType = INSTRUCTION_SET.get(opcode); + if (instructionType === undefined) { + throw new Error(`Opcode ${opcode} not implemented`); + } + const numberOfOperands = instructionType.numberOfOperands; const operands: number[] = []; for (let i = 0; i < numberOfOperands; i++) { const operand = bytecode.readUInt32BE(readPtr); - readPtr += OPERAND_BTYE_LENGTH; + readPtr += OPERAND_BYTE_LENGTH; operands.push(operand); } - instructions.push(instructionLookup(opcode, operands)); + instructions.push(new instructionType(...operands)) } return instructions; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts index 0411251b705..5035b26727b 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts @@ -5,5 +5,8 @@ import { AvmStateManager } from '../avm_state_manager.js'; * Opcode base class */ export abstract class Instruction { + static type: string; + static numberOfOperands: number; + abstract execute(machineState: AvmMachineState, stateManager: AvmStateManager): void; } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts new file mode 100644 index 00000000000..1299dc36596 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts @@ -0,0 +1,99 @@ +import { Add, Div, Mul, Sub } from './arithmetic.js'; +import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; +import { Eq, Lt, Lte } from './comparators.js'; +import { Return } from './control_flow.js'; +import { Instruction } from './instruction.js'; +import { CalldataCopy, Cast, Mov } from './memory.js'; +import { Opcode } from './opcodes.js'; + +/** - */ +type InstructionConstructor = new (...args: any[]) => Instruction; +/** - */ +type InstructionConstructorAndMembers = InstructionConstructor & { + /** - */ + numberOfOperands: number +}; + +export const INSTRUCTION_SET: Map = new Map( + new Array<[Opcode, InstructionConstructorAndMembers]>( + // Compute + // Compute - Arithmetic + [Opcode.ADD, Add], + [Opcode.SUB, Sub], + [Opcode.MUL, Mul], + //[Opcode.DIV, Div], + //// Compute - Comparators + //[Opcode.EQ, Eq], + //[Opcode.LT, Lt], + //[Opcode.LTE, Lte], + //// Compute - Bitwise + //[Opcode.AND, And], + //[Opcode.OR, Or], + //[Opcode.XOR, Xor], + //[Opcode.NOT, Not], + //[Opcode.SHL, Shl], + //[Opcode.SHR, Shr], + //// Compute - Type Conversions + //[Opcode.CAST, Cast], + + //// Execution Environment + //[Opcode.ADDRESS, Address], + //[Opcode.STORAGEADDRESS, Storageaddress], + //[Opcode.ORIGIN, Origin], + //[Opcode.SENDER, Sender], + //[Opcode.PORTAL, Portal], + //[Opcode.FEEPERL1GAS, Feeperl1gas], + //[Opcode.FEEPERL2GAS, Feeperl2gas], + //[Opcode.FEEPERDAGAS, Feeperdagas], + //[Opcode.CONTRACTCALLDEPTH, Contractcalldepth], + //// Execution Environment - Globals + //[Opcode.CHAINID, Chainid], + //[Opcode.VERSION, Version], + //[Opcode.BLOCKNUMBER, Blocknumber], + //[Opcode.TIMESTAMP, Timestamp], + //[Opcode.COINBASE, Coinbase], + //[Opcode.BLOCKL1GASLIMIT, Blockl1gaslimit], + //[Opcode.BLOCKL2GASLIMIT, Blockl2gaslimit], + //[Opcode.BLOCKDAGASLIMIT, Blockdagaslimit], + // Execution Environment - Calldata + [Opcode.CALLDATACOPY, CalldataCopy], + + //// Machine State + // Machine State - Gas + //[Opcode.L1GASLEFT, L1gasleft], + //[Opcode.L2GASLEFT, L2gasleft], + //[Opcode.DAGASLEFT, Dagasleft], + //// Machine State - Internal Control Flow + //[Opcode.JUMP, Jump], + //[Opcode.JUMPI, Jumpi], + //[Opcode.INTERNALCALL, Internalcall], + //[Opcode.INTERNALRETURN, Internalreturn], + //[Opcode.INTERNALCALLDEPTH, Internalcalldepth], + //// Machine State - Memory + //[Opcode.SET, Set], + //[Opcode.MOV, Mov], + //[Opcode.CMOV, CMov], + + //// World State + //[Opcode.BLOCKHEADERBYNUMBER, Blockheaderbynumber], + //[Opcode.SLOAD, Sload], // Public Storage + //[Opcode.SSTORE, Sstore], // Public Storage + //[Opcode.READL1TOL2MSG, Readl1tol2msg], // Messages + //[Opcode.SENDL2TOL1MSG, Sendl2tol1msg], // Messages + //[Opcode.EMITNOTEHASH, Emitnotehash], // Notes & Nullifiers + //[Opcode.EMITNULLIFIER, Emitnullifier], // Notes & Nullifiers + + //// Accrued Substate + //[Opcode.EMITUNENCRYPTEDLOG, Emitunencryptedlog], + + //// Control Flow - Contract Calls + //[Opcode.CALL, Call], + //[Opcode.STATICCALL, Staticcall], + [Opcode.RETURN, Return], + //[Opcode.REVERT, Revert], + + //// Gadgets + //[Opcode.KECCAK, Keccak], + //[Opcode.POSEIDON, Poseidon], + ) +); \ No newline at end of file diff --git a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts index 38fa560a3e6..bf14c1c235b 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts @@ -47,7 +47,7 @@ export class Mov implements Instruction { } /** - */ -export class CallDataCopy implements Instruction { +export class CalldataCopy implements Instruction { static type: string = 'CALLDATACOPY'; static numberOfOperands = 3; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index 2a7fa5a1758..cd3bbbd38eb 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -1,7 +1,7 @@ /** * All AVM opcodes */ -export enum Opcodes { +export enum Opcode { // Compute // Compute - Arithmetic ADD, From 1b2cc502a0db0e73266be56797f4542ccb0c73d3 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 21:02:34 +0000 Subject: [PATCH 13/19] revert instruction class wierdness --- yarn-project/acir-simulator/src/avm/opcodes/instruction.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts index 5035b26727b..0411251b705 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts @@ -5,8 +5,5 @@ import { AvmStateManager } from '../avm_state_manager.js'; * Opcode base class */ export abstract class Instruction { - static type: string; - static numberOfOperands: number; - abstract execute(machineState: AvmMachineState, stateManager: AvmStateManager): void; } From 3ea25611b504bee3449acc894b6fec995c7e4975 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 21:05:38 +0000 Subject: [PATCH 14/19] assert that opcode is valid from bytecode --- .../acir-simulator/src/avm/opcodes/from_bytecode.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts index e74719aa373..3f2b38d936c 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts @@ -19,8 +19,12 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { const instructions: Instruction[] = []; while (readPtr < bytecodeLength) { - const opcode = bytecode[readPtr] as Opcode; + const opcodeByte = bytecode[readPtr]; readPtr += 1; + if (!(opcodeByte in Opcode)) { + throw new Error(`Opcode ${opcodeByte} not implemented`); + } + const opcode = opcodeByte as Opcode; const instructionType = INSTRUCTION_SET.get(opcode); if (instructionType === undefined) { From 844dd10fc704db16c1b3bcfd7267e04ccb49bef7 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 21:40:46 +0000 Subject: [PATCH 15/19] prettier --- .../src/avm/opcodes/from_bytecode.ts | 6 ++--- .../src/avm/opcodes/instruction_set.ts | 22 +++++++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts index 3f2b38d936c..3225123f00b 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts @@ -1,6 +1,6 @@ import { Instruction } from './instruction.js'; -import { Opcode } from './opcodes.js'; import { INSTRUCTION_SET } from './instruction_set.js'; +import { Opcode } from './opcodes.js'; export const OPERAND_BIT_LENGTH = 32; export const OPERAND_BYTE_LENGTH = 4; @@ -30,7 +30,7 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { if (instructionType === undefined) { throw new Error(`Opcode ${opcode} not implemented`); } - const numberOfOperands = instructionType.numberOfOperands; + const numberOfOperands = instructionType.numberOfOperands; const operands: number[] = []; for (let i = 0; i < numberOfOperands; i++) { const operand = bytecode.readUInt32BE(readPtr); @@ -38,7 +38,7 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { operands.push(operand); } - instructions.push(new instructionType(...operands)) + instructions.push(new instructionType(...operands)); } return instructions; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts index 1299dc36596..52aaf4f5625 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts @@ -1,9 +1,17 @@ -import { Add, Div, Mul, Sub } from './arithmetic.js'; -import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; -import { Eq, Lt, Lte } from './comparators.js'; +import { + Add, + /*Div,*/ + Mul, + Sub, +} from './arithmetic.js'; +//import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; +//import { Eq, Lt, Lte } from './comparators.js'; import { Return } from './control_flow.js'; import { Instruction } from './instruction.js'; -import { CalldataCopy, Cast, Mov } from './memory.js'; +import { + CalldataCopy, + /*Cast, Mov*/ +} from './memory.js'; import { Opcode } from './opcodes.js'; /** - */ @@ -11,7 +19,7 @@ type InstructionConstructor = new (...args: any[]) => Instruction; /** - */ type InstructionConstructorAndMembers = InstructionConstructor & { /** - */ - numberOfOperands: number + numberOfOperands: number; }; export const INSTRUCTION_SET: Map = new Map( @@ -95,5 +103,5 @@ export const INSTRUCTION_SET: Map = ne //// Gadgets //[Opcode.KECCAK, Keccak], //[Opcode.POSEIDON, Poseidon], - ) -); \ No newline at end of file + ), +); From be1140ea648bb9b2282a10035d17621895add9df Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 17 Jan 2024 22:02:52 +0000 Subject: [PATCH 16/19] test that runs AVM simulator starting from bytecode --- .../acir-simulator/src/avm/index.test.ts | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 yarn-project/acir-simulator/src/avm/index.test.ts diff --git a/yarn-project/acir-simulator/src/avm/index.test.ts b/yarn-project/acir-simulator/src/avm/index.test.ts new file mode 100644 index 00000000000..92f32b87384 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/index.test.ts @@ -0,0 +1,62 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { mock } from 'jest-mock-extended'; + +import { AvmMachineState } from './avm_machine_state.js'; +import { AvmStateManager } from './avm_state_manager.js'; +import { AvmInterpreter } from './interpreter/interpreter.js'; +import { Add } from './opcodes/arithmetic.js'; +import { Return } from './opcodes/control_flow.js'; +import { interpretBytecode } from './opcodes/from_bytecode.js'; +import { CalldataCopy } from './opcodes/memory.js'; +import { Opcode } from './opcodes/opcodes.js'; + +function genInstructionBytecode(opcode: Opcode, args: number[], assertArgsLength: number): Buffer { + expect(args.length).toBe(assertArgsLength); + // 1 byte for opcode, 4 bytes for each argument + const bytecode = Buffer.alloc(1 + args.length * 4); + + let byteOffset = 0; + bytecode.writeUInt8(opcode as number, byteOffset); + byteOffset++; + for (let i = 0; i < args.length; i++) { + bytecode.writeUInt32BE(args[i], byteOffset); + byteOffset += 4; + } + return bytecode; +} + +describe('avm', () => { + it('Should execute bytecode', () => { + const calldata: Fr[] = [new Fr(1), new Fr(2)]; + const stateManager = mock(); + + // Construct bytecode + const calldataCopyArgs = [0, 2, 0]; + const addArgs = [0, 1, 2]; + const returnArgs = [2, 1]; + + const calldataCopyBytecode = genInstructionBytecode( + Opcode.CALLDATACOPY, + calldataCopyArgs, + CalldataCopy.numberOfOperands, + ); + const addBytecode = genInstructionBytecode(Opcode.ADD, addArgs, Add.numberOfOperands); + const returnBytecode = genInstructionBytecode(Opcode.RETURN, returnArgs, Return.numberOfOperands); + const fullBytecode = Buffer.concat([calldataCopyBytecode, addBytecode, returnBytecode]); + + // Decode bytecode into instructions + const instructions = interpretBytecode(fullBytecode); + + // Execute instructions + const context = new AvmMachineState(calldata); + const interpreter = new AvmInterpreter(context, stateManager, instructions); + const avmReturnData = interpreter.run(); + + expect(avmReturnData.reverted).toBe(false); + + const returnData = avmReturnData.output; + expect(returnData.length).toBe(1); + expect(returnData).toEqual([new Fr(3)]); + }); +}); From 9de7f0de0f699a137acee38f5805810d02c0d2f1 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Thu, 18 Jan 2024 17:12:51 +0000 Subject: [PATCH 17/19] encode & decode --- .../acir-simulator/src/avm/avm_context.ts | 4 +-- .../acir-simulator/src/avm/index.test.ts | 33 ++++------------- ...tecode.test.ts => decode_bytecode.test.ts} | 14 ++++---- .../{from_bytecode.ts => decode_bytecode.ts} | 23 +++++------- .../src/avm/opcodes/encode_to_bytecode.ts | 35 +++++++++++++++++++ .../src/avm/opcodes/instruction.ts | 3 ++ 6 files changed, 62 insertions(+), 50 deletions(-) rename yarn-project/acir-simulator/src/avm/opcodes/{from_bytecode.test.ts => decode_bytecode.test.ts} (63%) rename yarn-project/acir-simulator/src/avm/opcodes/{from_bytecode.ts => decode_bytecode.ts} (61%) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts diff --git a/yarn-project/acir-simulator/src/avm/avm_context.ts b/yarn-project/acir-simulator/src/avm/avm_context.ts index 9d52f869acf..79e763f79f4 100644 --- a/yarn-project/acir-simulator/src/avm/avm_context.ts +++ b/yarn-project/acir-simulator/src/avm/avm_context.ts @@ -4,7 +4,7 @@ import { AvmMachineState } from './avm_machine_state.js'; import { AvmMessageCallResult } from './avm_message_call_result.js'; import { AvmStateManager } from './avm_state_manager.js'; import { AvmInterpreter } from './interpreter/index.js'; -import { interpretBytecode } from './opcodes/from_bytecode.js'; +import { decodeBytecode } from './opcodes/decode_bytecode.js'; import { Instruction } from './opcodes/index.js'; /** @@ -34,7 +34,7 @@ export class AvmContext { // const bytecode = stateManager.journal.hostStorage.contractsDb.getBytecode(contractAddress); const bytecode = Buffer.from('0x01000100020003'); - const instructions: Instruction[] = interpretBytecode(bytecode); + const instructions: Instruction[] = decodeBytecode(bytecode); const context = new AvmMachineState(calldata); const interpreter = new AvmInterpreter(context, this.stateManager, instructions); diff --git a/yarn-project/acir-simulator/src/avm/index.test.ts b/yarn-project/acir-simulator/src/avm/index.test.ts index 92f32b87384..1db8306447a 100644 --- a/yarn-project/acir-simulator/src/avm/index.test.ts +++ b/yarn-project/acir-simulator/src/avm/index.test.ts @@ -5,27 +5,10 @@ import { mock } from 'jest-mock-extended'; import { AvmMachineState } from './avm_machine_state.js'; import { AvmStateManager } from './avm_state_manager.js'; import { AvmInterpreter } from './interpreter/interpreter.js'; -import { Add } from './opcodes/arithmetic.js'; -import { Return } from './opcodes/control_flow.js'; -import { interpretBytecode } from './opcodes/from_bytecode.js'; -import { CalldataCopy } from './opcodes/memory.js'; +import { decodeBytecode } from './opcodes/decode_bytecode.js'; +import { encodeToBytecode } from './opcodes/encode_to_bytecode.js'; import { Opcode } from './opcodes/opcodes.js'; -function genInstructionBytecode(opcode: Opcode, args: number[], assertArgsLength: number): Buffer { - expect(args.length).toBe(assertArgsLength); - // 1 byte for opcode, 4 bytes for each argument - const bytecode = Buffer.alloc(1 + args.length * 4); - - let byteOffset = 0; - bytecode.writeUInt8(opcode as number, byteOffset); - byteOffset++; - for (let i = 0; i < args.length; i++) { - bytecode.writeUInt32BE(args[i], byteOffset); - byteOffset += 4; - } - return bytecode; -} - describe('avm', () => { it('Should execute bytecode', () => { const calldata: Fr[] = [new Fr(1), new Fr(2)]; @@ -36,17 +19,13 @@ describe('avm', () => { const addArgs = [0, 1, 2]; const returnArgs = [2, 1]; - const calldataCopyBytecode = genInstructionBytecode( - Opcode.CALLDATACOPY, - calldataCopyArgs, - CalldataCopy.numberOfOperands, - ); - const addBytecode = genInstructionBytecode(Opcode.ADD, addArgs, Add.numberOfOperands); - const returnBytecode = genInstructionBytecode(Opcode.RETURN, returnArgs, Return.numberOfOperands); + const calldataCopyBytecode = encodeToBytecode(Opcode.CALLDATACOPY, calldataCopyArgs); + const addBytecode = encodeToBytecode(Opcode.ADD, addArgs); + const returnBytecode = encodeToBytecode(Opcode.RETURN, returnArgs); const fullBytecode = Buffer.concat([calldataCopyBytecode, addBytecode, returnBytecode]); // Decode bytecode into instructions - const instructions = interpretBytecode(fullBytecode); + const instructions = decodeBytecode(fullBytecode); // Execute instructions const context = new AvmMachineState(calldata); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts similarity index 63% rename from yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts rename to yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts index b5ba48bd23a..57502440e2d 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts @@ -1,20 +1,20 @@ import { Add, Sub } from './arithmetic.js'; -import { OPCODE_BYTE_LENGTH, OPERAND_BYTE_LENGTH, interpretBytecode } from './from_bytecode.js'; -import { Instruction } from './instruction.js'; +import { decodeBytecode } from './decode_bytecode.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH, Instruction } from './instruction.js'; -describe('Avm Interpreter', () => { +describe('Avm Decoder', () => { const toByte = (num: number): Buffer => { - const buf = Buffer.alloc(OPCODE_BYTE_LENGTH); + const buf = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH); buf.writeUInt8(num); return buf; }; const to4Byte = (num: number): Buffer => { - const buf = Buffer.alloc(OPERAND_BYTE_LENGTH); + const buf = Buffer.alloc(AVM_OPERAND_BYTE_LENGTH); buf.writeUInt32BE(num); return buf; }; - it('Should read bytecode string into a list of opcodes', () => { + it('Should read bytecode buffer into a list of opcodes', () => { const opcode = 1; const opcode2 = 2; const a = 1; @@ -30,7 +30,7 @@ describe('Avm Interpreter', () => { const expectedInstructions: Instruction[] = [new Add(a, b, c), new Sub(a, b, c)]; - const instructions = interpretBytecode(bytecode); + const instructions = decodeBytecode(bytecode); expect(instructions).toEqual(expectedInstructions); }); }); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts similarity index 61% rename from yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts rename to yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts index 3225123f00b..624546cfbeb 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts @@ -1,26 +1,21 @@ -import { Instruction } from './instruction.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH, Instruction } from './instruction.js'; import { INSTRUCTION_SET } from './instruction_set.js'; import { Opcode } from './opcodes.js'; -export const OPERAND_BIT_LENGTH = 32; -export const OPERAND_BYTE_LENGTH = 4; -export const OPCODE_BIT_LENGTH = 8; -export const OPCODE_BYTE_LENGTH = 1; - /** * Convert a buffer of bytecode into an array of instructions * @param bytecode - Buffer of bytecode - * @returns Bytecode interpreted into an ordered array of Instructions + * @returns Bytecode decoded into an ordered array of Instructions */ -export function interpretBytecode(bytecode: Buffer): Instruction[] { - let readPtr = 0; +export function decodeBytecode(bytecode: Buffer): Instruction[] { + let bytePtr = 0; const bytecodeLength = bytecode.length; const instructions: Instruction[] = []; - while (readPtr < bytecodeLength) { - const opcodeByte = bytecode[readPtr]; - readPtr += 1; + while (bytePtr < bytecodeLength) { + const opcodeByte = bytecode[bytePtr]; + bytePtr += AVM_OPCODE_BYTE_LENGTH; if (!(opcodeByte in Opcode)) { throw new Error(`Opcode ${opcodeByte} not implemented`); } @@ -33,8 +28,8 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { const numberOfOperands = instructionType.numberOfOperands; const operands: number[] = []; for (let i = 0; i < numberOfOperands; i++) { - const operand = bytecode.readUInt32BE(readPtr); - readPtr += OPERAND_BYTE_LENGTH; + const operand = bytecode.readUInt32BE(bytePtr); + bytePtr += AVM_OPERAND_BYTE_LENGTH; operands.push(operand); } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts new file mode 100644 index 00000000000..9f5bda82449 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts @@ -0,0 +1,35 @@ +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH } from './instruction.js'; +import { INSTRUCTION_SET } from './instruction_set.js'; +import { Opcode } from './opcodes.js'; + +/** + * Encode an instruction (opcode & arguments) to bytecode. + * @param opcode - the opcode to encode + * @param args - the arguments to encode + * @returns the bytecode for this one instruction + */ +export function encodeToBytecode(opcode: Opcode, args: number[]): Buffer { + const instructionType = INSTRUCTION_SET.get(opcode); + if (instructionType === undefined) { + throw new Error(`Opcode ${opcode} not implemented`); + } + + const numberOfOperands = instructionType.numberOfOperands; + if (args.length !== numberOfOperands) { + throw new Error(`Opcode ${opcode} expects ${numberOfOperands} arguments, but ${args.length} were provided`); + } + + const bytecode = Buffer.alloc( + AVM_OPCODE_BYTE_LENGTH + + numberOfOperands * AVM_OPERAND_BYTE_LENGTH + ); + + let bytePtr = 0; + bytecode.writeUInt8(opcode as number, bytePtr); + bytePtr += AVM_OPCODE_BYTE_LENGTH; + for (let i = 0; i < args.length; i++) { + bytecode.writeUInt32BE(args[i], bytePtr); + bytePtr += AVM_OPERAND_BYTE_LENGTH; + } + return bytecode; +} \ No newline at end of file diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts index 0411251b705..9a97ab21a00 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts @@ -1,6 +1,9 @@ import { AvmMachineState } from '../avm_machine_state.js'; import { AvmStateManager } from '../avm_state_manager.js'; +export const AVM_OPERAND_BYTE_LENGTH = 4; +export const AVM_OPCODE_BYTE_LENGTH = 1; + /** * Opcode base class */ From 19ebafdefbef8c55efe8729f22b61376a5fc6563 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Thu, 18 Jan 2024 17:13:17 +0000 Subject: [PATCH 18/19] encode test --- .../avm/opcodes/encode_to_bytecode.test.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts diff --git a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts new file mode 100644 index 00000000000..8b1ea033dee --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts @@ -0,0 +1,30 @@ +import { encodeToBytecode } from './encode_to_bytecode.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH } from './instruction.js'; +import { Opcode } from './opcodes.js'; + +describe('Avm Encoder', () => { + const toByte = (num: number): Buffer => { + const buf = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH); + buf.writeUInt8(num); + return buf; + }; + const to4Byte = (num: number): Buffer => { + const buf = Buffer.alloc(AVM_OPERAND_BYTE_LENGTH); + buf.writeUInt32BE(num); + return buf; + }; + + it('Should properly encode instructions into bytecode buffers', () => { + const addArgs = [0, 1, 2]; + const subArgs = [3, 4, 5]; + + const addBytecode = encodeToBytecode(Opcode.ADD, addArgs); + const subBytecode = encodeToBytecode(Opcode.SUB, subArgs); + + const expectedAddBytecode = Buffer.concat([toByte(Opcode.ADD), to4Byte(0), to4Byte(1), to4Byte(2)]); + const expectedSubBytecode = Buffer.concat([toByte(Opcode.SUB), to4Byte(3), to4Byte(4), to4Byte(5)]); + + expect(addBytecode).toEqual(expectedAddBytecode); + expect(subBytecode).toEqual(expectedSubBytecode); + }); +}); From b147a2c565ef05ebfc810b3daedf5e0e9a50872e Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Thu, 18 Jan 2024 17:20:54 +0000 Subject: [PATCH 19/19] prettier --- .../acir-simulator/src/avm/opcodes/encode_to_bytecode.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts index 9f5bda82449..186706847d3 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts @@ -19,10 +19,7 @@ export function encodeToBytecode(opcode: Opcode, args: number[]): Buffer { throw new Error(`Opcode ${opcode} expects ${numberOfOperands} arguments, but ${args.length} were provided`); } - const bytecode = Buffer.alloc( - AVM_OPCODE_BYTE_LENGTH - + numberOfOperands * AVM_OPERAND_BYTE_LENGTH - ); + const bytecode = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH + numberOfOperands * AVM_OPERAND_BYTE_LENGTH); let bytePtr = 0; bytecode.writeUInt8(opcode as number, bytePtr); @@ -32,4 +29,4 @@ export function encodeToBytecode(opcode: Opcode, args: number[]): Buffer { bytePtr += AVM_OPERAND_BYTE_LENGTH; } return bytecode; -} \ No newline at end of file +}