From f879d9256e1b5c3e059fd4b5df0cb33a9ba60f89 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Fri, 17 Nov 2023 11:11:29 -0500 Subject: [PATCH] Add doc for privileged instructions (#1355) * Add doc for privileged instructions * Comment --- evm/spec/instructions.tex | 52 +++++++++++++++++++++++++++++++++++--- evm/spec/zkevm.pdf | Bin 160503 -> 192177 bytes evm/spec/zkevm.tex | 1 + 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/evm/spec/instructions.tex b/evm/spec/instructions.tex index ea09698271..d177d22ad6 100644 --- a/evm/spec/instructions.tex +++ b/evm/spec/instructions.tex @@ -1,8 +1,52 @@ \section{Privileged instructions} \label{privileged-instructions} -\begin{enumerate} - \item[0xFB.] \texttt{MLOAD\_GENERAL}. Returns - \item[0xFC.] \texttt{MSTORE\_GENERAL}. Returns - \item[TODO.] \texttt{STACK\_SIZE}. Returns +To ease and speed-up proving time, the zkEVM supports custom, privileged instructions that can only be executed by the kernel. +Any appearance of those privileged instructions in a contract bytecode for instance would result in an unprovable state. + +In what follows, we denote by $p_{BN}$ the characteristic of the BN254 curve base field, curve for which Ethereum supports the +ecAdd, ecMul and ecPairing precompiles. + +\begin{enumerate}[align=left] + \item[0x0C.] \texttt{ADDFP254}. Pops 2 elements from the stack interpreted as BN254 base field elements, and pushes their addition modulo $p_{BN}$ onto the stack. + + \item[0x0D.] \texttt{MULFP254}. Pops 2 elements from the stack interpreted as BN254 base field elements, and pushes their product modulo $p_{BN}$ onto the stack. + + \item[0x0E.] \texttt{SUBFP254}. Pops 2 elements from the stack interpreted as BN254 base field elements, and pushes their difference modulo $p_{BN}$ onto the stack. + This instruction behaves similarly to the SUB (0x03) opcode, in that we subtract the second element of the stack from the initial (top) one. + + \item[0x0F.] \texttt{SUBMOD}. Pops 3 elements from the stack, and pushes the modular difference of the first two elements of the stack by the third one. + It is similar to the SUB instruction, with an extra pop for the custom modulus. + + \item[0x21.] \texttt{KECCAK\_GENERAL}. Pops 4 elements (successively the context, segment, and offset portions of a Memory address, followed by a length $\ell$) + and pushes the hash of the memory portion starting at the constructed address and of length $\ell$. It is similar to KECCAK256 (0x20) instruction, but can be applied to + any memory section (i.e. even privileged ones). + + \item[0x49.] \texttt{PROVER\_INPUT}. Pushes a single prover input onto the stack. + + \item[0xC0-0xDF.] \texttt{MSTORE\_32BYTES}. Pops 4 elements from the stack (successively the context, segment, and offset portions of a Memory address, and then a value), and pushes + a new offset' onto the stack. The value is being decomposed into bytes and written to memory, starting from the reconstructed address. The new offset being pushed is computed as the + initial address offset + the length of the byte sequence being written to memory. Note that similarly to PUSH (0x60-0x7F) instructions there are 31 MSTORE\_32BYTES instructions, each + corresponding to a target byte length (length 0 is ignored, for the same reasons as MLOAD\_32BYTES, see below). Writing to memory an integer fitting in $n$ bytes with a length $\ell < n$ will + result in the integer being truncated. On the other hand, specifying a length $\ell$ greater than the byte size of the value being written will result in padding with zeroes. This + process is heavily used when resetting memory sections (by calling MSTORE\_32BYTES\_32 with the value 0). + + \item[0xF6.] \texttt{GET\_CONTEXT}. Pushes the current context onto the stack. The kernel always has context 0. + + \item[0xF7.] \texttt{SET\_CONTEXT}. Pops the top element of the stack and updates the current context to this value. It is usually used when calling another contract or precompile, + to distinguish the caller from the callee. + + \item[0xF8.] \texttt{MLOAD\_32BYTES}. Pops 4 elements from the stack (successively the context, segment, and offset portions of a Memory address, and then a length $\ell$), and pushes + a value onto the stack. The pushed value corresponds to the U256 integer read from the big-endian sequence of length $\ell$ from the memory address being reconstructed. Note that an + empty length is not valid, nor is a length greater than 32 (as a U256 consists in at most 32 bytes). Missing these conditions will result in an unverifiable proof. + + \item[0xF9.] \texttt{EXIT\_KERNEL}. Pops 1 element from the stack. This instruction is used at the end of a syscall, before proceeding to the rest of the execution logic. + The popped element, \textit{kexit\_info}, contains several informations like the current program counter, current gas used, and if we are in kernel (i.e. privileged) mode. + + \item[0xFB.] \texttt{MLOAD\_GENERAL}. Pops 3 elements (successively the context, segment, and offset portions of a Memory address), and pushes the value stored at this memory + address onto the stack. It can read any memory location, general (similarly to MLOAD (0x51) instruction) or privileged. + + \item[0xFC.] \texttt{MSTORE\_GENERAL}. Pops 4 elements (successively a value, then the context, segment, and offset portions of a Memory address), and writes the popped value from + the stack at the reconstructed address. It can write to any memory location, general (similarly to MSTORE (0x52) / MSTORE8 (0x53) instructions) or privileged. + \end{enumerate} diff --git a/evm/spec/zkevm.pdf b/evm/spec/zkevm.pdf index 6aaed5e31cb06e7844513a584f1ba0383724228f..3f957a0e48e80f411b5bdc363cfc89b50339c85e 100644 GIT binary patch delta 101062 zcmZs?Q;;suvaMORZQHhO*DBk#@t1Aewry9f(kk1wjo#;W#O;XQ=WWJ(&6qj9969Fe zF?8cLECsoem;^mD13L`){L<(e3>O;_6On_lH4Gmg45OTxy@jhK5i2KaGBOA?AU0`J z28iy2+w ziX%gjRLM{-fCFX-3@r#tkYf%W3{?(AwphbJRxkh9dleoSG*af#Sm5*0DBy?1sM?N0 zVg;rN$yn&$&e!}u{b-j?zaDODz_NJvYDVc*?hE6wL@EV9Kj#+o+`K51}y%sQ{oPg}?Q zv>}Lv7e5M4dxb86@58YqCz3IT_q|C&+<0G$`>(07W8z9YpI?AMEr`}7Js%2*nMG(XtRjB>H zMz@(5b<8kk_NFeb&Spk-ME`UApVBZhv;KFHIN4bKPmzu_g&ne)(E3g_9N8ed+Zve# z+BRA2^h#??y484@4os<#ctm-gcW<#pvr5#nYqQw?h!5@E<>dUG$GhLd5s)P zfnha^pi!jqtoJClnG8632uK4<|l(Bz*qmzL@6|^VE(pw4M(7OZ8aN4y)?4?9wh`bpG`! z&iW#?enS<5pw8QF>xHl®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