From 4ff1194328d38baffce41e1525f4543aaf1219bd Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:05:23 -0400 Subject: [PATCH] Move documentation to Github Pages (#557) * Migrate to github pages * workflow * hyperlinks * Move * Tweak * Remove Rustdoc * Update doc * Remove TODO in workflow --- .github/workflows/book.yml | 36 ++ README.md | 9 +- book/.gitignore | 1 + book/book.toml | 30 ++ book/src/SUMMARY.md | 30 ++ .../src}/bibliography.bib | 6 +- book/src/cpu_execution/exceptions.md | 71 ++++ book/src/cpu_execution/gas_handling.md | 72 ++++ book/src/cpu_execution/intro.md | 11 + book/src/cpu_execution/kernel.md | 148 +++++++ book/src/cpu_execution/opcodes_syscalls.md | 21 + .../cpu_execution/privileged_instructions.md | 86 +++++ book/src/cpu_execution/stack_handling.md | 116 ++++++ book/src/framework/cost_model.md | 3 + book/src/framework/ctls.md | 49 +++ book/src/framework/field.md | 20 + book/src/framework/intro.md | 1 + book/src/framework/range_check.md | 120 ++++++ book/src/intro.md | 1 + book/src/mpt/encoding_hashing.md | 46 +++ book/src/mpt/intro.md | 30 ++ book/src/mpt/linked_lists.md | 88 +++++ book/src/mpt/memory_format.md | 68 ++++ book/src/mpt/prover_input_format.md | 33 ++ book/src/tables/arithmetic.md | 128 +++++++ book/src/tables/byte_packing.md | 99 +++++ book/src/tables/cpu.md | 177 +++++++++ book/src/tables/intro.md | 1 + book/src/tables/keccak.md | 145 +++++++ book/src/tables/keccak_sponge.md | 125 ++++++ book/src/tables/logic.md | 32 ++ book/src/tables/mem_continuations.md | 18 + book/src/tables/memory.md | 140 +++++++ docs/arithmetization/.gitignore | 7 - docs/arithmetization/Makefile | 20 - docs/arithmetization/cpulogic.tex | 360 ------------------ docs/arithmetization/framework.tex | 159 -------- docs/arithmetization/introduction.tex | 3 - docs/arithmetization/mpts.tex | 94 ----- docs/arithmetization/tables.tex | 11 - docs/arithmetization/tables/arithmetic.tex | 54 --- docs/arithmetization/tables/byte-packing.tex | 59 --- docs/arithmetization/tables/cpu.tex | 87 ----- docs/arithmetization/tables/keccak-f.tex | 65 ---- docs/arithmetization/tables/keccak-sponge.tex | 66 ---- docs/arithmetization/tables/logic.tex | 18 - .../tables/mem-continuations.tex | 15 - docs/arithmetization/tables/memory.tex | 98 ----- docs/arithmetization/zkevm.pdf | Bin 324827 -> 0 bytes docs/arithmetization/zkevm.tex | 61 --- 50 files changed, 1953 insertions(+), 1185 deletions(-) create mode 100644 .github/workflows/book.yml create mode 100644 book/.gitignore create mode 100644 book/book.toml create mode 100644 book/src/SUMMARY.md rename {docs/arithmetization => book/src}/bibliography.bib (89%) create mode 100644 book/src/cpu_execution/exceptions.md create mode 100644 book/src/cpu_execution/gas_handling.md create mode 100644 book/src/cpu_execution/intro.md create mode 100644 book/src/cpu_execution/kernel.md create mode 100644 book/src/cpu_execution/opcodes_syscalls.md create mode 100644 book/src/cpu_execution/privileged_instructions.md create mode 100644 book/src/cpu_execution/stack_handling.md create mode 100644 book/src/framework/cost_model.md create mode 100644 book/src/framework/ctls.md create mode 100644 book/src/framework/field.md create mode 100644 book/src/framework/intro.md create mode 100644 book/src/framework/range_check.md create mode 100644 book/src/intro.md create mode 100644 book/src/mpt/encoding_hashing.md create mode 100644 book/src/mpt/intro.md create mode 100644 book/src/mpt/linked_lists.md create mode 100644 book/src/mpt/memory_format.md create mode 100644 book/src/mpt/prover_input_format.md create mode 100644 book/src/tables/arithmetic.md create mode 100644 book/src/tables/byte_packing.md create mode 100644 book/src/tables/cpu.md create mode 100644 book/src/tables/intro.md create mode 100644 book/src/tables/keccak.md create mode 100644 book/src/tables/keccak_sponge.md create mode 100644 book/src/tables/logic.md create mode 100644 book/src/tables/mem_continuations.md create mode 100644 book/src/tables/memory.md delete mode 100644 docs/arithmetization/.gitignore delete mode 100644 docs/arithmetization/Makefile delete mode 100644 docs/arithmetization/cpulogic.tex delete mode 100644 docs/arithmetization/framework.tex delete mode 100644 docs/arithmetization/introduction.tex delete mode 100644 docs/arithmetization/mpts.tex delete mode 100644 docs/arithmetization/tables.tex delete mode 100644 docs/arithmetization/tables/arithmetic.tex delete mode 100644 docs/arithmetization/tables/byte-packing.tex delete mode 100644 docs/arithmetization/tables/cpu.tex delete mode 100644 docs/arithmetization/tables/keccak-f.tex delete mode 100644 docs/arithmetization/tables/keccak-sponge.tex delete mode 100644 docs/arithmetization/tables/logic.tex delete mode 100644 docs/arithmetization/tables/mem-continuations.tex delete mode 100644 docs/arithmetization/tables/memory.tex delete mode 100644 docs/arithmetization/zkevm.pdf delete mode 100644 docs/arithmetization/zkevm.tex diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 000000000..45c47716e --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,36 @@ +name: zkEVM mdbook + +on: + push: + branches: [develop, main] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + + - name: Install mdbook + uses: actions-rs/cargo@v1 + with: + command: install + args: mdbook + + - name: Install mdbook-katex and mdbook-bib + uses: actions-rs/cargo@v1 + with: + command: install + args: mdbook-katex mdbook-bib + + - name: Build book + run: mdbook build book + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./book/book diff --git a/README.md b/README.md index 67a3364a7..a4d8326e4 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,10 @@ flowchart LR ## Documentation -Documentation is still incomplete and will be improved over time, a lot of useful material can -be found in the [docs](./docs/) section, including: - -* [sequence diagrams](./docs/usage_seq_diagrams.md) for the proof generation flow -* [zkEVM specifications](./docs/arithmetization/zkevm.pdf), detailing the underlying EVM proving statement +Documentation is still incomplete and will be improved over time. +You can look at the [sequence diagrams](./docs/usage_seq_diagrams.md) for the proof generation flow, +or go through the [zkEVM book](https://0xpolygonzero.github.io/zk_evm/) +for explanations on the zkEVM design and architecture. ## Branches The default branch for the repo is the `develop` branch which is not stable but under active development. Most PRs should target `develop`. If you need a stable branch then a tagged version of `main` is what you're after. diff --git a/book/.gitignore b/book/.gitignore new file mode 100644 index 000000000..7585238ef --- /dev/null +++ b/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/book/book.toml b/book/book.toml new file mode 100644 index 000000000..33cbda21c --- /dev/null +++ b/book/book.toml @@ -0,0 +1,30 @@ +[book] +authors = ["Polygon Zero"] +language = "en" +multilingual = false +src = "src" +title = "The Polygon Zero zkEVM Book" + +[rust] +edition = "2021" + +[build] +create-missing = true + +[preprocessor.index] + +[preprocessor.links] + +[preprocessor.katex] + +[preprocessor.bib] +bibliography = "bibliography.bib" + +[output.html] + +[output.html.print] +# Disable page break +page-break = false + +[output.html.search] +limit-results = 15 diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md new file mode 100644 index 000000000..c2ee742bc --- /dev/null +++ b/book/src/SUMMARY.md @@ -0,0 +1,30 @@ +# Summary + +[Introduction](intro.md) + +- [STARK framework](framework/intro.md) + - [Cost model](framework/cost_model.md) + - [Field](framework/field.md) + - [Cross-Table Lookups](framework/ctls.md) + - [Range-Checks](framework/range_check.md) +- [Tables](tables/intro.md) + - [CPU](tables/cpu.md) + - [Arithmetic](tables/arithmetic.md) + - [BytePacking](tables/byte_packing.md) + - [Keccak](tables/keccak.md) + - [KeccakSponge](tables/keccak_sponge.md) + - [Logic](tables/logic.md) + - [Memory](tables/memory.md) + - [MemBefore & MemAfter](tables/mem_continuations.md) +- [Merkle Patricia Tries](mpt/intro.md) + - [Memory format](mpt/memory_format.md) + - [Prover input format](mpt/prover_input_format.md) + - [Encoding and hashing](mpt/encoding_hashing.md) + - [Linked lists](mpt/linked_lists.md) +- [CPU Execution](cpu_execution/intro.md) + - [Kernel](cpu_execution/kernel.md) + - [Opcodes & Syscalls](cpu_execution/opcodes_syscalls.md) + - [Privileged Instructions](cpu_execution/privileged_instructions.md) + - [Stack handling](cpu_execution/stack_handling.md) + - [Gas handling](cpu_execution/gas_handling.md) + - [Exceptions](cpu_execution/exceptions.md) \ No newline at end of file diff --git a/docs/arithmetization/bibliography.bib b/book/src/bibliography.bib similarity index 89% rename from docs/arithmetization/bibliography.bib rename to book/src/bibliography.bib index 1d83d297e..6f055dade 100644 --- a/docs/arithmetization/bibliography.bib +++ b/book/src/bibliography.bib @@ -6,7 +6,7 @@ @misc{stark title = {Scalable, transparent, and post-quantum secure computational integrity}, howpublished = {Cryptology ePrint Archive, Report 2018/046}, year = {2018}, - note = {\url{https://ia.cr/2018/046}}, + url = {https://ia.cr/2018/046}, } @misc{plonk, @@ -16,7 +16,7 @@ @misc{plonk title = {PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge}, howpublished = {Cryptology ePrint Archive, Report 2019/953}, year = {2019}, - note = {\url{https://ia.cr/2019/953}}, + url = {https://ia.cr/2019/953}, } @article{yellowpaper, @@ -27,4 +27,4 @@ @article{yellowpaper number={2014}, pages={1--32}, year={2014} -} +} \ No newline at end of file diff --git a/book/src/cpu_execution/exceptions.md b/book/src/cpu_execution/exceptions.md new file mode 100644 index 000000000..4fd5ae3ea --- /dev/null +++ b/book/src/cpu_execution/exceptions.md @@ -0,0 +1,71 @@ +## Exceptions + +Sometimes, when executing user code (i.e. contract or transaction code), +the EVM halts exceptionally (i.e. outside of a STOP, a RETURN or a +REVERT). When this happens, the CPU table invokes a special instruction +with a dedicated operation flag `exception`. Exceptions can only happen +in user mode; triggering an exception in kernel mode would make the +proof unverifiable. No matter the exception, the handling is the same: + +-- The opcode which would trigger the exception is not executed. The +operation flag set is `exception` instead of the opcode's flag. + +-- We push a value to the stack which contains: the current program +counter (to retrieve the faulty opcode), and the current value of +`gas_used`. The program counter is then set to the corresponding +exception handler in the kernel (e.g. `exc_out_of_gas`). + +-- The exception handler verifies that the given exception would indeed +be triggered by the faulty opcode. If this is not the case (if the +exception has already happened or if it doesn't happen after executing +the faulty opcode), then the kernel panics: there was an issue during +witness generation. + +-- The kernel consumes the remaining gas and returns from the current +context with `success` set to 0 to indicate an execution failure. + +Here is the list of the possible exceptions: + +1. Raised when a native instruction (i.e. not a syscall) in user mode + pushes the amount of gas used over the current gas limit. When this + happens, the EVM jumps to `exc_out_of_gas`. The kernel then checks + that the consumed gas is currently below the gas limit, and that + adding the gas cost of the faulty instruction pushes it over it. If + the exception is not raised, the prover will panic when returning + from the execution: the remaining gas is checked to be positive + after STOP, RETURN or REVERT. + +2. Raised when the read opcode is invalid. It means either that it + doesn't exist, or that it's a privileged instruction and thus not + available in user mode. When this happens, the EVM jumps to + `exc_invalid_opcode`. The kernel then checks that the given opcode + is indeed invalid. If the exception is not raised, decoding + constraints ensure no operation flag is set to 1, which would make + it a padding row. Halting constraints would then make the proof + unverifiable. + +3. Raised when an instruction which pops from the stack is called when + the stack doesn't have enough elements. When this happens, the EVM + jumps to `exc_stack_overflow`. The kernel then checks that the + current stack length is smaller than the minimum stack length + required by the faulty opcode. If the exception is not raised, the + popping memory operation's address offset would underflow, and the + Memory range check would require the Memory trace to be too large + ($>2^{32}$). + +4. Raised when the program counter jumps to an invalid location (i.e. + not a JUMPDEST). When this happens, the EVM jumps to + `exc_invalid_jump_destination`. The kernel then checks that the + opcode is a JUMP, and that the destination is not a JUMPDEST by + checking the JUMPDEST segment. If the exception is not raised, + jumping constraints will fail the proof. + +5. Same as the above, for JUMPI. + +6. Raised when a pushing instruction in user mode pushes the stack + over 1024. When this happens, the EVM jumps to `exc_stack_overflow`. + The kernel then checks that the current stack length is exactly + equal to 1024 (since an instruction can only push once at most), and + that the faulty instruction is pushing. If the exception is not + raised, stack constraints ensure that a stack length of 1025 in user + mode will fail the proof. diff --git a/book/src/cpu_execution/gas_handling.md b/book/src/cpu_execution/gas_handling.md new file mode 100644 index 000000000..7ebc8397d --- /dev/null +++ b/book/src/cpu_execution/gas_handling.md @@ -0,0 +1,72 @@ +## Gas handling + +### Out of gas errors + +The CPU table has a "gas" register that keeps track of the gas used by +the transaction so far. + +The crucial invariant in our out-of-gas checking method is that at any +point in the program's execution, we have not used more gas than we have +available; that is "gas" is at most the gas allocation for the +transaction (which is stored separately by the kernel). We assume that +the gas allocation will never be $2^{32}$ or more, so if "gas" does not +fit in one limb, then we've run out of gas. + +When a native instruction (one that is not a syscall) is executed, a +constraint ensures that the "gas" register is increased by the correct +amount. This is not automatic for syscalls; the syscall handler itself +must calculate and charge the appropriate amount. + +If everything goes smoothly and we have not run out of gas, "gas" should +be no more than the gas allowance at the point that we STOP, REVERT, +stack overflow, or whatever. Indeed, because we assume that the gas +overflow handler is invoked *as soon as* we've run out of gas, all these +termination methods verify that $\texttt{gas} \leq \texttt{allowance}$, +and jump to `exc_out_of_gas` if this is not the case. This is also true +for the out-of-gas handler, which checks that: + +1. we have not yet run out of gas + +2. we are about to run out of gas + +and "PANIC" if either of those statements does not hold. + +When we do run out of gas, however, this event must be handled. Syscalls +are responsible for checking that their execution would not cause the +transaction to run out of gas. If the syscall detects that it would need +to charge more gas than available, it aborts the transaction (or the +current code) by jumping to `fault_exception`. In fact, +`fault_exception` is in charge of handling all exceptional halts in the +kernel. + +Native instructions do this differently. If the prover notices that +execution of the instruction would cause an out-of-gas error, it must +jump to the appropriate handler instead of executing the instruction. +(The handler contains special code that PANICs if the prover invoked it +incorrectly.) + +### Overflow + +We must be careful to ensure that "gas" does not overflow to prevent +denial of service attacks. + +Note that a syscall cannot be the instruction that causes an overflow. +This is because every syscall is required to verify that its execution +does not cause us to exceed the gas limit. Upon entry into a syscall, a +constraint verifies that $\texttt{gas} < 2^{32}$. Some syscalls may have +to be careful to ensure that the gas check is performed correctly (for +example, that overflow modulo $2^{256}$ does not occur). So we can +assume that upon entry and exit out of a syscall, +$\texttt{gas} < 2^{32}$. + +Similarly, native instructions alone cannot cause wraparound. The most +expensive instruction, JUMPI, costs 10 gas. Even if we were to execute +$2^{32}$ consecutive JUMPI instructions, the maximum length of a trace, +we are nowhere close to consuming $2^{64} - 2^{32} + 1$ (= Goldilocks +prime) gas. + +The final scenario we must tackle is an expensive syscall followed by +many expensive native instructions. Upon exit from a syscall, +$\texttt{gas} < 2^{32}$. Again, even if that syscall is followed by +$2^{32}$ native instructions of cost 10, we do not see wraparound modulo +Goldilocks. diff --git a/book/src/cpu_execution/intro.md b/book/src/cpu_execution/intro.md new file mode 100644 index 000000000..a1928d830 --- /dev/null +++ b/book/src/cpu_execution/intro.md @@ -0,0 +1,11 @@ +# CPU Execution {#cpulogic} + +The CPU is in charge of coordinating the different STARKs, proving the +correct execution of the instructions it reads and guaranteeing that the +final state of the EVM corresponds to the starting state after executing +the input transactions. All design choices were made to make sure these +properties can be adequately translated into constraints of degree at +most 3 while minimizing the size of the different table traces (number +of columns and number of rows). + +In this section, we will detail some of these choices. \ No newline at end of file diff --git a/book/src/cpu_execution/kernel.md b/book/src/cpu_execution/kernel.md new file mode 100644 index 000000000..573936d14 --- /dev/null +++ b/book/src/cpu_execution/kernel.md @@ -0,0 +1,148 @@ +## Kernel + +The kernel is in charge of the proving logic. This section aims at +providing a high level overview of this logic. For details about any +specific part of the logic, one can consult the various "asm" files in +the ["kernel" +module](https://github.com/0xPolygonZero/plonky2/tree/main/evm/src/cpu/kernel). + +We prove a batch of transactions, split into segments. These proofs can +later be aggregated recursively to prove a block. Proof aggregation is +however not in the scope of this section. Here, we assume that we have +an initial state of the EVM, and we wish to prove that a batch of +contiguous transactions was correctly executed, leading to a correct +update of the state. + +Since we process transactions and not entire blocks, a few intermediary +values need to be provided by the prover. Indeed, to prove that the +registers in the EVM state are correctly updated, we need to have access +to their initial values. When aggregating proofs, we can also constrain +those values to match from one batch to the next. Let us consider the +example of the transaction number. Let $n$ be the number of transactions +executed so far in the current block. If the current proof is not a +dummy one (we are indeed executing a batch of transactions), then the +transaction number should be updated: $n := n+k$ with $k$ the number of +transactions in the batch. Otherwise, the number remains unchanged. We +can easily constrain this update. When aggregating the previous +transaction batch proof ($lhs$) with the current one ($rhs$), we also +need to check that the output transaction number of $lhs$ is the same as +the input transaction number of $rhs$. + +Those prover provided values are stored in memory prior to entering the +kernel, and are used in the kernel to assert correct updates. The list +of prover provided values necessary to the kernel is the following: + +1. the number of the last transaction executed: $t_n$, + +2. the gas used before executing the current transactions: $g\_u_0$, + +3. the gas used after executing the current transactions: $g\_u_1$, + +4. the state, transaction and receipts MPTs before executing the + current transactions: $\texttt{tries}_0$, + +5. the hash of all MPTs before executing the current transactions: + $\texttt{digests}_0$, + +6. the hash of all MPTs after executing the current transactions: + $\texttt{digests}_1$, + +7. the RLP encoding of the transactions. + +### Memory addresses + +Kernel operations deal with memory addresses as single U256 elements. +However, when processing the operations to generate the proof witness, +the CPU will decompose these into three components: + +- The context of the memory address. The Kernel context is special, + and has value 0. + +- The segment of the memory address, corresponding to a specific + section given a context (eg. MPT data, global metadata, etc.). + +- The offset of the memory address, within a segment given a context. + +To easily retrieve these components, we scale them so that they can +represent a memory address as: + +$$\mathrm{addr} = 2^{64} \cdot \mathrm{context} + 2^{32} \cdot \mathrm{segment} + \mathrm{offset}$$ + +This allows to easily retrieve each component individually once a Memory +address has been decomposed into 32-bit limbs. + +### Segment handling + +An execution run is split into one or more segments. To ensure +continuity, the first cycles of a segment are used to \"load\" segment +data from the previous segment, and the last cycles to \"save\" segment +data for the next segment. The number of CPU cycles of a segment is +bounded by `MAX_CPU_CYCLES`, which can be tweaked for best performance. +The segment data values are: + +- the stack length, + +- the stack top, + +- the context, + +- the `is_kernel` flag, + +- the gas used, + +- the program counter. + +These values are stored as global metadata, and are loaded from (resp. +written to) memory at the beginning (resp. at the end) of a segment. +They are propagated between proofs as public values. + +The initial memory of the first segment is fixed and contains: + +- the kernel code, + +- the shift table. + +### Initialization + +The first step of a run consists in initializing: + +- The initial transaction and receipt tries $\texttt{tries}_0$ are + loaded from memory. The transaction and the receipt tries are hashed + and the hashes are then compared to $\texttt{digests}\_0$. For + efficiency, the initial state trie will be hashed for verification + at the end of the run. + +- We load the transaction number $t\_n$ and the current gas used + $g\_u_0$ from memory. + +We start processing the transactions (if any) sequentially, provided in +RLP encoded format. + +The processing of the transaction returns a boolean "success" that +indicates whether the transaction was executed successfully, along with +the leftover gas. + +The following step is then to update the receipts MPT. Here, we update +the transaction's bloom filter. We store "success", the leftover gas, +the transaction bloom filter and the logs in memory. We also store some +additional information that facilitates the RLP encoding of the receipts +later. + +If there are any withdrawals, they are performed at this stage. + +Finally, once the three MPTs have been updated, we need to carry out +final checks: + +- the gas used after the execution is equal to $g\_u_1$, + +- the new transaction number is $n + k$ with $k$ the number of + processed transactions, + +- the initial state MPT is hashed and checked against + $\texttt{digests}_0$. + +- the initial state MPT is updated to reflect the processed + transactions, then the three final MPTs are hashed and checked + against $\texttt{digests}_1$. + +Once those final checks are performed, the program halts. \ No newline at end of file diff --git a/book/src/cpu_execution/opcodes_syscalls.md b/book/src/cpu_execution/opcodes_syscalls.md new file mode 100644 index 000000000..109dab022 --- /dev/null +++ b/book/src/cpu_execution/opcodes_syscalls.md @@ -0,0 +1,21 @@ +## Simple opcodes & Syscalls + +For simplicity and efficiency, EVM opcodes are categorized into two +groups: "simple opcodes" and "syscalls". Simple opcodes are generated +directly in Rust, in +[operation.rs](https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/witness/operation.rs). +Every call to a simple opcode adds exactly one row to the [cpu +table](https://github.com/0xPolygonZero/plonky2/blob/main/evm/spec/tables/cpu.tex). +Syscalls are more complex structures written with simple opcodes, in the +kernel. + +Whenever we encounter a syscall, we switch to kernel mode and execute +its associated code. At the end of each syscall, we run EXIT_KERNEL, +which resets the kernel mode to its state right before the syscall. It +also sets the PC to point to the opcode right after the syscall. + +Exceptions are handled differently for simple opcodes and syscalls. When +necessary, simple opcodes throw an exception (see [exceptions](./exceptions.md)). This +activates the "exception flag" in the CPU and runs the exception +operations. On the other hand, syscalls handle exceptions in the kernel +directly. diff --git a/book/src/cpu_execution/privileged_instructions.md b/book/src/cpu_execution/privileged_instructions.md new file mode 100644 index 000000000..af613346c --- /dev/null +++ b/book/src/cpu_execution/privileged_instructions.md @@ -0,0 +1,86 @@ +## Privileged instructions + +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. + +1. `ADDFP254`. Pops 2 elements from the stack interpreted as BN254 base + field elements, and pushes their addition modulo $p_{BN}$ onto the + stack. + +2. `MULFP254`. Pops 2 elements from the stack interpreted as BN254 base + field elements, and pushes their product modulo $p_{BN}$ onto the + stack. + +3. `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. + +4. `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. + +5. `KECCAK_GENERAL`. Pops 2 elements (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). + +6. `MSTORE_32BYTES`. Pops 2 elements from the stack (a Memory address, + and then a value), and pushes a new address' onto the stack. The + value is being decomposed into bytes and written to memory, starting + from the fetched address. The new address being pushed is computed + as the initial address + the length of the byte sequence being + written to memory. Note that similarly to PUSH (0x60-0x7F) + instructions, there are 32 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). + +7. `PROVER_INPUT`. Pushes a single prover input onto the stack. + +8. `GET_CONTEXT`. Pushes the current context onto the stack. The kernel + always has context 0. + +9. `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. + +10. `MLOAD_32BYTES`. Pops 2 elements from the stack (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 + fetched. 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. + +11. `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, *kexit_info*, contains several + pieces of information like the current program counter, the current + amount of gas used, and whether we are in kernel (i.e. privileged) + mode or not. + +12. `MLOAD_GENERAL`. Pops 1 elements (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. + +13. `MSTORE_GENERAL`. Pops 2 elements (a value and a Memory address), + and writes the popped value from the stack at the fetched address. + It can write to any memory location, general (similarly to MSTORE + (0x52) / MSTORE8 (0x53) instructions) or privileged. diff --git a/book/src/cpu_execution/stack_handling.md b/book/src/cpu_execution/stack_handling.md new file mode 100644 index 000000000..c845d3f65 --- /dev/null +++ b/book/src/cpu_execution/stack_handling.md @@ -0,0 +1,116 @@ +## Stack handling + +### Top of the stack + +The majority of memory operations involve the stack. The stack is a +segment in memory, and stack operations (popping or pushing) use the +memory channels. Every CPU instruction performs between 0 and 3 pops, +and may push at most once. However, for efficiency purposes, we hold the +top of the stack in the first memory channel +`current_row.mem_channels[0]`, only writing it in memory if necessary. + +#### Top reading and writing + +When a CPU instruction modifies the stack, it must update the top of the +stack accordingly. There are three cases. + +- **The instruction pops and pushes:** The new top of the stack is + stored in `next_row.mem_channels[0]`; it may be computed by the + instruction, or it could be read from memory. In either case, the + instruction is responsible for setting `next_row.mem_channels[0]`'s + flags and address columns correctly. After use, the previous top of + the stack is discarded and doesn't need to be written in memory. + +- **The instruction pushes, but doesn't pop:** The new top of the + stack is stored in `next_row.mem_channels[0]`; it may be computed by + the instruction, or it could be read from memory. In either case, + the instruction is responsible for setting + `next_row.mem_channels[0]`'s flags and address columns correctly. If + the stack wasn't empty (`current_row.stack_len > 0`), the + instruction performs a memory read in + `current_row.partial_ channel`. `current_row.partial_channel` shares + its values with `current_ row.mem_channels[0]` (which holds the + current top of the stack). If the stack was empty, + `current_row.partial_channel` is disabled. + +- **The instruction pops, but doesn't push:** After use, the current + top of the stack is discarded and doesn't need to be written in + memory. If the stack isn't empty now + (`current_row.stack_len > num_pops`), the new top of the stack is + set in `next_row.mem_channels[0]` with a memory read from the stack + segment. If the stack is now empty, `next_row.mem_channels[0]` is + disabled. + +In the last two cases, there is an edge case if `current_row.stack_len` +is equal to a `special_len`. For a strictly pushing instruction, this +happens if the stack is empty, and `special_len = 0`. For a strictly +popping instruction, this happens if the next stack is empty, i.e. if +all remaining elements are popped, and `special_len = num_pops`. Note +that we do not need to check for values below `num_pops`, since this +would be a stack underflow exception which is handled separately. The +edge case is detected with the compound flag +$$\texttt{1 - not\_special\_len * stack\_inv\_aux,}$$ where +$$\texttt{not\_special\_len = current\_row - special\_len}$$ + +and `stack_inv_aux` is constrained to be the modular inverse of +`not_special_ len` if it's non-zero, or 0 otherwise. The flag is 1 if +`stack_len` is equal to `special_len`, and 0 otherwise. + +This logic can be found in code in the `eval_packed_one` function of +[stack.rs](https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/stack.rs). +The function multiplies all of the stack constraints with the degree 1 +filter associated with the current instruction. + +#### Operation flag merging + +To reduce the total number of columns, many operation flags are merged +together (e.g. `DUP` and `SWAP`) and are distinguished with the binary +decomposition of their opcodes. The filter for a merged operation is now +of degree 2: for example, `is_swap = dup_swap * opcode_bits[4]` since +the 4th bit is set to 1 for a `SWAP` and 0 for a `DUP`. If the two +instructions have different stack behaviors, this can be a problem: +`eval_packed_one`'s constraints are already of degree 3 and it can't +support degree 2 filters. + +When this happens, stack constraints are defined manually in the +operation's dedicated file (e.g. `dup_swap.rs`). Implementation details +vary case-by-case and can be found in the files. + +### Stack length checking + +The CPU must make sure that the stack length never goes below zero and, +in user mode, never grows beyond the maximum stack size. When this +happens, an honest prover should trigger the corresponding exception. If +a malicious prover doesn't trigger the exception, constraints must fail +the proof. + +#### Stack underflow + +There is no explicit constraint checking for stack underflow. An +underflow happens when the CPU tries to pop the empty stack, which would +perform a memory read at virtual address `-1`. Such a read cannot +succeed: in Memory, the range-check argument requires the gap between +two consecutive addresses to be lower than the length of the Memory +trace. Since the prime of the Plonky2 field is 64-bit long, this would +require a Memory trace longer than $2^{32}$. + +#### Stack overflow + +An instruction can only push at most once, meaning that an overflow +occurs whenever the stack length is exactly one more than the maximum +stack size ($1024+1$) in user mode. To constrain this, the column +`stack_len_bounds_aux` contains: + +- the modular inverse of `stack_len - 1025` if we're in user mode and + `stack_len `$\neq$` 1025`, + +- 0 if `stack_len = 1025` or if we're in kernel mode. + +Then overflow can be checked with the flag +$$\texttt{(1 - is\_kernel\_mode) - stack\_len * stack\_len\_bounds\_aux}.$$ +The flag is 1 if `stack_len = 1025` and we're in user mode, and 0 +otherwise. + +Because `stack_len_bounds_aux` is a shared general column, we only check +this constraint after an instruction that can actually trigger an +overflow, i.e. a pushing, non-popping instruction. diff --git a/book/src/framework/cost_model.md b/book/src/framework/cost_model.md new file mode 100644 index 000000000..2df7c76f6 --- /dev/null +++ b/book/src/framework/cost_model.md @@ -0,0 +1,3 @@ +## Cost model + +Our zkEVM is designed for efficient verification by STARKs @@stark, particularly by an AIR with degree 3 constraints. In this model, the prover bottleneck is typically constructing Merkle trees, particularly constructing the tree containing low-degree extensions of witness polynomials. \ No newline at end of file diff --git a/book/src/framework/ctls.md b/book/src/framework/ctls.md new file mode 100644 index 000000000..44f14deb9 --- /dev/null +++ b/book/src/framework/ctls.md @@ -0,0 +1,49 @@ +## Cross-Table Lookups + +The various STARK tables carry out independent operations, but on shared values. We need to check that the shared values are identical in all the STARKs that require them. This is where cross-table lookups (CTLs) come in handy. + +Suppose STARK $S_1$ requires an operation -- say $Op$ -- that is carried out by another STARK $S_2$. Then $S_1$ writes the input and output of $Op$ in its own table, and provides the inputs to $S_2$. $S_2$ also writes the inputs and outputs in its rows, and the table's constraints check that $Op$ is carried out correctly. We then need to ensure that the inputs and outputs are the same in $S_1$ and $S_2$. + +In other words, we need to ensure that the rows -- reduced to the input and output columns -- of $S_1$ calling $Op$ are permutations of the rows of $S_2$ that carry out $Op$. Our CTL protocol is based on logUp and is similar to our range-checks. + +To prove this, the first step is to only select the rows of interest in $S_1$ and $S_2$, and filter out the rest. Let $f^1$ be the filter for $S_1$ and $f^2$ the filter for $S_2$. $f^1$ and $f^2$ are constrained to be in $\{0, 1\}$. $f^1 = 1$ (resp. $f^2 = 1$) whenever the row at hand carries out $Op$ in $S_1$ (resp. in $S_2$), and 0 otherwise. Let also $(\alpha, \beta)$ be two random challenges. + +The idea is to create subtables $S_1'$ and $S_2'$ of $S_1$ and $S_2$ respectively, such that $f^1 = 1$ and $f^2 = 1$ for all their rows. The columns in the subtables are limited to the ones whose values must be identical (the inputs and outputs of $Op$ in our example). + +Note that for design and constraint reasons, filters are limited to (at most) degree 2 combinations of columns. + +Let $\{c^{1, i}\}_{i=1}^m$ be the columns in $S_1'$ an $\{c^{2,i}\}_{i=1}^m$ be the columns in $S_2'$. + +The prover defines a "running sum" $Z$ for $S_1'$ such that: +$$\begin{gathered} + Z^{S_1}_{n-1} = \frac{1}{\sum_{j=0}^{m-1} \alpha^j \cdot c^{1, j}_{n-1} + \beta} \\ + Z^{S_1}_{i+1} = Z^{S_1}_i + f^1_i \cdot \frac{1}{\sum_{j=0}^{m-1} \alpha^j \cdot c^{1, j}_i + \beta} +\end{gathered}$$ + +The second equation "selects" the terms of interest thanks to $f^1$ and filters out the rest. + +Similarly, the prover constructs a running sum $Z^{S_2}$for $S_2$. Note that $Z$ is computed "upside down": we start with $Z_{n-1}$ and the final sum is in $Z_0$. + +On top of the constraints to check that the running sums were correctly constructed, the verifier checks that $Z^{S_1}_0 = Z^{S_2}_0$. This ensures that the columns in $S_1'$ and the columns in $S_2'$ are permutations of each other. + +In other words, the CTL argument is a logUp lookup argument where $S_1'$ is the looking table, $S_2'$ is the looked table, and $S_1' = S_2'$ (all the multiplicities are 1). For more details about logUp, see the next section. + +To sum up, for each STARK $S$, the prover: + +1. constructs a running sum $Z_i^l$ for each table looking into $S$ + (called looking sums here), + +2. constructs a running sum $Z^S$ for $S$ (called looked sum here), + +3. sends the final value for each running sum $Z_{i, 0}^l$ and $Z^S_0$ + to the verifier, + +4. sends a commitment to $Z_i^l$ and $Z^S$ to the verifier. + +Then, for each STARK $S$, the verifier: + +1. computes the sum $Z = \sum_i Z_{i, 0}^l$, + +2. checks that $Z = Z^S_0$, + +3. checks that each $Z_i^l$ and $Z^S$ was correctly constructed. \ No newline at end of file diff --git a/book/src/framework/field.md b/book/src/framework/field.md new file mode 100644 index 000000000..f14a57630 --- /dev/null +++ b/book/src/framework/field.md @@ -0,0 +1,20 @@ +## Field + +Our zkEVM is designed to have its execution traces encoded in a particular prime field $\mathbb{F}_p$, with $p = 2^{64} - 2^{32} + 1$. A nice property of this field is that it can represent the results of many common `u32` operations. For example, (widening) `u32` multiplication has a maximum value of $(2^{32} - 1)^2$, which is less than $p$. In fact a `u32` multiply-add has a maximum value of $p - 1$, so the result can be represented with a single field element, although if we were to add a carry in bit, this no longer holds. + +This field also enables a very efficient reduction method. Observe that $$2^{64} \equiv 2^{32} - 1 \pmod p$$ and consequently +$$\begin{aligned} + 2^{96} &\equiv 2^{32} (2^{32} - 1) \pmod p \\ + &\equiv 2^{64} - 2^{32} \pmod p \\ + &\equiv -1 \pmod p. +\end{aligned}$$ + +To reduce a 128-bit number $n$, we first rewrite $n$ as $n_0 + 2^{64} n_1 + 2^{96} n_2$, where $n_0$ is 64 bits and $n_1, n_2$ are 32 bits each. Then +$$\begin{aligned} + n &\equiv n_0 + 2^{64} n_1 + 2^{96} n_2 \pmod p \\ + &\equiv n_0 + (2^{32} - 1) n_1 - n_2 \pmod p +\end{aligned}$$ + +After computing $(2^{32} - 1) n_1$, which can be done with a shift and subtraction, we add the first two terms, subtracting $p$ if overflow occurs. We then subtract $n_2$, adding $p$ if underflow occurs. + +At this point we have reduced $n$ to a `u64`. This partial reduction is adequate for most purposes, but if we needed the result in canonical form, we would perform a final conditional subtraction. \ No newline at end of file diff --git a/book/src/framework/intro.md b/book/src/framework/intro.md new file mode 100644 index 000000000..0de7c9ddf --- /dev/null +++ b/book/src/framework/intro.md @@ -0,0 +1 @@ +# STARK framework diff --git a/book/src/framework/range_check.md b/book/src/framework/range_check.md new file mode 100644 index 000000000..e810861d0 --- /dev/null +++ b/book/src/framework/range_check.md @@ -0,0 +1,120 @@ +## Range-checks {#rc} + +In most cases, tables deal with U256 words, split into 32-bit limbs (to avoid overflowing the field). To prevent a malicious prover from cheating, it is crucial to range-check those limbs. + +### What to range-check? + +One can note that every element that ever appears on the stack has been pushed. Therefore, enforcing a range-check on pushed elements is enough to range-check all elements on the stack. Similarly, all elements in memory must have been written prior, and therefore it is enough to range-check memory writes. However, range-checking the PUSH and MSTORE opcodes is not sufficient. + +1. Pushes and memory writes for "MSTORE_32BYTES" are range-checked in + "BytePackingStark", except PUSH operations happening in privileged + mode. See [push_general_view](./../tables/cpu.md#general-columns). + +2. Syscalls, exceptions and prover inputs are range-checked in + "ArithmeticStark". + +3. The inputs and outputs of binary and ternary arithmetic operations + are range-checked in "ArithmeticStark". + +4. The inputs' bits of logic operations are checked to be either 1 or 0 + in "LogicStark". Since "LogicStark" only deals with bitwise + operations, this is enough to have range-checked outputs as well. + +5. The inputs of Keccak operations are range-checked in "KeccakStark". + The output digest is written as bytes in "KeccakStark". Those bytes + are used to reconstruct the associated 32-bit limbs checked against + the limbs in "CpuStark". This implicitly ensures that the output is + range-checked. + +Note that some operations do not require a range-check: + +1. "MSTORE_GENERAL" read the value to write from the stack. Thus, the + written value was already range-checked by a previous push. + +2. "EQ" reads two -- already range-checked -- elements on the stack, + and checks they are equal. The output is either 0 or 1, and does + therefore not need to be checked. + +3. "NOT" reads one -- already range-checked -- element. The result is + constrained to be equal to $\texttt{0xFFFFFFFF} - \texttt{input}$, + which implicitly enforces the range check. + +4. "PC": the program counter cannot be greater than $2^{32}$ in user + mode. Indeed, the user code cannot be longer than $2^{32}$, and + jumps are constrained to be JUMPDESTs. Moreover, in kernel mode, + every jump is towards a location within the kernel, and the kernel + code is smaller than $2^{32}$. These two points implicitly enforce + $PC$'s range check. + +5. "GET_CONTEXT", "DUP" and "SWAP" all read and push values that were + already written in memory. The pushed values were therefore already + range-checked. + +Range-checks are performed on the range $[0, 2^{16} - 1]$, to limit the trace length. + +### Lookup Argument + +To enforce the range-checks, we leverage [logUp](https://eprint.iacr.org/2022/1530.pdf), a lookup argument by Ulrich Häbock. Given a looking table $s = (s_1, ..., s_n)$ and a looked table $t = (t_1, ..., t_m)$, the goal is to prove that $$\forall 1 \leq i \leq n, \exists 1 \leq j \leq r \texttt{ such that } s_i = t_j$$ + +In our case, $t = (0, .., 2^{16} - 1)$ and $s$ is composed of all the columns in each STARK that must be range-checked. + +The logUp paper explains that proving the previous assertion is actually equivalent to proving that there exists a sequence $l$ such that: + +$$\sum_{i=1}^n \frac{1}{X - s_i} = \sum_{j=1}^r \frac{l_j}{X-t_j}$$ + +The values of $s$ can be stored in $c$ different columns of length $n$ each. In that case, the equality becomes: + +$$\sum_{k=1}^c \sum_{i=1}^n \frac{1}{X - s_i^k} = \sum_{j=1}^r \frac{l_j}{X-t_j}$$ + +The 'multiplicity' $m_i$ of value $t_i$ is defined as the number of times $t_i$ appears in $s$. In other words: + +$$m_i = |s_j \in s; s_j = t_i|$$ + +Multiplicities provide a valid sequence of values in the previously stated equation. Thus, if we store the multiplicities, and are provided with a challenge $\alpha$, we can prove the lookup argument by ensuring: + +$$\sum_{k=1}^c \sum_{i=1}^n \frac{1}{\alpha - s_i^k} = \sum_{j=1}^r \frac{m_j}{\alpha-t_j}$$ + +However, the equation is too high degree. To circumvent this issue, Häbock suggests providing helper columns $h_i$ and $d$ such that at a given row $i$: +$$\begin{gathered} + h_i^k = \frac{1}{\alpha + s_i^k } \forall 1 \leq k \leq c \\ + d_i = \frac{1}{\alpha + t_i} +\end{gathered}$$ + +The $h$ helper columns can be batched together to save columns. We can batch at most $\texttt{constraint\_degree} - 1$ helper functions together. In our case, we batch them 2 by 2. At row $i$, we now have: +$$\begin{aligned} + h_i^k = \frac{1}{\alpha + s_i^{2k}} + \frac{1}{\alpha + s_i^{2k+1}} \forall 1 \leq k \leq c/2 \\ +\end{aligned}$$ + +If $c$ is odd, then we have one extra helper column: +$$h_i^{c/2+1} = \frac{1}{\alpha + s_i^{c}}$$ + +For clarity, we will assume that $c$ is even in what follows. + +Let $g$ be a generator of a subgroup of order $n$. We extrapolate $h, m$ and $d$ to get polynomials such that, for $f \in \{h^k, m, g\}$: $f(g^i) = f_i$. + +We can define the following polynomial: +$$Z(x) := \sum_{i=1}^n \big[\sum_{k=1}^{c/2} h^k(x) - m(x) * d(x)\big]$$ + +### Constraints + +With these definitions and a challenge $\alpha$, we can finally check that the assertion holds with the following constraints: +$$\begin{gathered} + Z(1) = 0 \\ + Z(g \alpha) = Z(\alpha) + \sum_{k=1}^{c/2} h^k(\alpha) - m(\alpha) d(\alpha) +\end{gathered}$$ + +These ensure that We also need to ensure that $h^k$ is well constructed for all $1 \leq k \leq c/2$: + +$$h(\alpha)^k \cdot (\alpha + s_{2k}) \cdot (\alpha + s_{2k+1}) = (\alpha + s_{2k}) + (\alpha + s_{2k+1})$$ + +Note: if $c$ is odd, we have one unbatched helper column $h^{c/2+1}$ for which we need a last constraint: + +$$h(\alpha)^{c/2+1} \cdot (\alpha + s_{c}) = 1$$ + +Finally, the verifier needs to ensure that the table $t$ was also correctly computed. In each STARK, $t$ is computed starting from 0 and adding at most 1 at each row. This construction is constrained as follows: + +1. $t(1) = 0$ + +2. $(t(g^{i+1}) - t(g^{i})) \cdot ((t(g^{i+1}) - t(g^{i})) - 1) = 0$ + +3. $t(g^{n-1}) = 2^{16} - 1$ \ No newline at end of file diff --git a/book/src/intro.md b/book/src/intro.md new file mode 100644 index 000000000..e10b99d01 --- /dev/null +++ b/book/src/intro.md @@ -0,0 +1 @@ +# Introduction diff --git a/book/src/mpt/encoding_hashing.md b/book/src/mpt/encoding_hashing.md new file mode 100644 index 000000000..8fa10704b --- /dev/null +++ b/book/src/mpt/encoding_hashing.md @@ -0,0 +1,46 @@ +## Encoding and Hashing + +Encoding is done recursively starting from the trie root. Leaf, branch +and extension nodes are encoded as the RLP encoding of list containing +the hex prefix encoding of the node key as well as + +- Leaf Node: the encoding of the the payload, + +- Branch Node: the hash or encoding of the 16 children and the encoding of the payload, + +- Extension Node: the hash or encoding of the child and the encoding of the payload. + +For the rest of the nodes we have: + +- Empty Node: the encoding of an empty node is `0x80`, + +- Digest Node: the encoding of a digest node stored as $({\tt MPT\_HASH\_NODE}, d)$ is $d$. + +The payloads in turn are RLP encoded as follows + +- State Trie: Encoded as a list containing nonce, balance, storage trie hash and code hash. + +- Storage Trie: The RLP encoding of the value (thus the double RLP encoding) + +- Transaction Trie: The RLP encoded transaction. +- Receipt Trie: Depending on the transaction type, it is encoded as + ${\sf RLP}({\sf RLP}({\tt receipt}))$ for Legacy transactions or + ${\sf RLP}({\tt txn\_type}||{\sf RLP}({\tt receipt}))$ for + transactions of type 1 or 2. Each receipt is encoded as a list + containing: + + 1. the status, + + 2. the cumulative gas used, + + 3. the bloom filter, stored as a list of length 256. + + 4. the list of topics + + 5. the data string. + +Once a node is encoded it is written to the `Segment::RlpRaw` segment as +a sequence of bytes. Then the RLP encoded data is hashed if the length +of the data is more than 32 bytes. Otherwise we return the encoding. +Further details can be found in the [mpt hash +module](https://github.com/0xPolygonZero/plonky2/tree/main/evm/src/cpu/mpt/hash). diff --git a/book/src/mpt/intro.md b/book/src/mpt/intro.md new file mode 100644 index 000000000..1bb416531 --- /dev/null +++ b/book/src/mpt/intro.md @@ -0,0 +1,30 @@ +# Merkle Patricia Tries {#tries} + +The *EVM World state* is a representation of the different accounts at a +particular time, as well as the last processed transactions together +with their receipts. The world state is represented using *Merkle +Patricia Tries* (MPTs) [@@yellowpaper App. D], and there are three +different tries: the state trie, the transaction trie and the receipt +trie. + +For each transaction we need to show that the prover knows preimages of +the hashed initial and final EVM states. When the kernel starts +execution, it stores these three tries within the `Segment::TrieData` +segment. The prover loads the initial tries from the inputs into memory. +Subsequently, the tries are modified during transaction execution, +inserting new nodes or deleting existing nodes. + +An MPT is composed of five different nodes: branch, extension, leaf, +empty and digest nodes. Branch and leaf nodes might contain a payload +whose format depends on the particular trie. The nodes are encoded, +primarily using RLP encoding and Hex-prefix encoding (see @@yellowpaper +App. B and C, respectively). The resulting encoding is then hashed, +following a strategy similar to that of normal Merkle trees, to generate +the trie hashes. + +Insertion and deletion is performed in the same way as other MPTs +implementations. The only difference is for inserting extension nodes +where we create a new node with the new data, instead of modifying the +existing one. In the rest of this section we describe how the MPTs are +represented in memory, how they are given as input, and how MPTs are +hashed. diff --git a/book/src/mpt/linked_lists.md b/book/src/mpt/linked_lists.md new file mode 100644 index 000000000..d5c8ed0ea --- /dev/null +++ b/book/src/mpt/linked_lists.md @@ -0,0 +1,88 @@ +## Linked lists + +Individual account information are contained in the state and the +storage MPTs. However, accessing and modifying MPT data requires heavy +trie traversal, insertion and deletion functions. To alleviate these +costs, during an execution run, we store all account information in +linked list structures and only modify the state trie at the end of the +run. + +Our linked list construction guarantees these properties: + +- A linked list is cyclic. The last element's successor is the first + element. + +- A linked list is always sorted by a certain index, which can be one + or more fields of an element. + +- The last element of a linked list is MAX, whose index is always + higher than any possible index value. + +- An index cannot appear twice in the linked list. + +These properties allows us to efficiently modify the list. + +#### Search + +To search a node given its index, we provide via `PROVER_INPUT` a +pointer to its predecessor $p$. We first check that $p$'s index is +strictly lower than the node index, if not, the provided pointer is +invalid. Then, we check $s$, $p$'s successor. If $s$'s index is equal to +the node index, we found the node. If $s$'s index is lower than the node +index, then the provided $p$ was invalid. If $s$'s index is greater than +the node index, then the node doesn't exist. + +#### Insertion + +To insert a node given its index, we provide via `PROVER_INPUT` a +pointer to its predecessor $p$. We first check that $p$'s index is +strictly lower than the node index, if not, the provided pointer is +invalid. Then, we check $s$, $p$'s successor, and make sure that $s$ is +strictly greater than the node index. We create a new node, and make it +$p$'s successor; then we make $s$ the new node's successor. + +#### Deletion + +To delete a node given its index, we provide via `PROVER_INPUT` a +pointer to its predecessor $p$. We check that $p$'s successor is equal +to the node index; if not either $p$ is invalid or the node doesn't +exist. Then we set $p$'s successor to the node's successor. To indicate +that the node is now deleted and to make sure that it's never accessed +again, we set its next pointer to MAX. + +We maintain two linked lists: one for the state accounts and one for the +storage slots. + +### Account linked list + +An account node is made of four memory cells: + +- The account key (the hash of the account address). This is the index + of the node. + +- A pointer to the account payload, in segment `@TrieData`. + +- A pointer to the initial account payload, in segment `@TrieData`. + This is the value of the account at the beginning of the execution, + before processing any transaction. This payload never changes. + +- A pointer to the next node (which points to the next node's account + key). + +### Storage linked list + +A storage node is made of five memory cells: + +- The account key (the hash of the account address). + +- The slot key (the hash of the slot). Nodes are indexed by + `(account_key, slot_key)`. + +- The slot value. + +- The initial slot value. This is the value of the account at the + beginning of the execution, before processing any transaction. It + never changes. + +- A pointer to the next node (which points to the next node's account + key). diff --git a/book/src/mpt/memory_format.md b/book/src/mpt/memory_format.md new file mode 100644 index 000000000..419d2f73a --- /dev/null +++ b/book/src/mpt/memory_format.md @@ -0,0 +1,68 @@ +## Internal memory format + +The tries are stored in kernel memory, specifically in the +`Segment:TrieData` segment. Each node type is stored as + +1. An empty node is encoded as $(\texttt{MPT\_NODE\_EMPTY})$. + +2. A branch node is encoded as + $(\texttt{MPT\_NODE\_BRANCH}, c_1, \dots, c_{16}, v)$, where each + $c_i$ is a pointer to a child node, and $v$ is a pointer to a value. + If a branch node has no associated value, then $v = 0$, i.e. the + null pointer. + +3. An extension node is encoded as + $(\texttt{MPT\_NODE\_EXTENSION}, k, c)$, $k$ represents the part of + the key associated with this extension, and is encoded as a 2-tuple + $(\texttt{packed\_nibbles}, \texttt{num\_nibbles})$. $c$ is a + pointer to a child node. + +4. A leaf node is encoded as $(\texttt{MPT\_NODE\_LEAF}, k, v)$, where + $k$ is a 2-tuple as above, and $v$ is a pointer to a value. + +5. A digest node is encoded as $(\texttt{MPT\_NODE\_HASH}, d)$, where + $d$ is a Keccak256 digest. + +On the other hand the values or payloads are represented differently +depending on the particular trie. + +### State trie + +The state trie payload contains the account data. Each account is stored +in 4 contiguous memory addresses containing + +1. the nonce, + +2. the balance, + +3. a pointer to the account's storage trie, + +4. a hash of the account's code. + +The storage trie payload in turn is a single word. + +### Transaction Trie + +The transaction trie nodes contain the length of the RLP encoded +transaction, followed by the bytes of the RLP encoding of the +transaction. + +### Receipt Trie + +The payload of the receipts trie is a receipt. Each receipt is stored as + +1. the length in words of the payload, + +2. the status, + +3. the cumulative gas used, + +4. the bloom filter, stored as 256 words. + +5. the number of topics, + +6. the topics + +7. the data length, + +8. the data. \ No newline at end of file diff --git a/book/src/mpt/prover_input_format.md b/book/src/mpt/prover_input_format.md new file mode 100644 index 000000000..6b85ae30e --- /dev/null +++ b/book/src/mpt/prover_input_format.md @@ -0,0 +1,33 @@ +## Prover input format + +The initial state of each trie is given by the prover as a +nondeterministic input tape. This tape has a slightly different format: + +1. An empty node is encoded as $(\texttt{MPT\_NODE\_EMPTY})$. + +2. A branch node is encoded as + $(\texttt{MPT\_NODE\_BRANCH}, v_?, c_1, \dots, c_{16})$. Here $v_?$ + consists of a flag indicating whether a value is present, followed + by the actual value payload if one is present. Each $c_i$ is the + encoding of a child node. + +3. An extension node is encoded as + $(\texttt{MPT\_NODE\_EXTENSION}, k, c)$, where $k$ represents the + part of the key associated with this extension, and is encoded as a + 2-tuple $(\texttt{packed\_nibbles}, \texttt{num\_nibbles})$. $c$ is + a pointer to a child node. + +4. A leaf node is encoded as $(\texttt{MPT\_NODE\_LEAF}, k, v)$, where + $k$ is a 2-tuple as above, and $v$ is a value payload. + +5. A digest node is encoded as $(\texttt{MPT\_NODE\_HASH}, d)$, where + $d$ is a Keccak256 digest. + +Nodes are thus given in depth-first order, enabling natural recursive +methods for encoding and decoding this format. The payload of state and +receipt tries is given in the natural sequential way. The transaction an +receipt payloads contain variable size data, thus the input is slightly +different. The prover input for for the transactions is the transaction +RLP encoding preceded by its length. For the receipts is in the natural +sequential way, except that topics and data are preceded by their +lengths, respectively. diff --git a/book/src/tables/arithmetic.md b/book/src/tables/arithmetic.md new file mode 100644 index 000000000..48e2add02 --- /dev/null +++ b/book/src/tables/arithmetic.md @@ -0,0 +1,128 @@ +## Arithmetic + +Each row of the arithmetic table corresponds to a binary or ternary +arithmetic operation. Each of these operations has an associated flag +$f_{op}$ in the table, such that $f_{\texttt{op}} = 1$ whenever the +operation is $\texttt{op}$ and 0 otherwise. The full list of operations +carried out by the table is as follows: + +#### Binary operations + +- basic operations: "add", "mul", "sub" and "div", + +- comparisons: "lt" and "gt", + +- shifts: "shr" and "shl", + +- "byte": given $x_1, x_2$, returns the $x_1$-th "byte" in $x_2$, + +- modular operations: "mod", "AddFp254", "MulFp254" and "SubFp254", + +- range-check: no operation is performed, as this is only used to + range-check the input and output limbs in the range + \[$0, 2^{16} - 1$\]. + +For 'mod', the second input is the modulus. "AddFp254", "MulFp254" and +"SubFp254" are modular operations modulo "Fp254'' -- the prime for the +BN curve's base field. + +#### Ternary operations + +There are three ternary operations: modular addition "AddMod", modular +multiplication "MulMod" and modular subtraction "SubMod". + +Besides the flags, the arithmetic table needs to store the inputs, +output and some auxiliary values necessary to constraints. The input and +output values are range-checked to ensure their canonical +representation. Inputs are 256-bits words. To avoid having too large a +range-check, inputs are therefore split into sixteen 16-bits limbs, and +range-checked in the range $[0, 2^{16}-1]$. + +Overall, the table comprises the following columns: + +- 17 columns for the operation flags $f_{op}$, + +- 1 column $op$ containing the opcode, + +- 16 columns for the 16-bit limbs $x_{0, i}$ of the first input + $x_{0}$, + +- 16 columns for the 16-bit limbs $x_{1, i}$ of the second input + $x_{1}$, + +- 16 columns for the 16-bit limbs $x_{2, i}$ of the third input + $x_{2}$, + +- 16 columns for the 16-bit limbs $r_i$ of the output $r$, + +- 32 columns for auxiliary values $\texttt{aux}_i$, + +- 1 column $\texttt{range\_counter}$ containing values in the range + \[$0, 2^{16}-1$\], for the range-check, + +- 1 column storing the frequency of appearance of each value in the + range $[0, 2^{16} - 1]$. + +#### Note on $op$ + +The opcode column is only used for range-checks. For optimization +purposes, we check all arithmetic operations against the cpu table +together. To ensure correctness, we also check that the operation's +opcode corresponds to its behavior. But range-check is not associated to +a unique operation: any operation in the cpu table might require its +values to be checked. Thus, the arithmetic table cannot know its opcode +in advance: it needs to store the value provided by the cpu table. + +### Auxiliary columns + +The way auxiliary values are leveraged to efficiently check correctness +is not trivial, but it is explained in detail in each dedicated file. +Overall, five files explain the implementations of the various checks. +Refer to: + +1. "mul.rs" for details on multiplications. + +2. "addcy.rs" for details on addition, subtraction, "lt" and "gt". + +3. "modular.rs" for details on how modular operations are checked. Note + that even though "div" and "mod" are generated and checked in a + separate file, they leverage the logic for modular operations + described in "modular.rs". + +4. "byte" for details on how "byte" is checked. + +5. "shift.rs" for details on how shifts are checked. + +#### Note on "lt" and "gt" + +For "lt" and "gt", auxiliary columns hold the difference $d$ between the +two inputs $x_1, x_2$. We can then treat them similarly to subtractions +by ensuring that $x_1 - x_2 = d$ for "lt" and $x_2 - x_1 = d$ for "gt". +An auxiliary column $cy$ is used for the carry in additions and +subtractions. In the comparisons case, it holds the overflow flag. +Contrary to subtractions, the output of "lt" and "gt" operations is not +$d$ but $cy$. + +#### Note on "div" + +It might be unclear why "div" and "mod" are dealt with in the same file. + +Given numerator and denominator $n, d$, we compute, like for other +modular operations, the quotient $q$ and remainder $\texttt{rem}$: +$$div(x_1, x_2) = q * x_2 + \texttt{rem}$$. We then set the associated +auxiliary columns to $\texttt{rem}$ and the output to $q$. + +This is why "div" is essentially a modulo operation, and can be +addressed in almost the same way as "mod". The only difference is that +in the "mod" case, the output is $\texttt{rem}$ and the auxiliary value +is $q$. + +#### Note on shifts + +"shr" and "shl" are internally constrained as "div" and "mul" +respectively with shifted operands. Indeed, given inputs $s, x$, the +output should be $x >> s$ for "shr" (resp. $x << s$ for "shl"). Since +shifts are binary operations, we can use the third input columns to +store $s_{\texttt{shifted}} = 1 << s$. Then, we can use the "div" logic +(resp. "mul" logic) to ensure that the output is +$\frac{x}{s_{\texttt{shifted}}}$ (resp. $x * s_{\texttt{shifted}}$). \ No newline at end of file diff --git a/book/src/tables/byte_packing.md b/book/src/tables/byte_packing.md new file mode 100644 index 000000000..54808dd30 --- /dev/null +++ b/book/src/tables/byte_packing.md @@ -0,0 +1,99 @@ +## Byte Packing + +The BytePacking STARK module is used for reading and writing non-empty +byte sequences of length at most 32 to memory. The \"packing\" term +highlights that reading a sequence in memory will pack the bytes into an +EVM word (i.e. U256), while the \"unpacking\" operation consists in +breaking down an EVM word into its byte sequence and writing it to +memory. + +This allows faster memory copies between two memory locations, as well +as faster memory reset (see [memcpy.asm](https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/kernel/asm/memory/memcpy.asm) and [memset.asm](https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/kernel/asm/memory/memset.asm) modules). + +The 'BytePackingStark' table has one row per packing/unpacking +operation. + +Each row contains the following columns: + +1. 5 columns containing information on the initial memory address from + which the sequence starts (namely a flag differentiating read and + write operations, address context, segment and offset values, as + well as timestamp), + +2. 32 columns $b_i$ indicating the length of the byte sequence + ($b_i = 1$ if the length is $i+1$, and $b_i = 0$ otherwise), + +3. 32 columns $v_i$ indicating the values of the bytes that have been + read or written during a sequence, + +4. 2 columns $r_i$ needed for range-checking the byte values. + +#### Notes on columns generation + +Whenever a byte unpacking operation is called, the value $\texttt{val}$ +is read from the stack, but because the EVM and the STARKs use different +endianness, we need to convert $\texttt{val}$ to a little-endian byte +sequence. Only then do we resize it to the appropriate length, and prune +extra zeros and higher bytes in the process. Finally, we reverse the +byte order and write this new sequence into the $v_i$ columns of the +table. + +Whenever the operation is a byte packing, the bytes are read one by one +from memory and stored in the $v_i$ columns of the BytePackingStark +table. + +Note that because of the different endianness on the memory and EVM +sides, we write bytes starting with the last one. + +The $b_i$ columns hold a boolean value. $b_i = 1$ whenever we are +currently reading or writing the i-th element in the byte sequence. +$b_i = 0$ otherwise. + +#### Cross-table lookups + +The read or written bytes need to be checked against both the cpu and +the memory tables. Whenever we call $\texttt{MSTORE\_32BYTES}$, +$\texttt{MLOAD\_32BYTES}$ or $\texttt{PUSH}$ on the cpu side, we make +use of 'BytePackingStark' to make sure we are carrying out the correct +operation on the correct values. For this, we check that the following +values correspond: + +1. the address (comprising the context, the segment, and the virtual + address), + +2. the length of the byte sequence, + +3. the timestamp, + +4. the value (either written to or read from the stack) + +The address here corresponds to the address of the first byte. + +On the other hand, we need to make sure that the read and write +operations correspond to the values read or stored on the memory side. +We therefore need a CTL for each byte, checking that the following +values are identical in 'MemoryStark' and 'BytePackingStark': + +1. a flag indicating whether the operation is a read or a write, + +2. the address (context, segment and virtual address), + +3. the byte (followed by 0s to make sure the memory address contains a + byte and not a U256 word), + +4. the timestamp + +Note that the virtual address has to be recomputed based on the length +of the sequence of bytes. The virtual address for the $i$-th byte is +written as: $$\texttt{virt} + \sum_{j=0}^{31} b_j * j - i$$ where +$\sum_{j=0}^{31} b_j * j$ is equal to $\texttt{sequence\_length} - 1$. + +#### Note on range-check + +Range-checking is necessary whenever we do a memory unpacking operation +that will write values to memory. These values are constrained by the +range-check to be 8-bit values, i.e. fitting between 0 and 255 included. +While range-checking values read from memory is not necessary, because +we use the same $\texttt{byte\_values}$ columns for both read and write +operations, this extra condition is enforced throughout the whole trace +regardless of the operation type. diff --git a/book/src/tables/cpu.md b/book/src/tables/cpu.md new file mode 100644 index 000000000..f0c2117f9 --- /dev/null +++ b/book/src/tables/cpu.md @@ -0,0 +1,177 @@ +## CPU + +The CPU is the central component of the zkEVM. Like any CPU, it reads +instructions, executes them and modifies the state (registers and the +memory) accordingly. The constraining of some complex instructions (e.g. +Keccak hashing) is delegated to other tables. This section will only +briefly present the CPU and its columns. Details about the CPU logic +will be provided later. + +### CPU flow + +An execution run can be decomposed into two distinct parts: + +- **CPU cycles:** The bulk of the execution. In each row, the CPU + reads the current code at the program counter (PC) address, and + executes it. The current code can be the kernel code, or whichever + code is being executed in the current context (transaction code or + contract code). Executing an instruction consists in modifying the + registers, possibly performing some memory operations, and updating + the PC. + +- **Padding:** At the end of the execution, we need to pad the length + of the CPU trace to the next power of two. When the program counter + reaches the special halting label in the kernel, execution halts. + Constraints ensure that every subsequent row is a padding row and + that execution cannot resume. + +In the CPU cycles phase, the CPU can switch between different contexts, +which correspond to the different environments of the possible calls. +Context 0 is the kernel itself, which handles initialization (input +processing, transaction parsing, transaction trie updating\...) and +termination (receipt creation, final trie checks\...) before and after +executing the transaction. Subsequent contexts are created when +executing user code (transaction or contract code). In a non-zero user +context, syscalls may be executed, which are specific instructions +written in the kernel. They don't change the context but change the code +context, which is where the instructions are read from. + +#### Continuations + +A full run of the zkEVM consists in initializing the zkEVM with the +input state, executing a certain number of transactions, and then +validating the output state. However, for performance reasons, a run is +split in multiple segments of at most `MAX_CPU_CYCLES` cycles, which can +be proven individually. Continuations ensure that the segments are part +of the same run and guarantees that the state at the end of a segment is +equal to the state at the beginning of the next. + +The state to propagate from one segment to another contains some of the +zkEVM registers plus the current memory. These registers are stored in +memory as dedicated global metadata, and the memory to propagate is +stored in two STARK tables: `MemBefore` and `MemAfter`. To check the +consistency of the memory, the Merkle cap of the previous `MemAfter` is +compared to the Merkle cap of the next `MemBefore`. + +### CPU columns + +#### Registers + +- `context`: Indicates which context we are in. 0 for the kernel, and + a positive integer for every user context. Incremented by 1 at every + call. + +- `code_context`: Indicates in which context the code to execute + resides. It's equal to `context` in user mode, but is always 0 in + kernel mode. + +- `program_counter`: The address of the instruction to be read and + executed. + +- `stack_len`: The current length of the stack. + +- `is_kernel_mode`: Boolean indicating whether we are in kernel (i.e. + privileged) mode. This means we are executing kernel code, and we + have access to privileged instructions. + +- `gas`: The current amount of gas used in the current context. It is + eventually checked to be below the current gas limit. Must fit in 32 + bits. + +- `clock`: Monotonic counter which starts at 0 and is incremented by 1 + at each row. Used to enforce correct ordering of memory accesses. + +- `opcode_bits`: 8 boolean columns, which are the bit decomposition of + the opcode being read at the current PC. + +#### Operation flags + +Boolean flags. During CPU cycles phase, each row executes a single +instruction, which sets one and only one operation flag. No flag is set +during padding. The decoding constraints ensure that the flag set +corresponds to the opcode being read. There isn't a 1-to-1 +correspondence between instructions and flags. For efficiency, the same +flag can be set by different, unrelated instructions (e.g. `eq_iszero`, +which represents the `EQ` and the `ISZERO` instructions). When there is +a need to differentiate them in constraints, we filter them with their +respective opcode: since the first bit of `EQ`'s opcode (resp. +`ISZERO`'s opcode) is 0 (resp. 1), we can filter a constraint for an EQ +instruction with `eq_iszero * (1 - opcode_bits[0])` (resp. +`eq_iszero * opcode_bits[0]`). + +#### Memory columns + +The CPU interacts with the EVM memory via its memory channels. At each +row, a memory channel can execute a write, a read, or be disabled. A +full memory channel is composed of: + +- `used`: Boolean flag. If it's set to 1, a memory operation is + executed in this channel at this row. If it's set to 0, no operation + is done but its columns might be reused for other purposes. + +- `is_read`: Boolean flag indicating if a memory operation is a read + or a write. + +- 3 `address` columns. A memory address is made of three parts: + `context`, `segment` and `virtual`. + +- 8 `value` columns. EVM words are 256 bits long, and they are broken + down in 8 32-bit limbs. + +The last memory channel is a partial channel: it doesn't have its own +`value` columns and shares them with the first full memory channel. This +allows us to save eight columns. + +#### General columns + +There are 8 shared general columns. Depending on the instruction, they +are used differently: + +- `Exceptions`: When raising an exception, the first three general + columns are the bit decomposition of the exception code. They are + used to jump to the correct exception handler. + +- `Logic`: For EQ, and ISZERO operations, it's easy to check that the + result is 1 if `input0` and `input1` are equal. It's more difficult + to prove that, if the result is 0, the inputs are actually unequal. + To prove it, each general column contains the modular inverse of + $(\texttt{input0}_i - \texttt{input1}_i)$ for each limb $i$ (or 0 if + the limbs are equal). Then the quantity + $\texttt{general}_i * (\texttt{input0}_i - \texttt{input1}_i)$ will + be 1 if and only if $\texttt{general}_i$ is indeed the modular + inverse, which is only possible if the difference is non-zero. + +- `Jumps`: For jumps, we use the first two columns: `should_jump` and + `cond_sum_pinv`. `should_jump` conditions whether the EVM should + jump: it's 1 for a JUMP, and $\texttt{condition} \neq 0$ for a + JUMPI. To check if the condition is actually non-zero for a JUMPI, + `cond_sum_pinv` stores the modular inverse of `condition` (or 0 if + it's zero). + +- `Shift`: For shifts, the logic differs depending on whether the + displacement is lower than $2^{32}$, i.e. if it fits in a single + value limb. To check if this is not the case, we must check that at + least one of the seven high limbs is not zero. The general column + `high_limb_sum_inv` holds the modular inverse of the sum of the + seven high limbs, and is used to check it's non-zero like the + previous cases. Contrary to the logic operations, we do not need to + check limbs individually: each limb has been range-checked to 32 + bits, meaning that it's not possible for the sum to overflow and be + zero if some of the limbs are non-zero. + +- `Stack`: `stack_inv`, `stack_inv_aux` and `stack_inv_aux_2` are used + by popping-only (resp. pushing-only) instructions to check if the + stack is empty after (resp. was empty before) the instruction. + `stack_len_bounds_ aux` is used to check that the stack doesn't + overflow in user mode. We use the last four columns to prevent + conflicts with the other general columns. See + [stack handling](./../cpu_execution/stack_handling.md) for more details. + +- `Push`: `is_not_kernel` is used to skip range-checking the output of + a PUSH operation when we are in privileged mode, as the kernel code + is known and trusted. + +- `Context pruning`: When `SET_CONTEXT` is called to return to a + parent context, this makes the current context stale. The kernel + indicates it by setting one general column to 1. For more details + about context pruning, see [context-pruning](./memory.md#context-pruning). \ No newline at end of file diff --git a/book/src/tables/intro.md b/book/src/tables/intro.md new file mode 100644 index 000000000..afb1b4c41 --- /dev/null +++ b/book/src/tables/intro.md @@ -0,0 +1 @@ +# Tables diff --git a/book/src/tables/keccak.md b/book/src/tables/keccak.md new file mode 100644 index 000000000..706b1a23f --- /dev/null +++ b/book/src/tables/keccak.md @@ -0,0 +1,145 @@ +## Keccak-f + +This table computes the Keccak-f\[1600\] permutation. + +### Keccak-f Permutation + +To explain how this table is structured, we first need to detail how the +permutation is computed. [This +page](https://keccak.team/keccak_specs_summary.html) gives a pseudo-code +for the permutation. Our implementation differs slightly -- but remains +equivalent -- for optimization and constraint degree reasons. + +Let: + +- $S$ be the sponge width ($S=25$ in our case) + +- $\texttt{NUM\_ROUNDS}$ be the number of Keccak rounds + ($\texttt{NUM\_ROUNDS} = 24$) + +- $RC$ a vector of round constants of size $\texttt{NUM\_ROUNDS}$ + +- $I$ be the input of the permutation, comprised of $S$ 64-bit + elements + +The first step is to reshape $I$ into a $5 \times 5$ matrix. We +initialize the state $A$ of the sponge with $I$: +$$A[x, y] := I[x, y] \text{ } \forall x, y \in \{0..4\}$$ + +We store $A$ in the table, and subdivide each 64-bit element into two +32-bit limbs. Then, for each round $i$, we proceed as follows: + +1. First, we define $C[x] := \texttt{xor}_{i=0}^4 A[x, i]$. We store + $C$ as bits in the table. This is because we need to apply a + rotation on its elements' bits and carry out ` xor ` operations in + the next step. + +2. Then, we store a second vector $C'$ in bits, such that: + $$C'[x, z] = C[x, z] \texttt{ xor } C[x-1, z] \texttt{ xor } C[x+1, z-1]$$. + +3. We then need to store the updated value of $A$: + $$A'[x, y] = A[x, y] \texttt{ xor } C[x, y] \texttt{ xor } C'[x, y]$$ + Note that this is equivalent to the equation in the official + Keccak-f description: + $$A'[x, y] = A[x, y] \texttt{ xor } C[x-1, z] \texttt{ xor } C[x+1, z-1]$$. + +4. The previous three points correspond to the $\theta$ step in + Keccak-f. We can now move on to the $\rho$ and $\pi$ steps. These + steps are written as: + $$B[y, 2\times x + 3 \times y] := \texttt{rot}(A'[x, y], r[x, y])$$ + where $\texttt{rot(a, s)}$ is the bitwise cyclic shift operation, + and $r$ is the matrix of rotation offsets. We do not need to store + $B$: $B$'s bits are only a permutation of $A'$'s bits. + +5. The $\chi$ step updates the state once again, and we store the new + values: + $$A''[x, y] := B[x, y] \texttt{ xor } (\texttt{not }B[x+1, y] \texttt{ and } B[x+2, y])$$ + Because of the way we carry out constraints (as explained below), we + do not need to store the individual bits for $A''$: we only need the + 32-bit limbs. + +6. The final step, $\iota$, consists in updating the first element of + the state as follows: + $$A'''[0, 0] = A''[0, 0] \texttt{ xor } RC[i]$$ where + $$A'''[x, y] = A''[x, y] \forall (x, y) \neq (0, 0)$$ Since only the + first element is updated, we only need to store $A'''[0, 0]$ of this + updated state. The remaining elements are fetched from $A''$. + However, because of the bitwise $\texttt{xor}$ operation, we do need + columns for the bits of $A''[0, 0]$. + +Note that all permutation elements are 64-bit long. But they are stored +as 32-bit limbs so that we do not overflow the field. + +It is also important to note that all bitwise logic operations +($\texttt{ xor }$, $\texttt{ not }$ and $\texttt{ and}$) are checked in +this table. This is why we need to store the bits of most elements. The +logic table can only carry out eight 32-bit logic operations per row. +Thus, leveraging it here would drastically increase the number of logic +rows, and incur too much overhead in proving time. + +### Columns + +Using the notations from the previous section, we can now list the +columns in the table: + +1. $\texttt{NUM\_ROUND}S = 24$ columns $c_i$ to determine which round + is currently being computed. $c_i = 1$ when we are in the $i$-th + round, and 0 otherwise. These columns' purpose is to ensure that the + correct round constants are used at each round. + +2. $1$ column $t$ which stores the timestamp at which the Keccak + operation was called in the cpu. This column enables us to ensure + that inputs and outputs are consistent between the cpu, + keccak-sponge and keccak-f tables. + +3. $5 \times 5 \times 2 = 50$columns to store the elements of $A$. As a + reminder, each 64-bit element is divided into two 32-bit limbs, and + $A$ comprises $S = 25$ elements. + +4. $5 \times 64 = 320$ columns to store the bits of the vector $C$. + +5. $5 \times 64 = 320$ columns to store the bits of the vector $C'$. + +6. $5 \times 5 \times 64 = 1600$ columns to store the bits of $A'$. + +7. $5 \times 5 \times 2 = 50$ columns to store the 32-bit limbs of + $A''$. + +8. $64$ columns to store the bits of $A''[0, 0]$. + +9. $2$ columns to store the two limbs of $A'''[0, 0]$. + +In total, this table comprises 2,431 columns. + +### Constraints + +Some constraints checking that the elements are computed correctly are +not straightforward. Let us detail them here. + +First, it is important to highlight the fact that a $\texttt{xor}$ +between two elements is of degree 2. Indeed, for $x \texttt{ xor } y$, +the constraint is $x + y - 2 \times x \times y$, which is of degree 2. +This implies that a $\texttt{xor}$ between 3 elements is of degree 3, +which is the maximal constraint degree for our STARKs. + +We can check that +$C'[x, z] = C[x, z] \texttt{ xor } C[x - 1, z] \texttt{ xor } C[x + 1, z - 1]$. +However, we cannot directly check that +$C[x] = \texttt{xor}_{i=0}^4 A[x, i]$, as it would be a degree 5 +constraint. Instead, we use $C'$ for this constraint. We see that: +$$\texttt{xor}_{i=0}^4 A'[x, i, z] = C'[x, z]$$ This implies that the +difference $d = \sum_{i=0}^4 A'[x, i, z] - C'[x, z]$ is either 0, 2 or +4. We can therefore enforce the following degree 3 constraint instead: +$$d \times (d - 2) \times (d - 4) = 0$$ + +Additionally, we have to check that $A'$ is well constructed. We know +that $A'$ should be such that +$A'[x, y, z] = A[x, y, z] \texttt{ xor } C[x, z] \texttt{ xor } C'[x, z]$. +Since we do not have the bits of $A$ elements but the bits of $A'$ +elements, we check the equivalent degree 3 constraint: +$$A[x, y, z] = A'[x, y, z] \texttt{ xor } C[x, z] \texttt { xor } C'[x, z]$$ + +Finally, the constraints for the remaining elements, $A''$ and $A'''$ +are straightforward: $A''$ is a three-element bitwise $\texttt{xor}$ +where all bits involved are already storedn and $A'''[0, 0]$ is the +output of a simple bitwise $\texttt{xor}$ with a round constant. diff --git a/book/src/tables/keccak_sponge.md b/book/src/tables/keccak_sponge.md new file mode 100644 index 000000000..a93014a38 --- /dev/null +++ b/book/src/tables/keccak_sponge.md @@ -0,0 +1,125 @@ +## KeccakSponge {#keccak-sponge} + +This table computes the Keccak256 hash, a sponge-based hash built on top +of the Keccak-f\[1600\] permutation. An instance of KeccakSponge takes +as input a Memory address $a$, a length $l$, and computes the Keccak256 +digest of the memory segment starting at $a$ and of size $l$. An +instance can span many rows, each individual row being a single call to +the Keccak table. Note that all the read elements must be bytes; the +proof will be unverifiable if this is not the case. Following the Keccak +specifications, the input string is padded to the next multiple of 136 +bytes. Each row contains the following columns: + +- Read bytes: + + - 3 address columns: `context`, `segment` and the offset `virt` of + $a$. + + - `timestamp`: the timestamp which will be used for all memory + reads of this instance. + + - `already_absorbed_bytes`: keeps track of how many bytes have + been hashed in the current instance. At the end of an instance, + we should have absorbed $l$ bytes in total. + + - `KECCAK_RATE_BYTES` `block_bytes` columns: the bytes being + absorbed at this row. They are read from memory and will be + XORed to the rate part of the current state. + +- Input columns: + + - `KECCAK_RATE_U32S` `original_rate_u32s` columns: hold the rate + part of the state before XORing it with `block_bytes`. At the + beginning of an instance, they are initialized with 0. + + - `KECCAK_RATE_U32s` `xored_rate_u32s` columns: hold the original + rate XORed with `block_bytes`. + + - `KECCAK_CAPACITY_U32S` `original_capacity_u32s` columns: hold + the capacity part of the state before applying the Keccak + permutation. + +- Output columns: + + - `KECCAK_DIGEST_BYTES` `updated_digest_state_bytes columns`: the + beginning of the output state after applying the Keccak + permutation. At the last row of an instance, they hold the + computed hash. They are decomposed in bytes for endianness + reasons. + + - `KECCAK_WIDTH_MINUS_DIGEST_U32S` `partial_updated_state_u32s` + columns: the rest of the output state. They are discarded for + the final digest, but are used between instance rows. + +- Helper columns: + + - `is_full_input_block`: indicates if the current row has a full + input block, i.e. `block_bytes` contains only bytes read from + memory and no padding bytes. + + - `KECCAK_RATE_BYTES` `is_final_input_len` columns: in the final + row of an instance, indicate where the final read byte is. If + the $i$-th column is set to 1, it means that all bytes after the + $i$-th are padding bytes. In a full input block, all columns are + set to 0. + +For each instance, constraints ensure that: + +- at each row: + + - `is_full_input_block` and `is_final_input_len` columns are all + binary. + + - Only one column in `is_full_input_block` and + `is_final_input_len` is set to 1. + + - `xored_rate_u32s` is `original_rate_u32s` XOR `block_bytes`. + + - The CTL with Keccak ensures that + (`updated_digest_state_bytes columns`, + `partial_updated_state_u32s`) is the Keccak permutation output + of (`xored_rate_u32s`, `original_capacity_u32s`). + +- at the first row: + + - `original_rate_u32s` is all 0. + + - `already_absorbed_bytes` is 0. + +- at each full input row (i.e. `is_full_input_block` is 1, all + `is_final_input_len` columns are 0): + + - `context`, `segment`, `virt` and `timestamp` are unchanged in + the next row. + + - Next `already_absorbed_bytes` is current + `already_absorbed_bytes` + `KECCAK_RATE_BYTES`. + + - Next (`original_rate_u32s`, `original_capacity_u32s`) is current + (`updated_digest_state_bytes columns`, + `partial_updated_state_u32s`). + + - The CTL with Memory ensures that `block_bytes` is filled with + contiguous memory elements [$a$ + `already_absorbed_bytes`, + $a$ + `already_absorbed_bytes` + `KECCAK_RATE_BYTES` - 1] + +- at the final row (i.e. `is_full_input_block` is 0, + `is_final_input_len`'s $i$-th column is 1 for a certain $i$, the + rest are 0): + + - The CTL with Memory ensures that `block_bytes` is filled with + contiguous memory elements [$a$ + `already_absorbed_bytes`, + $a$ + `already_absorbed_bytes` + $i$ - 1]. The rest are padding + bytes. + + - The CTL with CPU ensures that `context`, `segment`, `virt` and + `timestamp` match the `KECCAK_GENERAL` call. + + - The CTL with CPU ensures that $l$ = `already_absorbed_bytes` + + $i$. + + - The CTL with CPU ensures that `updated_digest_state_bytes` is + the output of the `KECCAK_GENERAL` call. + +The trace is padded to the next power of two with dummy rows, whose +`is_full_input_block` and `is_final_input_len` columns are all 0. diff --git a/book/src/tables/logic.md b/book/src/tables/logic.md new file mode 100644 index 000000000..a392be8a0 --- /dev/null +++ b/book/src/tables/logic.md @@ -0,0 +1,32 @@ +## Logic + +Each row of the logic table corresponds to one bitwise logic operation: +either AND, OR or XOR. Each input for these operations is represented as +256 bits, while the output is stored as eight 32-bit limbs. + +Each row therefore contains the following columns: + +1. $f_{\texttt{and}}$, an "is and" flag, which should be 1 for an OR + operation and 0 otherwise, + +2. $f_{\texttt{or}}$, an "is or" flag, which should be 1 for an OR + operation and 0 otherwise, + +3. $f_{\texttt{xor}}$, an "is xor" flag, which should be 1 for a XOR + operation and 0 otherwise, + +4. 256 columns $x_{1, i}$ for the bits of the first input $x_1$, + +5. 256 columns $x_{2, i}$ for the bits of the second input $x_2$, + +6. 8 columns $r_i$ for the 32-bit limbs of the output $r$. + +Note that we need all three flags because we need to be able to +distinguish between an operation row and a padding row -- where all +flags are set to 0. + +The subdivision into bits is required for the two inputs as the table +carries out bitwise operations. The result, on the other hand, is +represented in 32-bit limbs since we do not need individual bits and can +therefore save the remaining 248 columns. Moreover, the output is +checked against the cpu, which stores values in the same way. diff --git a/book/src/tables/mem_continuations.md b/book/src/tables/mem_continuations.md new file mode 100644 index 000000000..7e7c56433 --- /dev/null +++ b/book/src/tables/mem_continuations.md @@ -0,0 +1,18 @@ +## MemBefore & MemAfter {#mem-continuations} + +The MemBefore (resp. MemAfter) table holds the content of the memory +before (resp. after) the execution of the current segment. For +consistency, the MemAfter trace of a segment must be identical to the +MemAfter trace of the next segment. Each row of these tables contains: + +1. $a$, the memory cell address, + +2. $v$, the initial value of the cell. + +The tables should be ordered by $(a, \tau)$. Since they only hold +values, there are no constraints between the rows. + +A CTL copies all of the MemBefore values in the memory trace as reads, +at timestamp $\tau = 0$. Another CTL copies the final values from memory +to MemAfter. For more details on which values are propagated, consult the +[Final Memory](./memory.md#final-memory) section. \ No newline at end of file diff --git a/book/src/tables/memory.md b/book/src/tables/memory.md new file mode 100644 index 000000000..f21f81c65 --- /dev/null +++ b/book/src/tables/memory.md @@ -0,0 +1,140 @@ +## Memory + +For simplicity, let's treat addresses and values as individual field +elements. The generalization to multi-element addresses and values is +straightforward. + +Each row of the memory table corresponds to a single memory operation (a +read or a write), and contains the following columns: + +1. $a$, the target address + +2. $r$, an "is read" flag, which should be 1 for a read or 0 for a + write + +3. $v$, the value being read or written + +4. $\tau$, the timestamp of the operation + +The memory table should be ordered by $(a, \tau)$. Note that the +correctness of the memory could be checked as follows: + +1. Verify the ordering by checking that + $(a_i, \tau_i) \leq (a_{i+1}, \tau_{i+1})$ for each consecutive + pair. + +2. Enumerate the purportedly-ordered log while tracking the "current" + value of $v$. + + 1. Upon observing an address which doesn't match that of the + previous row, if the address is zero-initialized and if the + operation is a read, check that $v = 0$. + + 2. Upon observing a write, don't constrain $v$. + + 3. Upon observing a read at timestamp $\tau_i$ which isn't the + first operation at this address, check that $v_i = v_{i-1}$. + +The ordering check is slightly involved since we are comparing multiple +columns. To facilitate this, we add an additional column $e$, where the +prover can indicate whether two consecutive addresses changed. An honest +prover will set $$e_i \leftarrow \begin{cases} + 1 & \text{if } a_i \neq a_{i + 1}, \\ + 0 & \text{otherwise}. +\end{cases}$$ We also introduce a range-check column $c$, which should +hold: $$c_i \leftarrow \begin{cases} + a_{i + 1} - a_i - 1 & \text{if } e_i = 1, \\ + \tau_{i+1} - \tau_i & \text{otherwise}. +\end{cases}$$ The extra $-1$ ensures that the address actually changed +if $e_i = 1$. We then impose the following transition constraints: + +1. $e_i (e_i - 1) = 0$, + +2. $(1 - e_i) (a_{i + 1} - a_i) = 0$, + +3. $c_i < 2^{32}$. + +The third constraint emulates a comparison between two addresses or +timestamps by bounding their difference; this assumes that all addresses +and timestamps fit in 32 bits and that the field is larger than that. + +### Virtual memory + +In the EVM, each contract call has its own address space. Within that +address space, there are separate segments for code, main memory, stack +memory, calldata, and returndata. Thus each address actually has three +components: + +1. an execution context, representing a contract call, + +2. a segment ID, used to separate code, main memory, and so forth, and + so on + +3. a virtual address. + +The comparisons now involve several columns, which requires some minor +adaptations to the technique described above; we will leave these as an +exercise to the reader. + +Note that an additional constraint check is required: whenever we change +the context or the segment, the virtual address must be range-checked to +$2^{32}$. Without this check, addresses could start at -1 (i.e. $p - 2$) +and then increase properly. + +### Timestamps + +Memory operations are sorted by address $a$ and timestamp $\tau$. For a +memory operation in the CPU, we have: +$$\tau = \texttt{NUM\_CHANNELS} \times \texttt{cycle} + \texttt{channel}.$$ +Since a memory channel can only hold at most one memory operation, every +CPU memory operation's timestamp is unique. + +Note that it doesn't mean that all memory operations have unique +timestamps. There are two exceptions: + +- Before the CPU cycles, we preinitialize the memory with the flashed + state stored in the MemBefore table and we write some global + metadata. These operations are done at timestamp $\tau = 0$. + +- Some tables other than CPU can generate memory operations, like + KeccakSponge. When this happens, these operations all have the + timestamp of the CPU row of the instruction which invoked the table + (for KeccakSponge, KECCAK_GENERAL). + +### Memory initialization + +By default, all memory is zero-initialized. However, to save numerous +writes, we allow some specific segments to be initialized with arbitrary +values. + +- The code segment (segment 0) is either part of the initial memory + for the kernel (context 0), or is initialized with + externally-provided account code, then checked against the account + code hash. In non-zero contexts, if the code is meant to be + executed, there is a soundness concern: if the code is malformed and + ends with an incomplete PUSH, then the missing bytes must be 0 + accordingly to the Ethereum specs. To prevent the issue, we manually + write 33 zeros (at most 32 bytes for the PUSH argument, and an extra + one for the post-PUSH PC value). + +- The "TrieData" segment is initialized with the input tries. The + stored tries are hashed and checked against the provided initial + hash. Note that the length of the segment and the pointers -- within + the "TrieData" segment -- for the three tries are provided as prover + inputs. The length is then checked against a value computed when + hashing the tries. + +### Final memory + +The final value of each cell of the memory must be propagated to the +MemAfter table. Since memory operations are ordered by address and by +timestamps, this is easy to do: the last value of an address is the +value of the last row touching this address. In other words, we +propagate values of rows before the address changes. + +#### Context pruning {#context-pruning} + +We can observe that whenever we return from a context (e.g. with a +RETURN opcode, from an exception\...), we will never access it again and +all its memory is now stale. We make use of this fact to prune stale +contexts and exclude them from MemAfter. diff --git a/docs/arithmetization/.gitignore b/docs/arithmetization/.gitignore deleted file mode 100644 index ba6d40079..000000000 --- a/docs/arithmetization/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -## Files generated by pdflatex, bibtex, etc. -*.aux -*.log -*.out -*.toc -*.bbl -*.blg diff --git a/docs/arithmetization/Makefile b/docs/arithmetization/Makefile deleted file mode 100644 index 979545288..000000000 --- a/docs/arithmetization/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -DOCNAME=zkevm - -all: pdf - -.PHONY: clean - -quick: - pdflatex $(DOCNAME).tex - -pdf: - pdflatex $(DOCNAME).tex - bibtex $(DOCNAME).aux - pdflatex $(DOCNAME).tex - pdflatex $(DOCNAME).tex - -view: pdf - open $(DOCNAME).pdf - -clean: - rm -f *.blg *.bbl *.aux *.log diff --git a/docs/arithmetization/cpulogic.tex b/docs/arithmetization/cpulogic.tex deleted file mode 100644 index b10f01169..000000000 --- a/docs/arithmetization/cpulogic.tex +++ /dev/null @@ -1,360 +0,0 @@ -\section{CPU logic} -\label{cpulogic} - -The CPU is in charge of coordinating the different STARKs, proving the correct execution of the instructions it reads and guaranteeing -that the final state of the EVM corresponds to the starting state after executing the input transactions. All design choices were made -to make sure these properties can be adequately translated into constraints of degree at most 3 while minimizing the size of the different -table traces (number of columns and number of rows). - -In this section, we will detail some of these choices. - -\subsection{Kernel} -The kernel is in charge of the proving logic. This section aims at providing a high level overview of this logic. For details about any specific part of the logic, one can consult the various ``asm'' files in the \href{https://github.com/0xPolygonZero/plonky2/tree/main/evm/src/cpu/kernel}{``kernel'' folder}. - -We prove a batch of transactions, split into segments. These proofs can later be aggregated recursively to prove a block. Proof aggregation is however not in the scope of this section. Here, we assume that we have an initial state of the EVM, and we wish to prove that a batch of contiguous transactions was correctly executed, leading to a correct update of the state. - -Since we process transactions and not entire blocks, a few intermediary values need to be provided by the prover. Indeed, to prove that the registers in the EVM state are correctly updated, we need to have access to their initial values. When aggregating proofs, we can also constrain those values to match from one batch to the next. Let us consider the example of the transaction number. Let $n$ be the number of transactions executed so far in the current block. If the current proof is not a dummy one (we are indeed executing a batch of transactions), then the transaction number should be updated: $n := n+k$ with $k$ the number of transactions in the batch. Otherwise, the number remains unchanged. We can easily constrain this update. When aggregating the previous transaction batch proof ($lhs$) with the current one ($rhs$), we also need to check that the output transaction number of $lhs$ is the same as the input transaction number of $rhs$. - -Those prover provided values are stored in memory prior to entering the kernel, and are used in the kernel to assert correct updates. The list of prover provided values necessary to the kernel is the following: -\begin{enumerate} - \item the number of the last transaction executed: $t_n$, - \item the gas used before executing the current transactions: $g\_u_0$, - \item the gas used after executing the current transactions: $g\_u_1$, - \item the state, transaction and receipts MPTs before executing the current transactions: $\texttt{tries}_0$, - \item the hash of all MPTs before executing the current transactions: $\texttt{digests}_0$, - \item the hash of all MPTs after executing the current transactions: $\texttt{digests}_1$, - \item the RLP encoding of the transactions. -\end{enumerate} - -\paragraph*{Segment handling:} -An execution run is split into one or more segments. To ensure continuity, the first cycles of a segment are used to "load" segment data from the previous segment, and the last cycles to -"save" segment data for the next segment. The number of CPU cycles of a segment is bounded by \texttt{MAX\_CPU\_CYCLES}, which can be tweaked for best performance. The segment data values are: -\begin{itemize} - \item the stack length, - \item the stack top, - \item the context, - \item the \texttt{is\_kernel} flag, - \item the gas used, - \item the program counter. -\end{itemize} -These values are stored as global metadata, and are loaded from (resp. written to) memory at the beginning (resp. at the end) of a segment. They are propagated -between proofs as public values. - -The initial memory of the first segment is fixed and contains: -\begin{itemize} - \item the kernel code, - \item the shift table. -\end{itemize} - -\paragraph*{Initialization:} The first step of a run consists in initializing: -\begin{itemize} - \item The initial transaction and receipt tries $\texttt{tries}_0$ are loaded from memory. The transaction and the receipt tries are hashed and the hashes are then compared to $\texttt{digests}\_0$. -For efficiency, the initial state trie will be hashed for verification at the end of the run. - \item We load the transaction number $t\_n$ and the current gas used $g\_u_0$ from memory. -\end{itemize} - -We start processing the transactions (if any) sequentially, provided in RLP encoded format. - -The processing of the transaction returns a boolean ``success'' that indicates whether the transaction was executed successfully, along with the leftover gas. - -The following step is then to update the receipts MPT. Here, we update the transaction's bloom filter. We store ``success'', the leftover gas, the transaction bloom filter and the logs in memory. We also store some additional information that facilitates the RLP encoding of the receipts later. - -If there are any withdrawals, they are performed at this stage. - -Finally, once the three MPTs have been updated, we need to carry out final checks: -\begin{itemize} - \item the gas used after the execution is equal to $g\_u_1$, - \item the new transaction number is $n + k$ with $k$ the number of processed transactions, - \item the initial state MPT is hashed and checked against $\texttt{digests}_0$. - \item the initial state MPT is updated to reflect the processed transactions, then the three final MPTs are hashed and checked against $\texttt{digests}_1$. -\end{itemize} -Once those final checks are performed, the program halts. - -\subsection{Simple opcodes VS Syscalls} -For simplicity and efficiency, EVM opcodes are categorized into two groups: ``simple opcodes'' and ``syscalls''. Simple opcodes are generated directly in Rust, in \href{https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/witness/operation.rs}{operation.rs}. Every call to a simple opcode adds exactly one row to the \href{https://github.com/0xPolygonZero/plonky2/blob/main/evm/spec/tables/cpu.tex}{cpu table}. Syscalls are more complex structures written with simple opcodes, in the kernel. - -Whenever we encounter a syscall, we switch to kernel mode and execute its associated code. At the end of each syscall, we run EXIT\_KERNEL, which resets the kernel mode to its state right before the syscall. It also sets the PC to point to the opcode right after the syscall. - -Exceptions are handled differently for simple opcodes and syscalls. When necessary, simple opcodes throw an exception (see \ref{exceptions}). This activates the ``exception flag'' in the CPU and runs the exception operations. On the other hand, syscalls handle exceptions in the kernel directly. - -\subsection{Privileged instructions} - -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 2 elements (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[0xC0-0xDF.] \texttt{MSTORE\_32BYTES}. Pops 2 elements from the stack (a Memory address, and then a value), and pushes - a new address' onto the stack. The value is being decomposed into bytes and written to memory, starting from the fetched address. The new address being pushed is computed as the - initial address + the length of the byte sequence being written to memory. Note that similarly to PUSH (0x60-0x7F) instructions, there are 32 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[0xEE.] \texttt{PROVER\_INPUT}. Pushes a single prover input onto the stack. - - \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 2 elements from the stack (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 fetched. 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 pieces of information like the current program counter, the current amount of gas used, and whether we are in kernel (i.e. privileged) mode or not. - - \item[0xFB.] \texttt{MLOAD\_GENERAL}. Pops 1 elements (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 2 elements (a value and a Memory address), and writes the popped value from - the stack at the fetched address. It can write to any memory location, general (similarly to MSTORE (0x52) / MSTORE8 (0x53) instructions) or privileged. -\end{enumerate} - - -\subsection{Memory addresses} -\label{memoryaddresses} - -Kernel operations deal with memory addresses as single U256 elements. -However, when processing the operations to generate the proof witness, the CPU will decompose these into three components: - -\begin{itemize} - \item[context.] The context of the memory address. The Kernel context is special, and has value 0. - - \item[segment.] The segment of the memory address, corresponding to a specific section given a context (eg. MPT data, global metadata, etc.). - - \item[virtual.] The offset of the memory address, within a segment given a context. -\end{itemize} - -To easily retrieve these components, we scale them so that they can represent a memory address as: - -$$ \mathrm{addr} = 2^{64} \cdot \mathrm{context} + 2^{32} \cdot \mathrm{segment} + \mathrm{offset}$$ - -This allows to easily retrieve each component individually once a Memory address has been decomposed into 32-bit limbs. - - -\subsection{Stack handling} -\label{stackhandling} - -\subsubsection{Top of the stack} - -The majority of memory operations involve the stack. The stack is a segment in memory, and stack operations (popping or pushing) use the memory channels. -Every CPU instruction performs between 0 and 3 pops, and may push at most once. However, for efficiency purposes, we hold the top of the stack in -the first memory channel \texttt{current\_row.mem\_channels[0]}, only writing it in memory if necessary. - -\paragraph*{Motivation:} - -See \href{https://github.com/0xPolygonZero/plonky2/issues/1149}{this issue}. - -\paragraph*{Top reading and writing:} - -When a CPU instruction modifies the stack, it must update the top of the stack accordingly. There are three cases. - -\begin{itemize} - \item \textbf{The instruction pops and pushes:} The new top of the stack is stored in \texttt{next\_row.mem\_channels[0]}; it may be computed by the instruction, -or it could be read from memory. In either case, the instruction is responsible for setting \texttt{next\_row.mem\_channels[0]}'s flags and address columns correctly. -After use, the previous top of the stack is discarded and doesn't need to be written in memory. - \item \textbf{The instruction pushes, but doesn't pop:} The new top of the stack is stored in \texttt{next\_row.mem\_channels[0]}; it may be computed by the instruction, -or it could be read from memory. In either case, the instruction is responsible for setting \texttt{next\_row.mem\_channels[0]}'s flags and address columns correctly. -If the stack wasn't empty (\texttt{current\_row.stack\_len > 0}), the instruction performs a memory read in \texttt{current\_row.partial\_ channel}. \texttt{current\_row.partial\_channel} -shares its values with \texttt{current\_ row.mem\_channels[0]} (which holds the current top of the stack). If the stack was empty, \texttt{current\_row.partial\_channel} -is disabled. - \item \textbf{The instruction pops, but doesn't push:} After use, the current top of the stack is discarded and doesn't need to be written in memory. -If the stack isn't empty now (\texttt{current\_row.stack\_len > num\_pops}), the new top of the stack is set in \texttt{next\_row.mem\_channels[0]} -with a memory read from the stack segment. If the stack is now empty, \texttt{next\_row.mem\_channels[0]} is disabled. -\end{itemize} - -In the last two cases, there is an edge case if \texttt{current\_row.stack\_len} is equal to a \texttt{special\_len}. For a strictly pushing instruction, -this happens if the stack is empty, and \texttt{special\_len = 0}. For a strictly popping instruction, this happens if the next stack is empty, i.e. if -all remaining elements are popped, and \texttt{special\_len = num\_pops}. Note that we do not need to check for values below \texttt{num\_pops}, since this -would be a stack underflow exception which is handled separately. -The edge case is detected with the compound flag -$$\texttt{1 - not\_special\_len * stack\_inv\_aux,}$$ -where $$\texttt{not\_special\_len = current\_row - special\_len}$$ - - -and \texttt{stack\_inv\_aux} is constrained to be the modular inverse of \texttt{not\_special\_ len} if it's non-zero, or 0 otherwise. The flag is 1 -if \texttt{stack\_len} is equal to \texttt{special\_len}, and 0 otherwise. - -This logic can be found in code in the \texttt{eval\_packed\_one} function of \href{https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/stack.rs}{stack.rs}. -The function multiplies all of the stack constraints with the degree 1 filter associated with the current instruction. - -\paragraph*{Operation flag merging:} - -To reduce the total number of columns, many operation flags are merged together (e.g. \texttt{DUP} and \texttt{SWAP}) and are distinguished with the binary decomposition of their opcodes. -The filter for a merged operation is now of degree 2: for example, \texttt{is\_swap = dup\_swap * opcode\_bits[4]} since the 4th bit is set to 1 for a \texttt{SWAP} and 0 for a \texttt{DUP}. -If the two instructions have different stack behaviors, this can be a problem: \texttt{eval\_packed\_one}'s constraints are already of degree 3 and it can't support degree 2 filters. - -When this happens, stack constraints are defined manually in the operation's dedicated file (e.g. \texttt{dup\_swap.rs}). Implementation details vary case-by-case and can be found in the files. - -\subsubsection{Stack length checking} - -The CPU must make sure that the stack length never goes below zero and, in user mode, never grows beyond the maximum stack size. When this happens, an honest prover should trigger the -corresponding exception. If a malicious prover doesn't trigger the exception, constraints must fail the proof. - -\paragraph*{Stack underflow:} -There is no explicit constraint checking for stack underflow. An underflow happens when the CPU tries to pop the empty stack, which would perform a memory read at virtual address \texttt{-1}. -Such a read cannot succeed: in Memory, the range-check argument requires the gap between two consecutive addresses to be lower than the length of the Memory trace. Since the prime of the Plonky2 field is 64-bit long, -this would require a Memory trace longer than $2^{32}$. - -\paragraph*{Stack overflow:} -An instruction can only push at most once, meaning that an overflow occurs whenever the stack length is exactly one more than the maximum stack size ($1024+1$) in user mode. -To constrain this, the column \texttt{stack\_len\_bounds\_aux} contains: - -\begin{itemize} - \item[--] the modular inverse of \texttt{stack\_len - 1025} if we're in user mode and \texttt{stack\_len $\neq$ 1025}, - \item[--] 0 if \texttt{stack\_len = 1025} or if we're in kernel mode. -\end{itemize} -Then overflow can be checked with the flag -$$\texttt{(1 - is\_kernel\_mode) - stack\_len * stack\_len\_bounds\_aux}.$$ -The flag is 1 if \texttt{stack\_len = 1025} and we're in user mode, and 0 otherwise. - -Because \texttt{stack\_len\_bounds\_aux} is a shared general column, we only check this constraint after an instruction that can actually trigger an overflow, -i.e. a pushing, non-popping instruction. - -\subsection{Gas handling} - -\subsubsection{Out of gas errors} - -The CPU table has a ``gas'' register that keeps track of the gas used by the transaction so far. - -The crucial invariant in our out-of-gas checking method is that at any point in the program's execution, we have not used more gas than we have available; that is ``gas'' is at most the gas allocation for the transaction (which is stored separately by the kernel). We assume that the gas allocation will never be $2^{32}$ or more, so if ``gas'' does not fit in one limb, then we've run out of gas. - -When a native instruction (one that is not a syscall) is executed, a constraint ensures that the ``gas'' register is increased by the correct amount. This is not automatic for syscalls; the syscall handler itself must calculate and charge the appropriate amount. - -If everything goes smoothly and we have not run out of gas, ``gas'' should be no more than the gas allowance at the point that we STOP, REVERT, stack overflow, or whatever. Indeed, because we assume that the gas overflow handler is invoked \textit{as soon as} we've run out of gas, all these termination methods verify that $\texttt{gas} \leq \texttt{allowance}$, and jump to \texttt{exc\_out\_of\_gas} if this is not the case. This is also true for the out-of-gas handler, which checks that: -\begin{enumerate} - \item we have not yet run out of gas - \item we are about to run out of gas -\end{enumerate} -and ``PANIC'' if either of those statements does not hold. - -When we do run out of gas, however, this event must be handled. Syscalls are responsible for checking that their execution would not cause the transaction to run out of gas. If the syscall detects that it would need to charge more gas than available, it aborts the transaction (or the current code) by jumping to \texttt{fault\_exception}. In fact, \texttt{fault\_exception} is in charge of handling all exceptional halts in the kernel. - -Native instructions do this differently. If the prover notices that execution of the instruction would cause an out-of-gas error, it must jump to the appropriate handler instead of executing the instruction. (The handler contains special code that PANICs if the prover invoked it incorrectly.) - -\subsubsection{Overflow} - -We must be careful to ensure that ``gas'' does not overflow to prevent denial of service attacks. - -Note that a syscall cannot be the instruction that causes an overflow. This is because every syscall is required to verify that its execution does not cause us to exceed the gas limit. Upon entry into a syscall, a constraint verifies that $\texttt{gas} < 2^{32}$. Some syscalls may have to be careful to ensure that the gas check is performed correctly (for example, that overflow modulo $2^{256}$ does not occur). So we can assume that upon entry and exit out of a syscall, $\texttt{gas} < 2^{32}$. - -Similarly, native instructions alone cannot cause wraparound. The most expensive instruction, JUMPI, costs 10 gas. Even if we were to execute $2^{32}$ consecutive JUMPI instructions, the maximum length of a trace, we are nowhere close to consuming $2^{64} - 2^{32} + 1$ (= Goldilocks prime) gas. - -The final scenario we must tackle is an expensive syscall followed by many expensive native instructions. Upon exit from a syscall, $\texttt{gas} < 2^{32}$. Again, even if that syscall is followed by $2^{32}$ native instructions of cost 10, we do not see wraparound modulo Goldilocks. - - -\subsection{Exceptions} -\label{exceptions} - -Sometimes, when executing user code (i.e. contract or transaction code), the EVM halts exceptionally (i.e. outside of a STOP, a RETURN or a REVERT). -When this happens, the CPU table invokes a special instruction with a dedicated operation flag \texttt{exception}. -Exceptions can only happen in user mode; triggering an exception in kernel mode would make the proof unverifiable. -No matter the exception, the handling is the same: - --- The opcode which would trigger the exception is not executed. The operation flag set is \texttt{exception} instead of the opcode's flag. - --- We push a value to the stack which contains: the current program counter (to retrieve the faulty opcode), and the current value of \texttt{gas\_used}. -The program counter is then set to the corresponding exception handler in the kernel (e.g. \texttt{exc\_out\_of\_gas}). - --- The exception handler verifies that the given exception would indeed be triggered by the faulty opcode. If this is not the case (if the exception has already happened or if it doesn't happen after executing -the faulty opcode), then the kernel panics: there was an issue during witness generation. - --- The kernel consumes the remaining gas and returns from the current context with \texttt{success} set to 0 to indicate an execution failure. - -Here is the list of the possible exceptions: - -\begin{enumerate}[align=left] - \item[\textbf{Out of gas:}] Raised when a native instruction (i.e. not a syscall) in user mode pushes the amount of gas used over the current gas limit. -When this happens, the EVM jumps to \texttt{exc\_out\_of\_gas}. The kernel then checks that the consumed gas is currently below the gas limit, -and that adding the gas cost of the faulty instruction pushes it over it. -If the exception is not raised, the prover will panic when returning from the execution: the remaining gas is checked to be positive after STOP, RETURN or REVERT. - \item[\textbf{Invalid opcode:}] Raised when the read opcode is invalid. It means either that it doesn't exist, or that it's a privileged instruction and -thus not available in user mode. When this happens, the EVM jumps to \texttt{exc\_invalid\_opcode}. The kernel then checks that the given opcode is indeed invalid. -If the exception is not raised, decoding constraints ensure no operation flag is set to 1, which would make it a padding row. Halting constraints would then make the proof -unverifiable. - \item[\textbf{Stack underflow:}] Raised when an instruction which pops from the stack is called when the stack doesn't have enough elements. -When this happens, the EVM jumps to \texttt{exc\_stack\_overflow}. The kernel then checks that the current stack length is smaller than the minimum -stack length required by the faulty opcode. -If the exception is not raised, the popping memory operation's address offset would underflow, and the Memory range check would require the Memory trace to be too -large ($>2^{32}$). - \item[\textbf{Invalid JUMP destination:}] Raised when the program counter jumps to an invalid location (i.e. not a JUMPDEST). When this happens, the EVM jumps to -\texttt{exc\_invalid\_jump\_destination}. The kernel then checks that the opcode is a JUMP, and that the destination is not a JUMPDEST by checking the -JUMPDEST segment. -If the exception is not raised, jumping constraints will fail the proof. - \item[\textbf{Invalid JUMPI destination:}] Same as the above, for JUMPI. - \item[\textbf{Stack overflow:}] Raised when a pushing instruction in user mode pushes the stack over 1024. When this happens, the EVM jumps -to \texttt{exc\_stack\_overflow}. The kernel then checks that the current stack length is exactly equal to 1024 (since an instruction can only -push once at most), and that the faulty instruction is pushing. -If the exception is not raised, stack constraints ensure that a stack length of 1025 in user mode will fail the proof. -\end{enumerate} - -\subsection{Linked lists} - -Individual account information are contained in the state and the storage MPTs. However, accessing and modifying MPT data requires heavy trie -traversal, insertion and deletion functions. To alleviate these costs, during an execution run, we store all account information in linked list structures -and only modify the state trie at the end of the run. - -Our linked list construction guarantees these properties: -\begin{itemize} - \item A linked list is cyclic. The last element's successor is the first element. - \item A linked list is always sorted by a certain index, which can be one or more fields of an element. - \item The last element of a linked list is MAX, whose index is always higher than any possible index value. - \item An index cannot appear twice in the linked list. -\end{itemize} - -These properties allows us to efficiently modify the list. - -\paragraph*{Search} -To search a node given its index, we provide via \texttt{PROVER\_INPUT} a pointer to its predecessor $p$. We first check that $p$'s index is strictly lower than -the node index, if not, the provided pointer is invalid. Then, we check $s$, $p$'s successor. If $s$'s index is equal to the node index, we found the node. -If $s$'s index is lower than the node index, then the provided $p$ was invalid. If $s$'s index is greater than the node index, then the node doesn't exist. - -\paragraph*{Insertion} -To insert a node given its index, we provide via \texttt{PROVER\_INPUT} a pointer to its predecessor $p$. We first check that $p$'s index is strictly lower than -the node index, if not, the provided pointer is invalid. Then, we check $s$, $p$'s successor, and make sure that $s$ is strictly greater than the node index. -We create a new node, and make it $p$'s successor; then we make $s$ the new node's successor. - -\paragraph*{Deletion} -To delete a node given its index, we provide via \texttt{PROVER\_INPUT} a pointer to its predecessor $p$. We check that $p$'s successor is equal to the node index; if not -either $p$ is invalid or the node doesn't exist. Then we set $p$'s successor to the node's successor. To indicate that the node is now deleted and to make sure that it's -never accessed again, we set its next pointer to MAX. - -We maintain two linked lists: one for the state accounts and one for the storage slots. - -\subsubsection*{Account linked list} - -An account node is made of four memory cells: -\begin{itemize} - \item The account key (the hash of the account address). This is the index of the node. - \item A pointer to the account payload, in segment \texttt{@TrieData}. - \item A pointer to the initial account payload, in segment \texttt{@TrieData}. This is the value of the account at the beginning of the execution, before processing any transaction. This payload never changes. - \item A pointer to the next node (which points to the next node's account key). -\end{itemize} - -\subsubsection*{Storage linked list} - -A storage node is made of five memory cells: -\begin{itemize} - \item The account key (the hash of the account address). - \item The slot key (the hash of the slot). Nodes are indexed by \texttt{(account\_key, slot\_key)}. - \item The slot value. - \item The initial slot value. This is the value of the account at the beginning of the execution, before processing any transaction. It never changes. - \item A pointer to the next node (which points to the next node's account key). -\end{itemize} \ No newline at end of file diff --git a/docs/arithmetization/framework.tex b/docs/arithmetization/framework.tex deleted file mode 100644 index 0df427363..000000000 --- a/docs/arithmetization/framework.tex +++ /dev/null @@ -1,159 +0,0 @@ -\section{STARK framework} -\label{framework} - - -\subsection{Cost model} - -Our zkEVM is designed for efficient verification by STARKs \cite{stark}, particularly by an AIR with degree 3 constraints. In this model, the prover bottleneck is typically constructing Merkle trees, particularly constructing the tree containing low-degree extensions of witness polynomials. - - -\subsection{Field selection} -\label{field} -Our zkEVM is designed to have its execution traces encoded in a particular prime field $\mathbb{F}_p$, with $p = 2^{64} - 2^{32} + 1$. A nice property of this field is that it can represent the results of many common \texttt{u32} operations. For example, (widening) \texttt{u32} multiplication has a maximum value of $(2^{32} - 1)^2$, which is less than $p$. In fact a \texttt{u32} multiply-add has a maximum value of $p - 1$, so the result can be represented with a single field element, although if we were to add a carry in bit, this no longer holds. - -This field also enables a very efficient reduction method. Observe that -$$ -2^{64} \equiv 2^{32} - 1 \pmod p -$$ -and consequently -\begin{align*} - 2^{96} &\equiv 2^{32} (2^{32} - 1) \pmod p \\ - &\equiv 2^{64} - 2^{32} \pmod p \\ - &\equiv -1 \pmod p. -\end{align*} -To reduce a 128-bit number $n$, we first rewrite $n$ as $n_0 + 2^{64} n_1 + 2^{96} n_2$, where $n_0$ is 64 bits and $n_1, n_2$ are 32 bits each. Then -\begin{align*} - n &\equiv n_0 + 2^{64} n_1 + 2^{96} n_2 \pmod p \\ - &\equiv n_0 + (2^{32} - 1) n_1 - n_2 \pmod p -\end{align*} -After computing $(2^{32} - 1) n_1$, which can be done with a shift and subtraction, we add the first two terms, subtracting $p$ if overflow occurs. We then subtract $n_2$, adding $p$ if underflow occurs. - -At this point we have reduced $n$ to a \texttt{u64}. This partial reduction is adequate for most purposes, but if we needed the result in canonical form, we would perform a final conditional subtraction. - -\subsection{Cross-table lookups} -\label{ctl} -The various STARK tables carry out independent operations, but on shared values. We need to check that the shared values are identical in all the STARKs that require them. This is where cross-table lookups (CTLs) come in handy. - -Suppose STARK $S_1$ requires an operation -- say $Op$ -- that is carried out by another STARK $S_2$. Then $S_1$ writes the input and output of $Op$ in its own table, and provides the inputs to $S_2$. $S_2$ also writes the inputs and outputs in its rows, and the table's constraints check that $Op$ is carried out correctly. We then need to ensure that the inputs and outputs are the same in $S_1$ and $S_2$. - -In other words, we need to ensure that the rows -- reduced to the input and output columns -- of $S_1$ calling $Op$ are permutations of the rows of $S_2$ that carry out $Op$. Our CTL protocol is based on logUp and is similar to our range-checks. - -To prove this, the first step is to only select the rows of interest in $S_1$ and $S_2$, and filter out the rest. Let $f^1$ be the filter for $S_1$ and $f^2$ the filter for $S_2$. $f^1$ and $f^2$ are constrained to be in $\{0, 1\}$. $f^1 = 1$ (resp. $f^2 = 1$) whenever the row at hand carries out $Op$ in $S_1$ (resp. in $S_2$), and 0 otherwise. Let also $(\alpha, \beta)$ be two random challenges. - -The idea is to create subtables $S_1'$ and $S_2'$ of $S_1$ and $S_2$ respectively, such that $f^1 = 1$ and $f^2 = 1$ for all their rows. The columns in the subtables are limited to the ones whose values must be identical (the inputs and outputs of $Op$ in our example). - -Note that for design and constraint reasons, filters are limited to (at most) degree 2 combinations of columns. - -Let $\{c^{1, i}\}_{i=1}^m$ be the columns in $S_1'$ an $\{c^{2,i}\}_{i=1}^m$ be the columns in $S_2'$. - -The prover defines a ``running sum'' $Z$ for $S_1'$ such that: -\begin{gather*} - Z^{S_1}_{n-1} = \frac{1}{\sum_{j=0}^{m-1} \alpha^j \cdot c^{1, j}_{n-1} + \beta} \\ - Z^{S_1}_{i+1} = Z^{S_1}_i + f^1_i \cdot \frac{1}{\sum_{j=0}^{m-1} \alpha^j \cdot c^{1, j}_i + \beta} -\end{gather*} -The second equation ``selects'' the terms of interest thanks to $f^1$ and filters out the rest. - -Similarly, the prover constructs a running sum $Z^{S_2}$for $S_2$. Note that $Z$ is computed ``upside down'': we start with $Z_{n-1}$ and the final sum is in $Z_0$. - -On top of the constraints to check that the running sums were correctly constructed, the verifier checks that $Z^{S_1}_0 = Z^{S_2}_0$. -This ensures that the columns in $S_1'$ and the columns in $S_2'$ are permutations of each other. - -In other words, the CTL argument is a logUp lookup argument where $S_1'$ is the looking table, $S_2'$ is the looked table, and $S_1' = S_2'$ (all the multiplicities are 1). -For more details about logUp, see the next section. - -To sum up, for each STARK $S$, the prover: -\begin{enumerate} - \item constructs a running sum $Z_i^l$ for each table looking into $S$ (called looking sums here), - \item constructs a running sum $Z^S$ for $S$ (called looked sum here), - \item sends the final value for each running sum $Z_{i, 0}^l$ and $Z^S_0$ to the verifier, - \item sends a commitment to $Z_i^l$ and $Z^S$ to the verifier. -\end{enumerate} -Then, for each STARK $S$, the verifier: -\begin{enumerate} - \item computes the sum $Z = \sum_i Z_{i, 0}^l$, - \item checks that $Z = Z^S_0$, - \item checks that each $Z_i^l$ and $Z^S$ was correctly constructed. -\end{enumerate} - - -\subsection{Range-checks} -\label{rc} -In most cases, tables deal with U256 words, split into 32-bit limbs (to avoid overflowing the field). To prevent a malicious prover from cheating, it is crucial to range-check those limbs. -\subsubsection{What to range-check?} -One can note that every element that ever appears on the stack has been pushed. Therefore, enforcing a range-check on pushed elements is enough to range-check all elements on the stack. Similarly, all elements in memory must have been written prior, and therefore it is enough to range-check memory writes. However, range-checking the PUSH and MSTORE opcodes is not sufficient. -\begin{enumerate} - \item Pushes and memory writes for ``MSTORE\_32BYTES'' are range-checked in ``BytePackingStark'', except PUSH operations happening in privileged mode. See \ref{push_general_view}. - \item Syscalls, exceptions and prover inputs are range-checked in ``ArithmeticStark''. - \item The inputs and outputs of binary and ternary arithmetic operations are range-checked in ``ArithmeticStark''. - \item The inputs' bits of logic operations are checked to be either 1 or 0 in ``LogicStark''. Since ``LogicStark'' only deals with bitwise operations, this is enough to have range-checked outputs as well. - \item The inputs of Keccak operations are range-checked in ``KeccakStark''. The output digest is written as bytes in ``KeccakStark''. Those bytes are used to reconstruct the associated 32-bit limbs checked against the limbs in ``CpuStark''. This implicitly ensures that the output is range-checked. -\end{enumerate} -Note that some operations do not require a range-check: -\begin{enumerate} - \item ``MSTORE\_GENERAL'' read the value to write from the stack. Thus, the written value was already range-checked by a previous push. - \item ``EQ'' reads two -- already range-checked -- elements on the stack, and checks they are equal. The output is either 0 or 1, and does therefore not need to be checked. - \item ``NOT'' reads one -- already range-checked -- element. The result is constrained to be equal to $\texttt{0xFFFFFFFF} - \texttt{input}$, which implicitly enforces the range check. - \item ``PC'': the program counter cannot be greater than $2^{32}$ in user mode. Indeed, the user code cannot be longer than $2^{32}$, and jumps are constrained to be JUMPDESTs. Moreover, in kernel mode, every jump is towards a location within the kernel, and the kernel code is smaller than $2^{32}$. These two points implicitly enforce $PC$'s range check. - \item ``GET\_CONTEXT'', ``DUP'' and ``SWAP'' all read and push values that were already written in memory. The pushed values were therefore already range-checked. -\end{enumerate} -Range-checks are performed on the range $[0, 2^{16} - 1]$, to limit the trace length. - -\subsubsection{Lookup Argument} -To enforce the range-checks, we leverage \href{https://eprint.iacr.org/2022/1530.pdf}{logUp}, a lookup argument by Ulrich Häbock. Given a looking table $s = (s_1, ..., s_n)$ and a looked table $t = (t_1, ..., t_m)$, the goal is to prove that -$$\forall 1 \leq i \leq n, \exists 1 \leq j \leq r \texttt{ such that } s_i = t_j$$ -In our case, $t = (0, .., 2^{16} - 1)$ and $s$ is composed of all the columns in each STARK that must be range-checked. - -The logUp paper explains that proving the previous assertion is actually equivalent to proving that there exists a sequence $l$ such that: -$$ \sum_{i=1}^n \frac{1}{X - s_i} = \sum_{j=1}^r \frac{l_j}{X-t_j}$$ - -The values of $s$ can be stored in $c$ different columns of length $n$ each. In that case, the equality becomes: -$$\sum_{k=1}^c \sum_{i=1}^n \frac{1}{X - s_i^k} = \sum_{j=1}^r \frac{l_j}{X-t_j}$$ - -The `multiplicity' $m_i$ of value $t_i$ is defined as the number of times $t_i$ appears in $s$. In other words: -$$m_i = |s_j \in s; s_j = t_i|$$ - -Multiplicities provide a valid sequence of values in the previously stated equation. Thus, if we store the multiplicities, and are provided with a challenge $\alpha$, we can prove the lookup argument by ensuring: -$$\sum_{k=1}^c \sum_{i=1}^n \frac{1}{\alpha - s_i^k} = \sum_{j=1}^r \frac{m_j}{\alpha-t_j}$$ -However, the equation is too high degree. To circumvent this issue, Häbock suggests providing helper columns $h_i$ and $d$ such that at a given row $i$: -\begin{gather*} - h_i^k = \frac{1}{\alpha + s_i^k } \forall 1 \leq k \leq c \\ - d_i = \frac{1}{\alpha + t_i} -\end{gather*} - -The $h$ helper columns can be batched together to save columns. We can batch at most $\texttt{constraint\_degree} - 1$ helper functions together. In our case, we batch them 2 by 2. At row $i$, we now have: -\begin{align*} - h_i^k = \frac{1}{\alpha + s_i^{2k}} + \frac{1}{\alpha + s_i^{2k+1}} \forall 1 \leq k \leq c/2 \\ -\end{align*} -If $c$ is odd, then we have one extra helper column: -$$h_i^{c/2+1} = \frac{1}{\alpha + s_i^{c}}$$ - -For clarity, we will assume that $c$ is even in what follows. - -Let $g$ be a generator of a subgroup of order $n$. We extrapolate $h, m$ and $d$ to get polynomials such that, for $f \in \{h^k, m, g\}$: $f(g^i) = f_i$. -We can define the following polynomial: -$$ Z(x) := \sum_{i=1}^n \big[\sum_{k=1}^{c/2} h^k(x) - m(x) * d(x)\big]$$ - - -\subsubsection{Constraints} -With these definitions and a challenge $\alpha$, we can finally check that the assertion holds with the following constraints: -\begin{gather*} - Z(1) = 0 \\ - Z(g \alpha) = Z(\alpha) + \sum_{k=1}^{c/2} h^k(\alpha) - m(\alpha) d(\alpha) -\end{gather*} -These ensure that -We also need to ensure that $h^k$ is well constructed for all $1 \leq k \leq c/2$: -$$ - h(\alpha)^k \cdot (\alpha + s_{2k}) \cdot (\alpha + s_{2k+1}) = (\alpha + s_{2k}) + (\alpha + s_{2k+1}) -$$ - -Note: if $c$ is odd, we have one unbatched helper column $h^{c/2+1}$ for which we need a last constraint: -$$ - h(\alpha)^{c/2+1} \cdot (\alpha + s_{c}) = 1 -$$ - -Finally, the verifier needs to ensure that the table $t$ was also correctly computed. In each STARK, $t$ is computed starting from 0 and adding at most 1 at each row. This construction is constrained as follows: -\begin{enumerate} - \item $t(1) = 0$ - \item $(t(g^{i+1}) - t(g^{i})) \cdot ((t(g^{i+1}) - t(g^{i})) - 1) = 0$ - \item $t(g^{n-1}) = 2^{16} - 1$ -\end{enumerate} diff --git a/docs/arithmetization/introduction.tex b/docs/arithmetization/introduction.tex deleted file mode 100644 index cb969a168..000000000 --- a/docs/arithmetization/introduction.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{Introduction} - -TODO diff --git a/docs/arithmetization/mpts.tex b/docs/arithmetization/mpts.tex deleted file mode 100644 index 3f6733a53..000000000 --- a/docs/arithmetization/mpts.tex +++ /dev/null @@ -1,94 +0,0 @@ -\section{Merkle Patricia Tries} -\label{tries} -The \emph{EVM World state} is a representation of the different accounts at a particular time, as well as the last processed transactions together with their receipts. The world state is represented using \emph{Merkle Patricia Tries} (MPTs) \cite[App.~D]{yellowpaper}, and there are three different tries: the state trie, the transaction trie and the receipt trie. - -For each transaction we need to show that the prover knows preimages of the hashed initial and final EVM states. When the kernel starts execution, it stores these three tries within the {\tt Segment::TrieData} segment. The prover loads the initial tries from the inputs into memory. Subsequently, the tries are modified during transaction execution, inserting new nodes or deleting existing nodes. - -An MPT is composed of five different nodes: branch, extension, leaf, empty and digest nodes. Branch and leaf nodes might contain a payload whose format depends on the particular trie. The nodes are encoded, primarily using RLP encoding and Hex-prefix encoding (see \cite{yellowpaper} App. B and C, respectively). The resulting encoding is then hashed, following a strategy similar to that of normal Merkle trees, to generate the trie hashes. - -Insertion and deletion is performed in the same way as other MPTs implementations. The only difference is for inserting extension nodes where we create a new node with the new data, instead of modifying the existing one. In the rest of this section we describe how the MPTs are represented in memory, how they are given as input, and how MPTs are hashed. - -\subsection{Internal memory format} - -The tries are stored in kernel memory, specifically in the {\tt Segment:TrieData} segment. Each node type is stored as -\begin{enumerate} - \item An empty node is encoded as $(\texttt{MPT\_NODE\_EMPTY})$. - \item A branch node is encoded as $(\texttt{MPT\_NODE\_BRANCH}, c_1, \dots, c_{16}, v)$, where each $c_i$ is a pointer to a child node, and $v$ is a pointer to a value. If a branch node has no associated value, then $v = 0$, i.e. the null pointer. - \item An extension node is encoded as $(\texttt{MPT\_NODE\_EXTENSION}, k, c)$, $k$ represents the part of the key associated with this extension, and is encoded as a 2-tuple $(\texttt{packed\_nibbles}, \texttt{num\_nibbles})$. $c$ is a pointer to a child node. - \item A leaf node is encoded as $(\texttt{MPT\_NODE\_LEAF}, k, v)$, where $k$ is a 2-tuple as above, and $v$ is a pointer to a value. - \item A digest node is encoded as $(\texttt{MPT\_NODE\_HASH}, d)$, where $d$ is a Keccak256 digest. -\end{enumerate} - -On the other hand the values or payloads are represented differently depending on the particular trie. - -\subsubsection{State trie} -The state trie payload contains the account data. Each account is stored in 4 contiguous memory addresses containing -\begin{enumerate} - \item the nonce, - \item the balance, - \item a pointer to the account's storage trie, - \item a hash of the account's code. -\end{enumerate} -The storage trie payload in turn is a single word. - -\subsubsection{Transaction Trie} -The transaction trie nodes contain the length of the RLP encoded transaction, followed by the bytes of the RLP encoding of the transaction. - -\subsubsection{Receipt Trie} -The payload of the receipts trie is a receipt. Each receipt is stored as -\begin{enumerate} - \item the length in words of the payload, - \item the status, - \item the cumulative gas used, - \item the bloom filter, stored as 256 words. - \item the number of topics, - \item the topics - \item the data length, - \item the data. -\end{enumerate} - - -\subsection{Prover input format} - -The initial state of each trie is given by the prover as a nondeterministic input tape. This tape has a slightly different format: -\begin{enumerate} - \item An empty node is encoded as $(\texttt{MPT\_NODE\_EMPTY})$. - \item A branch node is encoded as $(\texttt{MPT\_NODE\_BRANCH}, v_?, c_1, \dots, c_{16})$. Here $v_?$ consists of a flag indicating whether a value is present, followed by the actual value payload if one is present. Each $c_i$ is the encoding of a child node. - \item An extension node is encoded as $(\texttt{MPT\_NODE\_EXTENSION}, k, c)$, where $k$ represents the part of the key associated with this extension, and is encoded as a 2-tuple $(\texttt{packed\_nibbles}, \texttt{num\_nibbles})$. $c$ is a pointer to a child node. - \item A leaf node is encoded as $(\texttt{MPT\_NODE\_LEAF}, k, v)$, where $k$ is a 2-tuple as above, and $v$ is a value payload. - \item A digest node is encoded as $(\texttt{MPT\_NODE\_HASH}, d)$, where $d$ is a Keccak256 digest. -\end{enumerate} -Nodes are thus given in depth-first order, enabling natural recursive methods for encoding and decoding this format. -The payload of state and receipt tries is given in the natural sequential way. The transaction an receipt payloads contain variable size data, thus the input is slightly different. The prover input for for the transactions is the transaction RLP encoding preceded by its length. For the receipts is in the natural sequential way, except that topics and data are preceded by their lengths, respectively. - -\subsection{Encoding and Hashing} - -Encoding is done recursively starting from the trie root. Leaf, branch and extension nodes are encoded as the RLP encoding of list containing the hex prefix encoding of the node key as well as - -\begin{description} - \item[Leaf Node:] the encoding of the the payload, - \item[Branch Node:] the hash or encoding of the 16 children and the encoding of the payload, - \item[Extension Node:] the hash or encoding of the child and the encoding of the payload. -\end{description} -For the rest of the nodes we have: -\begin{description} - \item[Empty Node:] the encoding of an empty node is {\tt 0x80}, - \item[Digest Node:] the encoding of a digest node stored as $({\tt MPT\_HASH\_NODE}, d)$ is $d$. -\end{description} - -The payloads in turn are RLP encoded as follows -\begin{description} - \item[State Trie:] Encoded as a list containing nonce, balance, storage trie hash and code hash. - \item[Storage Trie:] The RLP encoding of the value (thus the double RLP encoding) - \item[Transaction Trie:] The RLP encoded transaction. - \item[Receipt Trie:] Depending on the transaction type it's encoded as ${\sf RLP}({\sf RLP}({\tt receipt}))$ for Legacy transactions or ${\sf RLP}({\tt txn\_type}||{\sf RLP}({\tt receipt}))$ for transactions of type 1 or 2. Each receipt is encoded as a list containing: - \begin{enumerate} - \item the status, - \item the cumulative gas used, - \item the bloom filter, stored as a list of length 256. - \item the list of topics - \item the data string. - \end{enumerate} -\end{description} - -Once a node is encoded it is written to the {\tt Segment::RlpRaw} segment as a sequence of bytes. Then the RLP encoded data is hashed if the length of the data is more than 32 bytes. Otherwise we return the encoding. Further details can be found in the \href{https://github.com/0xPolygonZero/plonky2/tree/main/evm/src/cpu/mpt/hash}{mpt hash folder}. \ No newline at end of file diff --git a/docs/arithmetization/tables.tex b/docs/arithmetization/tables.tex deleted file mode 100644 index 3094c462a..000000000 --- a/docs/arithmetization/tables.tex +++ /dev/null @@ -1,11 +0,0 @@ -\section{Tables} -\label{tables} - -\input{tables/cpu} -\input{tables/arithmetic} -\input{tables/byte-packing} -\input{tables/logic} -\input{tables/memory} -\input{tables/mem-continuations} -\input{tables/keccak-f} -\input{tables/keccak-sponge} diff --git a/docs/arithmetization/tables/arithmetic.tex b/docs/arithmetization/tables/arithmetic.tex deleted file mode 100644 index 19be4638f..000000000 --- a/docs/arithmetization/tables/arithmetic.tex +++ /dev/null @@ -1,54 +0,0 @@ -\subsection{Arithmetic} -\label{arithmetic} - -Each row of the arithmetic table corresponds to a binary or ternary arithmetic operation. Each of these operations has an associated flag $f_{op}$ in the table, such that $f_{\texttt{op}} = 1$ whenever the operation is $\texttt{op}$ and 0 otherwise. The full list of operations carried out by the table is as follows: -\paragraph*{Binary operations:} \begin{itemize} - \item basic operations: ``add'', ``mul'', ``sub'' and ``div'', - \item comparisons: ``lt'' and ``gt'', - \item shifts: ``shr'' and ``shl'', - \item ``byte'': given $x_1, x_2$, returns the $x_1$-th ``byte'' in $x_2$, - \item modular operations: ``mod'', ``AddFp254'', ``MulFp254'' and ``SubFp254'', - \item range-check: no operation is performed, as this is only used to range-check the input and output limbs in the range [$0, 2^{16} - 1$]. - \end{itemize} -For `mod', the second input is the modulus. ``AddFp254'', ``MulFp254'' and ``SubFp254'' are modular operations modulo ``Fp254'` -- the prime for the BN curve's base field. - -\paragraph*{Ternary operations:} There are three ternary operations: modular addition ``AddMod'', modular multiplication ``MulMod'' and modular subtraction ``SubMod''. - -Besides the flags, the arithmetic table needs to store the inputs, output and some auxiliary values necessary to constraints. The input and output values are range-checked to ensure their canonical representation. Inputs are 256-bits words. To avoid having too large a range-check, inputs are therefore split into sixteen 16-bits limbs, and range-checked in the range $[0, 2^{16}-1]$. - -Overall, the table comprises the following columns: -\begin{itemize} - \item 17 columns for the operation flags $f_{op}$, - \item 1 column $op$ containing the opcode, - \item 16 columns for the 16-bit limbs $x_{0, i}$ of the first input $x_{0}$, - \item 16 columns for the 16-bit limbs $x_{1, i}$ of the second input $x_{1}$, - \item 16 columns for the 16-bit limbs $x_{2, i}$ of the third input $x_{2}$, - \item 16 columns for the 16-bit limbs $r_i$ of the output $r$, - \item 32 columns for auxiliary values $\texttt{aux}_i$, - \item 1 column $\texttt{range\_counter}$ containing values in the range [$0, 2^{16}-1$], for the range-check, - \item 1 column storing the frequency of appearance of each value in the range $[0, 2^{16} - 1]$. -\end{itemize} - -\paragraph{Note on $op$:} The opcode column is only used for range-checks. For optimization purposes, we check all arithmetic operations against the cpu table together. To ensure correctness, we also check that the operation's opcode corresponds to its behavior. But range-check is not associated to a unique operation: any operation in the cpu table might require its values to be checked. Thus, the arithmetic table cannot know its opcode in advance: it needs to store the value provided by the cpu table. - -\subsubsection{Auxiliary columns} -The way auxiliary values are leveraged to efficiently check correctness is not trivial, but it is explained in detail in each dedicated file. Overall, five files explain the implementations of the various checks. Refer to: -\begin{enumerate} - \item ``mul.rs'' for details on multiplications. - \item ``addcy.rs'' for details on addition, subtraction, ``lt'' and ``gt''. - \item ``modular.rs'' for details on how modular operations are checked. Note that even though ``div'' and ``mod'' are generated and checked in a separate file, they leverage the logic for modular operations described in ``modular.rs''. - \item ``byte'' for details on how ``byte'' is checked. - \item ``shift.rs'' for details on how shifts are checked. -\end{enumerate} - -\paragraph*{Note on ``lt'' and ``gt'':} For ``lt'' and ``gt'', auxiliary columns hold the difference $d$ between the two inputs $x_1, x_2$. We can then treat them similarly to subtractions by ensuring that $x_1 - x_2 = d$ for ``lt'' and $x_2 - x_1 = d$ for ``gt''. An auxiliary column $cy$ is used for the carry in additions and subtractions. In the comparisons case, it holds the overflow flag. Contrary to subtractions, the output of ``lt'' and ``gt'' operations is not $d$ but $cy$. - -\paragraph*{Note on ``div'':} It might be unclear why ``div'' and ``mod'' are dealt with in the same file. - -Given numerator and denominator $n, d$, we compute, like for other modular operations, the quotient $q$ and remainder $\texttt{rem}$: -$$div(x_1, x_2) = q * x_2 + \texttt{rem}$$. -We then set the associated auxiliary columns to $\texttt{rem}$ and the output to $q$. - -This is why ``div'' is essentially a modulo operation, and can be addressed in almost the same way as ``mod''. The only difference is that in the ``mod'' case, the output is $\texttt{rem}$ and the auxiliary value is $q$. - -\paragraph{Note on shifts:} ``shr'' and ``shl'' are internally constrained as ``div'' and ``mul'' respectively with shifted operands. Indeed, given inputs $s, x$, the output should be $x >> s$ for ``shr'' (resp. $x << s$ for ``shl''). Since shifts are binary operations, we can use the third input columns to store $s_{\texttt{shifted}} = 1 << s$. Then, we can use the ``div'' logic (resp. ``mul'' logic) to ensure that the output is $\frac{x}{s_{\texttt{shifted}}}$ (resp. $x * s_{\texttt{shifted}}$). \ No newline at end of file diff --git a/docs/arithmetization/tables/byte-packing.tex b/docs/arithmetization/tables/byte-packing.tex deleted file mode 100644 index 6305b7226..000000000 --- a/docs/arithmetization/tables/byte-packing.tex +++ /dev/null @@ -1,59 +0,0 @@ -\subsection{Byte Packing} -\label{byte-packing} - -The BytePacking STARK module is used for reading and writing non-empty byte sequences of length at most 32 to memory. -The "packing" term highlights that reading a sequence in memory will pack the bytes into an EVM word (i.e. U256), while -the "unpacking" operation consists in breaking down an EVM word into its byte sequence and writing it to memory. - -This allows faster memory copies between two memory locations, as well as faster memory reset -(see \href{https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/kernel/asm/memory/memcpy.asm}{memcpy.asm} and -\href{https://github.com/0xPolygonZero/plonky2/blob/main/evm/src/cpu/kernel/asm/memory/memset.asm}{memset.asm} modules). - -The `BytePackingStark' table has one row per packing/unpacking operation. - -Each row contains the following columns: -\begin{enumerate} - \item 5 columns containing information on the initial memory address from which the sequence starts - (namely a flag differentiating read and write operations, address context, segment and offset values, as well as timestamp), - \item 32 columns $b_i$ indicating the length of the byte sequence ($b_i = 1$ if the length is $i+1$, and $b_i = 0$ otherwise), - \item 32 columns $v_i$ indicating the values of the bytes that have been read or written during a sequence, - \item 2 columns $r_i$ needed for range-checking the byte values. -\end{enumerate} - -\paragraph{Notes on columns generation:} -Whenever a byte unpacking operation is called, the value $\texttt{val}$ is read from the stack, but because the EVM and the STARKs use different endianness, we need to convert $\texttt{val}$ to a little-endian byte sequence. Only then do we resize it to the appropriate length, and prune extra zeros and higher bytes in the process. Finally, we reverse the byte order and write this new sequence into the $v_i$ columns of the table. - -Whenever the operation is a byte packing, the bytes are read one by one from memory and stored in the $v_i$ columns of the BytePackingStark table. - -Note that because of the different endianness on the memory and EVM sides, we write bytes starting with the last one. - -The $b_i$ columns hold a boolean value. $b_i = 1$ whenever we are currently reading or writing the i-th element in the byte sequence. $b_i = 0$ otherwise. - -\paragraph{Cross-table lookups:} -The read or written bytes need to be checked against both the cpu and the memory tables. Whenever we call $\texttt{MSTORE\_32BYTES}$, $\texttt{MLOAD\_32BYTES}$ or $\texttt{PUSH}$ on the cpu side, we make use of `BytePackingStark' to make sure we are carrying out the correct operation on the correct values. For this, we check that the following values correspond: -\begin{enumerate} - \item the address (comprising the context, the segment, and the virtual address), - \item the length of the byte sequence, - \item the timestamp, - \item the value (either written to or read from the stack) -\end{enumerate} - -The address here corresponds to the address of the first byte. - -On the other hand, we need to make sure that the read and write operations correspond to the values read or stored on the memory side. We therefore need a CTL for each byte, checking that the following values are identical in `MemoryStark' and `BytePackingStark': -\begin{enumerate} - \item a flag indicating whether the operation is a read or a write, - \item the address (context, segment and virtual address), - \item the byte (followed by 0s to make sure the memory address contains a byte and not a U256 word), - \item the timestamp -\end{enumerate} - -Note that the virtual address has to be recomputed based on the length of the sequence of bytes. The virtual address for the $i$-th byte is written as: -$$ \texttt{virt} + \sum_{j=0}^{31} b_j * j - i$$ -where $\sum_{j=0}^{31} b_j * j$ is equal to $\texttt{sequence\_length} - 1$. - -\paragraph*{Note on range-check:} Range-checking is necessary whenever we do a memory unpacking operation that will -write values to memory. These values are constrained by the range-check to be 8-bit values, i.e. fitting between 0 and 255 included. -While range-checking values read from memory is not necessary, because we use the same $\texttt{byte\_values}$ columns for both read -and write operations, this extra condition is enforced throughout the whole trace regardless of the operation type. - diff --git a/docs/arithmetization/tables/cpu.tex b/docs/arithmetization/tables/cpu.tex deleted file mode 100644 index ecbf68267..000000000 --- a/docs/arithmetization/tables/cpu.tex +++ /dev/null @@ -1,87 +0,0 @@ -\subsection{CPU} -\label{cpu} - -The CPU is the central component of the zkEVM. Like any CPU, it reads instructions, executes them and modifies the state (registers and the memory) -accordingly. The constraining of some complex instructions (e.g. Keccak hashing) is delegated to other tables. -This section will only briefly present the CPU and its columns. Details about the CPU logic will be provided later. - -\subsubsection{CPU flow} - -An execution run can be decomposed into two distinct parts: -\begin{itemize} - \item \textbf{CPU cycles:} The bulk of the execution. In each row, the CPU reads the current code at the program counter (PC) address, and executes it. The current code can be the kernel code, -or whichever code is being executed in the current context (transaction code or contract code). Executing an instruction consists in modifying the registers, possibly -performing some memory operations, and updating the PC. - \item \textbf{Padding:} At the end of the execution, we need to pad the length of the CPU trace to the next power of two. When the program counter reaches the special halting label -in the kernel, execution halts. Constraints ensure that every subsequent row is a padding row and that execution cannot resume. -\end{itemize} - -In the CPU cycles phase, the CPU can switch between different contexts, which correspond to the different environments of the possible calls. Context 0 is the kernel itself, which -handles initialization (input processing, transaction parsing, transaction trie updating...) and termination (receipt creation, final trie checks...) before and after executing the transaction. Subsequent contexts are created when -executing user code (transaction or contract code). In a non-zero user context, syscalls may be executed, which are specific instructions written in the kernel. They don't change the context -but change the code context, which is where the instructions are read from. - -\paragraph*{Continuations} - -A full run of the zkEVM consists in initializing the zkEVM with the input state, executing a certain number of transactions, and then validating the output state. -However, for performance reasons, a run is split in multiple segments of at most \texttt{MAX\_CPU\_CYCLES} cycles, which can be proven individually. Continuations ensure that the segments are part of the -same run and guarantees that the state at the end of a segment is equal to the state at the beginning of the next. - -The state to propagate from one segment to another contains some of the zkEVM registers plus the current memory. These registers -are stored in memory as dedicated global metadata, and the memory to propagate is stored in two STARK tables: \texttt{MemBefore} and \texttt{MemAfter}. To check the -consistency of the memory, the Merkle cap of the previous \texttt{MemAfter} is compared to the Merkle cap of the next \texttt{MemBefore}. - -\subsubsection{CPU columns} - -\paragraph*{Registers:} \begin{itemize} - \item \texttt{context}: Indicates which context we are in. 0 for the kernel, and a positive integer for every user context. Incremented by 1 at every call. - \item \texttt{code\_context}: Indicates in which context the code to execute resides. It's equal to \texttt{context} in user mode, but is always 0 in kernel mode. - \item \texttt{program\_counter}: The address of the instruction to be read and executed. - \item \texttt{stack\_len}: The current length of the stack. - \item \texttt{is\_kernel\_mode}: Boolean indicating whether we are in kernel (i.e. privileged) mode. This means we are executing kernel code, and we have access to -privileged instructions. - \item \texttt{gas}: The current amount of gas used in the current context. It is eventually checked to be below the current gas limit. Must fit in 32 bits. - \item \texttt{clock}: Monotonic counter which starts at 0 and is incremented by 1 at each row. Used to enforce correct ordering of memory accesses. - \item \texttt{opcode\_bits}: 8 boolean columns, which are the bit decomposition of the opcode being read at the current PC. -\end{itemize} - -\paragraph*{Operation flags:} Boolean flags. During CPU cycles phase, each row executes a single instruction, which sets one and only one operation flag. No flag is set during -padding. The decoding constraints ensure that the flag set corresponds to the opcode being read. -There isn't a 1-to-1 correspondence between instructions and flags. For efficiency, the same flag can be set by different, unrelated instructions (e.g. \texttt{eq\_iszero}, which represents -the \texttt{EQ} and the \texttt{ISZERO} instructions). When there is a need to differentiate them in constraints, we filter them with their respective opcode: since the first bit of \texttt{EQ}'s opcode -(resp. \texttt{ISZERO}'s opcode) is 0 (resp. 1), we can filter a constraint for an EQ instruction with \texttt{eq\_iszero * (1 - opcode\_bits[0])} -(resp. \texttt{eq\_iszero * opcode\_bits[0]}). - -\paragraph*{Memory columns:} The CPU interacts with the EVM memory via its memory channels. At each row, a memory channel can execute a write, a read, or be disabled. A full memory channel is composed of: -\begin{itemize} - \item \texttt{used}: Boolean flag. If it's set to 1, a memory operation is executed in this channel at this row. If it's set to 0, no operation is done but its columns might be reused for other purposes. - \item \texttt{is\_read}: Boolean flag indicating if a memory operation is a read or a write. - \item 3 \texttt{address} columns. A memory address is made of three parts: \texttt{context}, \texttt{segment} and \texttt{virtual}. - \item 8 \texttt{value} columns. EVM words are 256 bits long, and they are broken down in 8 32-bit limbs. -\end{itemize} -The last memory channel is a partial channel: it doesn't have its own \texttt{value} columns and shares them with the first full memory channel. This allows us to save eight columns. - -\paragraph*{General columns:} There are 8 shared general columns. Depending on the instruction, they are used differently: -\begin{itemize} - \item \texttt{Exceptions}: When raising an exception, the first three general columns are the bit decomposition of the exception code. -They are used to jump to the correct exception handler. - \item \texttt{Logic}: For EQ, and ISZERO operations, it's easy to check that the result is 1 if \texttt{input0} and \texttt{input1} are equal. It's more difficult -to prove that, if the result is 0, the inputs are actually unequal. To prove it, each general column contains the modular inverse of $(\texttt{input0}_i - \texttt{input1}_i)$ -for each limb $i$ (or 0 if the limbs are equal). Then the quantity $\texttt{general}_i * (\texttt{input0}_i - \texttt{input1}_i)$ will be 1 if and only if $\texttt{general}_i$ is -indeed the modular inverse, which is only possible if the difference is non-zero. - \item \texttt{Jumps}: For jumps, we use the first two columns: \texttt{should\_jump} and \texttt{cond\_sum\_pinv}. \texttt{should\_jump} conditions whether the EVM should jump: it's -1 for a JUMP, and $\texttt{condition} \neq 0$ for a JUMPI. To check if the condition is actually non-zero for a JUMPI, \texttt{cond\_sum\_pinv} stores the modular inverse of -\texttt{condition} (or 0 if it's zero). - \item \texttt{Shift}: For shifts, the logic differs depending on whether the displacement is lower than $2^{32}$, i.e. if it fits in a single value limb. -To check if this is not the case, we must check that at least one of the seven high limbs is not zero. The general column \texttt{high\_limb\_sum\_inv} holds the modular inverse -of the sum of the seven high limbs, and is used to check it's non-zero like the previous cases. -Contrary to the logic operations, we do not need to check limbs individually: each limb has been range-checked to 32 bits, meaning that it's not possible for the sum to -overflow and be zero if some of the limbs are non-zero. - \item \texttt{Stack}: \texttt{stack\_inv}, \texttt{stack\_inv\_aux} and \texttt{stack\_inv\_aux\_2} are used by popping-only (resp. pushing-only) instructions to check if the stack is empty after (resp. was empty -before) the instruction. \texttt{stack\_len\_bounds\_ aux} is used to check that the stack doesn't overflow in user mode. We use the last four columns to prevent conflicts with the other general columns. -See \ref{stackhandling} for more details. - \label{push_general_view} - \item \texttt{Push}: \texttt{is\_not\_kernel} is used to skip range-checking the output of a PUSH operation when we are in privileged mode, as the kernel code is known and trusted. - \item \texttt{Context pruning}: When \texttt{SET\_CONTEXT} is called to return to a parent context, this makes the current context stale. The kernel indicates it -by setting one general column to 1. For more details about context pruning, see \ref{context-pruning}. -\end{itemize} diff --git a/docs/arithmetization/tables/keccak-f.tex b/docs/arithmetization/tables/keccak-f.tex deleted file mode 100644 index 7eee4b53f..000000000 --- a/docs/arithmetization/tables/keccak-f.tex +++ /dev/null @@ -1,65 +0,0 @@ -\subsection{Keccak-f} -\label{keccak-f} - -This table computes the Keccak-f[1600] permutation. - -\subsubsection{Keccak-f Permutation} -To explain how this table is structured, we first need to detail how the permutation is computed. \href{https://keccak.team/keccak_specs_summary.html}{This page} gives a pseudo-code for the permutation. Our implementation differs slightly -- but remains equivalent -- for optimization and constraint degree reasons. - -Let: -\begin{itemize} - \item $S$ be the sponge width ($S=25$ in our case) - \item $\texttt{NUM\_ROUNDS}$ be the number of Keccak rounds ($\texttt{NUM\_ROUNDS} = 24$) - \item $RC$ a vector of round constants of size $\texttt{NUM\_ROUNDS}$ - \item $I$ be the input of the permutation, comprised of $S$ 64-bit elements -\end{itemize} - -The first step is to reshape $I$ into a $5 \times 5$ matrix. We initialize the state $A$ of the sponge with $I$: $$A[x, y] := I[x, y] \text{ } \forall x, y \in \{0..4\}$$ - -We store $A$ in the table, and subdivide each 64-bit element into two 32-bit limbs. -Then, for each round $i$, we proceed as follows: -\begin{enumerate} - \item First, we define $C[x] := \texttt{xor}_{i=0}^4 A[x, i]$. We store $C$ as bits in the table. This is because we need to apply a rotation on its elements' bits and carry out \texttt{ xor } operations in the next step. - \item Then, we store a second vector $C'$ in bits, such that: $$C'[x, z] = C[x, z] \texttt{ xor } C[x-1, z] \texttt{ xor } C[x+1, z-1]$$. - \item We then need to store the updated value of $A$: $$A'[x, y] = A[x, y] \texttt{ xor } C[x, y] \texttt{ xor } C'[x, y]$$ Note that this is equivalent to the equation in the official Keccak-f description: $$A'[x, y] = A[x, y] \texttt{ xor } C[x-1, z] \texttt{ xor } C[x+1, z-1]$$. - \item The previous three points correspond to the $\theta$ step in Keccak-f. We can now move on to the $\rho$ and $\pi$ steps. These steps are written as: $$B[y, 2\times x + 3 \times y] := \texttt{rot}(A'[x, y], r[x, y])$$ where $\texttt{rot(a, s)}$ is the bitwise cyclic shift operation, and $r$ is the matrix of rotation offsets. We do not need to store $B$: $B$'s bits are only a permutation of $A'$'s bits. - \item The $\chi$ step updates the state once again, and we store the new values: $$A''[x, y] := B[x, y] \texttt{ xor } (\texttt{not }B[x+1, y] \texttt{ and } B[x+2, y])$$ Because of the way we carry out constraints (as explained below), we do not need to store the individual bits for $A''$: we only need the 32-bit limbs. - \item The final step, $\iota$, consists in updating the first element of the state as follows: $$A'''[0, 0] = A''[0, 0] \texttt{ xor } RC[i]$$ where $$A'''[x, y] = A''[x, y] \forall (x, y) \neq (0, 0)$$ Since only the first element is updated, we only need to store $A'''[0, 0]$ of this updated state. The remaining elements are fetched from $A''$. However, because of the bitwise $\texttt{xor}$ operation, we do need columns for the bits of $A''[0, 0]$. -\end{enumerate} - -Note that all permutation elements are 64-bit long. But they are stored as 32-bit limbs so that we do not overflow the field. - -It is also important to note that all bitwise logic operations ($\texttt{ xor }$, $\texttt{ not }$ and $\texttt{ and}$) are checked in this table. This is why we need to store the bits of most elements. The logic table can only carry out eight 32-bit logic operations per row. Thus, leveraging it here would drastically increase the number of logic rows, and incur too much overhead in proving time. - - - -\subsubsection{Columns} -Using the notations from the previous section, we can now list the columns in the table: -\begin{enumerate} - \item $\texttt{NUM\_ROUND}S = 24$ columns $c_i$ to determine which round is currently being computed. $c_i = 1$ when we are in the $i$-th round, and 0 otherwise. These columns' purpose is to ensure that the correct round constants are used at each round. - \item $1$ column $t$ which stores the timestamp at which the Keccak operation was called in the cpu. This column enables us to ensure that inputs and outputs are consistent between the cpu, keccak-sponge and keccak-f tables. - \item $5 \times 5 \times 2 = 50 $columns to store the elements of $A$. As a reminder, each 64-bit element is divided into two 32-bit limbs, and $A$ comprises $S = 25$ elements. - \item $5 \times 64 = 320$ columns to store the bits of the vector $C$. - \item $5 \times 64 = 320$ columns to store the bits of the vector $C'$. - \item $5 \times 5 \times 64 = 1600$ columns to store the bits of $A'$. - \item $5 \times 5 \times 2 = 50$ columns to store the 32-bit limbs of $A''$. - \item $64$ columns to store the bits of $A''[0, 0]$. - \item $2$ columns to store the two limbs of $A'''[0, 0]$. -\end{enumerate} - -In total, this table comprises 2,431 columns. - -\subsubsection{Constraints} -Some constraints checking that the elements are computed correctly are not straightforward. Let us detail them here. - -First, it is important to highlight the fact that a $\texttt{xor}$ between two elements is of degree 2. Indeed, for $x \texttt{ xor } y$, the constraint is $x + y - 2 \times x \times y$, which is of degree 2. This implies that a $\texttt{xor}$ between 3 elements is of degree 3, which is the maximal constraint degree for our STARKs. - -We can check that $C'[x, z] = C[x, z] \texttt{ xor } C[x - 1, z] \texttt{ xor } C[x + 1, z - 1]$. However, we cannot directly check that $C[x] = \texttt{xor}_{i=0}^4 A[x, i]$, as it would be a degree 5 constraint. Instead, we use $C'$ for this constraint. We see that: -$$\texttt{xor}_{i=0}^4 A'[x, i, z] = C'[x, z]$$ -This implies that the difference $d = \sum_{i=0}^4 A'[x, i, z] - C'[x, z]$ is either 0, 2 or 4. We can therefore enforce the following degree 3 constraint instead: -$$d \times (d - 2) \times (d - 4) = 0$$ - -Additionally, we have to check that $A'$ is well constructed. We know that $A'$ should be such that $A'[x, y, z] = A[x, y, z] \texttt{ xor } C[x, z] \texttt{ xor } C'[x, z]$. Since we do not have the bits of $A$ elements but the bits of $A'$ elements, we check the equivalent degree 3 constraint: -$$A[x, y, z] = A'[x, y, z] \texttt{ xor } C[x, z] \texttt { xor } C'[x, z]$$ - -Finally, the constraints for the remaining elements, $A''$ and $A'''$ are straightforward: $A''$ is a three-element bitwise $\texttt{xor}$ where all bits involved are already storedn and $A'''[0, 0]$ is the output of a simple bitwise $\texttt{xor}$ with a round constant. \ No newline at end of file diff --git a/docs/arithmetization/tables/keccak-sponge.tex b/docs/arithmetization/tables/keccak-sponge.tex deleted file mode 100644 index a712335b8..000000000 --- a/docs/arithmetization/tables/keccak-sponge.tex +++ /dev/null @@ -1,66 +0,0 @@ -\subsection{KeccakSponge} -\label{keccak-sponge} - -This table computes the Keccak256 hash, a sponge-based hash built on top of the Keccak-f[1600] permutation. An instance of KeccakSponge takes as input a Memory address $a$, -a length $l$, and computes the Keccak256 digest of the memory segment starting at $a$ and of size $l$. An instance can span many rows, each individual row being a single call to -the Keccak table. Note that all the read elements must be bytes; the proof will be unverifiable if this is not the case. Following the Keccak specifications, the input string is padded to the next multiple of 136 bytes. -Each row contains the following columns: -\begin{itemize} - \item Read bytes: - \begin{itemize} - \item 3 address columns: \texttt{context}, \texttt{segment} and the offset \texttt{virt} of $a$. - \item \texttt{timestamp}: the timestamp which will be used for all memory reads of this instance. - \item \texttt{already\_absorbed\_bytes}: keeps track of how many bytes have been hashed in the current instance. At the end of an instance, we should have absorbed $l$ bytes in total. - \item \texttt{KECCAK\_RATE\_BYTES} \texttt{block\_bytes} columns: the bytes being absorbed at this row. They are read from memory and will be XORed to the rate part of the current state. - \end{itemize} - \item Input columns: - \begin{itemize} - \item \texttt{KECCAK\_RATE\_U32S} \texttt{original\_rate\_u32s} columns: hold the rate part of the state before XORing it with \texttt{block\_bytes}. At the beginning of an instance, they are initialized with 0. - \item \texttt{KECCAK\_RATE\_U32s} \texttt{xored\_rate\_u32s} columns: hold the original rate XORed with \texttt{block\_bytes}. - \item \texttt{KECCAK\_CAPACITY\_U32S} \texttt{original\_capacity\_u32s} columns: hold the capacity part of the state before applying the Keccak permutation. - \end{itemize} - \item Output columns: - \begin{itemize} - \item \texttt{KECCAK\_DIGEST\_BYTES} \texttt{updated\_digest\_state\_bytes columns}: the beginning of the output state after applying the Keccak permutation. At the last row of an instance, they hold the computed hash. -They are decomposed in bytes for endianness reasons. - \item \texttt{KECCAK\_WIDTH\_MINUS\_DIGEST\_U32S} \texttt{partial\_updated\_state\_u32s} columns: the rest of the output state. They are discarded for the final digest, but are used between instance rows. - \end{itemize} - \item Helper columns: - \begin{itemize} - \item \texttt{is\_full\_input\_block}: indicates if the current row has a full input block, i.e. \texttt{block\_bytes} contains only bytes read from memory and no padding bytes. - \item \texttt{KECCAK\_RATE\_BYTES} \texttt{is\_final\_input\_len} columns: in the final row of an instance, indicate where the final read byte is. If the $i$-th column is set to 1, it means that -all bytes after the $i$-th are padding bytes. In a full input block, all columns are set to 0. - \end{itemize} -\end{itemize} - -For each instance, constraints ensure that: -\begin{itemize} - \item at each row: - \begin{itemize} - \item \texttt{is\_full\_input\_block} and \texttt{is\_final\_input\_len} columns are all binary. - \item Only one column in \texttt{is\_full\_input\_block} and \texttt{is\_final\_input\_len} is set to 1. - \item \texttt{xored\_rate\_u32s} is \texttt{original\_rate\_u32s} XOR \texttt{block\_bytes}. - \item The CTL with Keccak ensures that (\texttt{updated\_digest\_state\_bytes columns}, \texttt{partial\_updated\_state\_u32s}) is the Keccak permutation output of (\texttt{xored\_rate\_u32s}, \texttt{original\_capacity\_u32s}). - \end{itemize} - \item at the first row: - \begin{itemize} - \item \texttt{original\_rate\_u32s} is all 0. - \item \texttt{already\_absorbed\_bytes} is 0. - \end{itemize} - \item at each full input row (i.e. \texttt{is\_full\_input\_block} is 1, all \texttt{is\_final\_input\_len} columns are 0): - \begin{itemize} - \item \texttt{context}, \texttt{segment}, \texttt{virt} and \texttt{timestamp} are unchanged in the next row. - \item Next \texttt{already\_absorbed\_bytes} is current \texttt{already\_absorbed\_bytes} + \texttt{KECCAK\_RATE\_BYTES}. - \item Next (\texttt{original\_rate\_u32s}, \texttt{original\_capacity\_u32s}) is current (\texttt{updated\_digest\_state\_bytes columns}, \texttt{partial\_updated\_state\_u32s}). - \item The CTL with Memory ensures that \texttt{block\_bytes} is filled with contiguous memory elements [$a$ + \texttt{already\_absorbed\_bytes}, $a$ + \texttt{already\_absorbed\_bytes} + \texttt{KECCAK\_RATE\_BYTES} - 1] - \end{itemize} - \item at the final row (i.e. \texttt{is\_full\_input\_block} is 0, \texttt{is\_final\_input\_len}'s $i$-th column is 1 for a certain $i$, the rest are 0): - \begin{itemize} - \item The CTL with Memory ensures that \texttt{block\_bytes} is filled with contiguous memory elements [$a$ + \texttt{already\_absorbed\_bytes}, $a$ + \texttt{already\_absorbed\_bytes} + $i$ - 1]. The rest are padding bytes. - \item The CTL with CPU ensures that \texttt{context}, \texttt{segment}, \texttt{virt} and \texttt{timestamp} match the \texttt{KECCAK\_GENERAL} call. - \item The CTL with CPU ensures that $l$ = \texttt{already\_absorbed\_bytes} + $i$. - \item The CTL with CPU ensures that \texttt{updated\_digest\_state\_bytes} is the output of the \texttt{KECCAK\_GENERAL} call. - \end{itemize} -\end{itemize} - -The trace is padded to the next power of two with dummy rows, whose \texttt{is\_full\_input\_block} and \texttt{is\_final\_input\_len} columns are all 0. diff --git a/docs/arithmetization/tables/logic.tex b/docs/arithmetization/tables/logic.tex deleted file mode 100644 index e2425fc4a..000000000 --- a/docs/arithmetization/tables/logic.tex +++ /dev/null @@ -1,18 +0,0 @@ -\subsection{Logic} -\label{logic} - -Each row of the logic table corresponds to one bitwise logic operation: either AND, OR or XOR. Each input for these operations is represented as 256 bits, while the output is stored as eight 32-bit limbs. - -Each row therefore contains the following columns: -\begin{enumerate} - \item $f_{\texttt{and}}$, an ``is and'' flag, which should be 1 for an OR operation and 0 otherwise, - \item $f_{\texttt{or}}$, an ``is or'' flag, which should be 1 for an OR operation and 0 otherwise, - \item $f_{\texttt{xor}}$, an ``is xor'' flag, which should be 1 for a XOR operation and 0 otherwise, - \item 256 columns $x_{1, i}$ for the bits of the first input $x_1$, - \item 256 columns $x_{2, i}$ for the bits of the second input $x_2$, - \item 8 columns $r_i$ for the 32-bit limbs of the output $r$. -\end{enumerate} - -Note that we need all three flags because we need to be able to distinguish between an operation row and a padding row -- where all flags are set to 0. - -The subdivision into bits is required for the two inputs as the table carries out bitwise operations. The result, on the other hand, is represented in 32-bit limbs since we do not need individual bits and can therefore save the remaining 248 columns. Moreover, the output is checked against the cpu, which stores values in the same way. diff --git a/docs/arithmetization/tables/mem-continuations.tex b/docs/arithmetization/tables/mem-continuations.tex deleted file mode 100644 index 9aee737a6..000000000 --- a/docs/arithmetization/tables/mem-continuations.tex +++ /dev/null @@ -1,15 +0,0 @@ -\subsection{Memory continuations} -\label{mem-continuations} - -The MemBefore (resp. MemAfter) table holds the content of the memory before (resp. after) the execution of the current segment. -For consistency, the MemAfter trace of a segment must be identical to the MemAfter trace of the next segment. -Each row of these tables contains: - -\begin{enumerate} - \item $a$, the memory cell address, - \item $v$, the initial value of the cell. -\end{enumerate} -The tables should be ordered by $(a, \tau)$. Since they only hold values, there are no constraints between the rows. - -A CTL copies all of the MemBefore values in the memory trace as reads, at timestamp $\tau = 0$. -Another CTL copies the final values from memory to MemAfter. For more details on which values are propagated, consult \ref{final-memory}. \ No newline at end of file diff --git a/docs/arithmetization/tables/memory.tex b/docs/arithmetization/tables/memory.tex deleted file mode 100644 index 6eef3bab1..000000000 --- a/docs/arithmetization/tables/memory.tex +++ /dev/null @@ -1,98 +0,0 @@ -\subsection{Memory} -\label{memory} - -For simplicity, let's treat addresses and values as individual field elements. The generalization to multi-element addresses and values is straightforward. - -Each row of the memory table corresponds to a single memory operation (a read or a write), and contains the following columns: - -\begin{enumerate} - \item $a$, the target address - \item $r$, an ``is read'' flag, which should be 1 for a read or 0 for a write - \item $v$, the value being read or written - \item $\tau$, the timestamp of the operation -\end{enumerate} -The memory table should be ordered by $(a, \tau)$. Note that the correctness of the memory could be checked as follows: -\begin{enumerate} - \item Verify the ordering by checking that $(a_i, \tau_i) \leq (a_{i+1}, \tau_{i+1})$ for each consecutive pair. - \item Enumerate the purportedly-ordered log while tracking the ``current'' value of $v$. - \begin{enumerate} - \item Upon observing an address which doesn't match that of the previous row, if the address is zero-initialized - and if the operation is a read, check that $v = 0$. - \item Upon observing a write, don't constrain $v$. - \item Upon observing a read at timestamp $\tau_i$ which isn't the first operation at this address, check that $v_i = v_{i-1}$. - \end{enumerate} -\end{enumerate} - -The ordering check is slightly involved since we are comparing multiple columns. To facilitate this, we add an additional column $e$, where the prover can indicate whether two consecutive addresses changed. An honest prover will set -$$ -e_i \leftarrow \begin{cases} - 1 & \text{if } a_i \neq a_{i + 1}, \\ - 0 & \text{otherwise}. -\end{cases} -$$ -We also introduce a range-check column $c$, which should hold: -$$ -c_i \leftarrow \begin{cases} - a_{i + 1} - a_i - 1 & \text{if } e_i = 1, \\ - \tau_{i+1} - \tau_i & \text{otherwise}. -\end{cases} -$$ -The extra $-1$ ensures that the address actually changed if $e_i = 1$. -We then impose the following transition constraints: -\begin{enumerate} - \item $e_i (e_i - 1) = 0$, - \item $(1 - e_i) (a_{i + 1} - a_i) = 0$, - \item $c_i < 2^{32}$. -\end{enumerate} -The third constraint emulates a comparison between two addresses or timestamps by bounding their difference; this assumes that all addresses and timestamps fit in 32 bits and that the field is larger than that. - -\subsubsection{Virtual memory} - -In the EVM, each contract call has its own address space. Within that address space, there are separate segments for code, main memory, stack memory, calldata, and returndata. Thus each address actually has three components: -\begin{enumerate} - \item an execution context, representing a contract call, - \item a segment ID, used to separate code, main memory, and so forth, and so on - \item a virtual address. -\end{enumerate} -The comparisons now involve several columns, which requires some minor adaptations to the technique described above; we will leave these as an exercise to the reader. - -Note that an additional constraint check is required: whenever we change the context or the segment, the virtual address must be range-checked to $2^{32}$. -Without this check, addresses could start at -1 (i.e. $p - 2$) and then increase properly. - -\subsubsection{Timestamps} - -Memory operations are sorted by address $a$ and timestamp $\tau$. For a memory operation in the CPU, we have: -$$\tau = \texttt{NUM\_CHANNELS} \times \texttt{cycle} + \texttt{channel}.$$ -Since a memory channel can only hold at most one memory operation, every CPU memory operation's timestamp is unique. - -Note that it doesn't mean that all memory operations have unique timestamps. There are two exceptions: - -\begin{itemize} - \item Before the CPU cycles, we preinitialize the memory with the flashed state stored in the MemBefore table and we write some global metadata. These operations are done at timestamp $\tau = 0$. - \item Some tables other than CPU can generate memory operations, like KeccakSponge. When this happens, these operations all have the timestamp of the CPU row of the instruction which invoked the table (for KeccakSponge, KECCAK\_GENERAL). -\end{itemize} - -\subsubsection{Memory initialization} - -By default, all memory is zero-initialized. However, to save numerous writes, we allow some specific segments to be initialized with arbitrary values. - -\begin{itemize} - \item The code segment (segment 0) is either part of the initial memory for the kernel (context 0), or is initialized with externally-provided account code, then checked against the account code hash. -In non-zero contexts, if the code is meant to be executed, there is a soundness concern: if the code is malformed and ends with an incomplete PUSH, then the missing bytes must -be 0 accordingly to the Ethereum specs. To prevent the issue, we manually write 33 zeros (at most 32 bytes for the PUSH argument, and an extra one for -the post-PUSH PC value). - \item The ``TrieData'' segment is initialized with the input tries. The stored tries are hashed and checked against the provided initial hash. Note that the length of the segment and the pointers -- within the ``TrieData'' segment -- for the three tries are provided as prover inputs. The length is then checked against a value computed when hashing the tries. -\end{itemize} - -\subsubsection{Final memory} -\label{final-memory} - -The final value of each cell of the memory must be propagated to the MemAfter table. Since memory operations are ordered by address and by timestamps, this is -easy to do: the last value of an address is the value of the last row touching this address. In other words, we propagate values of rows before the address changes. - -\paragraph*{Context pruning} -\label{context-pruning} - -We can observe that whenever we return from a context (e.g. with a RETURN opcode, from an exception...), we will never access it again and all its memory is now stale. -We make use of this fact to prune stale contexts and exclude them from MemAfter. - diff --git a/docs/arithmetization/zkevm.pdf b/docs/arithmetization/zkevm.pdf deleted file mode 100644 index ee815d59ab625719d8b130c2116ed35cc7ff7cb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324827 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

=tYDInz8P8{@{&@I5 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�yG{>puxu+qoEU*srug5m?d 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
x2Z4?~m++Rvii%udVd8cZ*F%5ZlBnoJM`iM!%F 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 z

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