From a6b354509d011f088a6e8e52d30671e8c9532d97 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 18 Jan 2024 02:16:07 +0000 Subject: [PATCH 01/27] git subrepo push --branch=master barretenberg subrepo: subdir: "barretenberg" merged: "ee6b91e5e" upstream: origin: "https://github.com/AztecProtocol/barretenberg" branch: "master" commit: "ee6b91e5e" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- barretenberg/.gitrepo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/.gitrepo b/barretenberg/.gitrepo index 7eb6dba2c41..b27c908e440 100644 --- a/barretenberg/.gitrepo +++ b/barretenberg/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/barretenberg branch = master - commit = 4f7bac9189d6b75b9591ecad688f964646783e2b - parent = 50b4a728b4c20503f6ab56c07feaa29d767cec10 + commit = ee6b91e5ecd6bc57dd83834d27442008672dbddb + parent = 04f8e0dfde5a3d4f54621726891aedc071212a8a method = merge cmdver = 0.4.6 From 84b0bad61a5fc751fdf01ae907bb9b7df3bece7b Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 18 Jan 2024 02:16:27 +0000 Subject: [PATCH 02/27] chore: replace relative paths to noir-protocol-circuits --- yarn-project/aztec-nr/aztec/Nargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec-nr/aztec/Nargo.toml b/yarn-project/aztec-nr/aztec/Nargo.toml index fb8ba9b6fd4..52f313a6472 100644 --- a/yarn-project/aztec-nr/aztec/Nargo.toml +++ b/yarn-project/aztec-nr/aztec/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "lib" [dependencies] -protocol_types = { path = "../../noir-protocol-circuits/src/crates/types" } +protocol_types = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.19.0", directory="yarn-project/noir-protocol-circuits/src/crates/types" } From 52c3bdc065b08abea24896fd751e91f5ce161d60 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 18 Jan 2024 02:16:28 +0000 Subject: [PATCH 03/27] git_subrepo.sh: Fix parent in .gitrepo file. [skip ci] --- yarn-project/aztec-nr/.gitrepo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec-nr/.gitrepo b/yarn-project/aztec-nr/.gitrepo index 879c65ffafe..4d62e63617b 100644 --- a/yarn-project/aztec-nr/.gitrepo +++ b/yarn-project/aztec-nr/.gitrepo @@ -9,4 +9,4 @@ commit = 8e2f097cdb016eba9650161d669d583b902405c6 method = merge cmdver = 0.4.6 - parent = 84dc42110cf307dd5c95f1077728910757c01d3a + parent = aa6e66443756e21484341aa69f449d71cc838562 From 07974e2d0305cc0461ffeb00cf2dba8b5ded9679 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Thu, 18 Jan 2024 02:16:34 +0000 Subject: [PATCH 04/27] git subrepo push --branch=master yarn-project/aztec-nr subrepo: subdir: "yarn-project/aztec-nr" merged: "8309aa264" upstream: origin: "https://github.com/AztecProtocol/aztec-nr" branch: "master" commit: "8309aa264" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- yarn-project/aztec-nr/.gitrepo | 4 ++-- yarn-project/aztec-nr/aztec/Nargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn-project/aztec-nr/.gitrepo b/yarn-project/aztec-nr/.gitrepo index 4d62e63617b..2e153fae335 100644 --- a/yarn-project/aztec-nr/.gitrepo +++ b/yarn-project/aztec-nr/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/aztec-nr branch = master - commit = 8e2f097cdb016eba9650161d669d583b902405c6 + commit = 8309aa264079c6382dcff4384bab3cce452f5c97 method = merge cmdver = 0.4.6 - parent = aa6e66443756e21484341aa69f449d71cc838562 + parent = 0818fdee5b7a0121ce1c064d06ca5ab7f27fdd58 diff --git a/yarn-project/aztec-nr/aztec/Nargo.toml b/yarn-project/aztec-nr/aztec/Nargo.toml index 52f313a6472..fb8ba9b6fd4 100644 --- a/yarn-project/aztec-nr/aztec/Nargo.toml +++ b/yarn-project/aztec-nr/aztec/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "lib" [dependencies] -protocol_types = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.19.0", directory="yarn-project/noir-protocol-circuits/src/crates/types" } +protocol_types = { path = "../../noir-protocol-circuits/src/crates/types" } From afca819166b9b5882b5d94062ac50cbb8dc590fb Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 18 Jan 2024 07:37:49 -0300 Subject: [PATCH 05/27] chore: Remove unused noir-version json (#4105) Given we're now releasing aztec nargo from the monorepo with the same versioning as the other packages, `noir-version.json` is no longer needed. As part of this changeset, removes all references to noir versions from the docs (last ones were around installing nargo just for LSP, which are being removed [here](https://github.com/AztecProtocol/aztec-packages/pull/4110/)), removes the exported noir-version from noir-compiler, and removes the `compatibleNargoVersion` from node-info since it's no longer used. And besides, we were returning the string `portal:../../noir/packages/noir_wasm` as `compatibleNargoVersion` from the pxe :facepalm:. --- build_manifest.yml | 1 - docs/README.md | 11 ----------- docs/docs/dev_docs/contracts/main.md | 4 ---- .../getting_started/aztecjs-getting-started.md | 5 ----- .../getting_started/aztecnr-getting-started.md | 4 ---- docs/docusaurus.config.js | 10 +--------- .../src/components/InstallNargoInstructions/index.js | 12 ------------ docs/src/components/Version/index.js | 1 - docs/src/preprocess/include_version.js | 8 -------- docs/src/theme/MDXComponents.js | 8 +------- yarn-project/aztec-sandbox/src/bin/index.ts | 9 ++++----- yarn-project/aztec.js/src/contract/contract.test.ts | 1 - yarn-project/cli/src/cmds/get_node_info.ts | 1 - yarn-project/end-to-end/src/cli_docs_sandbox.test.ts | 1 - yarn-project/noir-compiler/package.json | 4 +--- yarn-project/noir-compiler/src/index.ts | 2 -- yarn-project/noir-compiler/src/noir-version.json | 4 ---- yarn-project/noir-compiler/src/versions.ts | 12 ------------ yarn-project/pxe/src/pxe_service/pxe_service.ts | 2 -- yarn-project/types/src/interfaces/node-info.ts | 4 ---- yarn-project/yarn.lock | 9 --------- 21 files changed, 7 insertions(+), 106 deletions(-) delete mode 100644 docs/src/components/InstallNargoInstructions/index.js delete mode 100644 yarn-project/noir-compiler/src/noir-version.json delete mode 100644 yarn-project/noir-compiler/src/versions.ts diff --git a/build_manifest.yml b/build_manifest.yml index 8924d81aa80..ea8880f74d0 100644 --- a/build_manifest.yml +++ b/build_manifest.yml @@ -201,7 +201,6 @@ docs: - ^.*.hpp$ - ^.*.ts$ - ^.release-please-manifest.json$ - - ^.*/noir-version.json$ - ^.*.nr$ dependencies: - yarn-project diff --git a/docs/README.md b/docs/README.md index d07cc7f3981..f1fae6d86ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -133,14 +133,3 @@ Alternatively, you can also use the `AztecPackagesVersion()` js function, which import { AztecPackagesVersion } from "@site/src/components/Version"; <>{AztecPackagesVersion()} ``` - - ### `#include_noir_version` - -This macros will be replaced inline with the required nargo version, which is `0.11.1-aztec.0` at the time of these writing. This value is sourced from `yarn-project/noir-compiler/src/noir-version.json`. - -Alternatively, you can also use the `NoirVersion()` js function, which you need to import explicitly: - -``` -import { NoirVersion } from "@site/src/components/Version"; -<>{NoirVersion()} -``` diff --git a/docs/docs/dev_docs/contracts/main.md b/docs/docs/dev_docs/contracts/main.md index 152ef5f0a8a..36a2d59f496 100644 --- a/docs/docs/dev_docs/contracts/main.md +++ b/docs/docs/dev_docs/contracts/main.md @@ -30,10 +30,6 @@ For those coming from vanilla Noir, the version used for aztec.nr is tracked sep `aztec-nargo` comes with the Noir compiler, so installing `nargo` is not required, however it is recommended as it provides a better developer experience for writing contracts. You will need nargo installed to take advantage of the [Noir Language Server](https://noir-lang.org/docs/getting_started/tooling/language_server), which provides syntax highlighting and formatting for your Aztec contracts. -You can install `nargo` with the following commands: - - - ## Install Noir tooling There are a number of tools to make writing Aztec.nr contracts in Noir more pleasant. See [here](https://github.com/noir-lang/awesome-noir#get-coding). diff --git a/docs/docs/dev_docs/getting_started/aztecjs-getting-started.md b/docs/docs/dev_docs/getting_started/aztecjs-getting-started.md index f71af8aa883..637da709e60 100644 --- a/docs/docs/dev_docs/getting_started/aztecjs-getting-started.md +++ b/docs/docs/dev_docs/getting_started/aztecjs-getting-started.md @@ -122,7 +122,6 @@ A successful run should show something like this: ``` token Aztec Sandbox Info { token sandboxVersion: '#include_aztec_short_version', - token compatibleNargoVersion: '#include_noir_version', token chainId: 31337, token protocolVersion: 1, token l1ContractAddresses: { @@ -168,7 +167,6 @@ Now that we have our accounts loaded, let's move on to deploy our pre-compiled t ``` token Aztec Sandbox Info { token sandboxVersion: '#include_aztec_short_version', - token compatibleNargoVersion: '#include_noir_version', token chainId: 31337, token protocolVersion: 1, token l1ContractAddresses: { @@ -220,7 +218,6 @@ Running now should yield output: ``` token Aztec Sandbox Info { token sandboxVersion: '#include_aztec_short_version', - token compatibleNargoVersion: '#include_noir_version', token chainId: 31337, token protocolVersion: 1, token l1ContractAddresses: { @@ -282,7 +279,6 @@ Our output should now look like this: ``` token Aztec Sandbox Info { token sandboxVersion: '#include_aztec_short_version', - token compatibleNargoVersion: '#include_noir_version', token chainId: 31337, token protocolVersion: 1, token l1ContractAddresses: { @@ -339,7 +335,6 @@ Our complete output should now be something like: ``` token Aztec Sandbox Info { token sandboxVersion: '#include_aztec_short_version', - token compatibleNargoVersion: '#include_noir_version', token chainId: 31337, token protocolVersion: 1, token l1ContractAddresses: { diff --git a/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md b/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md index 846a8c8b848..f9c7906b10c 100644 --- a/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md +++ b/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md @@ -211,10 +211,6 @@ The CLI comes with the Noir compiler, so installing `nargo` is not required, how You will also need `nargo` if you want to run unit tests in Noir. -You can install `nargo` with the following commands: - - - ## What's next? Now you can explore. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 5f19cd0a574..efe1271187e 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -82,13 +82,6 @@ const config = { name: "load-versions", async loadContent() { try { - const noirVersionPath = path.resolve( - __dirname, - "../yarn-project/noir-compiler/src/noir-version.json" - ); - const noirVersion = JSON.parse( - fs.readFileSync(noirVersionPath).toString() - ).tag; const aztecVersionPath = path.resolve( __dirname, "../.release-please-manifest.json" @@ -97,12 +90,11 @@ const config = { fs.readFileSync(aztecVersionPath).toString() )["."]; return { - noir: noirVersion, "aztec-packages": `aztec-packages-v${aztecVersion}`, }; } catch (err) { throw new Error( - `Error loading Noir version from noir-compiler in docusaurus build. Check load-versions in docusaurus.config.js.\n${err}` + `Error loading versions in docusaurus build. Check load-versions in docusaurus.config.js.\n${err}` ); } }, diff --git a/docs/src/components/InstallNargoInstructions/index.js b/docs/src/components/InstallNargoInstructions/index.js deleted file mode 100644 index 2ee7437259b..00000000000 --- a/docs/src/components/InstallNargoInstructions/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; -import CodeBlock from "@theme/CodeBlock"; -import { NoirVersion } from "@site/src/components/Version"; - -export default function InstallNargoInstructions() { - return ( - - {`curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash -noirup -v ${NoirVersion()}`} - - ); -} diff --git a/docs/src/components/Version/index.js b/docs/src/components/Version/index.js index 01bf315f222..36599d90c82 100644 --- a/docs/src/components/Version/index.js +++ b/docs/src/components/Version/index.js @@ -7,5 +7,4 @@ export default function Version({ what }) { return Versions()[what]; } -export const NoirVersion = () => Versions()["noir"]; export const AztecPackagesVersion = () => Versions()["aztec-packages"]; \ No newline at end of file diff --git a/docs/src/preprocess/include_version.js b/docs/src/preprocess/include_version.js index afa372e0a04..529e93d0adb 100644 --- a/docs/src/preprocess/include_version.js +++ b/docs/src/preprocess/include_version.js @@ -7,13 +7,6 @@ let versions; async function getVersions() { if (!versions) { try { - const noirVersionPath = path.resolve( - __dirname, - "../../../yarn-project/noir-compiler/src/noir-version.json" - ); - const noirVersion = JSON.parse( - fs.readFileSync(noirVersionPath).toString() - ).tag; const aztecVersionPath = path.resolve( __dirname, "../../../.release-please-manifest.json" @@ -22,7 +15,6 @@ async function getVersions() { fs.readFileSync(aztecVersionPath).toString() )["."]; versions = { - noir: noirVersion, aztec: `aztec-packages-v${aztecVersion}`, aztec_short: aztecVersion, }; diff --git a/docs/src/theme/MDXComponents.js b/docs/src/theme/MDXComponents.js index 4593ab51e68..28e247751f4 100644 --- a/docs/src/theme/MDXComponents.js +++ b/docs/src/theme/MDXComponents.js @@ -1,18 +1,12 @@ import React from "react"; import MDXComponents from "@theme-original/MDXComponents"; -import Version, { - NoirVersion, - AztecPackagesVersion, -} from "@site/src/components/Version"; -import InstallNargoInstructions from "@site/src/components/InstallNargoInstructions"; +import Version, { AztecPackagesVersion } from "@site/src/components/Version"; import CodeBlock from "@theme/CodeBlock"; // https://docusaurus.io/docs/markdown-features/react#mdx-component-scope export default { ...MDXComponents, Version, - NoirVersion, AztecPackagesVersion, - InstallNargoInstructions, CodeBlock, }; diff --git a/yarn-project/aztec-sandbox/src/bin/index.ts b/yarn-project/aztec-sandbox/src/bin/index.ts index 75b8d311347..97aa2d790ea 100644 --- a/yarn-project/aztec-sandbox/src/bin/index.ts +++ b/yarn-project/aztec-sandbox/src/bin/index.ts @@ -7,7 +7,6 @@ import { init } from '@aztec/foundation/crypto'; import { createStatusRouter, startHttpRpcServer } from '@aztec/foundation/json-rpc/server'; import { createDebugLogger } from '@aztec/foundation/log'; import { fileURLToPath } from '@aztec/foundation/url'; -import { NoirCommit, NoirTag } from '@aztec/noir-compiler/versions'; import { BootstrapNode, getP2PConfigEnvVars } from '@aztec/p2p'; import { GrumpkinScalar, PXEService, createPXERpcServer } from '@aztec/pxe'; @@ -121,7 +120,7 @@ async function main() { // Code path for starting Sandbox if (mode === SandboxMode.Sandbox) { - logger.info(`Setting up Aztec Sandbox v${version} (noir ${NoirCommit} ${NoirTag}), please stand by...`); + logger.info(`Setting up Aztec Sandbox v${version} please stand by...`); const { pxe, node, stop, accounts } = await createAndInitialiseSandbox(deployTestAccounts); @@ -139,7 +138,7 @@ async function main() { const accountLogStrings = await createAccountLogs(accounts, pxe); logStrings.push(...accountLogStrings); } - logStrings.push(`Aztec Sandbox v${version} (noir ${NoirCommit}) is now ready for use!`); + logStrings.push(`Aztec Sandbox v${version} is now ready for use!`); } else if (mode === SandboxMode.Node) { // Code path for starting Node only const nodeConfig = getNodeConfigEnvVars(); @@ -170,7 +169,7 @@ async function main() { const httpServer = http.createServer(app.callback()); httpServer.listen(port); - logStrings.push(`Aztec Node v${version} (noir ${NoirCommit}) is now ready for use in port ${port}!`); + logStrings.push(`Aztec Node v${version} is now ready for use in port ${port}!`); } else if (mode === SandboxMode.PXE) { // Code path for starting PXE only @@ -190,7 +189,7 @@ async function main() { logStrings.push(...accountLogStrings); } - logStrings.push(`PXE v${version} (noir ${NoirCommit}) is now ready for use in port ${PXE_PORT}!`); + logStrings.push(`PXE v${version} is now ready for use in port ${PXE_PORT}!`); } else if (mode === SandboxMode.P2PBootstrap) { // Code path for starting a P2P bootstrap node const config = getP2PConfigEnvVars(); diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index 8f05d08a139..f9800982b05 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -29,7 +29,6 @@ describe('Contract Class', () => { }; const mockNodeInfo: NodeInfo = { nodeVersion: 'vx.x.x', - compatibleNargoVersion: 'vx.x.x-aztec.x', chainId: 1, protocolVersion: 2, l1ContractAddresses: l1Addresses, diff --git a/yarn-project/cli/src/cmds/get_node_info.ts b/yarn-project/cli/src/cmds/get_node_info.ts index 4d98da411cd..2f14d5f5a24 100644 --- a/yarn-project/cli/src/cmds/get_node_info.ts +++ b/yarn-project/cli/src/cmds/get_node_info.ts @@ -10,7 +10,6 @@ export async function getNodeInfo(rpcUrl: string, debugLogger: DebugLogger, log: const info = await client.getNodeInfo(); log(`\nNode Info:\n`); log(`Node Version: ${info.nodeVersion}\n`); - log(`Compatible Nargo Version: ${info.compatibleNargoVersion}\n`); log(`Chain Id: ${info.chainId}\n`); log(`Protocol Version: ${info.protocolVersion}\n`); log(`Rollup Address: ${info.l1ContractAddresses.rollupAddress.toString()}`); diff --git a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts index 46411f3e3af..c03353a9a88 100644 --- a/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts +++ b/yarn-project/end-to-end/src/cli_docs_sandbox.test.ts @@ -30,7 +30,6 @@ describe('CLI docs sandbox', () => { Node Info: Node Version: #include_aztec_short_version -Compatible Nargo Version: #include_noir_version Chain Id: 31337 Protocol Version: 1 Rollup Address: 0x0dcd1bf9a1b36ce34237eeafef220932846bcd82 diff --git a/yarn-project/noir-compiler/package.json b/yarn-project/noir-compiler/package.json index 71c96a4db41..dc90ce3ca62 100644 --- a/yarn-project/noir-compiler/package.json +++ b/yarn-project/noir-compiler/package.json @@ -4,8 +4,7 @@ "type": "module", "exports": { ".": "./dest/index.js", - "./cli": "./dest/cli/index.js", - "./versions": "./dest/versions.js" + "./cli": "./dest/cli/index.js" }, "typedocOptions": { "entryPoints": [ @@ -49,7 +48,6 @@ "@aztec/foundation": "workspace:^", "@aztec/types": "workspace:^", "@iarna/toml": "^2.2.5", - "@noir-lang/noir_wasm": "portal:../../noir/packages/noir_wasm", "base64-js": "^1.5.1", "commander": "^9.0.0", "fs-extra": "^11.1.1", diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index 88416ef4282..a28e4f09303 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -1,4 +1,2 @@ -export * from './versions.js'; - export { generateTypescriptContractInterface } from './contract-interface-gen/typescript.js'; export { generateNoirContractInterface } from './contract-interface-gen/noir.js'; diff --git a/yarn-project/noir-compiler/src/noir-version.json b/yarn-project/noir-compiler/src/noir-version.json deleted file mode 100644 index e81ecb08315..00000000000 --- a/yarn-project/noir-compiler/src/noir-version.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "tag": "v0.18.0-aztec.5", - "commit": "6ca33a223ccce6a295414a3ce078180e8a22b68c" -} diff --git a/yarn-project/noir-compiler/src/versions.ts b/yarn-project/noir-compiler/src/versions.ts deleted file mode 100644 index 9cf6fd768b3..00000000000 --- a/yarn-project/noir-compiler/src/versions.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { readFile } from 'node:fs/promises'; - -import NoirVersion from './noir-version.json' assert { type: 'json' }; - -// read package.json at runtime instead of compile time so that we keep rootDir as-is in tsconfig -const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf-8')); - -export const NoirWasmVersion = pkg.dependencies['@noir-lang/noir_wasm']; -export const NoirTag = NoirVersion.tag; -export const NoirCommit = NoirVersion.commit; - -export { NoirVersion }; diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index 3350aea7d65..0d732971158 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -52,7 +52,6 @@ import { Fr } from '@aztec/foundation/fields'; import { SerialQueue } from '@aztec/foundation/fifo'; import { DebugLogger, createDebugLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; -import { NoirWasmVersion } from '@aztec/noir-compiler/versions'; import { NodeInfo } from '@aztec/types/interfaces'; import { PXEServiceConfig, getPackageInfo } from '../config/index.js'; @@ -488,7 +487,6 @@ export class PXEService implements PXE { const nodeInfo: NodeInfo = { nodeVersion: this.nodeVersion, - compatibleNargoVersion: NoirWasmVersion, chainId, protocolVersion: version, l1ContractAddresses: contractAddresses, diff --git a/yarn-project/types/src/interfaces/node-info.ts b/yarn-project/types/src/interfaces/node-info.ts index 1831263c0e3..48d77996d89 100644 --- a/yarn-project/types/src/interfaces/node-info.ts +++ b/yarn-project/types/src/interfaces/node-info.ts @@ -8,10 +8,6 @@ export interface NodeInfo { * Version as tracked in the aztec-packages repository. */ nodeVersion: string; - /** - * The nargo version compatible with this node version - */ - compatibleNargoVersion: string; /** * L1 chain id. */ diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index b5e32659fad..305751891f5 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -611,7 +611,6 @@ __metadata: "@aztec/types": "workspace:^" "@iarna/toml": ^2.2.5 "@jest/globals": ^29.5.0 - "@noir-lang/noir_wasm": "portal:../../noir/packages/noir_wasm" "@types/fs-extra": ^11.0.1 "@types/jest": ^29.5.0 "@types/lodash.camelcase": ^4.3.7 @@ -2814,14 +2813,6 @@ __metadata: languageName: node linkType: soft -"@noir-lang/noir_wasm@portal:../noir/packages/noir_wasm::locator=%40aztec%2Faztec3-packages%40workspace%3A.": - version: 0.0.0-use.local - resolution: "@noir-lang/noir_wasm@portal:../noir/packages/noir_wasm::locator=%40aztec%2Faztec3-packages%40workspace%3A." - dependencies: - pako: ^2.1.0 - languageName: node - linkType: soft - "@noir-lang/noirc_abi@portal:../noir/packages/noirc_abi::locator=%40aztec%2Faztec3-packages%40workspace%3A.": version: 0.0.0-use.local resolution: "@noir-lang/noirc_abi@portal:../noir/packages/noirc_abi::locator=%40aztec%2Faztec3-packages%40workspace%3A." From 52a93279e43ae6780e8bfc253ee0570a443ed472 Mon Sep 17 00:00:00 2001 From: ludamad Date: Thu, 18 Jan 2024 07:49:41 -0500 Subject: [PATCH 06/27] fix: upload_benchmarks_to_s3.sh missing exit (#4046) --- barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh b/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh index dc5d890704b..03603d20c03 100755 --- a/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh +++ b/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh @@ -14,6 +14,7 @@ elif [ -n "${PULL_REQUEST:-}" ]; then TARGET_FOLDER="barretenberg-bench-v1/pulls/${PULL_REQUEST##*/}" else echo Skipping upload since no target folder was defined + exit fi echo "Uploading to s3://$BUCKET_NAME/$TARGET_FOLDER" -aws s3 cp extracted-repo/src/barretenberg/cpp/build/ultra_honk_rounds_bench.json "s3://$BUCKET_NAME/$TARGET_FOLDER/ultra_honk_rounds_bench.json" \ No newline at end of file +aws s3 cp extracted-repo/src/barretenberg/cpp/build/ultra_honk_rounds_bench.json "s3://$BUCKET_NAME/$TARGET_FOLDER/ultra_honk_rounds_bench.json" From 52162eed9ace2726c143a34520115c8530876187 Mon Sep 17 00:00:00 2001 From: David Banks <47112877+dbanks12@users.noreply.github.com> Date: Thu, 18 Jan 2024 07:52:47 -0500 Subject: [PATCH 07/27] docs(yellowpaper): refresh of avm instruction set (#4081) - Misc cleanup - Recategorized and *reordered* instructions - Updated instruction expressions to match context structure in high-level spec - Removed opcode numbers from section titles as it makes links ugly - Removed opcode numbers from images so they don't need to be regenerated for now - `in-tag` -> `inTag`, same with `dstTag` - Intro Instruction Set section with some relevant notes - Removed misc `*ROOT` opcodes in favor of `BLOCKHEADERBYNUM` opcode - Cleanup in high-level avm spec --- .../acir-simulator/src/avm/opcodes/opcodes.ts | 101 +- yellow-paper/docs/public-vm/avm.md | 55 +- .../docs/public-vm/gen/_InstructionSet.mdx | 1367 +++++++++-------- .../public-vm/gen/images/bit-formats/ADD.png | Bin 5422 -> 5314 bytes .../gen/images/bit-formats/ADDRESS.png | Bin 3561 -> 3593 bytes .../public-vm/gen/images/bit-formats/AND.png | Bin 5445 -> 5324 bytes .../images/bit-formats/BLOCKDAGASLIMIT.png | Bin 0 -> 3694 bytes .../images/bit-formats/BLOCKHEADERBYNUM.png | Bin 0 -> 4570 bytes .../images/bit-formats/BLOCKL1GASLIMIT.png | Bin 3541 -> 3686 bytes .../images/bit-formats/BLOCKL2GASLIMIT.png | Bin 3564 -> 3698 bytes .../gen/images/bit-formats/BLOCKNUMBER.png | Bin 3517 -> 3710 bytes .../gen/images/bit-formats/BLOCKSROOT.png | Bin 4449 -> 0 bytes .../public-vm/gen/images/bit-formats/CALL.png | Bin 8813 -> 8731 bytes .../gen/images/bit-formats/CALLDATACOPY.png | Bin 5315 -> 5491 bytes .../gen/images/bit-formats/CALLDEPTH.png | Bin 3552 -> 0 bytes .../gen/images/bit-formats/CALLER.png | Bin 3546 -> 0 bytes .../public-vm/gen/images/bit-formats/CAST.png | Bin 4686 -> 4652 bytes .../gen/images/bit-formats/CHAINID.png | Bin 3521 -> 3546 bytes .../public-vm/gen/images/bit-formats/CMOV.png | Bin 5853 -> 5835 bytes .../gen/images/bit-formats/COINBASE.png | Bin 3542 -> 3627 bytes .../images/bit-formats/CONTRACTCALLDEPTH.png | Bin 0 -> 3667 bytes .../gen/images/bit-formats/CONTRACTSROOT.png | Bin 4467 -> 0 bytes .../gen/images/bit-formats/DAGASLEFT.png | Bin 0 -> 3583 bytes .../public-vm/gen/images/bit-formats/DIV.png | Bin 5438 -> 5307 bytes .../gen/images/bit-formats/EMITNOTEHASH.png | Bin 3653 -> 3734 bytes .../gen/images/bit-formats/EMITNULLIFIER.png | Bin 3593 -> 3647 bytes .../images/bit-formats/EMITUNENCRYPTEDLOG.png | Bin 0 -> 4501 bytes .../public-vm/gen/images/bit-formats/EQ.png | Bin 5438 -> 5318 bytes .../gen/images/bit-formats/FEEPERDAGAS.png | Bin 0 -> 3650 bytes .../gen/images/bit-formats/FEEPERL1GAS.png | Bin 3539 -> 3636 bytes .../gen/images/bit-formats/FEEPERL2GAS.png | Bin 3553 -> 3650 bytes .../gen/images/bit-formats/GLOBALSHASH.png | Bin 4450 -> 0 bytes .../gen/images/bit-formats/GRANDROOT.png | Bin 4453 -> 0 bytes .../gen/images/bit-formats/INTERNALRETURN.png | Bin 0 -> 1955 bytes .../public-vm/gen/images/bit-formats/JUMP.png | Bin 2873 -> 2764 bytes .../gen/images/bit-formats/JUMPI.png | Bin 4232 -> 4181 bytes .../gen/images/bit-formats/L1GAS.png | Bin 3554 -> 0 bytes .../gen/images/bit-formats/L1GASLEFT.png | Bin 0 -> 3566 bytes .../gen/images/bit-formats/L2GAS.png | Bin 3565 -> 0 bytes .../gen/images/bit-formats/L2GASLEFT.png | Bin 0 -> 3583 bytes .../public-vm/gen/images/bit-formats/LT.png | Bin 5422 -> 5234 bytes .../public-vm/gen/images/bit-formats/LTE.png | Bin 5441 -> 5255 bytes .../public-vm/gen/images/bit-formats/MOV.png | Bin 4293 -> 4204 bytes .../gen/images/bit-formats/MSGSROOT.png | Bin 4441 -> 0 bytes .../public-vm/gen/images/bit-formats/MUL.png | Bin 0 -> 5274 bytes .../public-vm/gen/images/bit-formats/NOT.png | Bin 4670 -> 4529 bytes .../gen/images/bit-formats/NOTESROOT.png | Bin 4464 -> 0 bytes .../gen/images/bit-formats/NULLIFIERSROOT.png | Bin 4462 -> 0 bytes .../public-vm/gen/images/bit-formats/OR.png | Bin 5424 -> 5312 bytes .../gen/images/bit-formats/ORIGIN.png | Bin 3550 -> 3548 bytes .../gen/images/bit-formats/PORTAL.png | Bin 3547 -> 3546 bytes .../gen/images/bit-formats/PUBLICDATAROOT.png | Bin 4473 -> 0 bytes .../gen/images/bit-formats/READL1TOL2MSG.png | Bin 0 -> 5724 bytes .../gen/images/bit-formats/REFUNDEE.png | Bin 3553 -> 0 bytes .../gen/images/bit-formats/RETURN.png | Bin 4341 -> 4324 bytes .../gen/images/bit-formats/REVERT.png | Bin 4341 -> 4319 bytes .../gen/images/bit-formats/SENDER.png | Bin 0 -> 3558 bytes .../gen/images/bit-formats/SENDL2TOL1MSG.png | Bin 3591 -> 4670 bytes .../public-vm/gen/images/bit-formats/SET.png | Bin 6614 -> 6516 bytes .../public-vm/gen/images/bit-formats/SHL.png | Bin 5419 -> 5314 bytes .../public-vm/gen/images/bit-formats/SHR.png | Bin 5425 -> 5354 bytes .../gen/images/bit-formats/SLOAD.png | Bin 4292 -> 4327 bytes .../gen/images/bit-formats/SSTORE.png | Bin 4329 -> 4354 bytes .../gen/images/bit-formats/STATICCALL.png | Bin 8813 -> 8847 bytes .../gen/images/bit-formats/STORAGEADDRESS.png | Bin 0 -> 3683 bytes .../public-vm/gen/images/bit-formats/SUB.png | Bin 5414 -> 5353 bytes .../gen/images/bit-formats/TIMESTAMP.png | Bin 3552 -> 3587 bytes .../public-vm/gen/images/bit-formats/ULOG.png | Bin 4435 -> 0 bytes .../gen/images/bit-formats/VERSION.png | Bin 3530 -> 3599 bytes .../public-vm/gen/images/bit-formats/XOR.png | Bin 5451 -> 5345 bytes .../gen/images/bit-formats/internalcall.png | Bin 0 -> 2934 bytes .../docs/public-vm/instruction-set.mdx | 8 + yellow-paper/docs/public-vm/state-model.md | 20 +- .../InstructionSet/InstructionSet.js | 944 +++++------- .../preprocess/InstructionSet/genMarkdown.js | 3 +- 75 files changed, 1217 insertions(+), 1281 deletions(-) create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CONTRACTCALLDEPTH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/CONTRACTSROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERDAGAS.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALRETURN.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L1GASLEFT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L2GAS.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/NOTESROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/SENDER.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png delete mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/ULOG.png create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index c277c055628..2a7fa5a1758 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -1,48 +1,38 @@ /** - * All avm opcodes + * All AVM opcodes */ export enum Opcodes { - // Arithmetic + // Compute + // Compute - Arithmetic ADD, SUB, MUL, DIV, + // Compute - Comparators EQ, LT, LTE, + // Compute - Bitwise AND, OR, XOR, NOT, SHL, SHR, + // Compute - Type Conversions CAST, - // Memory - SET, - MOV, - CMOV, - CALLDATACOPY, - - // Logs - EMITNOTEHASH, - EMITNULLIFIER, - SENDL2TOL1MSG, - ULOG, - // Control flow - JUMP, - JUMPI, - INTERNALCALL, - INTERNALRETURN, - - // Storage - SLOAD, - SSTORE, - // Contract call control flow - RETURN, - REVERT, - CALL, - STATICCALL, + // Execution Environment + ADDRESS, + STORAGEADDRESS, + ORIGIN, + SENDER, + PORTAL, + FEEPERL1GAS, + FEEPERL2GAS, + FEEPERDAGAS, + CONTRACTCALLDEPTH, + // Execution Environment - Globals CHAINID, VERSION, BLOCKNUMBER, @@ -50,28 +40,45 @@ export enum Opcodes { COINBASE, BLOCKL1GASLIMIT, BLOCKL2GASLIMIT, - NULLIFIERSOOT, - CONTRACTSROOT, - MSGSROOT, - NOTESROOT, - PUBLICDATAROOT, - GLOBALSHASH, - BLOCKSROOT, - GRANDROOT, + BLOCKDAGASLIMIT, + // Execution Environment - Calldata + CALLDATACOPY, - // Call context - ORIGIN, - REFUNDEE, - FEEPERL1GAS, - FEEPERL2GAS, - CALLER, - ADDRESS, - PORTAL, - CALLDEPTH, - l1GAS, - L2GAS, + // Machine State + // Machine State - Gas + L1GASLEFT, + L2GASLEFT, + DAGASLEFT, + // Machine State - Internal Control Flow + JUMP, + JUMPI, + INTERNALCALL, + INTERNALRETURN, + INTERNALCALLDEPTH, + // Machine State - Memory + SET, + MOV, + CMOV, + + // World State + BLOCKHEADERBYNUMBER, + SLOAD, // Public Storage + SSTORE, // Public Storage + READL1TOL2MSG, // Messages + SENDL2TOL1MSG, // Messages + EMITNOTEHASH, // Notes & Nullifiers + EMITNULLIFIER, // Notes & Nullifiers + + // Accrued Substate + EMITUNENCRYPTEDLOG, + + // Control Flow - Contract Calls + CALL, + STATICCALL, + RETURN, + REVERT, - // Black box + // Gadgets KECCAK, POSEIDON, } diff --git a/yellow-paper/docs/public-vm/avm.md b/yellow-paper/docs/public-vm/avm.md index 2f06f409f1e..b3417afcb29 100644 --- a/yellow-paper/docs/public-vm/avm.md +++ b/yellow-paper/docs/public-vm/avm.md @@ -22,7 +22,7 @@ A **caller** is a contract call's initiator. The caller of an initial contract c - [**Public contract bytecode**](#public-contract-bytecode) (aka AVM bytecode) - [**Execution context**](#execution-context), outlining the AVM's environment and state -- [**Execution**](#execution), outlining control flow, gas tracking, halting, and reverting +- [**Execution**](#execution), outlining control flow, gas tracking, normal halting, and exceptional halting - [**Initial contract calls**](#initial-contract-calls), outlining the initiation of a contract call from a public execution request - [**Nested contract calls**](#nested-contract-calls), outlining the initiation of a contract call from an instruction as well as the processing of nested execution results, gas refunds, and state reverts @@ -69,14 +69,13 @@ ExecutionEnvironment { address: AztecAddress, storageAddress: AztecAddress, origin: AztecAddress, - l1GasPrice: field, - l2GasPrice: field, - daGasPrice: field, sender: AztecAddress, portal: AztecAddress, - blockHeader: BlockHeader, - globalVariables: PublicGlobalVariables, + feePerL1Gas: field, + feePerL2Gas: field, + feePerDaGas: field, contractCallDepth: field, + globals: PublicGlobalVariables, isStaticCall: boolean, isDelegateCall: boolean, calldata: [field; ], @@ -95,7 +94,7 @@ MachineState { daGasLeft: field, pc: field = 0, internalCallStack: Vector = [], // initialized as empty - memory: [field; 32768] = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory: [field; 2^32] = [0, ..., 0], // all 2^32 entries are initialized to zero } ``` @@ -121,7 +120,7 @@ WorldState { contracts: AztecAddress => {bytecode, portalAddress}, // read-only from within AVM blockHeaders: Vector, // read-only from within AVM publicStorage: (AztecAddress, field) => value, // read/write - l1ToL2Messages: (AztecAddress, field) => message, // read-only from within AVM + l1ToL2Messages: field => message, // read-only from within AVM l2ToL1Messages: Vector<[field; ]>, // append-only (no reads) from within AVM noteHashes: Vector, // append-only (no reads) from within AVM nullifiers: Vector, // append-only (no reads) from within AVM @@ -217,7 +216,7 @@ machineState.daGasLeft = 0 An instruction's gas cost is meant to reflect the computational cost of generating a proof of its correct execution. For some instructions, this computational cost changes based on inputs. Here are some examples and important notes: - [`JUMP`](./instruction-set/#isa-section-jump) is an example of an instruction with constant gas cost. Regardless of its inputs, the instruction always incurs the same `l1GasCost`, `l2GasCost`, and `daGasCost`. -- The [`SET`](./instruction-set/#isa-section-set) instruction operates on a different sized constant (based on its `dst-type`). Therefore, this instruction's gas cost increases with the size of its input. +- The [`SET`](./instruction-set/#isa-section-set) instruction operates on a different sized constant (based on its `dstTag`). Therefore, this instruction's gas cost increases with the size of its input. - Instructions that operate on a data range of a specified "size" scale in cost with that size. An example of this is the [`CALLDATACOPY`](./instruction-set/#isa-section-calldatacopy) argument which copies `copySize` words from `environment.calldata` to `machineState.memory`. - The [`CALL`](./instruction-set/#isa-section-call)/[`STATICCALL`](./instruction-set/#isa-section-call)/`DELEGATECALL` instruction's gas cost is determined by its `*Gas` arguments, but any gas unused by the nested contract call's execution is refunded after its completion ([more on this later](#updating-the-calling-context-after-nested-call-halts)). - An instruction with "offset" arguments (like [`ADD`](./instruction-set/#isa-section-add) and many others), has increased cost for each offset argument that is flagged as "indirect". @@ -226,11 +225,11 @@ An instruction's gas cost is meant to reflect the computational cost of generati > An instruction's gas cost takes into account the costs of associated downstream computations. An instruction that triggers accesses to the public data tree (`SLOAD`/`SSTORE`) incurs a cost that accounts for state access validation in later circuits (public kernel or rollup). A contract call instruction (`CALL`/`STATICCALL`/`DELEGATECALL`) incurs a cost accounting for the nested call's complete execution as well as any work required by the public kernel circuit for this additional call. -## Halting +### Halting A context's execution can end with a **normal halt** or **exceptional halt**. A halt ends execution within the current context and returns control flow to the calling context. -### Normal halting +#### Normal halting A normal halt occurs when the VM encounters an explicit halting instruction ([`RETURN`](./instruction-set#isa-section-return) or [`REVERT`](./instruction-set#isa-section-revert)). Such instructions consume gas normally and optionally initialize some output data before finally halting the current context's execution. @@ -246,7 +245,7 @@ results.output = machineState.memory[instr.args.retOffset:instr.args.retOffset+i > `results.output` is only relevant when the caller is a contract call itself. In other words, it is only relevant for [nested contract calls](#nested-contract-calls). When an [initial contract call](#initial-contract-calls) (initiated by a public execution request) halts normally, its `results.output` is ignored. -### Exceptional halting +#### Exceptional halting An exceptional halt is not explicitly triggered by an instruction but instead occurs when an exceptional condition is met. @@ -352,7 +351,7 @@ context = AvmContext { worldState = , journal = INITIAL_JOURNAL, accruedSubstate = INITIAL_ACCRUED_SUBSTATE, - results = INITIAL_MESSAGE_CALL_RESULTS, + results = INITIAL_CONTRACT_CALL_RESULTS, } ``` @@ -365,14 +364,13 @@ INITIAL_EXECUTION_ENVIRONMENT = ExecutionEnvironment { address = PublicCallRequest.contractAddress, storageAddress = PublicCallRequest.CallContext.storageContractAddress, origin = TxRequest.origin, - l1GasPrice = TxRequest.l1GasPrice, - l2GasPrice = TxRequest.l2GasPrice, - daGasPrice = TxRequest.daGasPrice, sender = PublicCallRequest.CallContext.msgSender, portal = PublicCallRequest.CallContext.portalContractAddress, - blockHeader = , - globalVariables = + feePerL1Gas = TxRequest.feePerL1Gas, + feePerL2Gas = TxRequest.feePerL2Gas, + feePerDaGas = TxRequest.feePerDaGas, contractCallDepth = 0, + globals = isStaticCall = PublicCallRequest.CallContext.isStaticCall, isDelegateCall = PublicCallRequest.CallContext.isDelegateCall, calldata = PublicCallRequest.args, @@ -385,7 +383,7 @@ INITIAL_MACHINE_STATE = MachineState { daGasLeft = TxRequest.daGasLimit, pc = 0, internalCallStack = [], // initialized as empty - memory = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory = [0, ..., 0], // all 2^32 entries are initialized to zero } INITIAL_JOURNAL = Journal { @@ -402,7 +400,7 @@ INITIAL_ACCRUED_SUBSTATE = AccruedSubstate { unencryptedLogs = [], // initialized as empty } -INITIAL_MESSAGE_CALL_RESULTS = ContractCallResults { +INITIAL_CONTRACT_CALL_RESULTS = ContractCallResults { reverted = false, output = [], // initialized as empty } @@ -423,7 +421,7 @@ nestedContext = AvmContext { worldState: callingContext.worldState, journal: callingContext.journal, accruedSubstate: INITIAL_ACCRUED_SUBSTATE, - results: INITIAL_MESSAGE_CALL_RESULTS, + results: INITIAL_CONTRACT_CALL_RESULTS, } ``` @@ -442,17 +440,16 @@ calldataStart = instr.args.argsOffset calldataEnd = calldataStart + instr.args.argsSize nestedExecutionEnvironment = ExecutionEnvironment { - address: instr.args.addr, - storageAddress: isDelegateCall ? callingContext.environment.storageAddress : instr.args.addr, origin: callingContext.origin, - l1GasPrice: callingContext.l1GasPrice, - l2GasPrice: callingContext.l2GasPrice, - daGasPrice: callingContext.daGasPrice, sender: callingContext.address, + address: instr.args.addr, + storageAddress: isDelegateCall ? callingContext.environment.storageAddress : instr.args.addr, portal: contract.portal, - blockHeader: callingContext.blockHeader, - globalVariables: callingContext.globalVariables, + feePerL1Gas: callingContext.feePerL1Gas, + feePerL2Gas: callingContext.feePerL2Gas, + feePerDaGas: callingContext.feePerDaGas, contractCallDepth: callingContext.contractCallDepth + 1, + globals: callingContext.globals, isStaticCall: isStaticCall, isDelegateCall: isDelegateCall, calldata: callingContext.memory[calldataStart:calldataEnd], @@ -465,7 +462,7 @@ nestedMachineState = MachineState { daGasLeft: callingContext.machineState.memory[instr.args.gasOffset+2], pc = 0, internalCallStack = [], // initialized as empty - memory = [0, ..., 0], // all 32768 (2^32) entries are initialized to zero + memory = [0, ..., 0], // all 2^32 entries are initialized to zero } ``` > The nested context's machine state's `*GasLeft` is initialized based on the call instruction's `gasOffset` argument. The caller allocates some amount of L1, L2, and DA gas to the nested call. It does so using the instruction's `gasOffset` argument. In particular, prior to the contract call instruction, the caller populates `M[gasOffset]` with the nested context's initial `l1GasLeft`. Likewise it populates `M[gasOffset+1]` with `l2GasLeft` and `M[gasOffset+2]` with `daGasLeft`. diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx index c362c88b840..4a28d65d2da 100644 --- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx +++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx @@ -31,7 +31,7 @@ Click on an instruction name to jump to its section. 0x02 [`MUL`](#isa-section-mul) - Subtraction (a - b) + Multiplication (a * b) 128 { `M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k` @@ -122,1330 +122,1377 @@ Click on an instruction name to jump to its section. Type cast 96 { - `M[dstOffset] = cast(M[aOffset])` + `M[dstOffset] = cast(M[aOffset])` } - 0x0e [`SET`](#isa-section-set) - Set a memory word from a constant in the bytecode. - 64+N + 0x0e [`ADDRESS`](#isa-section-address) + Get the address of the currently executing l2 contract + 56 { - `M[dstOffset] = const` + `M[dstOffset] = context.environment.address` } - 0x0f [`MOV`](#isa-section-mov) - Move a word from source memory location to destination`. - 88 + 0x0f [`STORAGEADDRESS`](#isa-section-storageaddress) + Get the _storage_ address of the currently executing context + 56 { - `M[dstOffset] = M[srcOffset]` + `M[dstOffset] = context.environment.storageAddress` } - 0x10 [`CMOV`](#isa-section-cmov) - Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). - 152 + 0x10 [`ORIGIN`](#isa-section-origin) + Get the transaction's origination address + 56 { - `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` + `M[dstOffset] = context.environment.origin` } - 0x11 [`CALLDATACOPY`](#isa-section-calldatacopy) - Copy calldata into memory. - 120 + 0x11 [`SENDER`](#isa-section-sender) + Get the address of the sender (caller of the current context) + 56 { - `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]` + `M[dstOffset] = context.environment.sender` } - 0x12 [`SLOAD`](#isa-section-sload) - Load a word from storage. - 88 + 0x12 [`PORTAL`](#isa-section-portal) + Get the address of the l1 portal contract + 56 { - `M[dstOffset] = storage[M[slotOffset]]` + `M[dstOffset] = context.environment.portal` } - 0x13 [`SSTORE`](#isa-section-sstore) - Write a word to storage. - 88 + 0x13 [`FEEPERL1GAS`](#isa-section-feeperl1gas) + Get the fee to be paid per "L1 gas" - constant for entire transaction + 56 { - `storage[M[slotOffset]] = M[srcOffset]` + `M[dstOffset] = context.environment.feePerL1Gas` } - 0x14 [`EMITNOTEHASH`](#isa-section-emitnotehash) - Emit a new note hash to be inserted into the notes tree + 0x14 [`FEEPERL2GAS`](#isa-section-feeperl2gas) + Get the fee to be paid per "L2 gas" - constant for entire transaction 56 - emitNoteHash(M[contentOffset]) + { + `M[dstOffset] = context.environment.feePerL2Gas` + } - 0x15 [`EMITNULLIFIER`](#isa-section-emitnullifier) - Emit a new nullifier to be inserted into the nullifier tree + 0x15 [`FEEPERDAGAS`](#isa-section-feeperdagas) + Get the fee to be paid per "DA gas" - constant for entire transaction 56 - emitNullifier(M[nullifierOffset]) + { + `M[dstOffset] = context.environment.feePerDaGas` + } - 0x16 [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) - Send an L2-to-L1 message + 0x16 [`CONTRACTCALLDEPTH`](#isa-section-contractcalldepth) + Get how many contract calls deep the current call context is 56 - sendL2ToL1Message(M[contentOffset]) - - - 0x17 [`JUMP`](#isa-section-jump) - Jump to a location in the bytecode. - 48 { - `PC = loc` + `M[dstOffset] = context.environment.contractCallDepth` } - 0x18 [`JUMPI`](#isa-section-jumpi) - Conditionally jump to a location in the bytecode. - 88 + 0x17 [`CHAINID`](#isa-section-chainid) + Get this rollup's L1 chain ID + 56 { - `PC = M[condOffset] > 0 ? loc : PC` + `M[dstOffset] = context.environment.globals.chainId` } - 0x19 [`RETURN`](#isa-section-return) - Halt execution with `success`, optionally returning some data. - 88 + 0x18 [`VERSION`](#isa-section-version) + Get this rollup's L2 version ID + 56 { - `return(M[retOffset:retOffset+retSize])` + `M[dstOffset] = context.environment.globals.version` } - 0x1a [`REVERT`](#isa-section-revert) - Halt execution with `failure`, reverting state changes and optionally returning some data. - 88 + 0x19 [`BLOCKNUMBER`](#isa-section-blocknumber) + Get this L2 block's number + 56 { - `revert(M[retOffset:retOffset+retSize])` + `M[dstOffset] = context.environment.globals.blocknumber` } - 0x1b [`CALL`](#isa-section-call) - Call into another contract. - 248 - -{`M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - - - - 0x1c [`STATICCALL`](#isa-section-staticcall) - Call into another contract, disallowing persistent state modifications. - 248 - -{`M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - + 0x1a [`TIMESTAMP`](#isa-section-timestamp) + Get this L2 block's timestamp + 56 + { + `M[dstOffset] = context.environment.globals.timestamp` + } - 0x1d [`ULOG`](#isa-section-ulog) - Emit an unencrypted log with data from the `field` memory page - 88 + 0x1b [`COINBASE`](#isa-section-coinbase) + Get the block's beneficiary address + 56 { - `ulog(M[logOffset:logOffset+logSize])` + `M[dstOffset] = context.environment.globals.coinbase` } - 0x1e [`CHAINID`](#isa-section-chainid) - Get this rollup's L1 chain ID + 0x1c [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) + Total amount of "L1 gas" that a block can consume 56 { - `M[dstOffset] = Globals.chainId` + `M[dstOffset] = context.environment.globals.l1GasLimit` } - 0x1f [`VERSION`](#isa-section-version) - Get this rollup's L2 version ID + 0x1d [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) + Total amount of "L2 gas" that a block can consume 56 { - `M[dstOffset] = Globals.version` + `M[dstOffset] = context.environment.globals.l2GasLimit` } - 0x20 [`BLOCKNUMBER`](#isa-section-blocknumber) - Get this block's number + 0x1e [`BLOCKDAGASLIMIT`](#isa-section-blockdagaslimit) + Total amount of "DA gas" that a block can consume 56 { - `M[dstOffset] = Globals.blocknumber` + `M[dstOffset] = context.environment.globals.daGasLimit` } - 0x21 [`TIMESTAMP`](#isa-section-timestamp) - Get this L2 block's timestamp - 56 + 0x1f [`CALLDATACOPY`](#isa-section-calldatacopy) + Copy calldata into memory + 120 { - `M[dstOffset] = Globals.timestamp` + `M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]` } - 0x22 [`COINBASE`](#isa-section-coinbase) - Get the block's beneficiary address + 0x20 [`L1GASLEFT`](#isa-section-l1gasleft) + Remaining "L1 gas" for this call (after this instruction) 56 { - `M[dstOffset] = Globals.coinbase` + `M[dstOffset] = context.machineState.l1GasLeft` } - 0x23 [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) - Total amount of "L1 gas" that a block can consume + 0x21 [`L2GASLEFT`](#isa-section-l2gasleft) + Remaining "L2 gas" for this call (after this instruction) 56 { - `M[dstOffset] = Globals.l1GasLimit` + `M[dstOffset] = context.MachineState.l2GasLeft` } - 0x24 [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) - Total amount of "L2 gas" that a block can consume + 0x22 [`DAGASLEFT`](#isa-section-dagasleft) + Remaining "DA gas" for this call (after this instruction) 56 { - `M[dstOffset] = Globals.l2GasLimit` + `M[dstOffset] = context.machineState.daGasLeft` } - 0x25 [`NOTESROOT`](#isa-section-notesroot) - Get the historical note-hash tree root as of the specified block number. - 88 + 0x23 [`JUMP`](#isa-section-jump) + Jump to a location in the bytecode + 48 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root` + `context.machineState.pc = loc` } - 0x26 [`NULLIFIERSROOT`](#isa-section-nullroot) - Get the historical nullifier tree root as of the specified block number. + 0x24 [`JUMPI`](#isa-section-jumpi) + Conditionally jump to a location in the bytecode 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root` + `context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc` } - 0x27 [`CONTRACTSROOT`](#isa-section-contractsroot) - Get the historical contracts tree root as of the specified block number. - 88 + 0x25 [`INTERNALCALL`](#isa-section-internalcall) + Make an internal call. Push the current PC to the internal call stack and jump to the target location. + 48 + +{`context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc`} + + + + 0x26 [`INTERNALRETURN`](#isa-section-internalreturn) + Return from an internal call. Pop from the internal call stack and jump to the popped location. + 16 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root` + `context.machineState.pc = context.machineState.internalCallStack.pop()` } - 0x28 [`MSGSROOT`](#isa-section-msgsroot) - Get the historical l1-to-l2 message tree root as of the specified block number. - 88 + 0x27 [`SET`](#isa-section-set) + Set a memory word from a constant in the bytecode + 64+N { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root` + `M[dstOffset] = const` } - 0x29 [`PUBLICDATAROOT`](#isa-section-publicdataroot) - Get the historical public data tree root as of the specified block number. + 0x28 [`MOV`](#isa-section-mov) + Move a word from source memory location to destination 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root` + `M[dstOffset] = M[srcOffset]` } - 0x2a [`GLOBALSHASH`](#isa-section-globalshash) - Get the historical global variables hash as of the specified block number. - 88 + 0x29 [`CMOV`](#isa-section-cmov) + Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`) + 152 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash` + `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` } - 0x2b [`BLOCKSROOT`](#isa-section-blocksroot) - Get the historical blocks tree root as of the specified block number. + 0x2a [`BLOCKHEADERBYNUM`](#isa-section-blockheaderbynum) + Get the block header as of the specified block number 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root` + `M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]` } - 0x2c [`GRANDROOT`](#isa-section-grandroot) - Get the historical grandfather tree root as of the specified block number. + 0x2b [`SLOAD`](#isa-section-sload) + Load a word from storage 88 { - `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root` + `M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]` } - 0x2d [`ORIGIN`](#isa-section-origin) - Get the transaction's origination address - 56 + 0x2c [`SSTORE`](#isa-section-sstore) + Write a word to storage + 88 { - `M[dstOffset] = TxContext.origin` + `context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]` } - 0x2e [`REFUNDEE`](#isa-section-refundee) - The recipient of fee refunds for this transaction - 56 + 0x2d [`READL1TOL2MSG`](#isa-section-readl1tol2msg) + Reads an L1-to-L2 message + 120 { - `M[dstOffset] = TxContext.refundee` + `M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])` } - 0x2f [`FEEPERL1GAS`](#isa-section-feeperl1gas) - The fee to be paid per "L1 gas" - set by the transaction's original caller - 56 + 0x2e [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) + Send an L2-to-L1 message + 88 { - `M[dstOffset] = TxContext.feePerL1Gas` + `context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])` } - 0x30 [`FEEPERL2GAS`](#isa-section-feeperl2gas) - The fee to be paid per "L2 gas" - set by the transaction's original caller + 0x2f [`EMITNOTEHASH`](#isa-section-emitnotehash) + Emit a new note hash to be inserted into the notes tree 56 { - `M[dstOffset] = TxContext.feePerL2Gas` + `context.worldState.newHashes.append(M[noteHashOffset])` } - 0x31 [`CALLER`](#isa-section-caller) - Get the address of the sender (the caller's context) + 0x30 [`EMITNULLIFIER`](#isa-section-emitnullifier) + Emit a new nullifier to be inserted into the nullifier tree 56 { - `M[dstOffset] = CallContext.sender` + `context.worldState.nullifiers.append(M[nullifierOffset])` } - 0x32 [`ADDRESS`](#isa-section-address) - Get the address of the currently executing l2 contract - 56 + 0x31 [`EMITUNENCRYPTEDLOG`](#isa-section-emitunencryptedlog) + Emit an unencrypted log + 88 { - `M[dstOffset] = CallContext.storageContractAddress` + `context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])` } - 0x33 [`PORTAL`](#isa-section-portal) - Get the address of the l1 portal contract - 56 - { - `M[dstOffset] = CallContext.portalAddress` - } + 0x32 [`CALL`](#isa-section-call) + Call into another contract + 248 + +{`M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + - 0x34 [`CALLDEPTH`](#isa-section-calldepth) - Get how many calls deep the current call context is - 56 - { - `M[dstOffset] = CallContext.calldepth` - } + 0x33 [`STATICCALL`](#isa-section-staticcall) + Call into another contract, disallowing World State and Accrued Substate modifications + 248 + +{`M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + - 0x35 [`L1GAS`](#isa-section-l1gas) - Remaining "L1 gas" for this call (after this instruction). - 56 - { - `M[dstOffset] = LatestContext.l1Gas` - } + 0x34 [`RETURN`](#isa-section-return) + Halt execution within this context (without revert), optionally returning some data + 88 + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt`} + - 0x36 [`L2GAS`](#isa-section-l2gas) - Remaining "L2 gas" for this call (after this instruction). - 56 - { - `M[dstOffset] = LatestContext.l2Gas` - } + 0x35 [`REVERT`](#isa-section-revert) + Halt execution within this context as `reverted`, optionally returning some data + 88 + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt`} + ## Instructions -### `ADD` (0x00) +### `ADD` Addition (a + b) [See in table.](#isa-table-add) -- **Category**: arithmetic +- **Opcode**: 0x00 +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/ADD.png)](./images/bit-formats/ADD.png) -### `SUB` (0x01) +### `SUB` Subtraction (a - b) [See in table.](#isa-table-sub) -- **Category**: arithmetic +- **Opcode**: 0x01 +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SUB.png)](./images/bit-formats/SUB.png) -### `MUL` (0x02) -Subtraction (a - b) +### `MUL` +Multiplication (a * b) [See in table.](#isa-table-mul) -- **Category**: arithmetic +- **Opcode**: 0x02 +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 +[![](./images/bit-formats/MUL.png)](./images/bit-formats/MUL.png) -### `DIV` (0x03) +### `DIV` Unsigned division (a / b) [See in table.](#isa-table-div) -- **Category**: arithmetic +- **Opcode**: 0x03 +- **Category**: Compute - Arithmetic - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] / M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/DIV.png)](./images/bit-formats/DIV.png) -### `EQ` (0x04) +### `EQ` Equality check (a == b) [See in table.](#isa-table-eq) -- **Category**: conditional +- **Opcode**: 0x04 +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/EQ.png)](./images/bit-formats/EQ.png) -### `LT` (0x05) +### `LT` Less-than check (a < b) [See in table.](#isa-table-lt) -- **Category**: conditional +- **Opcode**: 0x05 +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/LT.png)](./images/bit-formats/LT.png) -### `LTE` (0x06) +### `LTE` Less-than-or-equals check (a <= b) [See in table.](#isa-table-lte) -- **Category**: conditional +- **Opcode**: 0x06 +- **Category**: Compute - Comparators - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/LTE.png)](./images/bit-formats/LTE.png) -### `AND` (0x07) +### `AND` Bitwise AND (a & b) [See in table.](#isa-table-and) -- **Category**: bitwise +- **Opcode**: 0x07 +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] AND M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/AND.png)](./images/bit-formats/AND.png) -### `OR` (0x08) +### `OR` Bitwise OR (a | b) [See in table.](#isa-table-or) -- **Category**: bitwise +- **Opcode**: 0x08 +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] OR M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/OR.png)](./images/bit-formats/OR.png) -### `XOR` (0x09) +### `XOR` Bitwise XOR (a ^ b) [See in table.](#isa-table-xor) -- **Category**: bitwise +- **Opcode**: 0x09 +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] XOR M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/XOR.png)](./images/bit-formats/XOR.png) -### `NOT` (0x0a) +### `NOT` Bitwise NOT (inversion) [See in table.](#isa-table-not) -- **Category**: bitwise +- **Opcode**: 0x0a +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = NOT M[aOffset]` -- **Tag checks**: `T[aOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 96 [![](./images/bit-formats/NOT.png)](./images/bit-formats/NOT.png) -### `SHL` (0x0b) +### `SHL` Bitwise leftward shift (a << b) [See in table.](#isa-table-shl) -- **Category**: bitwise +- **Opcode**: 0x0b +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] << M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SHL.png)](./images/bit-formats/SHL.png) -### `SHR` (0x0c) +### `SHR` Bitwise rightward shift (a >> b) [See in table.](#isa-table-shr) -- **Category**: bitwise +- **Opcode**: 0x0c +- **Category**: Compute - Bitwise - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. + - **inTag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. - **Args**: - **aOffset**: memory offset of the operation's left input - **bOffset**: memory offset of the operation's right input - **dstOffset**: memory offset specifying where to store operation's result - **Expression**: `M[dstOffset] = M[aOffset] >> M[bOffset]` -- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag` -- **Tag updates**: `T[dstOffset] = in-tag` +- **Tag checks**: `T[aOffset] == T[bOffset] == inTag` +- **Tag updates**: `T[dstOffset] = inTag` - **Bit-size**: 128 [![](./images/bit-formats/SHR.png)](./images/bit-formats/SHR.png) -### `CAST` (0x0d) +### `CAST` Type cast [See in table.](#isa-table-cast) -- **Category**: types +- **Opcode**: 0x0d +- **Category**: Type Conversions - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **dst-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against. + - **dstTag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against. - **Args**: - **aOffset**: memory offset of word to cast - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = cast(M[aOffset])` -- **Details**: Cast a word in memory based on the `dst-tag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details. -- **Tag updates**: `T[dstOffset] = dst-tag` +- **Expression**: `M[dstOffset] = cast(M[aOffset])` +- **Details**: Cast a word in memory based on the `dstTag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details. +- **Tag updates**: `T[dstOffset] = dstTag` - **Bit-size**: 96 [![](./images/bit-formats/CAST.png)](./images/bit-formats/CAST.png) -### `SET` (0x0e) -Set a memory word from a constant in the bytecode. +### `ADDRESS` +Get the address of the currently executing l2 contract -[See in table.](#isa-table-set) +[See in table.](#isa-table-address) -- **Category**: memory +- **Opcode**: 0x0e +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - - **in-tag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. - **Args**: - - **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`) - - **dstOffset**: memory offset specifying where to store the constant -- **Expression**: `M[dstOffset] = const` -- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_! -- **Tag updates**: `T[dstOffset] = in-tag` -- **Bit-size**: 64+N + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.address` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png) +[![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png) -### `MOV` (0x0f) -Move a word from source memory location to destination`. +### `STORAGEADDRESS` +Get the _storage_ address of the currently executing context -[See in table.](#isa-table-mov) +[See in table.](#isa-table-storageaddress) -- **Category**: memory +- **Opcode**: 0x0f +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **srcOffset**: memory offset of word to move - - **dstOffset**: memory offset specifying where to store that word -- **Expression**: `M[dstOffset] = M[srcOffset]` -- **Tag updates**: `T[dstOffset] = T[srcOffset]` -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.storageAddress` +- **Details**: The storage address is used for public storage accesses. +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png) +[![](./images/bit-formats/STORAGEADDRESS.png)](./images/bit-formats/STORAGEADDRESS.png) -### `CMOV` (0x10) -Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). +### `ORIGIN` +Get the transaction's origination address -[See in table.](#isa-table-cmov) +[See in table.](#isa-table-origin) -- **Category**: memory +- **Opcode**: 0x10 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **aOffset**: memory offset of word 'a' to conditionally move - - **bOffset**: memory offset of word 'b' to conditionally move - - **condOffset**: memory offset of the operations 'conditional' input - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` -- **Details**: One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. -- **Tag updates**: `T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]` -- **Bit-size**: 152 +- **Expression**: `M[dstOffset] = context.environment.origin` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png) +[![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png) -### `CALLDATACOPY` (0x11) -Copy calldata into memory. +### `SENDER` +Get the address of the sender (caller of the current context) -[See in table.](#isa-table-calldatacopy) +[See in table.](#isa-table-sender) -- **Category**: contract calls +- **Opcode**: 0x11 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **cdOffset**: offset into calldata to copy from - - **copySize**: number of words to copy - - **dstOffset**: memory offset specifying where to copy the first word to -- **Expression**: `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]` -- **Details**: Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally. -- **Tag updates**: `T[dstOffset:dstOffset+copySize] = field` -- **Bit-size**: 120 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.sender` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png) +[![](./images/bit-formats/SENDER.png)](./images/bit-formats/SENDER.png) -### `SLOAD` (0x12) -Load a word from storage. +### `PORTAL` +Get the address of the l1 portal contract -[See in table.](#isa-table-sload) +[See in table.](#isa-table-portal) -- **Category**: storage & messaging +- **Opcode**: 0x12 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **slotOffset**: memory offset of the storage slot to load from - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = storage[M[slotOffset]]` -- **Details**: Load a word from this contract's persistent public storage into memory. -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 +- **Expression**: `M[dstOffset] = context.environment.portal` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png) +[![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png) -### `SSTORE` (0x13) -Write a word to storage. +### `FEEPERL1GAS` +Get the fee to be paid per "L1 gas" - constant for entire transaction -[See in table.](#isa-table-sstore) +[See in table.](#isa-table-feeperl1gas) -- **Category**: storage & messaging +- **Opcode**: 0x13 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **srcOffset**: memory offset of the word to store - - **slotOffset**: memory offset containing the storage slot to store to -- **Expression**: `storage[M[slotOffset]] = M[srcOffset]` -- **Details**: Store a word from memory into this contract's persistent public storage. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerL1Gas` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png) +[![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png) -### `EMITNOTEHASH` (0x14) -Emit a new note hash to be inserted into the notes tree +### `FEEPERL2GAS` +Get the fee to be paid per "L2 gas" - constant for entire transaction -[See in table.](#isa-table-emitnotehash) +[See in table.](#isa-table-feeperl2gas) -- **Category**: storage & messaging +- **Opcode**: 0x14 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **noteHashOffset**: memory offset of the note hash -- **Expression**: emitNoteHash(M[contentOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerL2Gas` +- **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png) +[![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png) -### `EMITNULLIFIER` (0x15) -Emit a new nullifier to be inserted into the nullifier tree +### `FEEPERDAGAS` +Get the fee to be paid per "DA gas" - constant for entire transaction -[See in table.](#isa-table-emitnullifier) +[See in table.](#isa-table-feeperdagas) -- **Category**: storage & messaging +- **Opcode**: 0x15 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **nullifierOffset**: memory offset of nullifier -- **Expression**: emitNullifier(M[nullifierOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.feePerDaGas` +- **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png) +[![](./images/bit-formats/FEEPERDAGAS.png)](./images/bit-formats/FEEPERDAGAS.png) -### `SENDL2TOL1MSG` (0x16) -Send an L2-to-L1 message +### `CONTRACTCALLDEPTH` +Get how many contract calls deep the current call context is -[See in table.](#isa-table-sendl2tol1msg) +[See in table.](#isa-table-contractcalldepth) -- **Category**: storage & messaging +- **Opcode**: 0x16 +- **Category**: Execution Environment - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **contentOffset**: memory offset of the message content -- **Expression**: sendL2ToL1Message(M[contentOffset]) + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.contractCallDepth` +- **Details**: Note: security issues with EVM's tx.origin can be resolved by asserting `calldepth == 0`. +- **Tag updates**: `T[dstOffset] = u8` - **Bit-size**: 56 -[![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png) +[![](./images/bit-formats/CONTRACTCALLDEPTH.png)](./images/bit-formats/CONTRACTCALLDEPTH.png) -### `JUMP` (0x17) -Jump to a location in the bytecode. +### `CHAINID` +Get this rollup's L1 chain ID -[See in table.](#isa-table-jump) +[See in table.](#isa-table-chainid) -- **Category**: control +- **Opcode**: 0x17 +- **Category**: Execution Environment - Globals +- **Flags**: + - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **loc**: target location to jump to -- **Expression**: `PC = loc` -- **Details**: Target location is an immediate value (a constant in the bytecode). -- **Bit-size**: 48 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.chainId` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png) +[![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png) -### `JUMPI` (0x18) -Conditionally jump to a location in the bytecode. +### `VERSION` +Get this rollup's L2 version ID -[See in table.](#isa-table-jumpi) +[See in table.](#isa-table-version) -- **Category**: control +- **Opcode**: 0x18 +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **loc**: target location conditionally jump to - - **condOffset**: memory offset of the operations 'conditional' input -- **Expression**: `PC = M[condOffset] > 0 ? loc : PC` -- **Details**: Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.version` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) +[![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png) -### `RETURN` (0x19) -Halt execution with `success`, optionally returning some data. +### `BLOCKNUMBER` +Get this L2 block's number -[See in table.](#isa-table-return) +[See in table.](#isa-table-blocknumber) -- **Category**: contract calls +- **Opcode**: 0x19 +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **retOffset**: memory offset of first word to return - - **retSize**: number of words to return -- **Expression**: `return(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.blocknumber` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png) +[![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png) -### `REVERT` (0x1a) -Halt execution with `failure`, reverting state changes and optionally returning some data. +### `TIMESTAMP` +Get this L2 block's timestamp -[See in table.](#isa-table-revert) +[See in table.](#isa-table-timestamp) -- **Category**: contract calls +- **Opcode**: 0x1a +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **retOffset**: memory offset of first word to return - - **retSize**: number of words to return -- **Expression**: `revert(M[retOffset:retOffset+retSize])` -- **Details**: Return control flow to the calling context/contract. -- **Bit-size**: 88 - -[![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png) - -### `CALL` (0x1b) -Call into another contract. - -[See in table.](#isa-table-call) - -- **Category**: contract calls -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. -- **Args**: - - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee - - **addrOffset**: address of the contract to call - - **argsOffset**: memory offset to args (will become the callee's calldata) - - **argsSize**: number of words to pass via callee's calldata - - **retOffset**: destination memory offset specifying where to store the data returned from the callee - - **retSize**: number of words to copy from data returned by callee - - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) -- **Expression**: - -{`M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - -- **Details**: Creates a new CallContext, triggers execution of the corresponding contract code, - and then resumes execution in the current CallContext. A non-existent contract or one - with no code will return success. Nested call has an incremented `CallContext.calldepth`. -- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32` -- **Tag updates**: - -{`T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field`} - -- **Bit-size**: 248 - -[![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png) - -### `STATICCALL` (0x1c) -Call into another contract, disallowing persistent state modifications. - -[See in table.](#isa-table-staticcall) - -- **Category**: contract calls -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. -- **Args**: - - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee - - **addrOffset**: address of the contract to call - - **argsOffset**: memory offset to args (will become the callee's calldata) - - **argsSize**: number of words to pass via callee's calldata - - **retOffset**: destination memory offset specifying where to store the data returned from the callee - - **retSize**: number of words to copy from data returned by callee - - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) -- **Expression**: - -{`M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize])`} - -- **Details**: Same as `CALL`, but the callee is cannot modify persistent state. Disallowed instructions are `SSTORE`, `ULOG`, `CALL`. -- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32` -- **Tag updates**: - -{`T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field`} - -- **Bit-size**: 248 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.timestamp` +- **Tag updates**: `T[dstOffset] = u64` +- **Bit-size**: 56 -[![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png) +[![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png) -### `ULOG` (0x1d) -Emit an unencrypted log with data from the `field` memory page +### `COINBASE` +Get the block's beneficiary address -[See in table.](#isa-table-ulog) +[See in table.](#isa-table-coinbase) -- **Category**: logging +- **Opcode**: 0x1b +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **logOffset**: memory offset of the data to log - - **logSize**: number of words to log -- **Expression**: `ulog(M[logOffset:logOffset+logSize])` -- **Bit-size**: 88 + - **dstOffset**: memory offset specifying where to store operation's result +- **Expression**: `M[dstOffset] = context.environment.globals.coinbase` +- **Tag updates**: `T[dstOffset] = u32` +- **Bit-size**: 56 -[![](./images/bit-formats/ULOG.png)](./images/bit-formats/ULOG.png) +[![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png) -### `CHAINID` (0x1e) -Get this rollup's L1 chain ID +### `BLOCKL1GASLIMIT` +Total amount of "L1 gas" that a block can consume -[See in table.](#isa-table-chainid) +[See in table.](#isa-table-blockl1gaslimit) -- **Category**: block info +- **Opcode**: 0x1c +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.chainId` +- **Expression**: `M[dstOffset] = context.environment.globals.l1GasLimit` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png) +[![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png) -### `VERSION` (0x1f) -Get this rollup's L2 version ID +### `BLOCKL2GASLIMIT` +Total amount of "L2 gas" that a block can consume -[See in table.](#isa-table-version) +[See in table.](#isa-table-blockl2gaslimit) -- **Category**: block info +- **Opcode**: 0x1d +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.version` +- **Expression**: `M[dstOffset] = context.environment.globals.l2GasLimit` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png) +[![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png) -### `BLOCKNUMBER` (0x20) -Get this block's number +### `BLOCKDAGASLIMIT` +Total amount of "DA gas" that a block can consume -[See in table.](#isa-table-blocknumber) +[See in table.](#isa-table-blockdagaslimit) -- **Category**: block info +- **Opcode**: 0x1e +- **Category**: Execution Environment - Globals - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.blocknumber` +- **Expression**: `M[dstOffset] = context.environment.globals.daGasLimit` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png) +[![](./images/bit-formats/BLOCKDAGASLIMIT.png)](./images/bit-formats/BLOCKDAGASLIMIT.png) -### `TIMESTAMP` (0x21) -Get this L2 block's timestamp +### `CALLDATACOPY` +Copy calldata into memory -[See in table.](#isa-table-timestamp) +[See in table.](#isa-table-calldatacopy) -- **Category**: block info +- **Opcode**: 0x1f +- **Category**: Execution Environment - Calldata - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.timestamp` -- **Tag updates**: `T[dstOffset] = u64` -- **Bit-size**: 56 + - **cdOffset**: offset into calldata to copy from + - **copySize**: number of words to copy + - **dstOffset**: memory offset specifying where to copy the first word to +- **Expression**: `M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]` +- **Details**: Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally. +- **Tag updates**: `T[dstOffset:dstOffset+copySize] = field` +- **Bit-size**: 120 -[![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png) +[![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png) -### `COINBASE` (0x22) -Get the block's beneficiary address +### `L1GASLEFT` +Remaining "L1 gas" for this call (after this instruction) -[See in table.](#isa-table-coinbase) +[See in table.](#isa-table-l1gasleft) -- **Category**: block info +- **Opcode**: 0x20 +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.coinbase` +- **Expression**: `M[dstOffset] = context.machineState.l1GasLeft` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png) +[![](./images/bit-formats/L1GASLEFT.png)](./images/bit-formats/L1GASLEFT.png) -### `BLOCKL1GASLIMIT` (0x23) -Total amount of "L1 gas" that a block can consume +### `L2GASLEFT` +Remaining "L2 gas" for this call (after this instruction) -[See in table.](#isa-table-blockl1gaslimit) +[See in table.](#isa-table-l2gasleft) -- **Category**: block info +- **Opcode**: 0x21 +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.l1GasLimit` +- **Expression**: `M[dstOffset] = context.MachineState.l2GasLeft` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png) +[![](./images/bit-formats/L2GASLEFT.png)](./images/bit-formats/L2GASLEFT.png) -### `BLOCKL2GASLIMIT` (0x24) -Total amount of "L2 gas" that a block can consume +### `DAGASLEFT` +Remaining "DA gas" for this call (after this instruction) -[See in table.](#isa-table-blockl2gaslimit) +[See in table.](#isa-table-dagasleft) -- **Category**: block info +- **Opcode**: 0x22 +- **Category**: Machine State - Gas - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = Globals.l2GasLimit` +- **Expression**: `M[dstOffset] = context.machineState.daGasLeft` - **Tag updates**: `T[dstOffset] = u32` - **Bit-size**: 56 -[![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png) +[![](./images/bit-formats/DAGASLEFT.png)](./images/bit-formats/DAGASLEFT.png) -### `NOTESROOT` (0x25) -Get the historical note-hash tree root as of the specified block number. +### `JUMP` +Jump to a location in the bytecode -[See in table.](#isa-table-notesroot) +[See in table.](#isa-table-jump) -- **Category**: historical access -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. +- **Opcode**: 0x23 +- **Category**: Machine State - Control Flow - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 + - **loc**: target location to jump to +- **Expression**: `context.machineState.pc = loc` +- **Details**: Target location is an immediate value (a constant in the bytecode). +- **Bit-size**: 48 -[![](./images/bit-formats/NOTESROOT.png)](./images/bit-formats/NOTESROOT.png) +[![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png) -### `NULLIFIERSROOT` (0x26) -Get the historical nullifier tree root as of the specified block number. +### `JUMPI` +Conditionally jump to a location in the bytecode -[See in table.](#isa-table-nullroot) +[See in table.](#isa-table-jumpi) -- **Category**: historical access +- **Opcode**: 0x24 +- **Category**: Machine State - Control Flow - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root` -- **Tag updates**: `T[dstOffset] = field` + - **loc**: target location conditionally jump to + - **condOffset**: memory offset of the operations 'conditional' input +- **Expression**: `context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc` +- **Details**: Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. - **Bit-size**: 88 -[![](./images/bit-formats/NULLIFIERSROOT.png)](./images/bit-formats/NULLIFIERSROOT.png) +[![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png) -### `CONTRACTSROOT` (0x27) -Get the historical contracts tree root as of the specified block number. +### `INTERNALCALL` +Make an internal call. Push the current PC to the internal call stack and jump to the target location. -[See in table.](#isa-table-contractsroot) +[See in table.](#isa-table-internalcall) -- **Category**: historical access -- **Flags**: - - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. +- **Opcode**: 0x25 +- **Category**: Machine State - Control Flow - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 + - **loc**: target location to jump/call to +- **Expression**: + +{`context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc`} + +- **Details**: Target location is an immediate value (a constant in the bytecode). +- **Bit-size**: 48 + + +### `INTERNALRETURN` +Return from an internal call. Pop from the internal call stack and jump to the popped location. + +[See in table.](#isa-table-internalreturn) + +- **Opcode**: 0x26 +- **Category**: Machine State - Control Flow +- **Expression**: `context.machineState.pc = context.machineState.internalCallStack.pop()` +- **Bit-size**: 16 -[![](./images/bit-formats/CONTRACTSROOT.png)](./images/bit-formats/CONTRACTSROOT.png) +[![](./images/bit-formats/INTERNALRETURN.png)](./images/bit-formats/INTERNALRETURN.png) -### `MSGSROOT` (0x28) -Get the historical l1-to-l2 message tree root as of the specified block number. +### `SET` +Set a memory word from a constant in the bytecode -[See in table.](#isa-table-msgsroot) +[See in table.](#isa-table-set) -- **Category**: historical access +- **Opcode**: 0x27 +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. + - **inTag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 + - **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`) + - **dstOffset**: memory offset specifying where to store the constant +- **Expression**: `M[dstOffset] = const` +- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `inTag`. It _cannot be 254 (`field` type)_! +- **Tag updates**: `T[dstOffset] = inTag` +- **Bit-size**: 64+N -[![](./images/bit-formats/MSGSROOT.png)](./images/bit-formats/MSGSROOT.png) +[![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png) -### `PUBLICDATAROOT` (0x29) -Get the historical public data tree root as of the specified block number. +### `MOV` +Move a word from source memory location to destination -[See in table.](#isa-table-publicdataroot) +[See in table.](#isa-table-mov) -- **Category**: historical access +- **Opcode**: 0x28 +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root` -- **Tag updates**: `T[dstOffset] = field` + - **srcOffset**: memory offset of word to move + - **dstOffset**: memory offset specifying where to store that word +- **Expression**: `M[dstOffset] = M[srcOffset]` +- **Tag updates**: `T[dstOffset] = T[srcOffset]` - **Bit-size**: 88 -[![](./images/bit-formats/PUBLICDATAROOT.png)](./images/bit-formats/PUBLICDATAROOT.png) +[![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png) -### `GLOBALSHASH` (0x2a) -Get the historical global variables hash as of the specified block number. +### `CMOV` +Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`) -[See in table.](#isa-table-globalshash) +[See in table.](#isa-table-cmov) -- **Category**: historical access +- **Opcode**: 0x29 +- **Category**: Machine State - Memory - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input + - **aOffset**: memory offset of word 'a' to conditionally move + - **bOffset**: memory offset of word 'b' to conditionally move + - **condOffset**: memory offset of the operations 'conditional' input - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash` -- **Tag updates**: `T[dstOffset] = field` -- **Bit-size**: 88 +- **Expression**: `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]` +- **Details**: One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type. +- **Tag updates**: `T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]` +- **Bit-size**: 152 -[![](./images/bit-formats/GLOBALSHASH.png)](./images/bit-formats/GLOBALSHASH.png) +[![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png) -### `BLOCKSROOT` (0x2b) -Get the historical blocks tree root as of the specified block number. +### `BLOCKHEADERBYNUM` +Get the block header as of the specified block number -[See in table.](#isa-table-blocksroot) +[See in table.](#isa-table-blockheaderbynum) -- **Category**: historical access +- **Opcode**: 0x2a +- **Category**: World State - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - **blockNumOffset**: memory offset of the block number input - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root` -- **Tag updates**: `T[dstOffset] = field` + - **dstOffset**: memory offset specifying where to store operation's result's 0th word +- **Expression**: `M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]` +- **Tag updates**: `T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field` - **Bit-size**: 88 -[![](./images/bit-formats/BLOCKSROOT.png)](./images/bit-formats/BLOCKSROOT.png) +[![](./images/bit-formats/BLOCKHEADERBYNUM.png)](./images/bit-formats/BLOCKHEADERBYNUM.png) -### `GRANDROOT` (0x2c) -Get the historical grandfather tree root as of the specified block number. +### `SLOAD` +Load a word from storage -[See in table.](#isa-table-grandroot) +[See in table.](#isa-table-sload) -- **Category**: historical access +- **Opcode**: 0x2b +- **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **blockNumOffset**: memory offset of the block number input + - **slotOffset**: memory offset of the storage slot to load from - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root` +- **Expression**: `M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]` +- **Details**: Load a word from this contract's persistent public storage into memory. - **Tag updates**: `T[dstOffset] = field` - **Bit-size**: 88 -[![](./images/bit-formats/GRANDROOT.png)](./images/bit-formats/GRANDROOT.png) +[![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png) -### `ORIGIN` (0x2d) -Get the transaction's origination address +### `SSTORE` +Write a word to storage -[See in table.](#isa-table-origin) +[See in table.](#isa-table-sstore) -- **Category**: tx context +- **Opcode**: 0x2c +- **Category**: World State - Public Storage - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.origin` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **srcOffset**: memory offset of the word to store + - **slotOffset**: memory offset containing the storage slot to store to +- **Expression**: `context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]` +- **Details**: Store a word from memory into this contract's persistent public storage. +- **Bit-size**: 88 -[![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png) +[![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png) -### `REFUNDEE` (0x2e) -The recipient of fee refunds for this transaction +### `READL1TOL2MSG` +Reads an L1-to-L2 message -[See in table.](#isa-table-refundee) +[See in table.](#isa-table-readl1tol2msg) -- **Category**: tx context +- **Opcode**: 0x2d +- **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.refundee` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **msgKeyOffset**: memory offset of the message's key + - **dstOffset**: memory offset to place the 0th word of the message content + - **msgSize**: number of words in the message +- **Expression**: `M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])` +- **Tag updates**: `T[dstOffset:dstOffset+msgSize] = field` +- **Bit-size**: 120 -[![](./images/bit-formats/REFUNDEE.png)](./images/bit-formats/REFUNDEE.png) +[![](./images/bit-formats/READL1TOL2MSG.png)](./images/bit-formats/READL1TOL2MSG.png) -### `FEEPERL1GAS` (0x2f) -The fee to be paid per "L1 gas" - set by the transaction's original caller +### `SENDL2TOL1MSG` +Send an L2-to-L1 message -[See in table.](#isa-table-feeperl1gas) +[See in table.](#isa-table-sendl2tol1msg) -- **Category**: tx context +- **Opcode**: 0x2e +- **Category**: World State - Messaging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.feePerL1Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **msgOffset**: memory offset of the message content + - **msgSize**: number of words in the message +- **Expression**: `context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])` +- **Bit-size**: 88 -[![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png) +[![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png) -### `FEEPERL2GAS` (0x30) -The fee to be paid per "L2 gas" - set by the transaction's original caller +### `EMITNOTEHASH` +Emit a new note hash to be inserted into the notes tree -[See in table.](#isa-table-feeperl2gas) +[See in table.](#isa-table-emitnotehash) -- **Category**: tx context +- **Opcode**: 0x2f +- **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = TxContext.feePerL2Gas` -- **Tag updates**: `T[dstOffset] = u32` + - **noteHashOffset**: memory offset of the note hash +- **Expression**: `context.worldState.newHashes.append(M[noteHashOffset])` - **Bit-size**: 56 -[![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png) +[![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png) -### `CALLER` (0x31) -Get the address of the sender (the caller's context) +### `EMITNULLIFIER` +Emit a new nullifier to be inserted into the nullifier tree -[See in table.](#isa-table-caller) +[See in table.](#isa-table-emitnullifier) -- **Category**: call context +- **Opcode**: 0x30 +- **Category**: World State - Notes & Nullifiers - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.sender` -- **Tag updates**: `T[dstOffset] = u32` + - **nullifierOffset**: memory offset of nullifier +- **Expression**: `context.worldState.nullifiers.append(M[nullifierOffset])` - **Bit-size**: 56 -[![](./images/bit-formats/CALLER.png)](./images/bit-formats/CALLER.png) +[![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png) -### `ADDRESS` (0x32) -Get the address of the currently executing l2 contract +### `EMITUNENCRYPTEDLOG` +Emit an unencrypted log -[See in table.](#isa-table-address) +[See in table.](#isa-table-emitunencryptedlog) -- **Category**: call context +- **Opcode**: 0x31 +- **Category**: Accrued Substate - Logging - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.storageContractAddress` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **logOffset**: memory offset of the data to log + - **logSize**: number of words to log +- **Expression**: `context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])` +- **Bit-size**: 88 -[![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png) +[![](./images/bit-formats/EMITUNENCRYPTEDLOG.png)](./images/bit-formats/EMITUNENCRYPTEDLOG.png) -### `PORTAL` (0x33) -Get the address of the l1 portal contract +### `CALL` +Call into another contract -[See in table.](#isa-table-portal) +[See in table.](#isa-table-call) -- **Category**: call context +- **Opcode**: 0x32 +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.portalAddress` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **gasOffset**: offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee + - **addrOffset**: address of the contract to call + - **argsOffset**: memory offset to args (will become the callee's calldata) + - **argsSize**: number of words to pass via callee's calldata + - **retOffset**: destination memory offset specifying where to store the data returned from the callee + - **retSize**: number of words to copy from data returned by callee + - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) +- **Expression**: + +{`M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + +- **Details**: Creates a new (nested) execution context and triggers execution within it until the nested context halts. + Then resumes execution in the current/calling context. A non-existent contract or one with no code will return success. + See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. +- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` +- **Tag updates**: + +{`T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field`} + +- **Bit-size**: 248 -[![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png) +[![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png) -### `CALLDEPTH` (0x34) -Get how many calls deep the current call context is +### `STATICCALL` +Call into another contract, disallowing World State and Accrued Substate modifications -[See in table.](#isa-table-calldepth) +[See in table.](#isa-table-staticcall) -- **Category**: call context +- **Opcode**: 0x33 +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = CallContext.calldepth` -- **Details**: Note: security issues with EVM's tx.origin can be resolved by asserting the `calldepth == 0`. -- **Tag updates**: `T[dstOffset] = u8` -- **Bit-size**: 56 + - **gasOffset**: offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee + - **addrOffset**: address of the contract to call + - **argsOffset**: memory offset to args (will become the callee's calldata) + - **argsSize**: number of words to pass via callee's calldata + - **retOffset**: destination memory offset specifying where to store the data returned from the callee + - **retSize**: number of words to copy from data returned by callee + - **successOffset**: destination memory offset specifying where to store the call's success (0: failure, 1: success) +- **Expression**: + +{`M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize])`} + +- **Details**: Same as `CALL`, but disallows World State and Accrued Substate modifications. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. +- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32` +- **Tag updates**: + +{`T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field`} + +- **Bit-size**: 248 -[![](./images/bit-formats/CALLDEPTH.png)](./images/bit-formats/CALLDEPTH.png) +[![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png) -### `L1GAS` (0x35) -Remaining "L1 gas" for this call (after this instruction). +### `RETURN` +Halt execution within this context (without revert), optionally returning some data -[See in table.](#isa-table-l1gas) +[See in table.](#isa-table-return) -- **Category**: latest context +- **Opcode**: 0x34 +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = LatestContext.l1Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **retOffset**: memory offset of first word to return + - **retSize**: number of words to return +- **Expression**: + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt`} + +- **Details**: Return control flow to the calling context/contract. Caller will accept World State and Accrued Substate modifications. See ["Halting"](./avm#halting) to learn more. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. +- **Bit-size**: 88 -[![](./images/bit-formats/L1GAS.png)](./images/bit-formats/L1GAS.png) +[![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png) -### `L2GAS` (0x36) -Remaining "L2 gas" for this call (after this instruction). +### `REVERT` +Halt execution within this context as `reverted`, optionally returning some data -[See in table.](#isa-table-l2gas) +[See in table.](#isa-table-revert) -- **Category**: latest context +- **Opcode**: 0x35 +- **Category**: Control Flow - Contract Calls - **Flags**: - **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`. - **Args**: - - **dstOffset**: memory offset specifying where to store operation's result -- **Expression**: `M[dstOffset] = LatestContext.l2Gas` -- **Tag updates**: `T[dstOffset] = u32` -- **Bit-size**: 56 + - **retOffset**: memory offset of first word to return + - **retSize**: number of words to return +- **Expression**: + +{`context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt`} + +- **Details**: Return control flow to the calling context/contract. Caller will reject World State and Accrued Substate modifications. See ["Halting"](./avm#halting) to learn more. See ["Nested contract calls"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts. +- **Bit-size**: 88 -[![](./images/bit-formats/L2GAS.png)](./images/bit-formats/L2GAS.png) +[![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png) diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png index ee1a32d95b71b328c86e10fcddb325013c8d6472..696324a4c45274d06205402d7b42689c0a3f78b0 100644 GIT binary patch literal 5314 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 r2)Mk2YTm8!|EHoKa{3>AO`{=<C@s+J^oE1UxgE literal 5422 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png index 4314acef2a15e859191d557429db52a4884c1a74..75a307347f35d312d34545d25640ae896a194176 100644 GIT binary patch delta 2798 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 delta 2790 zcmYjT3pCUH8~@Ev{B+-+gM@rokCrXsgUy2y38 zmaT+bvb-`yY@&qNSeiBCKmYTd|9QXXJm-AB&+|FY`F@}0^L(G@y2h+}wl=!f{>UHa z@P!NGW4TY7>!qBcd_@~ZQCh*MKf;}LKJQbVdenC7B)h(lPL;&6_%?ueF-5F#%gqfp zn(QoJMh3SkkxBAUR;q$}7Fk?1&!&tH@g1B_9gEgQ#FIGJ7pO^2XgI1CZLNs9&- zTj=FK5^d};T{b~SpFm{Aigzi0PITZ+jzofM(l~KrS!jXX6X;fxBG_cSVv>GYd#u2aQ~4&5pN=aBq4@|H-d2-;FI4Qw6L8PhY1{Dv0*ngIqmUS6|7wk8k zjncAlye}|8>2{eu)yX{pacpf^eFt0!GwrI3!AxJX_JXiOG{? z|HT}5y{vpjU;4vqIZ6h_@7hJ8O^_QpaIZ($T-0(#4_dzuJZ_3B%(pui)>6r^7rr7# zm~2p3t%Jj5$dmE_O>+i&5>QX5S?;$Dns||R zK&2_|4eh!>fEIABJr;U41g$$0=3^Slng}!YkGtgGfiF*XUCQ}=*jq8qxlWw`s6{}$;f-#ac2-zoi8D^ zOj@o)xOs(YX);XDbxe>=dA4ov;*@c)TS6};A3Arbv1>b+&$+gkX(nlqxeuIUJd~M} zqjMI0A1XobBt_;-k0VeqXG9qR{GK|qw|slz@#qPSvi^q1eT|Fv7i1I?be0lw-%kpm zTs7T1%L-K=1EfZ9w%}2x@TKx0yijsREt7~EnsFiP%Ut#Ed5XK@Z2D)! z3ezxNg6k&cn~Q%b{j$QwGOc>7R%9=1K|iXfnoeXo4!sxwZab$#%n(p1(kVgePIjy~ z;!;Q_pqV1XKtDO^OF!IgOVH>xWN&+ah%~0(3EaK#3Ys&aYEl{^ns6?DDJ`yhhrmP0 z#?Z~5c{ew;TNPF06CtjC;*MP?6XJ)CRS3}jU`1KmpPU4>2icqLg?>QXNr<#|4rT$o zyfXl&S!(g6ULe__rNE3m$lAf)Ca(U#58=Uy1C#_tN9;BrSWA zr-lZegYzm|r+&5v2f9zj*Y>m}9P9ffO0~<^hnnhoH&4WI&r_2Ec9dETx=(n=DY*&D zd=}nNS3%|1zNZR|r!~pHnc93jRK7PreImnSoy`xkX7DR)qjIl?3L&}@oBiCnZBFZNcVbg79X|#k~4mYe*1h$qeUt7{eMcWM(bR4L~pnq z&#oTk-J*uz;T@JPg@Zc)^Wo1HT0mMu%8c7CUGQ`k&H_<&=R%uIr@JCqK2unz-elBt z--3J;brty(=^jbx#9R_s_ckd8gyF`2jn-%jYlzqo7*4LiNA2#c75G1A<*LD%g4VD87M!{#JphTc2Eyi(Rl# z00mtk!j{<>NTIg38Rp7E2mIgo;x&Wb+i@h_ouyV-|Kbxzt-SH+Cy84Ei`q(zBRDhG z;BdtIQ6j0xOzL&zV$X^KVSyuT066|KjB-QtxBH*);N64O_UkS_wy(W||vjyV+ z$V1Q@V6(*-U$LzF>z3tc)%m*ug*V?xl^@TVv0S^E%M|t7Y7mW1Im*|CLJ6lk6ML)) z`GP&y`mK-L43@DEI2{DRXYq@?_j>0HAEIv)GbJ$1CMRr3KQ4p+;|goAs09hSgjrfk zkXkwg(GGA^7C#+0EJ68t-o~Wd*V$k}P1m=_=$b;P46vVwU`BuDw!2C?iQj4GaOk!(>tCZq?coxvD|7im!pOavEjQZH9rgAti(6Ht2;+@|_x-4aDB`qIB{!Su0Cb`Bw$xgc@1%KjgPs!t= zL{G=|vIGJn6v0wu%lVgDxeLq@7Rgy09ZS$OXgMcx@&Q&GrE4{&daMs7_BVj+vzKqd z&ktj-D!NxM!b+>kLW|E~ar?t6b#|wlaZSZ894G5}H)_;8!7qpBvtBTwcY5$CPVCl@==^hv%UfUX-ou2 zH9?{^aaRDyQ2G5@RMGaYEY3*G_;}mq*zmd_Yj=U7)8=--Uq&(KUjDzPjLnHdY1b+k XntXYFcA<536J>wY@ksSypXC1n#1UK- diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png index 9bfc38479f18a03e6125819b8976ebc8db798134..fe56f671f423d8f2cc04c1e0b714f4bc2d41e3ff 100644 GIT binary patch literal 5324 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 literal 5445 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 T^`>TN$I2Ja>uKbxTi*L8V(gm4 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKDAGASLIMIT.png new file mode 100644 index 0000000000000000000000000000000000000000..d95eac60812d9775a8dc5c6874ceb40c11937da8 GIT binary patch literal 3694 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 Qx_LAfX4a-9r?1@lC#P27C;$Ke literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKHEADERBYNUM.png new file mode 100644 index 0000000000000000000000000000000000000000..1a83a1d8dc544e60da1419306156439f5949c2d7 GIT binary patch literal 4570 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 M%;prqfimz(Q%ppPBvBCr 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 delta 2754 zcmX|D2{_bS8~-z+x@OwAOtuz6M2wq#W{QZ(UJ1z-vae;I86_%9Wh~b^E*W{UB}=x3 zB*r$jFv$#cC+ir^#25_U==r|yJkR?)?>Xmp&Uw%Io%1{I59!ZR&rid_`DVr!uSMoF zrl->LT8|1_zxAW;W>O?}z8CAbO*p4d28uJ1f-qQ0Ixb-60OIEk=+Jy2`8iig=jJF;Sm$Du`$Cm^(WzhiHfR zJw<2ZXwOD)vsRA7zSupe)~q(uO$S=68z7?eqi}D5dNj-;ae_IG;4ti;G=MTp>{R&8 zk(DOZ^eKon-v!i${yM%Lo7)zk&abo{?!d`*uzmE90{q&$Lf%LqOz=OQtRi@Gp5)NQsC2J-5^$$35rAR+A<33H~eR^ zx~IQNE_Pbaspn*n z4tft3cyIK5|3ba8p^h)jxDTy|I6zBEt2pk!+YEN3GyW2{x4-X-y*Q|KCiP@DZ>VAShyYuopJpvR>D#5SfBls zQc2fiFl)71StEJ&mQCN#vhGQ5$OF4u|g73lehBQOs4A=Ts)xWp9rHbN`uhpVIiEluTfv>?%7^{ zhqwH`-uLl#Of&BQ@r|m=6E_cRlG&e=Yc39(_ev#Ckd79rs5%#mC5UwsxP#Y_9ey|=3M48fa{$WNPHz2AL`wwScjxF$72Pdob%W3GWLgencRaE9pL)(>;F zHTbOW%GiY9Q5Oafjg;HQRwIyu%4ix)iEO^82X?!*ew9hx9Cl+67KyTMI=9-#| z`y1wqUj`5AG~o;CZ+Bi7YR_D$j4{_}&xR@urPRg{{>?_>&&pK~y<$@bC?wOsI-yom za1yFi5;Joe8HJ5GSXyRVBvyFX=!F-b;D4PvwUkvgdD+ytl>a zmXpM^a2~vxv{gFScstl`YL+>^YDmgk+ZDw`4&G!6Rou2ZaOTwm zRn_XVm&b}sIl5}E8En6{6|K314J|h$7fjPwFDVLX1rj>{)+yu4ozD>0VmR!d2jN7K zK_lHe$$)yu2A2wT5{bNkiYx-7*#5ZWnk=;T=-iDG%%nlPK3wo}PBL(p!hz{k)&PG!^?1zOH<&ovXwp8MrlIB*|2gPRKb`Zww z7&@x^?tTlahQYfe3Yyt*l@aSC>+2o`KnRK(dPf&#}eIzscA{p9YTnql`zTBHv`yG;#?TgKc1w-N7%<5`Ss z%w;YMVhs~8XK1pG4}RlXOu$H4THVuDl1&^ox@S5UE_^chA8ov~4C@P?LlZQ}Q!u!m z7dJ$T{$6=YlGuIsukp>wU`P<@O)p`$pW5Vg;i)spn-dgg*GF--xUU~4o~RUD6ibnI zbZHDVneF8`G^_<<6bAkKe4^~@;x}{RM;g{t@Cw|{bdaRM$fn|Emi`yj>v;>1o@MNp zW#v5bYY$XZZz?JkNOKo9XE#_1JTGh=4?kl3L$=toKH(*dPzQ{CkD9Y5+25&$tO8zq zCMFd}z(F)|+1bK~aPP&G%qh!ffUEC)xbvvUz+BrYEao{-8ny3Pe=rRvar}%sN&PXz z{{YaB)))`}w%TehR5N(A&^$Hkk~B+xm?>BBHR_+W7Mh}|V+d+e9ub+MRb*2VGs&p% zO2TXX+0%MTTq+WPSufUxhp{Na_(wG!(K8u^t7|b%og7X|)-50MfnV`Y0;s(pRgl=mIxyD%j9?BA@_r-W6b3Xyz=Ru{uOWjX~kAz2RQ%b8fv-ECZ z2D_qBXC(>)woUq==bArpTo(=SPPe)mEUc&KD^L<;~QaUo9<=VgW@L_-Eiv zuVt@SAIBb)+2~N8U(Di5vXb=^quxG$#hgMPPQF&5@7%Fu@qi*n!HnYrRmTTZsW}1d zd6gBr$15M|lz4K{Z-?Vi1KH@1QJ>AiN=0?~8-dRGM6r-G$Z~eY<)mv9cN!6!G?P{_`jHL4zIKFCWh5B0_#>0h%V}GZB q!F=uFrvg^EU9io64J^^VE3lO4wz*T=qt6!;!0fW6an&W)2mb+Y^l3Q& diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png index f952f689f04028de22ba6d466fdd24efb78d99ca..2eb40c349490d28a316cc16cd4219cbd38df9019 100644 GIT binary patch literal 3698 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKNUMBER.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKNUMBER.png index c7217f8452a30efc43a5cc98b2bc743226fa969f..59ea492d9d309155f5ce414ed07b9c6b180da69f 100644 GIT binary patch literal 3710 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKSROOT.png deleted file mode 100644 index d844d63bb4fd303052f1180b1fd0681458f01ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4449 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 S4l(N1+09N_8et7D#r_Q@T8{Am diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLDEPTH.png deleted file mode 100644 index 1cca7c9e725c8395cd138dfacd054cc2e4c75293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3552 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CALLER.png deleted file mode 100644 index dfb24671c96d0ab2aec10d92d580ae1e5824898a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CAST.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CAST.png index d663c342ae7c2522263c5470c0de8a393c0c73e3..8ee381fba7f04da25da322cca4cf2ea78bc22b15 100644 GIT binary patch literal 4652 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 g&A`9&HArg+OevbU>5rM~r^1|)E035cnEdT%j literal 4686 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 C1HKag diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CHAINID.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CHAINID.png index d197552c9dc472b79c773efbb8da8eebb006509f..e7fa8d7b431aba4f351e6565107dfec4880202f8 100644 GIT binary patch delta 2776 zcmZuzc|6VJ5pC^jNT`uPQ9|u&i&2%J zrAVYf(bQT>+7SCXnuQ`X!HaqG-e2#2KIii}_kPd)eD3|8@45H1$`W@ZWmNb{x?`j?HjS3kHBVF0(b7KH>z$1HpmE9&_w&$ z@4S<}v<3DbYw+~?ZM&EoLBNQB+q zf?ScZEdz&}pD?ikJ^;$_`ULQwj9oxe1kyr45U;qI9 zEg1ww74E}ZiuHi65V>_S+pD?dZ;!g|2nPvqb+rG5w4FB4M>99!oejt+XAJvBIYnzX z@w(WPO7J{9Ij!YA-+OiunKqD)@V7eV3jBJCRq`bI*AL%MgX=DKZ>7Lyy<@UGT575-G_Aw| z0=V1FN{51W7s`Bf(-yJtD0$J9pW1@_$ZpfkeC&o*LHfjGv^H6oE5ZHfWA;+`%8sU4 z-8x$OZWpL_kON9hXp#pQ%n6uxg3+Ng#J2 zbf&gH6W`}^69FBkdo&+becJhWQ7bb@@jtzzREd17?I@jCG0MiS`Y62f4t z4g36M^pUGj=(DGtm3+Tfrbc}evOfl)QhbFITpBhF@)I*MAFV5sH-G9V zMP|(9c32;L$D>^K_9I~4-lE7b3g!Kbb(GhC%-+E7gST%bReOiN!H*O!o=l2XzxnhB z&f$?XuJdWdDPnUxU8)h<=IyPlieYHuGXI%Dmt@LKo}+{Vbj>*wscu zMEy9TS&^qXCHmofQxaY4bi42B#i1q%ujIL;AI(_vj` zn{nj8?R0%f z>?KH}iB0c1r9L;T&lMn53agqNVuE~i>QSwwCku5EVQasy@IuK+dj7UTnGU0uu%5EM zXr|bUD>nn8^`uwp50Ux}*<0a+MTm>0`4FAg+BB!kr`rCf%YJZ$o!zF0 zBGKg8QOW6_>bWtd#I9@xQe#qFX?LW1YKGP@`lYBq;ds^8p`6au?RF_8kNXAF?+2V} z+qcWy_;e6{MgyMJaOhA)jdC;-zV`F8@WzLEF!wg zAXK*NzbuvNDPw>4QBqy-xJD*{$8({X4r@__{I76VuWtxeOgk3Yb8Xja7xfx4_z90` zTFxsVd_acrMc2(RYr$G|5vgh1NZv%?h{bhBC*HtjU!wHn2aa!HTsiw+auXIBLD}!- z`tpHLYIa{0bH%|~63;I{-?5e;ymL}8&}Iwrg4UW|?&wl2kuo$<)!-c7=9w3Va#}*0 z;2xk{MgN~IJ}huY>Kfql?ba!P@5k7{Rwe;5ecLk6<9T5-_Fhf;lTT&k!c)d%LhFxv zpSy23KuS(1su#+sowTVIozHc4ZN7g@2-Dno?5-R8+*`I3DEvfI_L(KHtV zW{a04h{j1gvg3i;K2>;DE4#{R)j1(()0D|l<3-oJU{tO7<7U!pd+-)HUxqMB(ZRb) zFYgkIZj4$kNL78N$PC5~*(G-~()Pmq8@J~|U?_t_0cY87^ic$t$8%RKj3c{E8imjL zxms?0Jm$U{6^9lQwolhkYtVW~Ezb6B^{^qAp&|xO>zK%v2rH^@Ty-&!4wLHSz3Nrg zVmU*NUzgqPPw5s3sOQ|9ZN1tkOU;EUIX$4^N3FGsPND__S9^i6gCFib`zz8j0GWqT zr&Ab9h~LU)9J@n#vt}ve_3v8ZOnW{`>PiT8$VgSP>0#o@`8xp_y}k0k;%lNH#kXGG z1HVy4{C1~i-NZkeL&-)d%copYrd@n3>qMUTYQK8@TO9pn*fLf7sC>50!rP=jZ72a$ zXZ!LNwMwJPCZ=XP(c$Jt5mpsXFUs+tpz8NOd<9QI6IfKiomEy$Z_`p*;+^Ov(2%kT z)sFkE;2$B17lZ$4&ldh}<9u;X#O42wiA!^|`!#=o4d+(T1sj3OW;VazFWrv&H<7Aw AcK`qY delta 2714 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 JId%27zX3s{R=5BF diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CMOV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CMOV.png index a46692edd84c5bba21d558c003a5f121c71dc0d3..f90abd3b274bef82426c2bc537d950740e9889be 100644 GIT binary patch literal 5835 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 UcE#2EOh}wQVW5+C-1_!E0mBoyX#fBK literal 5853 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 AK>z>% delta 2741 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/DAGASLEFT.png new file mode 100644 index 0000000000000000000000000000000000000000..96f93a3418eced7b6553f3470340cc6fc8be1462 GIT binary patch literal 3583 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/DIV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/DIV.png index 58fee0f68533d9140e600fa64632c6e19a644da1..a87e44962f320ed2aa28165a40dbc4f36a0b3419 100644 GIT binary patch literal 5307 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 vw2x;W0DwtX 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 G@B9za=YKx{ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITNOTEHASH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITNOTEHASH.png index fd31987d317df00d3cc9b984b615a6895d7f5353..036785120e898e43d0e0a1b94b7d517a984ae3d9 100644 GIT binary patch delta 2971 zcmZuzc{tSD8~=_q8dSKE^`KOuvRQaf`<1oughEW3&nUZ>ma`cU>I8oKzBL_aH%wCkc%yEgMAkSk)}k_5 zmKa5l-2a)vs9yzciTf#@Kli!}(?}H}y!@)IeFis&g9zPX#^LpBxKpdd9prAz0aT@K z8eJ2Tb745ukzb1E<3wmN66BsE1OCRQIy(Zqh})7e`R?vs{7+K&Qmw@}$ny0&X@EUd;e0Rx#6VhI-p-0F_=oTJD!tNLm7IR)Io)Vssv{jElW&U&M0k)h8In&E9^SwR{t0L<2rfZ3C*^E&% z`e954I-;8}?Ik1{?>Y&X`pKj)&}?zly(15?-WDP!y*MOat?N3e-Oi4R^hYLiVeTOt z;6E>oQLQ0;_jSQZpV~u&Bx1_MEM%Z-r%j72$lVj$=;rb-x*X>Gk0PV_f~xWQ?!OD5 zhXmpDj-S7K8NrsXlJ!8M5Z%p;aB3{BcTvKl_OEJ+9fE*D-g)NNUp*#cGK9|GWsBd3m^c?B^G&f^~koKYegRDtZ#s;3xr-b1}B2<(nt6V0y#y zy17(sP_tp%&m!Le_aoi<&u|BYk)TC?f5bB0di{gdB#QxwtE+9GxT|+7l=ixhIeIBN}WKwhxkih;UXs% zDF_?d5^k+YDPn^&g=L}go*V#Z@sHFpO?m0ym1mNI4IABFbLlgi$<^X~?ce4Kj^Di{Z8a z@IA*40i4Yi1^_<3gBC-h?GUTybNPwLk^1er z5cRbptR5gTU+^{UN|neclfWu-if5;&%la9b&T!t;5HHD0*67hnq#?zG%Ahs>WkaFSHUyvx-p~1i7s)bTv$rq)?YoynIOgjY#K4 zrLR`}Shb179lZ6RLjemD)X+q#ne#Q9tkRu$eM>UU9!wGXKH=hRqb}5q(&I0QA%!$@ zK0?g6m-|UOJxVHLlT2(G+k#QT%9ZX+s@RJd%-7@}$}G(72g`%^J}>&?ni-WWZf$7dZ>QWM4#m*A4{&(cPj>6`b6YpX~UoF z?qn=Fq1iK>SG_m^lp1uJdLz4he*7u@BT_6g7pfj>59uqs;Ajl*L#%t%guT*l^7{lq}3*+dNklUAKw?m%Ffc#}?hM zfeiC)!Bt7JYSG3B%!_iR;-1f*Bh|?4LS4C$@sZC*a=cJiNak`6vdpuHKb%GcB88?m zBXsOjLH(u;*ESYkI^-`W%u?dRD$3Xwdc3ZD9r(R>Lc_Ofc;!ROr^h>|++ffDjE@Hr zKASOM>Oyb5g?i($$4h_8i)&)*k&^+1?z;hfl+SRhdi55VuEn?L2I>>}hSU{;%gtN9 zE=oQISIc%$FLhO4F*J^~O5nAs93a-e@KXFzhipP3=Lj`jaJO?!9d(;RrOW5Nb!*4x zvboDhZnFZ7Cdn+ytGVv*xZNWBuU@1iZg7B}MNVz(q9|Z5(YiyZ78VzYAotQpvsbeawX9Il9Qpp3- z?NUKeXZZ!u@CNR=R{D!OXaxbaO0OotEz@#-L>>>S^B=mE)lC_#RA49u@xI&8!#662 zcmTY?N4zITe7&8ogvcRBLvz zg#TViR6n3bn1=8kQgInC=Xdp^i;9 z6rTpxI?IM&~ zD;mGQhJ~nmc5FZPu;!!ffc>2s5h!2STF_`xCuzd2~g3<5~S^&0-|z_Pg@fo?g3J zzS5nXTfL(X$}HCx=@P5qjxGIiQ!zL=WYARIx1U_NOFq^dN$JN!^fOQ8bhy92*z1lN zo?laTf_lzVS@vxCz4$MRrYIM}#;vc+^{V-L34i(YgbP~N2ZUY?d7+0NF67@a)`{)u z39QX9h<$W8bXi)<=qn+f!D!GTEA&#*b@R>T2U1%fqevY4$Zq$8~aQf8_+^#F=diB`&>8 zwB0Blv<^lj_@IvU7J3#>gmFmA3r-cc(_u#M5YbkE@`8svd25ut<92lD49K$ewpYb( zZs6fPRO-UT+`0R?l5jqtiIO5nj8zeM(5Gg*Blm-s$fb56A=OQ%?Rz8? zRm2cA8lv{W56t62xFvL-h0E`viRB6rVYOQ@iG(R3dQO;OXqU5`EK31a|G4 z46=wN(~k!i*HYU(NWXof4hJis@gg>3b+KgbrR2kzjphp>$!wdNP2~!|22{(th*{a` zn|oYpMG@nQ|gX~bb0x<13q90u=h`R)uJcJlSng% z=#NyMDgiiya@Mbxi5LlSWsI_bm{MY0Xd8zem*R;)9w<|^Gx_M1O%P9u0Iig~Hh#(u6M&Vsvj|TE-gJI;7+xYmy~{XsnZE$TIPt>AI9cHJH>`j+#l0 zB_bJXNy0EOS;v}XNX!(nWcWtsJKy)c=RD`U@3Z{g<@r7Dd2&=*mG2%wLT%2Ra*ZP| zj(IDbjR>_w7jIB<)P#KgwoP}Y)3m7oO)?VH9n*AK5`2Xj2DaM7t41i&7%_c z?iCYZkb?r*4{muk2(700t#7v(W(<@`?0T-4MD3iD8Z$8?b7RCh)|h<0mt&K(z%t?X zK9Wq)U|me;3B?Nu6w#A^a{Y`Ii%b&5;j{U>;21vo;knH5RItpeTuGqKqq+&yJkLB> z=bB2PU<#0Z=T5F~MB~^f!6HuPZw<2>99GOPxCki{kLW9Ph{zNc0|`sQS@ZrBLf|qk zb&dBQnd7gGCI0gLI6U5W92i)?QZQwRs#A~Vn8Z;Jw?+KX)^F&M0e_I2U;cBiTz0Ap zE5v`xsbigxsR*xUeGvmJTeMGzGr|prQV&&~FtL>}dJiH){nDJzWL%liN%|1D)l33J z3-Ps}u&Y-F(N6&id#-3YeI7H|vQAKiNQR$GXJDj1)aZMrfDR~Cy8n_yUy>Dib@S9; zgGw6jrHyi?-esH&SGSlWhjDhG+#8L z)Nc-XdfM{6G)}=BXlAbUp>K8@SX zl7jrI={W%?j6zCZR=}#2V2#jo!f!v26BY2_9A1crVg;+yfUGJ!nDf4&H zYpV!b9SfwMQ}@fw;@jkl`^v-3kp4qR>^v>}(qdDw<3zP>!T0kQp8=?#P{$KZmd9EF zD~5%Ujd98c1~(AFI#|lcu}bV7doZLCyurDdla8I0p?EFLWBZZc0?1^r!-w9}_gJ1H zhG%B*H7N>(U=}bFma1{6^L<}p8SJq-cQlHSa^5~nIhF(K zPWvq7`E{hc+q0>~S)@6)tQ2Rf(@au?e@v(2sM9_|qpnHymQRNhAJK@JBS8{znI>VH z*_T0lCNKjj8;u?c8S664psmRmZ9J;9UPW(^GP5&?LrZmjV)gd7ajyk0z47agxId?T ztRFTqLudKD%Oq6fdGk3!OKhEC$T}7E|*G6TtKiTR>a&bXOu7u)Cn^ivG-{pd6oj z0IZ~{S$@@&??X{IbP6B!+>DtwI$qiHbsxK1R=JX$MSPa04$cphai%V8B}tQ0qdx3| zpg!~X4f1y4aRwxwh3c!>Av7wvdUcG9wCkcCIr8v|X2aa+o`3piHJTo>_yLzRh;1%G zh-9=i4SLu3{XDziVfM+z?YpU0-F#yxo(2EKX2^tVcZAR-hofS}zG9NV)2N+beCN?t zKu!c+<6kFQPw*6vFcMJrrd`~Ud!=fF^p4Fp6p zKupr2EeS{N^k%kcso>d4DSk1m7uR)~)S71)7PaL==&3;kWMuE4B0klI?DH^bV9M}S zkVn&41YGY5{;~1}$0!48EX|Y2?qC}ORwD4&D!CR_ml4^>ZLr^bs49Aq6w65Y7^PZl zW#{=b@c?P-O}Tdh@~IBtas8|Ol5XXV0CKur_@S~XSesyTq^9bl$E!&q11F|lu^J4f>gcYuq7a@~81)Bqlo zR(BKNPJ;XLaUOYXh7B|CxM{aaZ~Mn~Ctqs3LXU>|UhA>He77p7-PsMyp69}w65Y?* zk{VZY7~3@Sf&S!WMmM2sv4nVwPbQz1x|a;vky{yMs~X7yYOC^`s#eEf<1BB zy>yaCe45(?52;70tS&5asozX^9XssM(`GuUC0(Bb%q;DbGmp%P(T{k>?#9^1OhQKZ z$+@AiI?Lr1u_hW5aKw_?#bM5i7lDz?J$rswn_J}pM_wm$`ctaK^PU`3tqaNzxTfz0 zUUsSuYOnZ0-68Prv+0LVb#gxu93)og{gB|CqY>nwwYB{ioElFE-Blo!pR6 zHCFghV~rZDT1!*!b`wW~E1TGl%qkUj>Vjr9QZlatZWP)(wb-hm;oJ7Adhl2a>WT{K z)iKA`jVD_nug(Xj%1N|#VP=jVK!u2arumBSQ4@@$#c1tsOa4Z!e{x_&*44@95Y#Gw z9PX&kj+Z5R{A_dWWH<&W>3_^ngx45sV<(G7;VW;XYKvdf)quOffy%7a{*Cy8-{wdF z1*b7$^i@Ygb1W>OSADs@i-3UOLnyddTHplTK{vB80E8|leSY*cl7Et9c*3l3)s&~Em4QJ;maKfh~;)8z8 zNPjpv`KLU>Gm6@>V6gz(R})6I??Xncc}Mr6snGw$Fn)eXE zcrS6^+k#8vXpX~ScImov@%VPgxjgH zLR?q+cuac>KJ&{9dVv}4sr};h%N2q=+2W(DX$P=qt}Q`ib$W>)aM{C`J6mv-9ypFFV=(!`3r fOrn;Qmi)Tbl<@N-*BDlqU6YNK!r|9ndy!o+cCHb+b7faj*6hmi#mH7Of4a%NYEozXl^&wJkAIlt%pCDknTmcy`ysFlE zj`LcHiE{0~8P5eNbS8~gy-g(Y4MX{qXLBG$ODHDr#Urqpec=AyGq_qhSLcN*3{nT{ z?zlBA1BW1&2_DR=5B4KV{&yh5#1Y|~NWq-a`F~7Oc9Usk+)7|CpE8qnk()BRE3!KI zU+LdrH*Wvq76d&SR@<(>EA?QKs+(s>_<)cxd>|@e&Ga+MpXm4zLys;jG#UKGMUt81 z+76El$Yt48NdkvAF-Ylij7dM)d!MV9l+XJK9YmtNlN~MFtJhB=rzMaqc{5ny^%Vdt zvhA>9uzBG{5+>7c^+LQkEg3+f{x7K68op@_9DbjWHj*^^{LaUlj8lj^`*LFHI8kQO zqj`gh)4f^z4l$<@@X?G$K2pym1JJPmASY)A)dFzXAaO1PiJk~d*%=<+ zI>j)p+R)T00xu9+Fg6d{2Rvf*qCmHmz}w5J(Sj@!ve?(r0_8R!HXt`UaO;YACQ2aX zEZx+XYFf83s?@jTHKfFHeHXob&E+lN8Fa&5-An$NPrNGR{aVUG;rlKDKZCnc>F-QH z+S_bdUE4p|UmYGG;#fC>HwCHUE05B)FJb3@b9wk!Sr>?u+#;v@#Jh5V=~c@)@ivlW zE9fo#n?w1{IDcgcXYy%l6gCwd{=RywmUh|rt*W~{Ih^M2Q>H=3CZg0wp8dOAtEE*z zFl1ZB+TJA@mYV$${eVbNRx?iyH`m%*^t6_JuTJ^n>Ovak+1##zTj>h=?DjQBrDCBu z<&pau$1UE$Jj2Sg3&ps>>CA+IhG2aU?AXew1Nqsx-RYF0B`avFA&AlD2r?14}O1vc{5*934zD_^o--kmnLZn-n&jeaY}9SL%!^VLRu@h^(iZ#~!J zX)!%*-z77YHDfPZB&~!buRf4q>7m?PomF^0p#>-s_)_{4WJ>kjmm|}g1K+K^!X0UA z=+#@<)4dPCc6iSBJOz8PDXS|&C4}|OcZ1ETT;;~Zlh+R+9Qtb3&Zt-;Ez@wVh5lQb zNPoS;g10z%ZLs6dQk))-8cr2lOey4F5HgFtt#vsW)?;R9wZ8D&`DHP7svlEXM%p&* z^tJ5hmG2r;3v3%$uBLx@%vQ*;OQm8kfDAJ?qCkv$P@8+kfo2$BlUAjT$Bw0HeD|HOxzf+5Zn=7DM( zaEL4YQfS@k(iWbtSF>W-O9_K2AjBCiWI(O`12ECUCUp?VE@V; zhPm58p{B%S(zJvnv@we#k0aoEP`d@0e>r+z0%}bFNKhJUubt<4__OcR%4?sjwVr5) z11!A~!g(KvQ7(e+ja)#;02?!MyY-wD^WDjNW;tH2i7K*n|xwJHe^6g!wIQ z>(kBc4-xM>D@}zgCUaLPgmsN>Th;}>|tjmkRNJySN-DqN=(%p~laLI15YHYigF>PV1 z^hnGun%bxcu&%2GOaVFzldy{xA+T~h_!-Bw^?HSmW~wPqeH4a@%B7dCJMn%>*BI`@1`X(?v>4w*{%UCoOg%Em7R(>Dn7gNtiT%q5hB-BGWK4HACR z|B?2Hib-Iy>8+B8zsSSMhYi%-Y1ZM}IO<}F+gdUyIV$E%Ur6_S@cT|c8)8MlZPAOJ z-%w3(s=!B={d>Iym~ed5RYA~2>-nBqd>8Aq*L7LBSY#5aDQbcTN+93Bv=eXt<@ay1 zrJ+w7BF8i}J<0A;MvWxUgho}(LhmNiJ{4v_@Y8Kkky01E%p{cH$q=~uh zvQ4^5L$J=dk=)UFoh2vYvMof9Kz-6Blulc#5-qIs?Z4VTq-b5{QCKffjJEVJ%0K0y zE&KW|PcXY}CbYq~!j{)T&g@3(zy%|Z2E@jCQRfNgGn<@jzHrO#%|%HtUQPM|V;EkI0uT?G70(~e|KE`J_r&1~4XN2D4)}`lrZ!5? SdLR5`E2|53mZj#`@BIhiOoyWY delta 2802 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 bXgko*{D-@7|Ej+Yx*&Gej#i|z*Y5lWQ}K9# diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EMITUNENCRYPTEDLOG.png new file mode 100644 index 0000000000000000000000000000000000000000..43ed04808e8c9949f5152e7460172a26dc8abf60 GIT binary patch literal 4501 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 v{zpF8fcXKcqil^m>iP$ literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/EQ.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/EQ.png index 426d47621b060ebd7ee72baaccf245a42381881e..4ee5f60980f3938b5ed2dc8a7b0e7d256eb905ec 100644 GIT binary patch literal 5318 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 Raf^5ZgVSeD6`r&Y`)`EANLc^? literal 5438 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 a#TP{-Ppjc#64V5C0Bo%6ElYm%y7@<5_`dl7 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL1GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL1GAS.png index 428bb22433d9b80ca2f35467c30c475d1a32187f..3b31baa617d0c9264b66285f94dfd9013bf182ac 100644 GIT binary patch delta 2829 zcmX|D3pmsJ8~=^D)FF|iD5sSBPT{ySPUV(sCD+^vk>wgAY@9-o`@PsW%9IefwN@b{wo8g;yD?OMj)=mhg>|LGru7j3pT;(D9WHx^$@#oQapOEk zaTuS^A$Qv1gcii{EVjb5KD9%M@6i46?(9xUSttCSA&nuLkIUjR-=L5RdzQ+_)0+jT zLGO9( z8Q%kV+dUk_TAkl$!SV%`h%jzV6y-q9>jIraPKcZIB200DQWg4w2n_4(8y*p}Z5^+N{8B3{Hm?=wBAQ|pH z0Wu4eO`!{G-?7g;DGDKGN?q*RM3dZ$Z>XQT=@tt!of$_=W&uJzBFLK})h!hJ6yMiB z9f$fZpl;(OTNH{#9b+nE{X&pt)GuGOcyr&^D~$S3j(60wYF0%me1eS{wzC^3_VQM% z0Rqz0_wO%!p#MnnbaqG_JwW;Ux z7X67QgWT?vuI1i>a+3@c9b*&~C0=Yq36Wa<_6mr*>j$# zF3k{u~9nS4y*24AJlC4wp%=ClW*nmTe~;Y|B|nRfL%W-QU)r zK#%l^ymCQ9WVb229yl(WGQ~9Q3-5&6C0bOWIWtUlSNwLRG{2yiEXsk-ujj;SR0kH) z`La7--quv(r+8Zo2u)&V@wU#NsyXR>&-liGDi+|QAprnjunPYU0O)E=-G+`ZV*MqP z+V3^`?I*oMh7h-%$aN8|0B$Z{pkqt5$vAp4llYQ_8M6P&~Iau ze}AaKd9Zmg#7op6CH3eeP%Y()5lx$2m{inr7obk>>#%t)JBd^@~8EMTT@{?60bM7D}UzVNrZK8)%vwAC68@&RRD7}4WuTU6w!QN!g}0L(oXk4W#K4> zmp@+N6%Z4~NLiYB>@G9BR^;})5e-j)z2=_L&Yo-CLfjZCmBc@)4&1GDfOGGm@5q+J(PVU>gB z*B9PL-pXo){oej}*Qx+UUe{l%nK)B~VBXv5OrtR$O*`7Vo$9tJMRbyH%mcU~=@UQj zU-ZAtoPJe{8(M24ld~V3e>3wDj#X`cZ5YQW)B(jnp3C~2Rdk%x#d!1T8M-i9pb5O$ zIKP00s>R=>>2&+&|J%%<$t!hX0u*~y;c6f7exN8~Hz@I&YAJxUb&kX1C3Dwky$F zoqr4qW#3LdyT!nVjx-{$Q%)8HU}E4%9qk)O?Q6F-*2D}MTP4GN>?>1?o@q^!ffy`P9lpWE!-{&sojBE`1INoV0lGIEb)n7+?>({F z{6jlG%V0l}tiI5g8<85lU`+%mCcp5)w1R;r1kxFiNl_4CdNB0d&lxEGOiKN$uW9C) ze%6Bt2|aY~hf-?po6}59Co)vN4GW+5K;|yuwi51Sz#O6vWIO5U1T-gfg(as(C#%bI zpz6;0-c2<$qi#>*sgnktad>Qg&HB_IDeVQY_W}diGKPM&$Yd|i+(c3zlKxiPnN@rn=oa)xqN|{GO z3|uByXgZ~klfzhWIr`zt3)ii>!YN3p7Tns&Fi~d3KeEm^^tt&If$i41#=FBL&^BDp{wfI>j>zlOR98uY8RdC)Ix^cK(h(n|IrU%btF1Q1z zX?BXsXFgQ6ur=9HQ7WsC6AyU^064hn4>ncOtOTI<+Z_=>{x()ZFQVIW zZ(xim&)Ux{=F(zdL1vh)h}8R|Fmfc}*g&V^VYy9E$SIpc9ZIuZ@@5S^-$!ysEe~YM0A{IJq;6@|Y^#RBf9kH2qWKdo zx8a=2lJr7IA#@kBvYvsoMbo8kBKDhL-v*=G{oPj=PKe?j2H^uoa@CI;H&VD<6Zrh7 zXRWS1bwhUYVOryObvxCS@GW=K4|ex%(tQUF=l?d};`+15AeKR2+gduD5M L`-^qweg6ChJ$9f| delta 2739 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 R_mTsE*~Kdt$i}z+`VWI)SC;?) diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL2GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/FEEPERL2GAS.png index db94bc190a3f21e2746413298df7350e02a5f7d4..441f9782688cd522ac29fee1e8ab4a171d7ba146 100644 GIT binary patch literal 3650 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 aT#<`4OyrPxdyUsz<7n@Er0!6_)xQFld#Ts} diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/GLOBALSHASH.png deleted file mode 100644 index 0cea4cc32d0286db06d94d3042726d70e36c10c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4450 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/GRANDROOT.png deleted file mode 100644 index 34d66c5a33146a4177a765465d920ced947428fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4453 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 delta 2165 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 IcU0p40FsK5O#lD@ delta 3056 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 Pc59d$TU{nya((na^uVm( diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/L1GAS.png deleted file mode 100644 index 7ec775889c516d20ce5ff8b4f8731c39c6b64599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3554 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/L2GASLEFT.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb4674b10b418d188d2d61cb5f861205ee36944 GIT binary patch literal 3583 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 X!7XscA%)$7rva=i?959{FJAv6TStm6 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/LT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/LT.png index 59927272c47fff681b09ffbb1ab3e84fc4a8fe86..442a7021a2ba0264331f5fd650e9e8a172f361b4 100644 GIT binary patch literal 5234 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 A3IG5A literal 5422 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 P8r(qFR0nqkdFwv_YW;Pe diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/LTE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/LTE.png index 1b0e35cf2908875181345a8eaf6e7a66497de406..7f2383fdb4d3fbc8f7f3a98663890d22e97eb13e 100644 GIT binary patch literal 5255 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 H9K!zw(Gxa< literal 5441 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 N&CRS16z{`a{6DM4e%Sy3 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MOV.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MOV.png index 4d79281a5e34e1e15c15370d027e49081da1130c..f1e83baa411bacc7c0dec67e4a412924466ad7e1 100644 GIT binary patch literal 4204 zcmds4do+~m8h>YyYs5(|6}pk6TuP+OlxpO@T`O|gqeDu{xJ(!`YA3sB+DJmCn=Pg> zl!hT@N}DF5iCn6Y8I6gynB2mc;e5m1Yp-?wIBT7~&ROTI{r&NM&-eV^%X)s#<$c~C zJ>5}DRrFN=080-#?ehXai3!OpB{=j(#<+X{V43y7eS3Vcg~K1X@po&r6kZQzNanX< z3?6bDk8Rn4G?K?S#MNo1axZO6T0>WB{3-{{gr0c`by9gzJZ%nNzbL_BT8ly|Si}fO zg8YI8X@rz*34qZuBiMqlOzG;v7bwX)Eei5~$z>Q6kB~aAmpsF?(1;}C1xuNYndr;q z=QD!*jil0&c`1<*w8#Kq90GbFK<+m})!P#Y9q2H{1-OSj>wK4iAR2yl;laF!^Mb|2 zTHiiXUyuj|X3{Mm&kEzD4hjnjzClyv{_Z^ontyi-s^Y@x1qA$C4yx6->TF8!fDzPd zg22_jL>Mw{NCD{82XBRt#r5tFRZl7-S5m(u=%&%a_a@9O;mp3UEPRo-(nO%CVAw12 zPh6^Pt#P8BW7DK@LJx8B)21eaY{&glw!h)jY+Xua7q&_lu`5^GX;)kS%8==@94iA0 zYTvyyK6$hXt+Ez9JrMpY+V*aG#wZ&txf(91;3YkNkYap1=6>GU7g#C@VK8rbY5MPh z!}sx6E0`8jrRz$?J8WT&mzsf%HTH!yx8mZcqc)Yu?cl6;Q`ffEA}438J+Bxd2h;MH zNNFL!&pn~HdCl3)BoAJBj5_%(KddLU@cBe+|0xezQ(Ga7|j-A1TIPHecAeswcuUTi!~ygWaGWkXUq4s_phBJ zBAE9sB&~Mcv$=pApRuawGsGESu450A_{OJbmN8EH92p0V}az`oK{eU`iiJ#Hv zzWCmdN30Lr%nf5-x}Gf&6;x+1l$q(@o9k@-W|4B}ShBM94^CD-w&~&<)TVKw-j60j zb3=-_^J{@#xef^X-DL+v-Ku7PF6G1?ruz}%He$*IMvxLoe?Q(1iFXa99m6HLj{FZ*vva&I6QrWEDITwzc6;~+P&_NmXGo+CM8kPYZP`vtxkIV)Un7ch zSUC}6dt@5^ng>X@811`i0lp0tNX}#fJHje63I95Op)_FC1Kz?y%ynb~{-~rULlbDk z-M5TIVp5MuWGD{VfcrFv`0*&kWBEVDowKJI zmn4_-f<@ODsAvoc<3~XRIEZP!XST)mki8QsmjiIneM1ULQHGltO_1%F*K4+F5 z{^U|%V<;Uevn}VRYv>p!xY3`L=mOyJnl|DEZBTVgK`R!`O)wT#8zFogg6?=X*XL(n z<|Mc217=&fXSo@~hrX6k95w3mgGfexsID=?aj@V2rG2eQOEjq_zA!mCIV2AT3fBem zg);KWIV);B9jU0U1TwBbzhQSAuILZ;xwI?W1&Gsepm_cJr%D7IPU?3phKy#MWff>NWQ3_oHJl=M!Yn{Jrsrs=y%P8#BBC=e!rNb z!mV2bed)euR)z0EJYh6o9yRZc7U6Feob@wrmIt@)JXYu}E8@+UEtdy1MzHo$8V(gf z$yKCm@v0-;dda1^{*29+v~i0DhNGsXlp6KYmzpqO>oYl3fLgU05Y|B_rP!jH;~4X| zXLM5Q1ih;{E9b)BS$C<4Ua_GuQ_qaU;eg4KMR$D#TsgnAVHzD!9n3Y1Eg~Ozd1)kk z1P!Nd2h3p^{k0(qTA(E6qA6gaW&aSP(7(8@GFI{~b)`EDoboVL0R+`&#Z#j4&Bax}9pnU$qbLi%-y0_h%^_8#*8OV)IcG$tukGq+ zqd}7f_`2;^L%=_t$lKGZ^51U9__Bkm!o^fLFc7Yr<~U2Tf8K^tyj9!%e9me|=0E@( zc+e!YQI!q^;6hpQy3+r+efgPad@ShNRP6fdtw3?y9137psa(ZHZ6{pblWXf9Z4P<( zl!m|Ktt#jj2p#SSzm2DrJ;;Hd`jVm(oNWVkc{eQaoCk%DgjmPyDNjj_((X<(k!i8( zlBaW)e(IBhrw}7pDUBA}BpT64u>_MAA6$0eYZ$@36c5~uk+qaQw;{~!%5L3h zeWXE~7O>4J(*RigNe!kQRBz0J5l`pep3YDd>&mG@p_|)bHPg}{(HC;@N9l}jgBV2C z7yS5mKKGr`J3FLT%BgqOdMQYh40)_VdJ_Ph?~0cU=7<%sMgeav`*xDtJlibPSld6Ls_vCXwJ?ks^hm2q zL9a>@3~;_JEN{1X`;--F8&6-Q*8RkO9N0N*16jtcq7T!FB?*w*0)ywG1a-p5zI1&g zWY}eGCqR4@m}N6_fJ~1$n+&&d;frlJ?mO~6esb_QUel=tJUPbs(6Thg0P} zEPLfQ&uH^}kL+#Nbjb%-{G>m(UHQ4DA5$Hm3U+l#bGz^32?G`IQfsQ2_vGZ0sk*}P zPEC6qGa|rVVfkih(3d;R(B**M6nVwSR0e2x2rosz4Q!^Bl&pgX4pnXdJ)Qj{^BRY< zX8Q-!L0Av#ehBh?3DM=c$2Y@McJj{Z*ILa(uSxip?F1J+>Ts_$N{E-J_y&KX z7gWOdEOkl_M0IoJg%6bEdaG6(jwBs2Sj$lO2*u@_B6uQxwEp%*7Plsd$i|T+ue`O( z2JJpMSoX2-5u>PRWs30uzEX3mIm@)XuRng!#K<@b)Z{OXUa66oP&x;*h4L%m z(bv*?jfuY8O>>dagJrC?Zi9|5iiOeRZ0}=MC+$V8=4W}|1b|uWL-+EC&-#2=DtFon z*1nWdtHwZ##Ka*mEAcohI}KV=n^K0i7ffU6ef{^(=KWF@N$4b7jr zegh^fm9mmQY{unv@JYMw6EdC23r&PBCXLkhtJzS?7q{_{kIQ(&;NsZ3VQ|2NH;h|g z(@z7VgW>vV=t$|XF#sU7RSNdg*!n;DnID%>fbMTkrAE{(mYm#RV{9_-r9sar!vdu^ zCbNgdY|)1QWB@eKAO{(8{6+py(ng8X4MCuo7+Tt;*D6+7Oc;em&*&oK|t{av^LG-Xd+s*T21IMEct z_2O2Q%$(}{KKp@L&AGglIG3`|e2j=aTFJw`U3)tMcFG8+Mcs_=kV4_iNy3gcz^zR00mAo z!Mqhu4L)sK{P;zy2h8ozmC?DriY{&Y>-x&hCkQj@6N2x(n|WJJ!a>v*Ji@Vbx>{Hx2B?i(QBDChm-uafe`M?kd z!lxL>oAK&zT;%@>G4O-7BT68`&pvQfdZWgoR3sbOMaiwqfcX>^yKCu9>aGhJ&1kdT zUH$7^f32rKN|4yADQA(Z>$NE;^n5%>3JvSfW`>cTmas(F$_&Q1+jTgC%8SX)XP*r1 zV%IJv`6%Zm*I3)@Y&Wpp6bFdzY8|es(c*Qk=08Q`b%g93IGW7Q_W!QC*cTeZu7b~o zYM3qq_b;Tv<49Vi)XcZfZ8Qj63s+CLnmP=9s|h6xmJ<&Fkh?>E$r-IL&j)em9T`DXVP;0y{!=zrhr3;8AtFXdh$~XYMc#7FkhirLn7YUpE=AYBY>iJzrI`M2?OyaDI1PPbFLo z0EIGoNT%ghkhPN|r*x+UCQp3P>&BWGBhMbKij{WqSU*wbH*N2G_@0d2?jHoazvbw_ zI7MZ-(sV8`XDGHLFls?uxZX8aaO{DXsmYjs>u_#pllJ{GOv%^{F63Cgdw>wc&>7dWl zYwx1Ak#H3?9kOXtnMI2zQlXlH)nbplhV5p6$D2C8cbsISC9WS$c8}WBEDA9E z_I6S1C5x{>Ik!_=nyu6(P-ptm^zhxw@wN2sAYO9)s@*v$b**rb zy8t|YZsoMuVT`$`9 zdasfsJUnx;d*)>~VW|Wm)0H=y0>F;4@`mBw<)sofo8rP!8EzycU4*ACG9aG7;4-Mg zJ1M^FnV^QvU)LhWkVv;z;v(m^0nGDAG^y}qAOLPJevvG@jLe9b*z*fQI}LfG;8S8^ zQb$4viIV5~X720VWC^HA*>@JoLm8x%m8RcX;q*t0YE9e!xRQCA=u-s>~S9{I=9E2*Gr8X1Zn0<0UbRq;|iP?53%7qFIc+31}=C0 z%@%gif`8Ns`4wr`ydqZ@2yOhx9SdjqntxO8+oS@aEKJ^Z&Eh`)4vRPAzp7Wm@G~^P zR3K5@DiD&N*YCRU2lr!a2mqs3T}-FZX6bcqbVSXw+CUIV7np-1nu5X*V63CRUX^%j zo!1c#p%Gh?_k60dFizdlU}Hbf5i{7cYsHQOjHIsfj`1nQEx7xI9q_H!i&m|wN}^-J z8QF_;F}nqAul;SN@?(vU1D91?IU6)4-NC9*gF2USV3}WiQ+%m$v?}t=zC}^gNY9mm zW^C^o?T`XZs6JpZcwrakW4E==q0Bx5BUWMT@WA7bf&{Q+-YTZU;PjD0432iTsb8he z<`|}F8rB_s{!+GO6@~tc{$3u!8&o>V{doHc@Nqx1SSyr1oAI{7g4!b#+S_`qmwC-t zpkvKw=xgBsK0ItVhb{*mDc$ZI5t~jc6v0!rK0@--RFes*3wHyewHA^r@XgpnMe%_m zv>|Q2zH@|BP0fXy;OptA!$lr(9uiXW+IR_30VBJxTJNhDl#9z=`+xYsb5I=Z*_I^; zD$2c)l|%Efy$5>WRxFU{#M5mSZ7$SP`fhIW&gu$vKvg^Xnz>_{)2xZXv`1?>Rx2ad z2328QdJ~q(-%E+w zM$t1*bYvaQ$=DKn&z90Bc$-j7Q*~4=Ng|XaA2b9^kKCsl&Cb=CNKs=?yZYstzV6w! zA^zQRnefatawZ&o4cowwJklJa>|2yemTyCVpadBQ@yv5P&(IiNCC>a{l{`#}Io-I& zpdlglyTU8ky?rU&TxaaQr5TEgeMwlf58ebyR$tGmK!KcW*QqXNW~Nn`;M@u?7HV>g zopg3FshhC+K1JOEu4$HB2qJ25d_N6Ivso8*x;#9vWv_Rfe5EYV?3*i6Ka$@<{6U0a zqNc6+yF!cr8RF$EF1H~vJ#yJ|Gv{vS$nIa(*~DXc>Ars8Ddu>-7emB{8I z#l_Kkg23CR+|rT-dav?y*S0@q+3dcqTr=}^=54C?4Zmga`S*++LPr^eT_XuflC--g znIGzKcYl08yA*Q!vY^_tpj(OXFU$L8PA4qZItC*@@?hxi(~}X_r)fs}^U)wuiF3BU zziT^A$(2NH3U!?=Ox2{S8Juh$h+XcnbMt6T-NGcqG{-%p*45+>MGI}gfV5t5y9B+F zyLasR4odNOg32^W2l0cb8fXWmHwokn+g8oh(QO`trYWrJ-Pp_|EVzD6sP!Jrj~7%U zEyO>4?-(>+8TjJ0GE}q~JJrv2sU{$8p}JFqbxU>>KYC>Q+AH8rXqtnA!%4RVS0_f( zr#*-ep_h=~e%Yo9t7Y?QVqmUctm}CDFYEb6S^xk5 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MSGSROOT.png deleted file mode 100644 index d39c81f4564772e9c7711bd57f1a842b8f1d2872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4441 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/MUL.png new file mode 100644 index 0000000000000000000000000000000000000000..28095b7457b710151e4301f4dd2848ca0dbb319c GIT binary patch literal 5274 zcmeHLcTm&W_P?P81i=joDAj@}-9-UeAT&ja6h&!L1O@4`C%#;>?K9t)D_5X3o_^FQ)R%5o8u}KR~+zt0aDMgSp8UN|Bv3l;y;Q5u{c1&TPTc( zzTamRU9yAZm+0b(rRv-+|P-NH>^N_+vzJUtRVP972BC50Ftbp zX~=2fkU-*MUbgiGZg=_nRDa}~Fh&{zR4a>XtFE1WpuqwTdD{)jCfBlpNy$Dm{nP7F zKA^R$E$K$HMri&RFMK=1U4D)aT&=a3e-#SwK4-_^*0R>FqeYbqLAfkIBUXP!P+UXa z9%^-;K+zO06GDP~w?f90wGfyzptqC@yFYpro zCY?%SwIVBiq_P9Neijbksjq%aMfS|2;(vQ|pmd&BOZ2S&uOjso7#%;x!IofJtVw@o zf)sr>yIFN`v2Xu3*_rVCB|DF{#3T3cF9a4SYFOWnppsa0zY-2FEg%@DVksv0;&b6b z!84tBk>R=e)#oZ|j_=c&D-gWf$@$5OZP(7IUA;mWwFXJ1ul)hbW4~qN+Wy zuexLAk`PBU@&>*=Or}ZPyP#~y=L~|+N>=r}80dM;OBczUKQP)=8r2C7hR+~__Tx`P z(hO|F5z}MMF}*3_3*oe(5O#GRpW=dTkM@U9(xBL9`QuOQeTn5rcKy7!-oDtG5#_9b z``Du877-~YfWsFz&EB`J$so_U&g4ycu~^NXBI}M1jBsUo+LMX}5GQghg^>!=&4ZCT z@wQOS4=8J-(GE9E`@=Y0-be{Hs`HGS7`kJhycw_WUGJLNVTd}=5}Z%Q^&UKx`fAR- zPe&Mn0yN2Sf}mAO@J0EbO}#t$!`=-;(XU|-dio~(R$gPBT*7KG*i*ZU#+TV7er)Kl zI!Rb{e_xdTpT2jNSS@;;xpS=o^uLZi%ZPGmvkxE;xtx!`(AA~;g)FzTgQ45YNHFx^ z$8?%L7rAc9TjT#2ESNq*9DPFds&z*m`rda=JXlvw`TADjZ#y5T^C7#x|1Q$^WWHpA zvUOUdPiXKpTmE-RK%c*1M0D(0y zin088rX@8gn-zelRMrmN4@WYZR#F6PGfclIm8u`3edAWDKOn~xtDLJluF>?t)_%8N z!CH~_w{a3#80ju{+Y$kxk0uUXA^JCVkfIY*?Z^>fmL*7k4ypvf#opRH zrw(3IETlk~F@bM{F|p|h>2|>j>e#t6uwD057_$JJ#SmkoGcuT0Mw8~eN1agwQ9ujg)nF^zv-Z-ju0N-9!kvX2b zr>a@?;XR5m4i~a0HEn-?*v zYoEPT5ND&VO$OCaW6?J5MABl*YOO2wP#mAyZ7dshPJps<$tT!I9&*_^uwfUv&@SYd zvlu@LLBfbu7jB;8cI)1X0hg<@@$rSu_6H}qT&4_$&lS|fyNPl@JGxULMcEKHC=D70 zN;`U$r_qTrDHtObjY%3&i3yCfD;IN#c$8OFdGCCcL(n<(mD{0ok2mM`z{|Y5)I|NW zc>&Oh=e25yTX+^vjAagB6lg`nM%+TPoQet+6Yvbx*wC~$>8{MvcgpF5x)HgaW|W|{ z#1!tU!bY};grA_a*Kjsey6utj>UdJY%Ci;9TMN5kEk}~XeSYREa_=E=K_I<5 z$>h?>vZkYWoeugW^>G4G5@=a1+td(zj;!m_awGL)`Kffa9ciorTI7)ui4P#luPyKi zzck)|OvBiJ&502MfKLVk0Xoypu$1W_-za;YeEvz{AgV1>nP&8>OKmqXrt{~w-B)Fj zDz;5IY@0OcmT3@aMBtCYLbWwv)m=NCZITBeyI6Ku;TR9u1wS$9aPy3lkzoQ>;2eWY ze~Zyvu&wHL+7`jddfST{xfmV%WHM#;v2AIS-ytMGeMAGT@Sk6^KShzE+4A=&4cLj; zlo??!S~wZyzFr}YxpqBoW;JsXfLxQ7*Ypft&A3mSYbe{lb ze=V0sVUX|(_G zxv219X-RxNr{gh4wF=|jZ$wL!oxOy9guW`b%F�r^mRCN8;Q2?-;J)KRCyuNa2JL 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 H<9zcU)-Qo> literal 4670 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 PrrRukwK1(a>3QvMWG|3J diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/NULLIFIERSROOT.png deleted file mode 100644 index fc8d2cd1050905e2e464dff88b46cfe9beb0895f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4462 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 literal 5424 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 PyD)5PjkF?tb?Npm3LAYH delta 2790 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 X=T#&v<_A(DpQo+QA}lJ;xW)b*e3XP~ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/PUBLICDATAROOT.png deleted file mode 100644 index 44ddaf86bc26a92d81bee504b3b19bcc2f9acab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmd^DXH-+$wqA*HX#y$&A|MW}mbCo&gH`h1!<7-!q z1o)2d0RRL{j4xRLz|+W_M$n2Ma>=Ch#-^0PN>b6eowfOG;^s1p`BfIGV3t8 zR837pS12qoOky#%zFay^y!qU%_iwV`E2QbjD2iBE=Z*OFPe{AyKO|t0kcY{&xTl&~ zdFQh)E|c)1B(78vYvsdT@v92QTqaiB;nN;)NzE6qr||UhA*)rL+X=H@(y=UegK!n> zVis%p4pbH+RVtvQQ-T zy~ZdhGFTpR5Ow?Oslb}hCdGK+YY_)VMN1n5Sa(~+Nm(JN{I4mRKJXJgR(br#Jp2x@ zrs2+{mU_WjnaYw*bh+fjJbg(RU~Fth;UCS$GD!Z$IdlzNb!y=@_;QokaRDKy4^c=7 zKCX?r=H*96dq38xtGMQj4{2wZ0K}m%as0Vow{B)`>@VO=efh@s;EJ1G4jmpUJ5jvR zDij)X42b`ev))1fONe{PVjJ=3+G``-g^j6D&ybNVi{#M0{G)4qC52B4>y>s!uA7hl z(@^053dGko&}e$G7i)2KTZeWdzaS^cIg+Lq&6mRj)i#6b*gXH^i?PScIf)HJ8`y*% zzA^Mao5dIt5m2>UYAt~^x5b=LgKPcBHr(#(RwYj2)2WbT)=@V2`Zf=>K~Pb>^>oYqpL-;Hgo5 z*w=|`kc}VN`7Bv<#p&0=!AT*7$}E$Qys(v1{yZ|t>AE5JE4uh_W zBRI2av8V>y*;^aaBr&IITNX|$dJsV^_z^LV%iIHeD=Sbj8{#={WPrYKv3_kEdS5y| z%G1I>tmoO8nzvm<{`9~ySXA-^-uI5cFq(Kg@aktFE{!EcMlj{(@78`g-Qo@c0BD|O zPPm=s0o{C%p8g_v{gtNXKt;!Va^PIvyM3oz1_$#hv}tK!7bH)GEF(uJ3<9OU^bWRB zRNj+QJ-MZ6hhfx%aM8bj+_>qzs4Y39lBURB5Pa^&ki*TzgWea6Rj<0wun^QaO4=yZ zd0^osZgI_#nARLPkme*3^pWVBxTyE1adKW21XLT8cx15;)3{<6-G>h=>{48^NoDO{ zq1OMP&xs7y+!@^bu$Z4&5=SwdjnE1dGlhVZ)%){R92HoxeoW!pvI!*2yr}x&nU(H> zsr)E=kyhbnettLo1~cUCn*j*E7dGoq5CZ_c49c5xeZAu)Lv*_EbE~P^0^U5p?|U|P z2?RV_veYkfJ?+SMp>vKU1C_QY$f`tJ}VH z%7lVt^($NuaO4(OPydfza&sC|Y%2W$+|cY|^u1Z4_c^-L?%Oh&zoE z@yL+}Oj^mCRdH5C+~n#BoDnMAI4?QG*gpG#aWZPPIW7LdV3N=2s28`B$`pLgYd;{J=Iesvk$ufufW*oyn0j6=~k@w|%5FUo7% z#4VA7c&F$04k+hJ=`WON^j+#;=c>rK6tyv8rEhGpycMtY0R{*)CBdhs~eVBJa zSN#c73ynCr3;J#KkB?N0E%~ZB2yt{QlnoiD#Lo~J;P+S=IzVkxvgS{6U%mc zK)5bv11H$1ZG1I$lMgH-I35;w59P&}Zjak)5zvzlEdi!-Ng>{M!^7>)=Txx+!@ zXch|qRPUys=WqXVCPv`!zu3DD^p%xf`u3Z(QmLtL`FjoxEmhAnx8S~Yr_B!IHc-Kf z&u2`bKxma=m*~N(FRqXRj%Zx*7E`(xNhd*qi*Z!Z*oPZJD{>IPm-PflvSTE`tflZY zT|0p~_If$tVnAl%7Usm_p9yJSX9cY7PH~khsD5+oWz&q4sJj4TL=@^QkOPDJWpqg+ z+k!@hsm&4!k$PNURL-L*g?=TcJG?B=(4xn)c{ zBC%Z~lmV5}@xaw^IW{i40tUCB6K{O5=nK+;!!uh%O%-&@n93zc2Q&H`DaNZ)0X8ZvDSnq69ZbxuvOG^_)EB)ywFRL}Wv~<{b8FPd3L@8cw z7F)-LecV@qMv}MCl-oW|tW?-W_f;+`5Rd~8UlCtxybi!Mx_HqKR_TyV_bQoPR%9wP z+Lj0|x=5=xNct{6A}WsT^ImM~Obi=gU%Hant`X!pF9bAPSs^8-Du}mj-Aur3Z20rV z4$UDuB+M=2{!7&-Y7l#rjr7+Sy$RDOqLnCkF|$>mRUp?GW*fcgz74nblu(lY?6p}= z#k!NkwZ)zuh3LQUIJ;SCU>t9H-RZ{!B-ewi`6!C44gG11>BBpG@n)_lb1xVPK9@{Z z?h;JbY_mGU3%pK-RgQ(7=`!8^E12A9K<#HW1nqs-DT)?SALje^^O{wqTSj@J!oA0JW7B8tBG3ruvQ5wLVy^D&ocej+R0!KfneU#6xb%qB%m(xaLz0s+~OCLAJGfzp4ML<52_=VJbdRD*MFv^=2Ax==tE^%jUbM z<&X*lF{4kG+Sv>jr7wEj!@`*9mum2&+eukU`v5INToLJD_xa1z6;n{erW~Zo*2hGi zoEpEtlBVRR^X-2bS@Ww@E`OqW+5go&)piqU|L>&uw}> zc%k~LE@UXFzJ42Lsjda|qo*4YUq@Zb5WNR6>1u?|jOS%+`u-=+F7=%B?uY`IDvt=J z3)g?EK6W6}gRq}|aTpwr;1vDrW@%=0w(}naV4o|$_HOt8w>tb^_H%(D?WPrX|5UrY QKgX~p23IfPeszxd8|o>S2LJ#7 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/READL1TOL2MSG.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2a43c54e18e715d4983cecf7d48cbd64b811c2 GIT binary patch literal 5724 zcmeG=XH-*Jx0l|*p(`Lr5oDwYND-4DML;PkU;zPIs5K*_uglhB%HG_=HWcR2><|( zsfpnQ0N`o{_g(Ca;B)Yi(q{k=mN7LvWgUW?9~lYCml9?rX#c)Qf8S$NV4nnwkCsNE z%jriO~Q`)x6Rgu4q~w9^;H^yeM`a^)Bf?Ctdha`%v=H2xp_!z_QhO)5t} ziusPHa!1icJKoG^?Ag9`Idkv{qgW!ladJYE!|#OdD1p8i-k)!qBVwICb>A@iEy+Sa z0?q2NM-)P;FEcZK?6$Tlk^4>ICG$@>p#fdeE&c9;{j=wb0FI5{Y!81_l|`riYygP8 z=jYr~Oqlw}eYfe@$ePIFwZ28WJ>0L@tu?bK#KSfj$l((wcnN!OJ)Iig-5A_m|3Q?H zp?d1v24r&pfcD&B0&25qtbnf;g$Ee(M&q^W`Tkp80%$P6%WSa5Pkh*$V}vGll9J-A zo#O0+EHM^5+D#eiJNIVhO9_qCzW(LtL>yMUP2r7>b$59SL^~N0ygCs zE=vGGhT`rop0rQk2LGD>OakkY7o&!uhUJ-|#WWwEN^bheMo571{C?%^AhojQ=@PWx z^{q!T5nU+>8akSZMF?2h4X8D@===Rflb^EZMPZYdlO-wc%Abx#d+&6kT8YAmQO!e6 zVbjUy4MDXG^ZgG8>TFJ><5;verF%6o5y;5?>xo~x!+e}4ANfEd&GKKqQ;s*wHWC-1 z!_5;Gi|3b1wrj0?DA#kr>oM1KU>K2@Bzhh> zHD<&y5oh%=PSqgZES6L2Sk&|*yQOpQ*7FEq+a3F)dgwO|Aa^;@64PXQ|{9?zsEn2hI#+ zyMN_>AS^Qfx~}ZzaMnLB4ge?oBf(x^PNHfG?vKr*9{#B*U`PyPo~og;S`(-$@aovS zP44|X`(f#-k$)nrr;@mGYwru}q33b@y1M(a0G_`WybZ?L303ZvQCPd5XM#>l zH9ESvu`Jo}GbxST20hR2B^rxM@1DN*Q+!T7BM(8+Cgta`$OO(RRThds;52%-P94AT zCm3Gt&m|A^ul&r7|Cae{e8Yyu4=QBaNNO&or55p}j6!DyqSO{<{qroxARl!fQe{MT zG9-tCUo^0QMK##QLRBkg+*%MUw-80bNq5m$q)O>`i*+r@(Yf0d5!0`Hpner}s|ZG? z`T2sC?}3FVFxNLnU^%32hnl^;+}aH_#bQq1 z9MLX}Jy-8)nv=L@b+2{6K29Xk=H-J{u8}vdK=q|^v1AJiBXDOTkQ-`CW$vzDo`Pzr za~3*;-8^cLHqr0jO?qsJsER*pE37Q`RH-|g*i=^q9PaGHJ=?7k7BNlXQq7=4g ziN(?%2oad4^=jEx{GBr*#m;9g~=_;rXpbt|*KUnP44i1bzhcQvt2J8fRO zhRW`nxssSFo8X2hkDN9Ca39wYe0-1}q=@$2Q=4E$9hW55Lp-DUf>1Y){7!*{W78vv zAkOF3mkQtyhav%3Qn<7Zx^_wRhi2jz?y|y-x9vaGI5Y(OAqnDW`R%f6KE#kk^ds>a zUUOsvPc1)O`e;np0>t>SVh-!=b;f!gVDbJdaEo?QX-!_IDtDCkG@Tbn7^q){Zit8Y1wxhPEfG`XVKU; znF(#->fJVR%qi-uR>m!0`iBxpJT0$#TDLq|TvzNsKLbmRHy*e9^E4wlHGqf)U0Em& zrRAt^C^44RN;;07K>M6M7~a;Pqsh?Rau9{Snj3Qv*ca2qt#^pw06Yn2FpkIH8*Vz$ zEDxb=_qk0yL1*^h2P@4dYj1J_PlmI_N-Uizpq$2Y*VQN$Rfg(G&u={fJ~r*o9n>|E zRbIk*($kh7H@oG0%MjtU$TqI(R^jHy7gs$cZgkfP>W+9l+x}wJq)4%PT5u-N&SBKM z=sf};+^_zIpe6H*J;Hdc)dS5(X!72pc6WSxIf0Y-&rH|mvl+4=11kHw7GICw@NL81 zw6qWUT#TLX^R-ve9QlyiP{ot*o&S7|9Z*lW>0TAAzy^d|m_BL90RiAu ztuCi^AaJYeEFO^$k_EghJ;+TPQ`jW(nhwNaYDDhDG1#Zu9f6b3dHJgC%I&hdWlC1h3KNv@$Y41)k8nx-NbDACLVKKj-HaA+Cz(GCXwF7E<=voM zG$+;%-9koQ3}av$+lC&@9c;`EqWo(k39{brzVYI=ASwIE_A?`r zLMnOs>R6)$4#DnF(Sxxih50Xh!!4A= zOF-auA(geU?R9ThVn(~)-167AH4aPPlW)wvj&JpLh)$!O{kCj%Q;uFy|6ER`KZux# znGF-2FRnHRjCuQHY5bubI4G>HVc0G+VTr_$%T<#x6<%j6x2ovH3oM z-!5oOytD6Q2wPs})W{ZcEt8PdBs-e_qo+cZuuOi;#d?&& z#_lF2gM!&hypTtT?P{vIubTQh8(aMX-7`ag^_%^uvcS1)k-%32GuUKoO(Y6v4!=|0 z_yCM`y*f7G(>I0WGf)ir9D=zot1N@p!oT+C1#HwS6i(GgjlNCqq^~Y`Z~%*bvtw0H z(mW4tDvR$E(K_AOm=d?$tyEpnWvDen(P#kR3neqM2r{gkiVkK5K2P#+nFn{$rTKCl zB{BE=8cz?Fj;F|qOF0MOWy=MC)7k?7>f>DJ@NvLSO@ zD-z5L(6>3;Csi812X1b)1A0QipP{*>i)a}jH$hi8OH&e~dVbK1n=UJosHi*!Xox&x z#0A{#oQiR4+i>&2?zhIw)eh(?(Uqbuj}xZz<<4`MR zZJJ%(v0BmQ-)qSREIhicW<$O?u~l_=Hv{k$H4p-3s~mcT^z05P61H5@@mN6Lt&x9Pd5zvU^UuL8MA9w(E=WvF-DpKcvbF@ov7u4U>tX+_ZKKoWJ+h-Obv;GoKnG5$>Zvw`Km64jHfS{LP;UHAa za)I-uckfwgvQk}R%!RihEK3K^Giu1KTw>((0KK6-z#+8M<;x_J=WF{K9es5 zJiF0Auj~+;{8?gL&on7zKw)21b3w=EwlNUJc(?jI?(P+Putx-s-?B+v(h3 z0W`rh&LNe);8QVfaSR-lc1Qkq>vzlFH&Q2^RlF`SHOA5Sz>bc_cdqD*zCiPFG(L*a z2Ao*ocIf#7xn-8tyRC$D_^`f!9y6v?3p_x_RbIb!81dkDNkQ$F{IA4U!dXD{zFnd$ z+tTZoA-m9ZQ7$N8xjV=FT>m!3{Pll&l}_RvABWGmh{k@*-Xq&*Py8)?f$3KVbncxJ na_`+ge~kUd&)NT13hr>Z#hma%j>$gTb)Kn_g<+Zgwdnr>x5j|D literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/REFUNDEE.png deleted file mode 100644 index 70ccb4c1f5a91a886e62f0c399de9e395d585873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3553 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 KJ?Yzk8-D{HsCw=I diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/RETURN.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/RETURN.png index e1bf7d6a19d527b8831e47e82329dfd6deeb7755..90d42f5ad0f01e26ca9f5d4da5e412be064ac62d 100644 GIT binary patch literal 4324 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 BKS%%o literal 4341 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 D(N$&@ diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/REVERT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/REVERT.png index 67c12bd2d06e75353f09906558ebdc098920661e..01aa918429fd494ab3e4f70bf810f0272172d54d 100644 GIT binary patch literal 4319 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 delta 3236 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 literal 0 HcmV?d00001 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SENDL2TOL1MSG.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SENDL2TOL1MSG.png index 04611cd6a436c4c044f521bd731a3124d0c9307b..253882ebc65061f99f5e8eacbda19ddd39275a50 100644 GIT binary patch literal 4670 zcmeHKS5%YRwq6M!QUnF0C0klr2I-K3xM2fgP(Z~1LCOYH z+Ch3Tii*@wgdkmzCcTD02q%HP#~tI2GwwZSocnMe&U*OA_s=!wDs!&+&9$PgnCS20 zKEw?G*muc5*A#%gBqnay3uS&0K1Kro2yk4|yeS8;^Y7C?xJ8=Jh0095M3G`A}*j9wo z`X(MF-j~X?QB)>1=`S1SJ8;>Y=GdjRRmwY2SX5i6dvHSf~lE={WXx?yF4W5UH^fp zM|p(E`c8N+gyO~PqQu=tZ^69QDhh1RQC43v@KC92Zu z%0$nH;!9|}WY}4Y=l8$7z5WqSNUlgzH#FhQn|&d;M68~EIv8SD`p0;Jdb>I$D9vkpDL5(RP{G(cd@KkYDVvLTdf zxTd!0p>Q#3Nb%Jr7K`Jkh0JxjRj`zC2DKikPE|MqoCRGq!Kd zxRqoehhgLKpXrGb*rsPKc2iyukdtMID_fV=z5sBWW?{Z5PNF_uz4;vdF$Ici6+N)! z$ryNf5B4gN~F%%d2kc=NU0*3U}x;jQM$<+)4Q|>eGSIuiWafJzeQ- z*zds$5C@YW_8a=$7~2zj!QFeMg;gJV6?!Euy_n~1p*y%sY*pQ^72{(zV->l>C$g| zz5m=8U%+Vq2GczIk1;oT$B09~_vVmt{8E_|+yWCEWs*X5Jta&GYC8l--{$t`^Kd}G zp(i_Qu=5PIu*Ahwo+C3ueLckAhyiO| z2I$3x($e;4BsExK60rvZ>(kG<#sacDBOtUPFIB}v*vo-+P>T>-8+)%Kh z&C%gE&Yw+FOD?2^oX)17*q)405II~RVRr(X+N^1KwQ_8x|8lTq^3{X&LF3DH)QPI| zAu_?6jG>aG>>P1HfQvR{t4>dSw{6J^wT^(nvtH`MHfsgst5X714rz^)(&Xfk+e`St zHBCwH`XTR6>Y4KT>|ofu>z#Kh$`^oEM;?vIx?UK65@CP-mWK&3OZJ#tlyj24Vz8O7 z6N>sl)&&YkpB~%?pyo;#dyBauqlYrNtzy1Uocuh_&KBV06U^AeWy09oisto9DfRC?@qDBk zV{OPYW825IT+3Pvtk!sdc$x6kHylQzs@5N%O4J|hrmgbfD_iel~M(@0>;z$Z(KAn1gx& z5ia)PJOoGGPXoV)bE_k?8ZU9_>VSh>?b`RpQi)>t~3zfSwX0v}r4fRHzsv(f_JAZd_5$`weO+!y? zAIyEYMK-KH;PD)}DEeoM_0JZP+<_Z;DHkzK^gU6Z33fquAiy`zDKjAur3{tR^4iGm zSmY;dX(@%h^-jFdF6)yNJ3;83HEC{sMw_txex@w-b-7!~Mmi-OsXS0V7qxoZUg_-` zk6OktplNFI;pVb~NO+wtZFSr@t|2eUOd?djdmBm$ACNJ1GoZ6+*0Bj1ND>?h15T#Q zxufH^VUzD+%a(bAy6xFPgZkSb9(lgza(S?kn;g24GN)&uW|VUtU%Muqv^9@$5H4o( zL_0_>*Ol4}-!c!<58zRS;F@d&P&JsKAP1qkf-Z=RR}fPGb<~x4f=<$dB|biIwc_mr{_H$ z*mZV(R}9qsGpfIuyHzK$;Yr-5%CP3LnM29sPWjNxn3C$9T zo9J*ry8TGk(7n&@>qal3M@@&hl?JwxaZ8qB;`4OAR5VR(wKJ4}nhr|LF3rqGH+6LK zJKNAts06(3L#?DgB^bT+@h?8>2dInHVsgt80}2oJ0I!@4<7#5!xkf+fqU5db5cSn& z?o2aFv6-HiC6yBc!3L@fSLbVq??W=PAIT!$HaesqbKzRKgE~L0t{OC`0R`4-=ki6j zlUA^qNC%@ZYM>)W2eHFqkAyL`pz+97g-6Sm;uaN1ldZH_*0Eda8JS$ee8M8X_@Spl zcdRR<@^eK2UHUvU_%dpuPYK}Bwq)D?S7BRnM%{erT7%C;#~ z_rj;AV8JJ;ukfzrv7k(N>^6J{#$Q|q<&j?dZ#L|VMI2z~b3CFjdBux>h}uGgp@_Ueo+T zUz{Sl!zA4qAgAZaNeSA?oT_8Kf6$LvAG|j>&OOX0E7C@<98C5rFm4`de=Nxf20a2Y zed*U#rnuAcIIl^~+T1SeW_)=_tPp)UIY~)&acyeZtf&%n)FX}uSUunTAW3)^jTEaF zQ>f^8?}S}Y%-Oh6BpqvX+y+;icd($K#WJ2Ec=|eqWM$c|VI3nW;Qg*^6AJPzwM-5B zs|@somX*Irge8221L_Kiy(2OD{NJkj4jx4<1!#1IX4&w3U^5qA)2MXwS?LIWA%;^< z5C$ni4r2i}HDkG1dRq}0fJD|hnuSJpD=Z0jfSQnDVgD$%ZZjUc&bgrX1Zv s^}sAG+6z%}YdhZmJF$lLGXMYp literal 3591 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 Fe*kto-rE2G literal 6614 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

|hc+!HZPvYqg?<4Fuz0BN-#yCn_| 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 literal 5419 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SHR.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SHR.png index ed85ae15c1f59a61244d04577cb793ac3b9f70e6..d6e76948abe8386af596340ae34a9d6082862200 100644 GIT binary patch literal 5354 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 Uwc1?1?1SwafNyj8|X&N+2ks?)8YB2N; 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SLOAD.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SLOAD.png index f9c6540667d42534817b11d9f7c9873120712302..05fd89e17ca6d8144f658c9879f5692eb710150f 100644 GIT binary patch literal 4327 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 JrQcq@_jg7iNbLXs diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/SSTORE.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/SSTORE.png index 5580d4237a774225ed61e8347e0d05d2d8efc1f9..14742f8d60e0c3a861d15a7a15f9dc809d79939b 100644 GIT binary patch literal 4354 zcmd^CXH-+$wq6M!MIeIGq@II#1w>F#Kw^Rykq%N4qzH%}ij>e41X2`*djJgw1*NM< zmvW>S>4zqvg^1D;n$koN5Fro}xB&ECv9D1OFF4vtGyKu2Rimv7djf_Mz-;IqdCKUusAK zbxz=A!}gDc?PbdTT?RlvJ;xB9K)vxNH;w0qg%cd(=Xb4ym<<>2AB>p^ML%yn{Ts`8 znceO%NvFX*`j-N7MhxLuwIw5Yd!K_hYgBoiZTHgoli_i`sxq!!(|?NV^D7V=<*7Ma z@C;HS0j`r=K*B^gME~N~fw*a|Km9w$lf{rf?}F5A1vie8_Y)v={v2`CYNns$nJVE%HAq*eRWz!tqoTC3y&y9i@8ryJjo`S zYg#k?!-3<6E%kC0PF3S^ZHQ>i*mlVtcpL0?8*CG6-#O=*crhk6B_@86`IfOxv~Eef zTA95y(aniI)ysNK9?gL^rYFM&yT*T__%_S6!BCM1e_P}ut+RGr#;@K>8}5TO?t>l~ zo!v}^@NnO@&CX#3f8Xep@gWY*Ym!M^PbzcUeqA1DjpH2Tf{Q$>Y+sISx`CFTyr?g^B?c#EFLau=A0h8>w z^$0w{T9a}1>D{N=s0B&g+P=k)e*vIWqY{5NjWpEO{*$*3ZN23I{4*~JwyLQor3<7l z-)WH^x*gShF%+Yn++OaqUpf*qdWv-vD8^Pg*A6zXUrm}&>N@Z<`O<{KoTs?ZjJ&2O zrk^zcW9~Bqr<~P6dq5pfXkLX9;`>V_(Eqgr`;lc6i~Er+&z_z6gZ&}s%}fpl8X=hl zG%K~x2p1-m$gyTs{~OcS{}meWxa4aIBIb&zvVGQ`%ILfHiF9#@zjVG&9So@CYzQXp zmqN~8W$okz-0ACnH{YwgyE*bdB}_{ZtNgtLn~pL0>XMo@b3#-kt{b_98;c=sKiv^# zFwXNz9~xF^)8S>R#Z=hoSrX;AYTE+!JSa=v z)s25u+p01>Ck!l~TC-)u_%+o*J^_=Z%d~R0FA~B+87I@VqKUriR}g;RQWwPm!LjgA zST^#-A#OlIswVW^z5E8^#~*qF*6} zeZHE63Z(an*a`t4G0dvBQsx7_0+9DZg@4g+ZcE#gVaMY>K1V+I#aOCnRM=wV_7nPk zcdO0}46Xk}p%dH+qsZuN!9`TFFV|iRp*FVIrCe=?97 z>i1>7nXU3&-JLUjORlaPYw1wA<-0XYL$?M#|Ll@c9hU=uakarl@y?WcV#WcXsQw6x zDHE}QgkS0_yjQ3a_N{@uMv)|qYM%~SL@NMcQ9fT!aOi5Re5HTa!*{diB};rVrsJKN z)*Q(`IAl3R-H{9E49j-h+!=JA+qk=?Dg<3QW-)Lxd+eu>@2XR>BWY7_teo{M!{y~A zJph<#mk7IUdL9rq%kPg!<<{3IH4s_ep*$BNX`rjBWkAh82Q2X zutXt)B5f?zd=+B~0bznW-ZS8M gz>!-VVKJxXl`-dOiWh-#qreVpW!Nk!@>O;2z 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%0Arg5 z%Ev8>1?OF!N&kMlvsW0q+IFO1mAA4^q4xS8(g~~K<~=e-hJYS8i~=K zApPJFL&D?AO1FslEQY*&rf2=aV@)Bz^4ZKwenn>JSa7a*k-T0JQQ2AKCkp1Yo}Yzt z4FP3La2^7mn?X@Tq7I-03FeT?g85qAZ>Z>5icApz$wmBt`ridp=uaIK6{TqaE+Ta# zK$j?T@V~t9+$>-5b47b%R(=rh0|568_crk@+Qe`HpU8KiZng^83lVj}c7y+K69-W$ zD?7o$u`*(wFW-{Q@fR=ryKh|r6F`{lKqL$X!!liiaRG|e>>cp%cNB~Bkd`G6VL&v5 zD#byHmF2B~7ygE5SH-VMInbfpdJG_ctqnmpKjrB)Y618)z8vAJP9KP z2j<|~0a<){R*}%}Y)H;0kCI-GE5^+-mPR0AW_^W~P#mFQ^;SriSUmZV=N@g1p}c1j zd2+}>dM9;il!d<%&_8PuGeKT7Jo5l*Qa-;fg&Q51+so=eX9PP;0!pfO68O4Ho$g+I zkc6M~9~_$~&r#34^i8$V;A5Lf4j(&6gw)&8XiI1C(F zdLB^9#!s`ehD*;X@edj(t4^m=-F&|6`7}fcVAk{o%ru#C?>-9JU@T3$WVp9LSb30l zz6UKw3e9GsGy#R|R0tAdPD#oezUsl!Ix zpw%{K(%I!TIfOX7A>iYXrTsBetYWS9nYMx3HtFP%Pcs&rrZ8qj&3ygoL`=dlFyg{P zH4;10RGv%i5gd7MJ3R37S{idK`z7m9|Hd=j>(Ban{PoQNUMmb&XHz6D9gfU!IDElb z3}{bB6_cEl%mOqXK9h(N(@!C|hHk&RJb9_`Uc8ptAD%u)+ma&%l6mCcozGcXURbP$ zO-0LsHxHyvDJN;L9`Su!&C5+?uXF5R@0$`7++JYV>7c82$nCMNi9!RXUW9@)ru%(^ z3ekRq2Qmu%K89+UN8hKN(z~u}*8~+}75j#=ueWI>7&T%*lw{GmbfXrliJuzho)=I$ z&89PBmdy@w4={Vtp^{nSrpZsmMyUR?yo4)Gyf2D-9wfBK7+n^D_fpf38wz5gCo*-> z_jKgJWMhI%%)@NW0vp<~*itVT6XFq3s4+&tLrcvJA`Q5WELUO7Eg^9QuiX8x<}ata z()KfB;-Y9XM;ecSunWbGe$izC0fssDM)E&;J<}F8ek+~t;Q`aS?~smV;(Q(Oc+$b5 z&jp@Rl7yw|3Z-ZyzaDysyDMp-T^mlIE@fH`lb zvdJ}i-nUD9W0UknrqC{j>%8Jzw}n}5+gQLDM7A+r&3zh_$PQ(HIOn7H20fxOOV5)5 zG!m-8BH~NnD(>g)B38TL=EC`=1W$ECQWSkg?9C8$E%CWkMBvq$jn_jjSS3``2C*mf zm_^ffJ?Y38Cf8Zi`~4j9fLE41Id+sqj+AAfUWf&Q*9q8y&VkUo9;cV_vkF!q&7iUU zNm`}xNdZwNYA&k*R`4enpnR^nxbYXO{!9Jni2*jZuT?;Vu4-HDEaiOfF1w|Fw!J^Q mz1^|N#Q*R5-v6;?enY%HefrjExsrH+V-Z#kr^-)y-~0zbVL6!q diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/STATICCALL.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/STATICCALL.png index e433c5063c3509b0ed94ecfeeb326a364b003ce2..61ba39ba7fbc4beead09e57e864f02bdb011ec52 100644 GIT binary patch literal 8847 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 literal 8813 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/STORAGEADDRESS.png new file mode 100644 index 0000000000000000000000000000000000000000..d0455038b2e6bd8fc3ea0a8cb829eeedb68af197 GIT binary patch literal 3683 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 literal 5414 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 Bd$s@o diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/TIMESTAMP.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/TIMESTAMP.png index 8ac215faa811c009b8d3f58fece01e2c0f637a8a..e505abdd032927ecfd17d688ad46509c7540cc46 100644 GIT binary patch delta 2815 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 delta 2757 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 Mj#cTKe2k&>5i2wiq diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/VERSION.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/VERSION.png index dc95ff9b5caa13d4160b28b3608d800564555c3a..c7cb9e18eefe26d0b08af1368d9bfb5150090f3c 100644 GIT binary patch delta 2775 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 In=5zz0&(hFaR2}S delta 2703 zcmYLLdpOhkAOFrUxy(sIG3w;{bD60`8*`!y3gw)}uc4I4lBC@8UFqm#nwU}{tCLn@ zE1LVF%iOvwkzvezQrj%6F>^W7?>W!!kN5MuFR$nGc|Onk{eFF3IVK&(*UYiG-d?}` zo>U|nv1OFN6M6cN+*G+qD-6};mtb6 zWPbJ=f@Ja6tRO04Y3<(?3Q0)K?{J!g!O` z>O(scmn=DF1vmYUmA|9NvoD%;NzV;Ex;OKL`>g*aRv59=yc?!D{j3&B{NSi9T_r8{ zBX87r_lB(J)iPJYIdC)FAQ#2J2y~MLx(lnRfRLI962qm*PTCpmo+!#?%%{vvZ_VcP zsFGb>Z39chMrNPW!sMvvE;_~ET4wJ=;_AN4WG06%T|<>v!S5$;hG@p#mtKo^O*ve^ zMm9&U<{2PIwiRPnVB2!lh_(ww<%+ts4`ZE#5rS)57|zeX=S40x zqx0eV{5_K!+3D|xZ}|!*qLG?=8EcA$uC!-|Bhg5*BbZbrj@1~yvrA&?KK*}Vf&6on zP8};72&7|q!L5D3r3LlAxYhN|U}!;H_R*pgv8+D(sL5D&d<{3kWXxzXnQ~VLm)i_S z8MVZnWa(Vie)S<`rHRBK?&{Y~J;tXm(uaWl^_k+$UhADemzN6=fd61tU86ukxuAmv zmzaEDyQB82AuxNaH^GJmNfZz zzabbGw-9nvg~6P)!A4xy9R9P1{CZ~X0UPz+ov@Cb)kpt2mcCpyF7vak8>gedbd;+l zZ)Wl@fmUS7U)2Q|Cjn>1*uSNHAuwHZ9G4TFzaDUhksFkkfh<*P9NGVDIg@abduh{J zPbMT(T-z^7N7g*L$NVuJ8-CKQuKMr?2xVHSvAS4an#B zhy>6FB{{P_U|8%oH5>dU&`-Fr1ACzCu;>U*KQUlzIQ=PM5kB-QK<};=+pq!fEY)LM zhxk@rlWKigTH_Ad7gizZ-R@J*R2y3n2?ai=W^gxg28c-vk=;(*OdcC`^KwY1ne1l; zFU>q&m_;yLm*!*O7nSQ!_2S-58dVE>hdZEM5{L-cuU;=1Qh? z8OecphMM2Z)dIiL(#}_0W!wjf{A|>%snCgNm|0$>Z0DA`(?(1?_ld|t#Fq$J%P-)q zc(0hhbzb<;sShc2iL5-uKMMLsrS;hoQRr1;MUr zgv1XCFe`UT65ssXybQqXDm_EfhYCxf6WgVQfoX7&+Z%} z2P8D~`H%jzYQi>Vl5T;Hu;5fB+!V9a zYqJk%KOw>O0fz}~E01^|lm`T14d6Q#X^`82SrAQ)fK#pMT1ikQoa$O?bl6b2zZ)Uz zoQzVM67wUUD9PW$u%5i(>`!u4y(2Liqpz`BS^L5#QEdw&8d4aLRLEy+=)6FAqT>yM z725!!XXcT)H1{!=g9tEYEt3oXP%NrUh7H*-{Fm3gkO#z4p=#8lL!LZ2N<7AeH-{=| z;Gj^hEA>@rybRA*%=cl73un9X*ET2cl?7IRf&*ruM|akGpU73;)kby2y#6BLVc2y@QnbAQc}*o zMWLx6mBfzKASk9!7_1Q|8SwttV)*@($j^dn=Y5DU?I-xA**er0f;cUouR@jgY2a9QAXVDXY!3|1hYr{u_hvi`Nd z;0E))7SHsT%tk`)ytBa6RL@ZV!fNqU?k#X(G$+%}16kQiS)`()= zQ!7MtA#3-@U_&Sk90}vP}rt0}8+^5$tK}+7Nx~q;B@SyvC;3Z8n=CIPs^M>WMcZdJ1EZAyW^b6I{iK3=@?aTVhji$Zs#mAFco(cg zbTUoUIQ)AClJ%i@4Ypd%b8Bz|?UKs2IG^NT6Z6e8xfv~GaQCM{|C{RFVI3H%dYA@83RVhRFTqVES3H@ofnw(kQd1P$>t1*GhJ% s*9};4qvKcUQigSmC>wNomCC_j4t!qhWav^Oidw09@AUJc?>Kz%A6p_ru>b%7 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/XOR.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/XOR.png index 83610f677e960426e92dcbad394529a680ac7696..668629f573f3162aaf66950a280a12e29d850970 100644 GIT binary patch literal 5345 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 Xi}|}{vi8%HC7`2uR-@>&ZSda#A45j@ literal 5451 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 diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/internalcall.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2930a7fe2697b36b8ec481238cb032408f7a27 GIT binary patch literal 2934 zcmdT`c{J2}8~^^sk~PT<*^;_ch$uUyxRxmtQHB}CMcJk#OqO4_PI)QI?V^~BC9*V@ zEHT5-t+*wPp^V*FvLu7X7&Df+Q|~$NKli-v>HhJa^S*z4pY#2G&+~kj=lOh|=lO?= zlby7Lk^}%i+QHuD6aXTEDR?c05J=Wpv1i{1A`;j$&1DbwMsCQtNWsT!kbQZak?LzdF-l|NM8|-k< z3~I6Srb|cOpJGm^AWZD}bYC5*>_3X5hMe(YX~%)+8HVo1&1KKQ6m}x7eAdidYVE0T zmQC!)VPy2A(5IqhdCAvs!Cke0_srt^{m!2c`<;R`)6x%rMlwZ`jYz^guCvFTgjNfV zib9CEmf&wSZDyK@==q)Ty#WbY;NCP_gLDD59WKuu$b{vt#9OxJ*!b*~Lq2GWmngk6((7pR*U7;qD53W2A(Br&`%o0M1y8{DsE# zn^uCU*A(LK4nJS%@h|$=wVY0DKC~K@@^h6lu&-;Mu;QhCcnq4F(mZ=$1sL7%m z#el`8S=kLJJhS3Gr)?;(#evj`jz{d*HF5ne50)TGj>Lk)q_5v1Zx+?gbtvn-e3B5h zLudJQBk$10xp7D7c*@5NtC4=H#e;?~&TQfU8P==D4G;d@BbuNA2q7F{^Wa7jm3F5p zu$$UyfPIzUomQgFc~y%=d4^hqc#?`o$4wr#Lc06ZZcZIGU@t}lD5M_%G24;3RQ=N% zp0WlQxyc0#r=J(p&NZ8GBYX~`45Nb^NYtkH9zWvs72)=|Ll;74+FnXOIthgi*Scn6 zpC zOP~-=FB+kV^hSzJ04-POmj4rSKz*EKU*4xhMaJsjDAt&i+-hhJA4FhT(iDsTKppXN$8H**mgIhOhcGMudH&ydGV#~MNID}BexCt_|h?!+AIpQ=u%Fn4v(5e zKHaFG>*cVJd-vCf`jDR)UVlt$^$&nC`&t49R#Jy;=L5a7f-yE z@Uwv;tXT{Q0a4+TzTpfN%0B^y4F%!xSIYeD$|qnZEP2J76J^1pG~?8t zu~zRzhxf~rQrJOl;()CG5W?$~Bi8W2KLw}?9z{8QUSvhA^vz%o%ae-b$23X3=d8=> z(o>WHSe93S2~$k-oUHg02e|Bj%Nxe0M|id4!SBKe^Q6#EcAQoAE>DF1t1F^dNW?VD%1H z9bt8qxi|CKm%6~{jS3%51_*YuNK>p^>s3>~F0qhMvd~b~@*%?eN5d2&)WIBHTgpmu zqHixHLf&*tJ}9yR!k0v89Qbg#$nwZ$Xl1t{tE1MH_K8R@pvj^F6qp+#fwt>5=QG8X z7^p&>>u8TsrKa{p?yJ#ecg=KKS|d@N$Z_9373i_5N#*9LHAN(%F_@+M>qJ%BR@hs| ztnktq(WnB1*V9WI_Z|NrJ0l;b&lvfuu?~Ruv4UsDs^#^``|K%1#Klpg#g13vB0?(7rjP~38m;@ZIA%e3n6oz zBSP$p8;?bm@P4K5s&k^PRUb>Dx}F`{3bRaq5V~^;+89r;FpBYemGNw2`1$lP6DQ^7 z)Aa+=gmZEJNFdJ@I3buJJqK9%+AU;fsr1d+*EaWj3cHy3Yegq{sEzQp+VSgM@+B%h z#>juPduRBh*Yxa|6WbYPbwDk^FUaC`EU%?(N zJ!t+rdT-5&YE!L6;H diff --git a/yellow-paper/docs/public-vm/state-model.md b/yellow-paper/docs/public-vm/state-model.md index a52bbbe7504..d6087cba3e8 100644 --- a/yellow-paper/docs/public-vm/state-model.md +++ b/yellow-paper/docs/public-vm/state-model.md @@ -52,11 +52,11 @@ Memory addresses must be tagged to be a `u32` type. - `M[X]`: main memory cell at offset `X` - `tag`: a value referring to a memory cell's type (its maximum potential value) - `T[X]`: the tag associated with memory cell at offset `X` -- `in-tag`: an instruction's tag to check input operands against. Present for many but not all instructions. -- `dst-tag`: the target type of a `CAST` instruction, also used to tag the destination memory cell -- `ADD`: shorthand for an `ADD` instruction with `in-tag = X` -- `ADD aOffset bOffset dstOffset`: an full `ADD` instruction with `in-tag = X`. See [here](./instruction-set#isa-section-add) for more details. -- `CAST`: a `CAST` instruction with `dst-tag`: `X`. `CAST` is the only instruction with a `dst-tag`. See [here](./instruction-set#isa-section-cast) for more details. +- `inTag`: an instruction's tag to check input operands against. Present for many but not all instructions. +- `dstTag`: the target type of a `CAST` instruction, also used to tag the destination memory cell +- `ADD`: shorthand for an `ADD` instruction with `inTag = X` +- `ADD aOffset bOffset dstOffset`: an full `ADD` instruction with `inTag = X`. See [here](./instruction-set#isa-section-add) for more details. +- `CAST`: a `CAST` instruction with `dstTag`: `X`. `CAST` is the only instruction with a `dstTag`. See [here](./instruction-set#isa-section-cast) for more details. ### Tags and tagged memory @@ -80,7 +80,7 @@ The purpose of a tag is to inform the VM of the maximum possible length of an op #### Checking input operand tags -Many AVM instructions explicitly operate over range-constrained input parameters (e.g. `ADD`). The maximum allowable value for an instruction's input parameters is defined via an `in-tag` (instruction/input tag). Two potential scenarios result: +Many AVM instructions explicitly operate over range-constrained input parameters (e.g. `ADD`). The maximum allowable value for an instruction's input parameters is defined via an `inTag` (instruction/input tag). Two potential scenarios result: 1. A VM instruction's tag value matches the input parameter tag values 2. A VM instruction's tag value does _not_ match the input parameter tag values @@ -95,8 +95,8 @@ It is required that all VM instructions that write into main memory explicitly d ``` # ADD aOffset bOffset dstOffset -assert T[aOffset] == T[bOffset] == u32 // check inputs against in-tag, revert on mismatch -T[dstOffset] = u32 // tag destination with in-tag +assert T[aOffset] == T[bOffset] == u32 // check inputs against inTag, revert on mismatch +T[dstOffset] = u32 // tag destination with inTag M[dstOffset] = M[aOffset] + M[bOffset] // perform the addition ``` @@ -110,7 +110,7 @@ T[dstOffset] = T[srcOffset] // preserve tag M[dstOffset] = M[srcOffset] // perform the move ``` -Note that `MOV` does not have an `in-tag` and therefore does not need to make any assertions regarding the source memory cell's type. +Note that `MOV` does not have an `inTag` and therefore does not need to make any assertions regarding the source memory cell's type. #### `CAST` and tag conversions @@ -125,7 +125,7 @@ Case 2 is trivial as no additional consistency checks must be performed between ``` # CAST srcOffset dstOffset -T[dstOffset] = u64 // tag destination with dst-tag +T[dstOffset] = u64 // tag destination with dstTag M[dstOffset] = cast(M[srcOffset]) // perform cast ``` diff --git a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js index ff3fd87fb47..776890efff9 100644 --- a/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js +++ b/yellow-paper/src/preprocess/InstructionSet/InstructionSet.js @@ -15,13 +15,11 @@ const INSTRUCTION_SET_RAW = [ { "id": "add", "Name": "`ADD`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -30,19 +28,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k`", "Summary": "Addition (a + b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "sub", "Name": "`SUB`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -51,19 +47,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k`", "Summary": "Subtraction (a - b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "mul", "Name": "`MUL`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -72,19 +66,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] * M[bOffset] mod 2^k`", "Summary": "Multiplication (a * b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "div", "Name": "`DIV`", - "Category": "arithmetic", + "Category": "Compute - Arithmetic", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -93,19 +85,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] / M[bOffset]`", "Summary": "Unsigned division (a / b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "eq", "Name": "`EQ`", - "Category": "conditional", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -114,19 +104,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0`", "Summary": "Equality check (a == b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "lt", "Name": "`LT`", - "Category": "conditional", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -135,19 +123,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0`", "Summary": "Less-than check (a < b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "lte", "Name": "`LTE`", - "Category": "conditional", + "Category": "Compute - Comparators", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -156,19 +142,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0`", "Summary": "Less-than-or-equals check (a <= b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "and", "Name": "`AND`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -177,19 +161,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] AND M[bOffset]`", "Summary": "Bitwise AND (a & b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "or", "Name": "`OR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -198,19 +180,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] OR M[bOffset]`", "Summary": "Bitwise OR (a | b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "xor", "Name": "`XOR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -219,19 +199,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] XOR M[bOffset]`", "Summary": "Bitwise XOR (a ^ b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "not", "Name": "`NOT`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, @@ -239,19 +217,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = NOT M[aOffset]`", "Summary": "Bitwise NOT (inversion)", "Details": "", - "Tag checks": "`T[aOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "shl", "Name": "`SHL`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -260,19 +236,17 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] << M[bOffset]`", "Summary": "Bitwise leftward shift (a << b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "shr", "Name": "`SHR`", - "Category": "bitwise", + "Category": "Compute - Bitwise", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": IN_TAG_DESCRIPTION}, + {"name": "inTag", "description": IN_TAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of the operation's left input"}, {"name": "bOffset", "description": "memory offset of the operation's right input"}, @@ -281,816 +255,718 @@ const INSTRUCTION_SET_RAW = [ "Expression": "`M[dstOffset] = M[aOffset] >> M[bOffset]`", "Summary": "Bitwise rightward shift (a >> b)", "Details": "", - "Tag checks": "`T[aOffset] == T[bOffset] == in-tag`", - "Tag updates": "`T[dstOffset] = in-tag`", + "Tag checks": "`T[aOffset] == T[bOffset] == inTag`", + "Tag updates": "`T[dstOffset] = inTag`", }, { "id": "cast", "Name": "`CAST`", - "Category": "types", + "Category": "Type Conversions", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "dst-tag", "description": DST_TAG_DESCRIPTION}, + {"name": "dstTag", "description": DST_TAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "aOffset", "description": "memory offset of word to cast"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = cast(M[aOffset])`", + "Expression": "`M[dstOffset] = cast(M[aOffset])`", "Summary": "Type cast", - "Details": "Cast a word in memory based on the `dst-tag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details.", + "Details": "Cast a word in memory based on the `dstTag` specified in the bytecode. Truncates (`M[dstOffset] = M[aOffset] mod 2^dstsize`) when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = dst-tag`", + "Tag updates": "`T[dstOffset] = dstTag`", }, { - "id": "set", - "Name": "`SET`", - "Category": "memory", - "Flags": [ - {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - {"name": "in-tag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, - ], - "#memreads": "0", - "#memwrites": "1", - "Args": [ - {"name": "const", "description": "an N-bit constant value from the bytecode to store in memory (any type except `field`)", "mode": "immediate"}, - {"name": "dstOffset", "description": "memory offset specifying where to store the constant"}, - ], - "Expression": "`M[dstOffset] = const`", - "Summary": "Set a memory word from a constant in the bytecode.", - "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_!", - "Tag checks": "", - "Tag updates": "`T[dstOffset] = in-tag`", - }, - { - "id": "mov", - "Name": "`MOV`", - "Category": "memory", + "id": "address", + "Name": "`ADDRESS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "srcOffset", "description": "memory offset of word to move"}, - {"name": "dstOffset", "description": "memory offset specifying where to store that word"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = M[srcOffset]`", - "Summary": "Move a word from source memory location to destination`.", + "Expression": "`M[dstOffset] = context.environment.address`", + "Summary": "Get the address of the currently executing l2 contract", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = T[srcOffset]`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "cmov", - "Name": "`CMOV`", - "Category": "memory", + "id": "storageaddress", + "Name": "`STORAGEADDRESS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", - "#memwrites": "1", "Args": [ - {"name": "aOffset", "description": "memory offset of word 'a' to conditionally move"}, - {"name": "bOffset", "description": "memory offset of word 'b' to conditionally move"}, - {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`", - "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`).", - "Details": "One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", + "Expression": "`M[dstOffset] = context.environment.storageAddress`", + "Summary": "Get the _storage_ address of the currently executing context", + "Details": "The storage address is used for public storage accesses.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "calldatacopy", - "Name": "`CALLDATACOPY`", - "Category": "contract calls", + "id": "origin", + "Name": "`ORIGIN`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "`s1`", "Args": [ - {"name": "cdOffset", "description": "offset into calldata to copy from"}, - {"name": "copySize", "description": "number of words to copy", "mode": "immediate", "type": "u32"}, - {"name": "dstOffset", "description": "memory offset specifying where to copy the first word to"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]`", - "Summary": "Copy calldata into memory.", - "Details": "Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.", + "Expression": "`M[dstOffset] = context.environment.origin`", + "Summary": "Get the transaction's origination address", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset:dstOffset+copySize] = field`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sload", - "Name": "`SLOAD`", - "Category": "storage & messaging", + "id": "sender", + "Name": "`SENDER`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "1", "Args": [ - {"name": "slotOffset", "description": "memory offset of the storage slot to load from"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = storage[M[slotOffset]]`", - "Summary": "Load a word from storage.", - "Details": "Load a word from this contract's persistent public storage into memory.", + "Expression": "`M[dstOffset] = context.environment.sender`", + "Summary": "Get the address of the sender (caller of the current context)", + "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sstore", - "Name": "`SSTORE`", - "Category": "storage & messaging", + "id": "portal", + "Name": "`PORTAL`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "2", - "#memwrites": "0", "Args": [ - {"name": "srcOffset", "description": "memory offset of the word to store"}, - {"name": "slotOffset", "description": "memory offset containing the storage slot to store to"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`storage[M[slotOffset]] = M[srcOffset]`", - "Summary": "Write a word to storage.", - "Details": "Store a word from memory into this contract's persistent public storage.", + "Expression": "`M[dstOffset] = context.environment.portal`", + "Summary": "Get the address of the l1 portal contract", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "emitnotehash", - "Name": "`EMITNOTEHASH`", - "Category": "storage & messaging", + "id": "feeperl1gas", + "Name": "`FEEPERL1GAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ - {"name": "noteHashOffset", "description": "memory offset of the note hash"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": `emitNoteHash(M[contentOffset])`, - "Summary": "Emit a new note hash to be inserted into the notes tree", + "Expression": "`M[dstOffset] = context.environment.feePerL1Gas`", + "Summary": "Get the fee to be paid per \"L1 gas\" - constant for entire transaction", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "emitnullifier", - "Name": "`EMITNULLIFIER`", - "Category": "storage & messaging", + "id": "feeperl2gas", + "Name": "`FEEPERL2GAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ - {"name": "nullifierOffset", "description": "memory offset of nullifier"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": `emitNullifier(M[nullifierOffset])`, - "Summary": "Emit a new nullifier to be inserted into the nullifier tree", + "Expression": "`M[dstOffset] = context.environment.feePerL2Gas`", + "Summary": "Get the fee to be paid per \"L2 gas\" - constant for entire transaction", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "sendl2tol1msg", - "Name": "`SENDL2TOL1MSG`", - "Category": "storage & messaging", + "id": "feeperdagas", + "Name": "`FEEPERDAGAS`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "0", "Args": [ - {"name": "contentOffset", "description": "memory offset of the message content"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": `sendL2ToL1Message(M[contentOffset])`, - "Summary": "Send an L2-to-L1 message", + "Expression": "`M[dstOffset] = context.environment.feePerDaGas`", + "Summary": "Get the fee to be paid per \"DA gas\" - constant for entire transaction", "Details": "", "Tag checks": "", - "Tag updates": "", - }, - { - "id": "jump", - "Name": "`JUMP`", - "Category": "control", - "Flags": [], - "#memreads": "0", - "#memwrites": "0", - "Args": [ - {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, - ], - "Expression": "`PC = loc`", - "Summary": "Jump to a location in the bytecode.", - "Details": "Target location is an immediate value (a constant in the bytecode).", - "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "jumpi", - "Name": "`JUMPI`", - "Category": "control", + "id": "contractcalldepth", + "Name": "`CONTRACTCALLDEPTH`", + "Category": "Execution Environment", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "3", - "#memwrites": "0", "Args": [ - {"name": "loc", "description": "target location conditionally jump to", "mode": "immediate", "type": "u32"}, - {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`PC = M[condOffset] > 0 ? loc : PC`", - "Summary": "Conditionally jump to a location in the bytecode.", - "Details": "Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", + "Expression": "`M[dstOffset] = context.environment.contractCallDepth`", + "Summary": "Get how many contract calls deep the current call context is", + "Details": "Note: security issues with EVM's tx.origin can be resolved by asserting `calldepth == 0`.", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u8`", }, { - "id": "return", - "Name": "`RETURN`", - "Category": "contract calls", + "id": "chainid", + "Name": "`CHAINID`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ - {"name": "retOffset", "description": "memory offset of first word to return"}, - {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`return(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `success`, optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": "`M[dstOffset] = context.environment.globals.chainId`", + "Summary": "Get this rollup's L1 chain ID", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "revert", - "Name": "`REVERT`", - "Category": "contract calls", + "id": "version", + "Name": "`VERSION`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ - {"name": "retOffset", "description": "memory offset of first word to return"}, - {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`revert(M[retOffset:retOffset+retSize])`", - "Summary": "Halt execution with `failure`, reverting state changes and optionally returning some data.", - "Details": "Return control flow to the calling context/contract.", + "Expression": "`M[dstOffset] = context.environment.globals.version`", + "Summary": "Get this rollup's L2 version ID", + "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "call", - "Name": "`CALL`", - "Category": "contract calls", + "id": "blocknumber", + "Name": "`BLOCKNUMBER`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "7", - "#memwrites": "`1+retSize`", "Args": [ - {"name": "gasOffset", "description": "offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee"}, - {"name": "addrOffset", "description": "address of the contract to call"}, - {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, - {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, - {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, - {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, - {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression":` -M[successOffset] = call( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize]) -`, - "Summary": "Call into another contract.", - "Details": `Creates a new CallContext, triggers execution of the corresponding contract code, - and then resumes execution in the current CallContext. A non-existent contract or one - with no code will return success. Nested call has an incremented \`CallContext.calldepth\`.`, - "Tag checks": "`T[gasOffset] == T[gasOffset+1] == u32`", - "Tag updates": ` -T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field -`, + "Expression": "`M[dstOffset] = context.environment.globals.blocknumber`", + "Summary": "Get this L2 block's number", + "Details": "", + "Tag checks": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "staticcall", - "Name": "`STATICCALL`", - "Category": "contract calls", + "id": "timestamp", + "Name": "`TIMESTAMP`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "7", - "#memwrites": "`1+retSize`", "Args": [ - {"name": "gasOffset", "description": "offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee"}, - {"name": "addrOffset", "description": "address of the contract to call"}, - {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, - {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, - {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, - {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, - {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": ` -M[successOffset] = staticcall( - M[gasOffset], M[gasOffset+1], M[addrOffset], - M[argsOffset], M[argsSize], - M[retOffset], M[retSize]) -`, - "Summary": "Call into another contract, disallowing persistent state modifications.", - "Details": "Same as `CALL`, but the callee is cannot modify persistent state. Disallowed instructions are `SSTORE`, `ULOG`, `CALL`.", - "Tag checks": "`T[gasOffset] == T[gasOffset+1] == u32`", - "Tag updates": ` -T[successOffset] = u8 -T[retOffset:retOffset+retSize] = field -`, + "Expression": "`M[dstOffset] = context.environment.globals.timestamp`", + "Summary": "Get this L2 block's timestamp", + "Details": "", + "Tag checks": "", + "Tag updates": "`T[dstOffset] = u64`", }, { - "id": "ulog", - "Name": "`ULOG`", - "Category": "logging", + "id": "coinbase", + "Name": "`COINBASE`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "`s1`", - "#memwrites": "0", "Args": [ - {"name": "logOffset", "description": "memory offset of the data to log"}, - {"name": "logSize", "description": "number of words to log", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`ulog(M[logOffset:logOffset+logSize])`", - "Summary": "Emit an unencrypted log with data from the `field` memory page", + "Expression": "`M[dstOffset] = context.environment.globals.coinbase`", + "Summary": "Get the block's beneficiary address", "Details": "", "Tag checks": "", - "Tag updates": "", + "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "chainid", - "Name": "`CHAINID`", - "Category": "block info", + "id": "blockl1gaslimit", + "Name": "`BLOCKL1GASLIMIT`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.chainId`", - "Summary": "Get this rollup's L1 chain ID", + "Expression": "`M[dstOffset] = context.environment.globals.l1GasLimit`", + "Summary": "Total amount of \"L1 gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "version", - "Name": "`VERSION`", - "Category": "block info", + "id": "blockl2gaslimit", + "Name": "`BLOCKL2GASLIMIT`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.version`", - "Summary": "Get this rollup's L2 version ID", + "Expression": "`M[dstOffset] = context.environment.globals.l2GasLimit`", + "Summary": "Total amount of \"L2 gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blocknumber", - "Name": "`BLOCKNUMBER`", - "Category": "block info", + "id": "blockdagaslimit", + "Name": "`BLOCKDAGASLIMIT`", + "Category": "Execution Environment - Globals", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.blocknumber`", - "Summary": "Get this block's number", + "Expression": "`M[dstOffset] = context.environment.globals.daGasLimit`", + "Summary": "Total amount of \"DA gas\" that a block can consume", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "timestamp", - "Name": "`TIMESTAMP`", - "Category": "block info", + "id": "calldatacopy", + "Name": "`CALLDATACOPY`", + "Category": "Execution Environment - Calldata", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "cdOffset", "description": "offset into calldata to copy from"}, + {"name": "copySize", "description": "number of words to copy", "mode": "immediate", "type": "u32"}, + {"name": "dstOffset", "description": "memory offset specifying where to copy the first word to"}, ], - "Expression": "`M[dstOffset] = Globals.timestamp`", - "Summary": "Get this L2 block's timestamp", - "Details": "", + "Expression": "`M[dstOffset:dstOffset+copySize] = context.environment.calldata[cdOffset:cdOffset+copySize]`", + "Summary": "Copy calldata into memory", + "Details": "Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u64`", + "Tag updates": "`T[dstOffset:dstOffset+copySize] = field`", }, { - "id": "coinbase", - "Name": "`COINBASE`", - "Category": "block info", + "id": "l1gasleft", + "Name": "`L1GASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.coinbase`", - "Summary": "Get the block's beneficiary address", + "Expression": "`M[dstOffset] = context.machineState.l1GasLeft`", + "Summary": "Remaining \"L1 gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blockl1gaslimit", - "Name": "`BLOCKL1GASLIMIT`", - "Category": "block info", + "id": "l2gasleft", + "Name": "`L2GASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.l1GasLimit`", - "Summary": "Total amount of \"L1 gas\" that a block can consume", + "Expression": "`M[dstOffset] = context.MachineState.l2GasLeft`", + "Summary": "Remaining \"L2 gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "blockl2gaslimit", - "Name": "`BLOCKL2GASLIMIT`", - "Category": "block info", + "id": "dagasleft", + "Name": "`DAGASLEFT`", + "Category": "Machine State - Gas", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = Globals.l2GasLimit`", - "Summary": "Total amount of \"L2 gas\" that a block can consume", + "Expression": "`M[dstOffset] = context.machineState.daGasLeft`", + "Summary": "Remaining \"DA gas\" for this call (after this instruction)", "Details": "", "Tag checks": "", "Tag updates": "`T[dstOffset] = u32`", }, { - "id": "notesroot", - "Name": "`NOTESROOT`", - "Category": "historical access", - "Flags": [ - {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - ], - "#memreads": "1", - "#memwrites": "1", + "id": "jump", + "Name": "`JUMP`", + "Category": "Machine State - Control Flow", + "Flags": [], "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "loc", "description": "target location to jump to", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`", - "Summary": "Get the historical note-hash tree root as of the specified block number.", - "Details": "", + "Expression": "`context.machineState.pc = loc`", + "Summary": "Jump to a location in the bytecode", + "Details": "Target location is an immediate value (a constant in the bytecode).", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "", }, { - "id": "nullroot", - "Name": "`NULLIFIERSROOT`", - "Category": "historical access", + "id": "jumpi", + "Name": "`JUMPI`", + "Category": "Machine State - Control Flow", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "loc", "description": "target location conditionally jump to", "mode": "immediate", "type": "u32"}, + {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root`", - "Summary": "Get the historical nullifier tree root as of the specified block number.", - "Details": "", + "Expression": "`context.machineState.pc = M[condOffset] > 0 ? loc : context.machineState.pc`", + "Summary": "Conditionally jump to a location in the bytecode", + "Details": "Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "", }, { - "id": "contractsroot", - "Name": "`CONTRACTSROOT`", - "Category": "historical access", - "Flags": [ - {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, - ], - "#memreads": "1", - "#memwrites": "1", + "id": "internalcall", + "Name": "`INTERNALCALL`", + "Category": "Machine State - Control Flow", + "Flags": [], "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "loc", "description": "target location to jump/call to", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root`", - "Summary": "Get the historical contracts tree root as of the specified block number.", + "Expression": ` +context.machineState.internalCallStack.push(context.machineState.pc) +context.machineState.pc = loc +`, + "Summary": "Make an internal call. Push the current PC to the internal call stack and jump to the target location.", + "Details": "Target location is an immediate value (a constant in the bytecode).", + "Tag checks": "", + "Tag updates": "", + }, + { + "id": "internalreturn", + "Name": "`INTERNALRETURN`", + "Category": "Machine State - Control Flow", + "Flags": [], + "Args": [], + "Expression": "`context.machineState.pc = context.machineState.internalCallStack.pop()`", + "Summary": "Return from an internal call. Pop from the internal call stack and jump to the popped location.", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "", }, { - "id": "msgsroot", - "Name": "`MSGSROOT`", - "Category": "historical access", + "id": "set", + "Name": "`SET`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, + {"name": "inTag", "description": "The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET."}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "const", "description": "an N-bit constant value from the bytecode to store in memory (any type except `field`)", "mode": "immediate"}, + {"name": "dstOffset", "description": "memory offset specifying where to store the constant"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_message_tree_root`", - "Summary": "Get the historical l1-to-l2 message tree root as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = const`", + "Summary": "Set a memory word from a constant in the bytecode", + "Details": "Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `inTag`. It _cannot be 254 (`field` type)_!", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = inTag`", }, { - "id": "publicdataroot", - "Name": "`PUBLICDATAROOT`", - "Category": "historical access", + "id": "mov", + "Name": "`MOV`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "srcOffset", "description": "memory offset of word to move"}, + {"name": "dstOffset", "description": "memory offset specifying where to store that word"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root`", - "Summary": "Get the historical public data tree root as of the specified block number.", + "Expression": "`M[dstOffset] = M[srcOffset]`", + "Summary": "Move a word from source memory location to destination", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = T[srcOffset]`", }, { - "id": "globalshash", - "Name": "`GLOBALSHASH`", - "Category": "historical access", + "id": "cmov", + "Name": "`CMOV`", + "Category": "Machine State - Memory", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, + {"name": "aOffset", "description": "memory offset of word 'a' to conditionally move"}, + {"name": "bOffset", "description": "memory offset of word 'b' to conditionally move"}, + {"name": "condOffset", "description": "memory offset of the operations 'conditional' input"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash`", - "Summary": "Get the historical global variables hash as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`", + "Summary": "Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`)", + "Details": "One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`", }, { - "id": "blocksroot", - "Name": "`BLOCKSROOT`", - "Category": "historical access", + "id": "blockheaderbynum", + "Name": "`BLOCKHEADERBYNUM`", + "Category": "World State", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ {"name": "blockNumOffset", "description": "memory offset of the block number input"}, - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "dstOffset", "description": "memory offset specifying where to store operation's result's 0th word"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root`", - "Summary": "Get the historical blocks tree root as of the specified block number.", + "Expression": "`M[dstOffset:dstOffset+BLOCK_HEADER_LENGTH] = context.worldState.blockHeader[M[blockNumOffset]]`", + "Summary": "Get the block header as of the specified block number", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = field`", + "Tag updates": "`T[dstOffset:dstOffset+BLOCK_HEADER_LENGTh] = field`", }, { - "id": "grandroot", - "Name": "`GRANDROOT`", - "Category": "historical access", + "id": "sload", + "Name": "`SLOAD`", + "Category": "World State - Public Storage", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "1", - "#memwrites": "1", "Args": [ - {"name": "blockNumOffset", "description": "memory offset of the block number input"}, + {"name": "slotOffset", "description": "memory offset of the storage slot to load from"}, {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, ], - "Expression": "`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root`", - "Summary": "Get the historical grandfather tree root as of the specified block number.", - "Details": "", + "Expression": "`M[dstOffset] = context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]]`", + "Summary": "Load a word from storage", + "Details": "Load a word from this contract's persistent public storage into memory.", "Tag checks": "", "Tag updates": "`T[dstOffset] = field`", }, { - "id": "origin", - "Name": "`ORIGIN`", - "Category": "tx context", + "id": "sstore", + "Name": "`SSTORE`", + "Category": "World State - Public Storage", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "srcOffset", "description": "memory offset of the word to store"}, + {"name": "slotOffset", "description": "memory offset containing the storage slot to store to"}, ], - "Expression": "`M[dstOffset] = TxContext.origin`", - "Summary": "Get the transaction's origination address", - "Details": "", + "Expression": "`context.worldState.publicStorage[context.environment.storageAddress, M[slotOffset]] = M[srcOffset]`", + "Summary": "Write a word to storage", + "Details": "Store a word from memory into this contract's persistent public storage.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "refundee", - "Name": "`REFUNDEE`", - "Category": "tx context", + "id": "readl1tol2msg", + "Name": "`READL1TOL2MSG`", + "Category": "World State - Messaging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "msgKeyOffset", "description": "memory offset of the message's key"}, + {"name": "dstOffset", "description": "memory offset to place the 0th word of the message content"}, + {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = TxContext.refundee`", - "Summary": "The recipient of fee refunds for this transaction", + "Expression": "`M[dstOffset:dstOffset+msgSize] = context.worldState.l1ToL2Messages(M[msgKeyOffset])`", + "Summary": "Reads an L1-to-L2 message", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "`T[dstOffset:dstOffset+msgSize] = field`", }, { - "id": "feeperl1gas", - "Name": "`FEEPERL1GAS`", - "Category": "tx context", + "id": "sendl2tol1msg", + "Name": "`SENDL2TOL1MSG`", + "Category": "World State - Messaging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "msgOffset", "description": "memory offset of the message content"}, + {"name": "msgSize", "description": "number of words in the message", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = TxContext.feePerL1Gas`", - "Summary": "The fee to be paid per \"L1 gas\" - set by the transaction's original caller", + "Expression": "`context.worldState.l2ToL1Messages.append(M[msgOffset:msgOffset+msgSize])`", + "Summary": "Send an L2-to-L1 message", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "feeperl2gas", - "Name": "`FEEPERL2GAS`", - "Category": "tx context", + "id": "emitnotehash", + "Name": "`EMITNOTEHASH`", + "Category": "World State - Notes & Nullifiers", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "noteHashOffset", "description": "memory offset of the note hash"}, ], - "Expression": "`M[dstOffset] = TxContext.feePerL2Gas`", - "Summary": "The fee to be paid per \"L2 gas\" - set by the transaction's original caller", + "Expression": "`context.worldState.newHashes.append(M[noteHashOffset])`", + "Summary": "Emit a new note hash to be inserted into the notes tree", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "caller", - "Name": "`CALLER`", - "Category": "call context", + "id": "emitnullifier", + "Name": "`EMITNULLIFIER`", + "Category": "World State - Notes & Nullifiers", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "nullifierOffset", "description": "memory offset of nullifier"}, ], - "Expression": "`M[dstOffset] = CallContext.sender`", - "Summary": "Get the address of the sender (the caller's context)", + "Expression": "`context.worldState.nullifiers.append(M[nullifierOffset])`", + "Summary": "Emit a new nullifier to be inserted into the nullifier tree", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "address", - "Name": "`ADDRESS`", - "Category": "call context", + "id": "emitunencryptedlog", + "Name": "`EMITUNENCRYPTEDLOG`", + "Category": "Accrued Substate - Logging", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "logOffset", "description": "memory offset of the data to log"}, + {"name": "logSize", "description": "number of words to log", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = CallContext.storageContractAddress`", - "Summary": "Get the address of the currently executing l2 contract", + "Expression": "`context.accruedSubstate.unencryptedLogs.append(M[logOffset:logOffset+logSize])`", + "Summary": "Emit an unencrypted log", "Details": "", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "portal", - "Name": "`PORTAL`", - "Category": "call context", + "id": "call", + "Name": "`CALL`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, + {"name": "addrOffset", "description": "address of the contract to call"}, + {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, + {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, + {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, + {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, + {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, ], - "Expression": "`M[dstOffset] = CallContext.portalAddress`", - "Summary": "Get the address of the l1 portal contract", - "Details": "", - "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Expression":` +M[successOffset] = call( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize]) +`, + "Summary": "Call into another contract", + "Details": `Creates a new (nested) execution context and triggers execution within it until the nested context halts. + Then resumes execution in the current/calling context. A non-existent contract or one with no code will return success. + See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.`, + "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", + "Tag updates": ` +T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field +`, }, { - "id": "calldepth", - "Name": "`CALLDEPTH`", - "Category": "call context", + "id": "staticcall", + "Name": "`STATICCALL`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "gasOffset", "description": "offset to three words containing `{l1GasLeft, l2GasLeft, daGasLeft}`: amount of gas to provide to the callee"}, + {"name": "addrOffset", "description": "address of the contract to call"}, + {"name": "argsOffset", "description": "memory offset to args (will become the callee's calldata)"}, + {"name": "argsSize", "description": "number of words to pass via callee's calldata", "mode": "immediate", "type": "u32"}, + {"name": "retOffset", "description": "destination memory offset specifying where to store the data returned from the callee"}, + {"name": "retSize", "description": "number of words to copy from data returned by callee", "mode": "immediate", "type": "u32"}, + {"name": "successOffset", "description": "destination memory offset specifying where to store the call's success (0: failure, 1: success)", "type": "u8"}, ], - "Expression": "`M[dstOffset] = CallContext.calldepth`", - "Summary": "Get how many calls deep the current call context is", - "Details": "Note: security issues with EVM's tx.origin can be resolved by asserting the `calldepth == 0`.", - "Tag checks": "", - "Tag updates": "`T[dstOffset] = u8`", + "Expression": ` +M[successOffset] = staticcall( + M[gasOffset], M[gasOffset+1], M[gasOffset+2], + M[addrOffset], + M[argsOffset], M[argsSize], + M[retOffset], M[retSize]) +`, + "Summary": "Call into another contract, disallowing World State and Accrued Substate modifications", + "Details": "Same as `CALL`, but disallows World State and Accrued Substate modifications. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", + "Tag checks": "`T[gasOffset] == T[gasOffset+1] == T[gasOffset+2] == u32`", + "Tag updates": ` +T[successOffset] = u8 +T[retOffset:retOffset+retSize] = field +`, }, { - "id": "l1gas", - "Name": "`L1GAS`", - "Category": "latest context", + "id": "return", + "Name": "`RETURN`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "retOffset", "description": "memory offset of first word to return"}, + {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = LatestContext.l1Gas`", - "Summary": "Remaining \"L1 gas\" for this call (after this instruction).", - "Details": "", + "Expression": ` +context.contractCallResults.output = M[retOffset:retOffset+retSize] +halt +`, + "Summary": "Halt execution within this context (without revert), optionally returning some data", + "Details": "Return control flow to the calling context/contract. Caller will accept World State and Accrued Substate modifications. See [\"Halting\"](./avm#halting) to learn more. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, { - "id": "l2gas", - "Name": "`L2GAS`", - "Category": "latest context", + "id": "revert", + "Name": "`REVERT`", + "Category": "Control Flow - Contract Calls", "Flags": [ {"name": "indirect", "description": INDIRECT_FLAG_DESCRIPTION}, ], - "#memreads": "0", - "#memwrites": "1", "Args": [ - {"name": "dstOffset", "description": "memory offset specifying where to store operation's result"}, + {"name": "retOffset", "description": "memory offset of first word to return"}, + {"name": "retSize", "description": "number of words to return", "mode": "immediate", "type": "u32"}, ], - "Expression": "`M[dstOffset] = LatestContext.l2Gas`", - "Summary": "Remaining \"L2 gas\" for this call (after this instruction).", - "Details": "", + "Expression": ` +context.contractCallResults.output = M[retOffset:retOffset+retSize] +context.contractCallResults.reverted = true +halt +`, + "Summary": "Halt execution within this context as `reverted`, optionally returning some data", + "Details": "Return control flow to the calling context/contract. Caller will reject World State and Accrued Substate modifications. See [\"Halting\"](./avm#halting) to learn more. See [\"Nested contract calls\"](./avm#nested-contract-calls) to see how the caller updates its context after the nested call halts.", "Tag checks": "", - "Tag updates": "`T[dstOffset] = u32`", + "Tag updates": "", }, ]; const INSTRUCTION_SET = INSTRUCTION_SET_RAW.map((instr) => {instr['Bit-size'] = instructionSize(instr); return instr;}); diff --git a/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js b/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js index e26940ef03f..fbb9792b111 100644 --- a/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js +++ b/yellow-paper/src/preprocess/InstructionSet/genMarkdown.js @@ -86,9 +86,10 @@ function markdownInstructionSetSection(pathToGenDir) { for (let i = 0; i < INSTRUCTION_SET.length; i++) { const instr = INSTRUCTION_SET[i]; const name = instr['Name']; - let subsection = `### ${name} (${toOpcode(i)})\n`; + let subsection = `### ${name}\n`; subsection += `${instr['Summary']}\n\n`; subsection += `[See in table.](#isa-table-${instr['id']})\n\n`; + subsection += `- **Opcode**: ${toOpcode(i)}\n`; for (let t = 0; t < TOPICS_IN_SECTIONS.length; t++) { const topic = TOPICS_IN_SECTIONS[t]; let field = instr[topic]; From 56584683340cd29b26adbcc60d3cd58fe889e8ad Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:04:19 +0000 Subject: [PATCH 08/27] feat(public-vm): avm journal (#3945) --- .../src/avm/avm_state_manager.ts | 5 +- .../acir-simulator/src/avm/journal/errors.ts | 8 + .../src/avm/journal/host_storage.ts | 13 +- .../src/avm/journal/journal.test.ts | 157 +++++++++++++++- .../acir-simulator/src/avm/journal/journal.ts | 168 ++++++++++++++---- 5 files changed, 302 insertions(+), 49 deletions(-) create mode 100644 yarn-project/acir-simulator/src/avm/journal/errors.ts diff --git a/yarn-project/acir-simulator/src/avm/avm_state_manager.ts b/yarn-project/acir-simulator/src/avm/avm_state_manager.ts index 250a7d8f122..b5396accc7a 100644 --- a/yarn-project/acir-simulator/src/avm/avm_state_manager.ts +++ b/yarn-project/acir-simulator/src/avm/avm_state_manager.ts @@ -29,7 +29,7 @@ export class AvmStateManager { * @returns Avm State Manager */ public static rootStateManager(blockHeader: BlockHeader, hostStorage: HostStorage): AvmStateManager { - const journal = new AvmJournal(hostStorage); + const journal = AvmJournal.rootJournal(hostStorage); return new AvmStateManager(blockHeader, journal); } @@ -39,6 +39,7 @@ export class AvmStateManager { * @returns */ public static forkStateManager(parent: AvmStateManager): AvmStateManager { - return new AvmStateManager(parent.blockHeader, parent.journal); + const journal = AvmJournal.branchParent(parent.journal); + return new AvmStateManager(parent.blockHeader, journal); } } diff --git a/yarn-project/acir-simulator/src/avm/journal/errors.ts b/yarn-project/acir-simulator/src/avm/journal/errors.ts new file mode 100644 index 00000000000..17696b1de68 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/journal/errors.ts @@ -0,0 +1,8 @@ +/** + * Error thrown when a base journal is attempted to be merged. + */ +export class RootJournalCannotBeMerged extends Error { + constructor() { + super('Root journal cannot be merged'); + } +} diff --git a/yarn-project/acir-simulator/src/avm/journal/host_storage.ts b/yarn-project/acir-simulator/src/avm/journal/host_storage.ts index ccd31891205..fcd9d27f722 100644 --- a/yarn-project/acir-simulator/src/avm/journal/host_storage.ts +++ b/yarn-project/acir-simulator/src/avm/journal/host_storage.ts @@ -1,17 +1,20 @@ import { CommitmentsDB, PublicContractsDB, PublicStateDB } from '../../index.js'; -/** - */ +/** + * Host storage + * + * A wrapper around the node dbs + */ export class HostStorage { /** - */ - public readonly stateDb: PublicStateDB; + public readonly publicStateDb: PublicStateDB; /** - */ public readonly contractsDb: PublicContractsDB; - /** - */ public readonly commitmentsDb: CommitmentsDB; - constructor(stateDb: PublicStateDB, contractsDb: PublicContractsDB, commitmentsDb: CommitmentsDB) { - this.stateDb = stateDb; + constructor(publicStateDb: PublicStateDB, contractsDb: PublicContractsDB, commitmentsDb: CommitmentsDB) { + this.publicStateDb = publicStateDb; this.contractsDb = contractsDb; this.commitmentsDb = commitmentsDb; } diff --git a/yarn-project/acir-simulator/src/avm/journal/journal.test.ts b/yarn-project/acir-simulator/src/avm/journal/journal.test.ts index c356db72386..a11a3b38743 100644 --- a/yarn-project/acir-simulator/src/avm/journal/journal.test.ts +++ b/yarn-project/acir-simulator/src/avm/journal/journal.test.ts @@ -1,7 +1,158 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { MockProxy, mock } from 'jest-mock-extended'; + +import { CommitmentsDB, PublicContractsDB, PublicStateDB } from '../../index.js'; +import { HostStorage } from './host_storage.js'; +import { AvmJournal, JournalData } from './journal.js'; + describe('journal', () => { - it('Should write to storage', () => {}); + let publicDb: MockProxy; + let journal: AvmJournal; + + beforeEach(() => { + publicDb = mock(); + const commitmentsDb = mock(); + const contractsDb = mock(); + + const hostStorage = new HostStorage(publicDb, contractsDb, commitmentsDb); + journal = new AvmJournal(hostStorage); + }); + + describe('Public Storage', () => { + it('Should cache write to storage', () => { + // When writing to storage we should write to the storage writes map + const contractAddress = new Fr(1); + const key = new Fr(2); + const value = new Fr(3); + + journal.writeStorage(contractAddress, key, value); + + const journalUpdates: JournalData = journal.flush(); + expect(journalUpdates.storageWrites.get(contractAddress)?.get(key)).toEqual(value); + }); + + it('When reading from storage, should check the parent first', async () => { + // Store a different value in storage vs the cache, and make sure the cache is returned + const contractAddress = new Fr(1); + const key = new Fr(2); + const storedValue = new Fr(420); + const parentValue = new Fr(69); + const cachedValue = new Fr(1337); + + publicDb.storageRead.mockResolvedValue(Promise.resolve(storedValue)); + + const childJournal = new AvmJournal(journal.hostStorage, journal); + + // Get the cache miss + const cacheMissResult = await childJournal.readStorage(contractAddress, key); + expect(cacheMissResult).toEqual(storedValue); + + // Write to storage + journal.writeStorage(contractAddress, key, parentValue); + const parentResult = await childJournal.readStorage(contractAddress, key); + expect(parentResult).toEqual(parentValue); + + // Get the parent value + childJournal.writeStorage(contractAddress, key, cachedValue); + + // Get the storage value + const cachedResult = await childJournal.readStorage(contractAddress, key); + expect(cachedResult).toEqual(cachedValue); + }); + + it('When reading from storage, should check the cache first', async () => { + // Store a different value in storage vs the cache, and make sure the cache is returned + const contractAddress = new Fr(1); + const key = new Fr(2); + const storedValue = new Fr(420); + const cachedValue = new Fr(69); + + publicDb.storageRead.mockResolvedValue(Promise.resolve(storedValue)); + + // Get the cache first + const cacheMissResult = await journal.readStorage(contractAddress, key); + expect(cacheMissResult).toEqual(storedValue); + + // Write to storage + journal.writeStorage(contractAddress, key, cachedValue); + + // Get the storage value + const cachedResult = await journal.readStorage(contractAddress, key); + expect(cachedResult).toEqual(cachedValue); + }); + }); + + describe('UTXOs', () => { + it('Should maintain commitments', () => { + const utxo = new Fr(1); + journal.writeCommitment(utxo); + + const journalUpdates = journal.flush(); + expect(journalUpdates.newCommitments).toEqual([utxo]); + }); + + it('Should maintain l1 messages', () => { + const utxo = new Fr(1); + journal.writeL1Message(utxo); + + const journalUpdates = journal.flush(); + expect(journalUpdates.newL1Messages).toEqual([utxo]); + }); + + it('Should maintain nullifiers', () => { + const utxo = new Fr(1); + journal.writeNullifier(utxo); + + const journalUpdates = journal.flush(); + expect(journalUpdates.newNullifiers).toEqual([utxo]); + }); + }); + + it('Should merge two journals together', async () => { + // Fundamentally checking that insert ordering of public storage is preserved upon journal merge + // time | journal | op | value + // t0 -> journal0 -> write | 1 + // t1 -> journal1 -> write | 2 + // merge journals + // t2 -> journal0 -> read | 2 + + const contractAddress = new Fr(1); + const key = new Fr(2); + const value = new Fr(1); + const valueT1 = new Fr(2); + const commitment = new Fr(10); + const commitmentT1 = new Fr(20); + + journal.writeStorage(contractAddress, key, value); + journal.writeCommitment(commitment); + journal.writeL1Message(commitment); + journal.writeNullifier(commitment); + + const journal1 = new AvmJournal(journal.hostStorage, journal); + journal.writeStorage(contractAddress, key, valueT1); + journal.writeCommitment(commitmentT1); + journal.writeL1Message(commitmentT1); + journal.writeNullifier(commitmentT1); + + journal1.mergeWithParent(); + + // Check that the storage is merged by reading from the journal + const result = await journal.readStorage(contractAddress, key); + expect(result).toEqual(valueT1); + + // Check that the UTXOs are merged + const journalUpdates: JournalData = journal.flush(); + expect(journalUpdates.newCommitments).toEqual([commitment, commitmentT1]); + expect(journalUpdates.newL1Messages).toEqual([commitment, commitmentT1]); + expect(journalUpdates.newNullifiers).toEqual([commitment, commitmentT1]); + }); - it('Should read from storage', () => {}); + it('Cannot merge a root journal, but can merge a child journal', () => { + const rootJournal = AvmJournal.rootJournal(journal.hostStorage); + const childJournal = AvmJournal.branchParent(rootJournal); - it('Should merge two journals together', () => {}); + expect(() => rootJournal.mergeWithParent()).toThrow(); + expect(() => childJournal.mergeWithParent()); + }); }); diff --git a/yarn-project/acir-simulator/src/avm/journal/journal.ts b/yarn-project/acir-simulator/src/avm/journal/journal.ts index 67563fe6370..cb69b3c33ef 100644 --- a/yarn-project/acir-simulator/src/avm/journal/journal.ts +++ b/yarn-project/acir-simulator/src/avm/journal/journal.ts @@ -1,101 +1,191 @@ import { Fr } from '@aztec/foundation/fields'; +import { RootJournalCannotBeMerged } from './errors.js'; import { HostStorage } from './host_storage.js'; -// TODO: all of the data that comes out of the avm ready for write should be in this format -/** - */ +/** + * Data held within the journal + */ export type JournalData = { /** - */ newCommitments: Fr[]; /** - */ - newL1Message: Fr[]; + newL1Messages: Fr[]; /** - */ - storageWrites: { [key: string]: { [key: string]: Fr } }; + newNullifiers: Fr[]; + /** contract address -\> key -\> value */ + storageWrites: Map>; }; -// This persists for an entire block -// Each transaction should have its own journal that gets appended to this one upon success -/** - */ +/** + * A cache of the current state of the AVM + * The interpreter should make any state queries through this object + * + * When a sub context's call succeeds, it's journal is merge into the parent + * When a a call fails, it's journal is discarded and the parent is used from this point forward + * When a call succeeds's we can merge a child into its parent + */ export class AvmJournal { - // TODO: should we make private? - /** - */ + /** Reference to node storage */ public readonly hostStorage: HostStorage; - // We need to keep track of the following - // - State reads - // - State updates - // - New Commitments - // - Commitment reads + // Reading state - must be tracked for vm execution + // contract address -> key -> value + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3999) + private storageReads: Map> = new Map(); + // New written state private newCommitments: Fr[] = []; + private newNullifiers: Fr[] = []; private newL1Message: Fr[] = []; - // TODO: type this structure -> contract address -> key -> value - private storageWrites: { [key: string]: { [key: string]: Fr } } = {}; + // New Substrate + private newLogs: Fr[][] = []; + + // contract address -> key -> value + private storageWrites: Map> = new Map(); - constructor(hostStorage: HostStorage) { + private parentJournal: AvmJournal | undefined; + + constructor(hostStorage: HostStorage, parentJournal?: AvmJournal) { this.hostStorage = hostStorage; + this.parentJournal = parentJournal; + } + + /** + * Create a new root journal, without a parent + * @param hostStorage - + */ + public static rootJournal(hostStorage: HostStorage) { + return new AvmJournal(hostStorage); } - // TODO: work on the typing /** - * - + * Create a new journal from a parent + * @param parentJournal - + */ + public static branchParent(parentJournal: AvmJournal) { + return new AvmJournal(parentJournal.hostStorage, parentJournal); + } + + /** + * Write storage into journal + * * @param contractAddress - * @param key - * @param value - */ public writeStorage(contractAddress: Fr, key: Fr, value: Fr) { - // TODO: do we want this map to be ordered -> is there performance upside to this? - this.storageWrites[contractAddress.toString()][key.toString()] = value; + let contractMap = this.storageWrites.get(contractAddress); + if (!contractMap) { + contractMap = new Map(); + this.storageWrites.set(contractAddress, contractMap); + } + contractMap.set(key, value); } /** - * - + * Read storage from journal + * Read from host storage on cache miss + * * @param contractAddress - * @param key - + * @returns current value */ - public readStorage(contractAddress: Fr, key: Fr) { - const cachedValue = this.storageWrites[contractAddress.toString()][key.toString()]; + public readStorage(contractAddress: Fr, key: Fr): Promise { + const cachedValue = this.storageWrites.get(contractAddress)?.get(key); if (cachedValue) { - return cachedValue; + return Promise.resolve(cachedValue); } - return this.hostStorage.stateDb.storageRead(contractAddress, key); + if (this.parentJournal) { + return this.parentJournal?.readStorage(contractAddress, key); + } + return this.hostStorage.publicStateDb.storageRead(contractAddress, key); } - /** - * - + /** - * @param commitment - */ public writeCommitment(commitment: Fr) { this.newCommitments.push(commitment); } - /** - * - + /** - * @param message - */ public writeL1Message(message: Fr) { this.newL1Message.push(message); } - // TODO: This function will merge two journals together -> the new head of the chain - /** - * - - * @param journal - + /** - + * @param nullifier - */ - public mergeJournal(journal: AvmJournal) { - // TODO: This function will - void journal; + public writeNullifier(nullifier: Fr) { + this.newNullifiers.push(nullifier); } /** - * - + * Merge Journal into parent + * - Utxo objects are concatenated + * - Public state is merged, with the value in the incoming journal taking precedent + */ + public mergeWithParent() { + if (!this.parentJournal) { + throw new RootJournalCannotBeMerged(); + } + + const incomingFlush = this.flush(); + + // Merge UTXOs + this.parentJournal.newCommitments = this.parentJournal.newCommitments.concat(incomingFlush.newCommitments); + this.parentJournal.newL1Message = this.parentJournal.newL1Message.concat(incomingFlush.newL1Messages); + this.parentJournal.newNullifiers = this.parentJournal.newNullifiers.concat(incomingFlush.newNullifiers); + + // Merge Public State + mergeContractMaps(this.parentJournal.storageWrites, incomingFlush.storageWrites); + } + + /** Access the current state of the journal + * + * @returns a JournalData object that can be used to write to the storage */ public flush(): JournalData { return { newCommitments: this.newCommitments, - newL1Message: this.newL1Message, + newL1Messages: this.newL1Message, + newNullifiers: this.newNullifiers, storageWrites: this.storageWrites, }; } } + +/** + * Merges two contract maps together + * Where childMap keys will take precedent over the hostMap + * The assumption being that the child map is created at a later time + * And thus contains more up to date information + * + * @param hostMap - The map to be merged into + * @param childMap - The map to be merged from + */ +function mergeContractMaps(hostMap: Map>, childMap: Map>) { + for (const [key, value] of childMap) { + const map1Value = hostMap.get(key); + if (!map1Value) { + hostMap.set(key, value); + } else { + mergeStorageMaps(map1Value, value); + } + } +} + +/** + * + * @param hostMap - The map to be merge into + * @param childMap - The map to be merged from + */ +function mergeStorageMaps(hostMap: Map, childMap: Map) { + for (const [key, value] of childMap) { + hostMap.set(key, value); + } +} From a10eef0a77cb52e00ffedb10ed325bd63fa0c971 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 18 Jan 2024 10:48:31 -0300 Subject: [PATCH 09/27] chore: Remove lodash times in favor of foundation fn (#3877) See https://github.com/AztecProtocol/aztec-packages/pull/3775#discussion_r1444857703 for context --- yarn-project/archiver/package.json | 1 - .../archiver/src/archiver/archiver.test.ts | 2 +- yarn-project/circuit-types/src/l2_block.ts | 3 +-- yarn-project/circuit-types/src/l2_tx.ts | 3 +-- yarn-project/circuit-types/src/mocks.ts | 3 +-- yarn-project/circuits.js/package.json | 2 -- .../circuits.js/src/abis/abis.test.ts | 2 +- .../src/structs/aggregation_object.ts | 3 +-- .../src/structs/verification_key.ts | 3 +-- yarn-project/end-to-end/package.json | 2 -- .../end-to-end/src/benchmarks/utils.ts | 2 +- .../end-to-end/src/e2e_block_building.test.ts | 3 +-- .../foundation/src/collection/array.test.ts | 13 ++++++++++++ .../foundation/src/collection/array.ts | 10 +++++++++ yarn-project/noir-compiler/package.json | 2 -- .../src/contract-interface-gen/noir.ts | 2 +- yarn-project/p2p/package.json | 2 -- yarn-project/pxe/package.json | 2 -- yarn-project/sequencer-client/package.json | 2 -- .../block_builder/solo_block_builder.test.ts | 2 +- .../src/sequencer/public_processor.test.ts | 3 +-- .../src/sequencer/sequencer.test.ts | 2 +- .../src/sequencer/sequencer.ts | 3 +-- yarn-project/world-state/package.json | 2 -- yarn-project/yarn.lock | 21 +++---------------- 25 files changed, 40 insertions(+), 55 deletions(-) create mode 100644 yarn-project/foundation/src/collection/array.test.ts diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index 3dba1489b60..66a7c825d9b 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -58,7 +58,6 @@ "concurrently": "^8.0.1", "jest": "^29.5.0", "jest-mock-extended": "^3.0.4", - "lodash.times": "^4.3.2", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^5.0.4" diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index c20e2f5bcef..5fb5ef1fbb0 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -1,13 +1,13 @@ import { ExtendedContractData, L2Block, L2BlockL2Logs, LogType } from '@aztec/circuit-types'; import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; import { AztecAddress } from '@aztec/foundation/aztec-address'; +import { times } from '@aztec/foundation/collection'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { sleep } from '@aztec/foundation/sleep'; import { ContractDeploymentEmitterAbi, InboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { MockProxy, mock } from 'jest-mock-extended'; -import times from 'lodash.times'; import { Chain, HttpTransport, Log, PublicClient, Transaction, encodeFunctionData, toHex } from 'viem'; import { Archiver } from './archiver.js'; diff --git a/yarn-project/circuit-types/src/l2_block.ts b/yarn-project/circuit-types/src/l2_block.ts index baa87985282..620659b01f1 100644 --- a/yarn-project/circuit-types/src/l2_block.ts +++ b/yarn-project/circuit-types/src/l2_block.ts @@ -10,13 +10,12 @@ import { STRING_ENCODING, } from '@aztec/circuits.js'; import { makeAppendOnlyTreeSnapshot, makeGlobalVariables, makeHeader } from '@aztec/circuits.js/factories'; +import { times } from '@aztec/foundation/collection'; import { keccak, sha256 } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import times from 'lodash.times'; - import { ContractData } from './contract_data.js'; import { L2Tx } from './l2_tx.js'; import { LogType, TxL2Logs } from './logs/index.js'; diff --git a/yarn-project/circuit-types/src/l2_tx.ts b/yarn-project/circuit-types/src/l2_tx.ts index 293e87f89e4..65588476418 100644 --- a/yarn-project/circuit-types/src/l2_tx.ts +++ b/yarn-project/circuit-types/src/l2_tx.ts @@ -6,11 +6,10 @@ import { MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, Vector, } from '@aztec/circuits.js'; +import { times } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize'; -import times from 'lodash.times'; - import { ContractData } from './contract_data.js'; import { PublicDataWrite } from './public_data_write.js'; import { TxHash } from './tx/tx_hash.js'; diff --git a/yarn-project/circuit-types/src/mocks.ts b/yarn-project/circuit-types/src/mocks.ts index c4d9827e852..5dbddd45d59 100644 --- a/yarn-project/circuit-types/src/mocks.ts +++ b/yarn-project/circuit-types/src/mocks.ts @@ -9,11 +9,10 @@ import { } from '@aztec/circuits.js'; import { makePrivateKernelPublicInputsFinal, makePublicCallRequest } from '@aztec/circuits.js/factories'; import { ContractArtifact } from '@aztec/foundation/abi'; +import { times } from '@aztec/foundation/collection'; import { randomBytes } from '@aztec/foundation/crypto'; import { Tuple } from '@aztec/foundation/serialize'; -import times from 'lodash.times'; - import { ExtendedContractData } from './contract_data.js'; import { DeployedContract } from './interfaces/index.js'; import { FunctionL2Logs, Note, TxL2Logs } from './logs/index.js'; diff --git a/yarn-project/circuits.js/package.json b/yarn-project/circuits.js/package.json index 10befd0fe2b..e3f18a3ca83 100644 --- a/yarn-project/circuits.js/package.json +++ b/yarn-project/circuits.js/package.json @@ -43,14 +43,12 @@ "@aztec/foundation": "workspace:^", "eslint": "^8.35.0", "lodash.chunk": "^4.2.0", - "lodash.times": "^4.3.2", "tslib": "^2.4.0" }, "devDependencies": { "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/lodash.chunk": "^4.2.7", - "@types/lodash.times": "^4.3.7", "@types/node": "^18.7.23", "jest": "^29.5.0", "prettier": "^2.8.4", diff --git a/yarn-project/circuits.js/src/abis/abis.test.ts b/yarn-project/circuits.js/src/abis/abis.test.ts index 51113d7497f..ab0132ce8b6 100644 --- a/yarn-project/circuits.js/src/abis/abis.test.ts +++ b/yarn-project/circuits.js/src/abis/abis.test.ts @@ -1,4 +1,4 @@ -import times from 'lodash.times'; +import { times } from '@aztec/foundation/collection'; import { AztecAddress, diff --git a/yarn-project/circuits.js/src/structs/aggregation_object.ts b/yarn-project/circuits.js/src/structs/aggregation_object.ts index 798cc126b11..b05d57d43ae 100644 --- a/yarn-project/circuits.js/src/structs/aggregation_object.ts +++ b/yarn-project/circuits.js/src/structs/aggregation_object.ts @@ -1,8 +1,7 @@ +import { times } from '@aztec/foundation/collection'; import { Fq, Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import times from 'lodash.times'; - import { UInt32, Vector } from './shared.js'; import { G1AffineElement } from './verification_key.js'; diff --git a/yarn-project/circuits.js/src/structs/verification_key.ts b/yarn-project/circuits.js/src/structs/verification_key.ts index 91e773d843f..1e397cec8ce 100644 --- a/yarn-project/circuits.js/src/structs/verification_key.ts +++ b/yarn-project/circuits.js/src/structs/verification_key.ts @@ -1,7 +1,6 @@ +import { times } from '@aztec/foundation/collection'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import times from 'lodash.times'; - import { Fq } from './index.js'; import { CircuitType } from './shared.js'; diff --git a/yarn-project/end-to-end/package.json b/yarn-project/end-to-end/package.json index bd1e835e57d..a75d100da31 100644 --- a/yarn-project/end-to-end/package.json +++ b/yarn-project/end-to-end/package.json @@ -48,7 +48,6 @@ "@types/koa-static": "^4.0.2", "@types/levelup": "^5.1.2", "@types/lodash.every": "^4.6.7", - "@types/lodash.times": "^4.3.7", "@types/memdown": "^3.0.3", "@types/node": "^18.7.23", "buffer": "^6.0.3", @@ -61,7 +60,6 @@ "lmdb": "^2.9.1", "lodash.compact": "^3.0.1", "lodash.every": "^4.6.0", - "lodash.times": "^4.3.2", "memdown": "^6.1.1", "process": "^0.11.10", "puppeteer": "^21.3.4", diff --git a/yarn-project/end-to-end/src/benchmarks/utils.ts b/yarn-project/end-to-end/src/benchmarks/utils.ts index 780d2561d6c..348932f7b60 100644 --- a/yarn-project/end-to-end/src/benchmarks/utils.ts +++ b/yarn-project/end-to-end/src/benchmarks/utils.ts @@ -10,12 +10,12 @@ import { retryUntil, sleep, } from '@aztec/aztec.js'; +import { times } from '@aztec/foundation/collection'; import { BenchmarkingContract } from '@aztec/noir-contracts/Benchmarking'; import { PXEService, createPXEService } from '@aztec/pxe'; import { mkdirpSync } from 'fs-extra'; import { globSync } from 'glob'; -import times from 'lodash.times'; import { join } from 'path'; import { EndToEndContext, setup } from '../fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_block_building.test.ts b/yarn-project/end-to-end/src/e2e_block_building.test.ts index 8cf476f323c..d21b5a4a447 100644 --- a/yarn-project/end-to-end/src/e2e_block_building.test.ts +++ b/yarn-project/end-to-end/src/e2e_block_building.test.ts @@ -12,12 +12,11 @@ import { Wallet, isContractDeployed, } from '@aztec/aztec.js'; +import { times } from '@aztec/foundation/collection'; import { pedersenHash } from '@aztec/foundation/crypto'; import { TestContract, TestContractArtifact } from '@aztec/noir-contracts/Test'; import { TokenContract } from '@aztec/noir-contracts/Token'; -import times from 'lodash.times'; - import { setup } from './fixtures/utils.js'; describe('e2e_block_building', () => { diff --git a/yarn-project/foundation/src/collection/array.test.ts b/yarn-project/foundation/src/collection/array.test.ts new file mode 100644 index 00000000000..d750c129ad8 --- /dev/null +++ b/yarn-project/foundation/src/collection/array.test.ts @@ -0,0 +1,13 @@ +import { times } from './array.js'; + +describe('times', () => { + it('should return an array with the result from all executions', () => { + const result = times(5, i => i * 2); + expect(result).toEqual([0, 2, 4, 6, 8]); + }); + + it('should return an empty array when n is 0', () => { + const result = times(0, i => i * 2); + expect(result).toEqual([]); + }); +}); diff --git a/yarn-project/foundation/src/collection/array.ts b/yarn-project/foundation/src/collection/array.ts index 1e4eb934d4c..d60786489dc 100644 --- a/yarn-project/foundation/src/collection/array.ts +++ b/yarn-project/foundation/src/collection/array.ts @@ -52,3 +52,13 @@ export function isArrayEmpty(arr: T[], isEmpty: (item: T) => boolean): boolea export function arrayNonEmptyLength(arr: T[], isEmpty: (item: T) => boolean): number { return arr.reduce((sum, item) => (isEmpty(item) ? sum : sum + 1), 0); } + +/** + * Executes the given function n times and returns the results in an array. + * @param n - How many times to repeat. + * @param fn - Mapper from index to value. + * @returns The array with the result from all executions. + */ +export function times(n: number, fn: (i: number) => T): T[] { + return [...Array(n).keys()].map(i => fn(i)); +} diff --git a/yarn-project/noir-compiler/package.json b/yarn-project/noir-compiler/package.json index dc90ce3ca62..a184351fea0 100644 --- a/yarn-project/noir-compiler/package.json +++ b/yarn-project/noir-compiler/package.json @@ -53,7 +53,6 @@ "fs-extra": "^11.1.1", "lodash.camelcase": "^4.3.0", "lodash.capitalize": "^4.2.1", - "lodash.times": "^4.3.2", "memfs": "^4.6.0", "pako": "^2.1.0", "semver": "^7.5.4", @@ -66,7 +65,6 @@ "@types/jest": "^29.5.0", "@types/lodash.camelcase": "^4.3.7", "@types/lodash.capitalize": "^4.2.7", - "@types/lodash.times": "^4.3.7", "@types/node": "^18.7.23", "@types/pako": "^2.0.0", "@types/semver": "^7.5.4", diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts index a3d1a23c5e7..c33c23590c0 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/noir.ts @@ -7,10 +7,10 @@ import { FunctionType, StructType, } from '@aztec/foundation/abi'; +import { times } from '@aztec/foundation/collection'; import camelCase from 'lodash.camelcase'; import capitalize from 'lodash.capitalize'; -import times from 'lodash.times'; /** * Returns whether this function type corresponds to a private call. diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index 6203bc73123..1e4aab4e5ef 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -49,14 +49,12 @@ "@libp2p/tcp": "^8.0.4", "it-pipe": "^3.0.1", "libp2p": "^0.46.6", - "lodash.times": "^4.3.2", "sha3": "^2.1.4", "tslib": "^2.4.0" }, "devDependencies": { "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", - "@types/lodash.times": "^4.3.7", "@types/node": "^18.14.6", "jest": "^29.5.0", "jest-mock-extended": "^3.0.4", diff --git a/yarn-project/pxe/package.json b/yarn-project/pxe/package.json index 223b5f7abd4..82bf35b49e6 100644 --- a/yarn-project/pxe/package.json +++ b/yarn-project/pxe/package.json @@ -46,7 +46,6 @@ "koa": "^2.14.2", "koa-router": "^12.0.0", "lodash.omit": "^4.5.0", - "lodash.times": "^4.3.2", "sha3": "^2.1.4", "tslib": "^2.4.0", "viem": "^1.2.5" @@ -55,7 +54,6 @@ "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/lodash.omit": "^4.5.7", - "@types/lodash.times": "^4.3.7", "@types/node": "^18.7.23", "jest": "^29.5.0", "jest-mock-extended": "^3.0.3", diff --git a/yarn-project/sequencer-client/package.json b/yarn-project/sequencer-client/package.json index 879838cf052..8c11e1f877f 100644 --- a/yarn-project/sequencer-client/package.json +++ b/yarn-project/sequencer-client/package.json @@ -45,7 +45,6 @@ "@aztec/world-state": "workspace:^", "lodash.chunk": "^4.2.0", "lodash.pick": "^4.4.0", - "lodash.times": "^4.3.2", "tslib": "^2.4.0", "viem": "^1.2.5" }, @@ -55,7 +54,6 @@ "@types/levelup": "^5.1.2", "@types/lodash.chunk": "^4.2.7", "@types/lodash.pick": "^4.4.7", - "@types/lodash.times": "^4.3.7", "@types/memdown": "^3.0.0", "@types/node": "^18.7.23", "concurrently": "^7.6.0", diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts index a0e03bb5afc..3ab5e249e60 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts @@ -47,12 +47,12 @@ import { } from '@aztec/circuits.js/factories'; import { makeTuple, range } from '@aztec/foundation/array'; import { toBufferBE } from '@aztec/foundation/bigint-buffer'; +import { times } from '@aztec/foundation/collection'; import { to2Fields } from '@aztec/foundation/serialize'; import { MerkleTreeOperations, MerkleTrees } from '@aztec/world-state'; import { MockProxy, mock } from 'jest-mock-extended'; import { default as levelup } from 'levelup'; -import times from 'lodash.times'; import { type MemDown, default as memdown } from 'memdown'; import { VerificationKeys, getVerificationKeys } from '../mocks/verification_keys.js'; diff --git a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts index 98db4d5e64e..14174865bdb 100644 --- a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts @@ -34,12 +34,11 @@ import { makeSelector, } from '@aztec/circuits.js/factories'; import { makeTuple } from '@aztec/foundation/array'; -import { padArrayEnd } from '@aztec/foundation/collection'; +import { padArrayEnd, times } from '@aztec/foundation/collection'; import { SiblingPath } from '@aztec/types/membership'; import { MerkleTreeOperations, TreeInfo } from '@aztec/world-state'; import { MockProxy, mock } from 'jest-mock-extended'; -import times from 'lodash.times'; import { PublicProver } from '../prover/index.js'; import { PublicKernelCircuitSimulator } from '../simulator/index.js'; diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts index 1bc34c9dc69..2e4af5ba3af 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts @@ -15,11 +15,11 @@ import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, makeEmptyProof, } from '@aztec/circuits.js'; +import { times } from '@aztec/foundation/collection'; import { P2P, P2PClientState } from '@aztec/p2p'; import { MerkleTreeOperations, WorldStateRunningState, WorldStateSynchronizer } from '@aztec/world-state'; import { MockProxy, mock, mockFn } from 'jest-mock-extended'; -import times from 'lodash.times'; import { BlockBuilder } from '../block_builder/index.js'; import { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js'; diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index f23c8c9a9df..2663453e953 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -1,6 +1,7 @@ import { L1ToL2MessageSource, L2Block, L2BlockSource, MerkleTreeId, Tx } from '@aztec/circuit-types'; import { L2BlockBuiltStats } from '@aztec/circuit-types/stats'; import { GlobalVariables } from '@aztec/circuits.js'; +import { times } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; @@ -8,8 +9,6 @@ import { Timer, elapsed } from '@aztec/foundation/timer'; import { P2P } from '@aztec/p2p'; import { WorldStateStatus, WorldStateSynchronizer } from '@aztec/world-state'; -import times from 'lodash.times'; - import { BlockBuilder } from '../block_builder/index.js'; import { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js'; import { L1Publisher } from '../publisher/l1-publisher.js'; diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index f4d908eec5d..7fc61040e0e 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -36,7 +36,6 @@ "@aztec/merkle-tree": "workspace:^", "@aztec/types": "workspace:^", "levelup": "^5.1.1", - "lodash.times": "^4.3.2", "memdown": "^6.1.1", "tslib": "^2.4.0" }, @@ -44,7 +43,6 @@ "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/levelup": "^5.1.2", - "@types/lodash.times": "^4.3.7", "@types/memdown": "^3.0.0", "@types/node": "^18.7.23", "jest": "^29.5.0", diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 305751891f5..d2945982290 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -128,7 +128,6 @@ __metadata: jest-mock-extended: ^3.0.4 lmdb: ^2.9.1 lodash.omit: ^4.5.0 - lodash.times: ^4.3.2 ts-jest: ^29.1.0 ts-node: ^10.9.1 tsc-watch: ^6.0.0 @@ -328,12 +327,10 @@ __metadata: "@jest/globals": ^29.5.0 "@types/jest": ^29.5.0 "@types/lodash.chunk": ^4.2.7 - "@types/lodash.times": ^4.3.7 "@types/node": ^18.7.23 eslint: ^8.35.0 jest: ^29.5.0 lodash.chunk: ^4.2.0 - lodash.times: ^4.3.2 prettier: ^2.8.4 ts-jest: ^29.1.0 ts-node: ^10.9.1 @@ -418,7 +415,6 @@ __metadata: "@types/koa-static": ^4.0.2 "@types/levelup": ^5.1.2 "@types/lodash.every": ^4.6.7 - "@types/lodash.times": ^4.3.7 "@types/memdown": ^3.0.3 "@types/node": ^18.7.23 buffer: ^6.0.3 @@ -432,7 +428,6 @@ __metadata: lmdb: ^2.9.1 lodash.compact: ^3.0.1 lodash.every: ^4.6.0 - lodash.times: ^4.3.2 memdown: ^6.1.1 process: ^0.11.10 puppeteer: ^21.3.4 @@ -615,7 +610,6 @@ __metadata: "@types/jest": ^29.5.0 "@types/lodash.camelcase": ^4.3.7 "@types/lodash.capitalize": ^4.2.7 - "@types/lodash.times": ^4.3.7 "@types/node": ^18.7.23 "@types/pako": ^2.0.0 "@types/semver": ^7.5.4 @@ -625,7 +619,6 @@ __metadata: jest: ^29.5.0 lodash.camelcase: ^4.3.0 lodash.capitalize: ^4.2.1 - lodash.times: ^4.3.2 memfs: ^4.6.0 pako: ^2.1.0 semver: ^7.5.4 @@ -720,13 +713,11 @@ __metadata: "@libp2p/peer-id-factory": ^3.0.3 "@libp2p/tcp": ^8.0.4 "@types/jest": ^29.5.0 - "@types/lodash.times": ^4.3.7 "@types/node": ^18.14.6 it-pipe: ^3.0.1 jest: ^29.5.0 jest-mock-extended: ^3.0.4 libp2p: ^0.46.6 - lodash.times: ^4.3.2 sha3: ^2.1.4 ts-jest: ^29.1.0 ts-node: ^10.9.1 @@ -768,14 +759,12 @@ __metadata: "@jest/globals": ^29.5.0 "@types/jest": ^29.5.0 "@types/lodash.omit": ^4.5.7 - "@types/lodash.times": ^4.3.7 "@types/node": ^18.7.23 jest: ^29.5.0 jest-mock-extended: ^3.0.3 koa: ^2.14.2 koa-router: ^12.0.0 lodash.omit: ^4.5.0 - lodash.times: ^4.3.2 sha3: ^2.1.4 ts-jest: ^29.1.0 ts-node: ^10.9.1 @@ -831,7 +820,6 @@ __metadata: "@types/levelup": ^5.1.2 "@types/lodash.chunk": ^4.2.7 "@types/lodash.pick": ^4.4.7 - "@types/lodash.times": ^4.3.7 "@types/memdown": ^3.0.0 "@types/node": ^18.7.23 concurrently: ^7.6.0 @@ -841,7 +829,6 @@ __metadata: levelup: ^5.1.1 lodash.chunk: ^4.2.0 lodash.pick: ^4.4.0 - lodash.times: ^4.3.2 memdown: ^6.1.1 prettier: ^2.8.7 ts-jest: ^29.1.0 @@ -892,13 +879,11 @@ __metadata: "@jest/globals": ^29.5.0 "@types/jest": ^29.5.0 "@types/levelup": ^5.1.2 - "@types/lodash.times": ^4.3.7 "@types/memdown": ^3.0.0 "@types/node": ^18.7.23 jest: ^29.5.0 jest-mock-extended: ^3.0.5 levelup: ^5.1.1 - lodash.times: ^4.3.2 memdown: ^6.1.1 ts-jest: ^29.1.0 ts-node: ^10.9.1 @@ -3603,11 +3588,11 @@ __metadata: linkType: hard "@types/lodash.times@npm:^4.3.7": - version: 4.3.7 - resolution: "@types/lodash.times@npm:4.3.7" + version: 4.3.9 + resolution: "@types/lodash.times@npm:4.3.9" dependencies: "@types/lodash": "*" - checksum: f31e67c17124614afd392b10e26a5af38f0975edbe4e128c60affa0890a1f2fea502daa4839aee4b1f66b690f925254eff3e9dfcea5d7d3ace7315dba430335f + checksum: 452374b3db98bb805e77b3a53955aa76c1e78a7d48c400b08d48b6424ed9328ad826d98364b82506ea2756089320503d3a5797a1456bcdac11451763be536e62 languageName: node linkType: hard From f35bdb84722dbd01535da5542a0ec7c1fb96e5c7 Mon Sep 17 00:00:00 2001 From: Lasse Herskind <16536249+LHerskind@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:52:05 +0000 Subject: [PATCH 10/27] refactor: Remove unnecessary computation (#4133) The merkle tree computations were done a bit hastily so seems like it was forgotten to reduce how much was computed. Not producing unexpected results, just computing unused hashes, so this pr is removing those unneeded computations. --- l1-contracts/src/core/libraries/decoders/Decoder.sol | 1 + l1-contracts/src/core/libraries/decoders/TxsDecoder.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/l1-contracts/src/core/libraries/decoders/Decoder.sol b/l1-contracts/src/core/libraries/decoders/Decoder.sol index 178e91acda2..39efa07f04d 100644 --- a/l1-contracts/src/core/libraries/decoders/Decoder.sol +++ b/l1-contracts/src/core/libraries/decoders/Decoder.sol @@ -385,6 +385,7 @@ library Decoder { for (uint256 j = 0; j < treeSize; j += 2) { _leafs[j / 2] = sha256(bytes.concat(_leafs[j], _leafs[j + 1])); } + treeSize /= 2; } return _leafs[0]; diff --git a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol b/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol index c58b10b377e..93bb8d922d4 100644 --- a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol +++ b/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol @@ -268,6 +268,7 @@ library TxsDecoder { for (uint256 j = 0; j < treeSize; j += 2) { _leafs[j / 2] = sha256(bytes.concat(_leafs[j], _leafs[j + 1])); } + treeSize /= 2; } return _leafs[0]; From dee564a16293ff8f0aa2c6ba9fb0d1d6235ba251 Mon Sep 17 00:00:00 2001 From: David Banks <47112877+dbanks12@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:39:57 -0500 Subject: [PATCH 11/27] chore(avm): list avm opcodes in a (enum => class) map in TS (#4113) --- .../src/avm/interpreter/interpreter.test.ts | 4 +- .../src/avm/opcodes/from_bytecode.test.ts | 4 +- .../src/avm/opcodes/from_bytecode.ts | 47 +++----- .../src/avm/opcodes/instruction_set.ts | 106 ++++++++++++++++++ .../acir-simulator/src/avm/opcodes/memory.ts | 2 +- .../acir-simulator/src/avm/opcodes/opcodes.ts | 3 +- .../images/bit-formats/INTERNALCALLDEPTH.png | Bin 0 -> 3651 bytes 7 files changed, 127 insertions(+), 39 deletions(-) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts create mode 100644 yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALCALLDEPTH.png diff --git a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts index 3b86414ab63..19fb0e99b54 100644 --- a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts +++ b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts @@ -7,7 +7,7 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Add } from '../opcodes/arithmetic.js'; import { Return } from '../opcodes/control_flow.js'; import { Instruction } from '../opcodes/instruction.js'; -import { CallDataCopy } from '../opcodes/memory.js'; +import { CalldataCopy } from '../opcodes/memory.js'; import { AvmInterpreter } from './interpreter.js'; describe('interpreter', () => { @@ -17,7 +17,7 @@ describe('interpreter', () => { const instructions: Instruction[] = [ // Copy the first two elements of the calldata to memory regions 0 and 1 - new CallDataCopy(0, 2, 0), + new CalldataCopy(0, 2, 0), // Add the two together and store the result in memory region 2 new Add(0, 1, 2), // 1 + 2 // Return the result diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts index e7f95b89b4f..b5ba48bd23a 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts @@ -1,5 +1,5 @@ import { Add, Sub } from './arithmetic.js'; -import { OPCODE_BYTE_LENGTH, OPERAND_BTYE_LENGTH, interpretBytecode } from './from_bytecode.js'; +import { OPCODE_BYTE_LENGTH, OPERAND_BYTE_LENGTH, interpretBytecode } from './from_bytecode.js'; import { Instruction } from './instruction.js'; describe('Avm Interpreter', () => { @@ -9,7 +9,7 @@ describe('Avm Interpreter', () => { return buf; }; const to4Byte = (num: number): Buffer => { - const buf = Buffer.alloc(OPERAND_BTYE_LENGTH); + const buf = Buffer.alloc(OPERAND_BYTE_LENGTH); buf.writeUInt32BE(num); return buf; }; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts index 697ff6be13b..3225123f00b 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts @@ -1,37 +1,12 @@ -import { Add, Mul, Sub } from './arithmetic.js'; import { Instruction } from './instruction.js'; +import { INSTRUCTION_SET } from './instruction_set.js'; +import { Opcode } from './opcodes.js'; export const OPERAND_BIT_LENGTH = 32; -export const OPERAND_BTYE_LENGTH = 4; +export const OPERAND_BYTE_LENGTH = 4; export const OPCODE_BIT_LENGTH = 8; export const OPCODE_BYTE_LENGTH = 1; -const OPERANDS_LOOKUP: { [key: number]: number } = { - 0x1: Add.numberOfOperands, - 0x2: Sub.numberOfOperands, - 0x3: Mul.numberOfOperands, -}; - -/** - * Given the opcode and operands that have been parsed by the interpreter - * We return a construction of the opcode - * - * @param opcode - Opcode value - * @param operands - Array of operands - */ -function instructionLookup(opcode: number, operands: number[]): Instruction { - switch (opcode) { - case 0x1: - return new Add(operands[0], operands[1], operands[2]); - case 0x2: - return new Sub(operands[0], operands[1], operands[2]); - case 0x3: - return new Mul(operands[0], operands[1], operands[2]); - default: - throw new Error(`Opcode ${opcode} not found`); - } -} - /** * Convert a buffer of bytecode into an array of instructions * @param bytecode - Buffer of bytecode @@ -44,18 +19,26 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { const instructions: Instruction[] = []; while (readPtr < bytecodeLength) { - const opcode = bytecode[readPtr]; + const opcodeByte = bytecode[readPtr]; readPtr += 1; + if (!(opcodeByte in Opcode)) { + throw new Error(`Opcode ${opcodeByte} not implemented`); + } + const opcode = opcodeByte as Opcode; - const numberOfOperands = OPERANDS_LOOKUP[opcode]; + const instructionType = INSTRUCTION_SET.get(opcode); + if (instructionType === undefined) { + throw new Error(`Opcode ${opcode} not implemented`); + } + const numberOfOperands = instructionType.numberOfOperands; const operands: number[] = []; for (let i = 0; i < numberOfOperands; i++) { const operand = bytecode.readUInt32BE(readPtr); - readPtr += OPERAND_BTYE_LENGTH; + readPtr += OPERAND_BYTE_LENGTH; operands.push(operand); } - instructions.push(instructionLookup(opcode, operands)); + instructions.push(new instructionType(...operands)); } return instructions; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts new file mode 100644 index 00000000000..5d8c8921daf --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts @@ -0,0 +1,106 @@ +import { + Add, + /*Div,*/ + Mul, + Sub, +} from './arithmetic.js'; +//import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; +//import { Eq, Lt, Lte } from './comparators.js'; +import { Return } from './control_flow.js'; +import { Instruction } from './instruction.js'; +import { + CalldataCopy, + /*Cast, Mov*/ +} from './memory.js'; +import { Opcode } from './opcodes.js'; + +/** - */ +type InstructionConstructor = new (...args: any[]) => Instruction; +/** - */ +type InstructionConstructorAndMembers = InstructionConstructor & { + /** - */ + numberOfOperands: number; +}; + +export const INSTRUCTION_SET: Map = new Map( + new Array<[Opcode, InstructionConstructorAndMembers]>( + // Compute + // Compute - Arithmetic + [Opcode.ADD, Add], + [Opcode.SUB, Sub], + [Opcode.MUL, Mul], + //[Opcode.DIV, Div], + //// Compute - Comparators + //[Opcode.EQ, Eq], + //[Opcode.LT, Lt], + //[Opcode.LTE, Lte], + //// Compute - Bitwise + //[Opcode.AND, And], + //[Opcode.OR, Or], + //[Opcode.XOR, Xor], + //[Opcode.NOT, Not], + //[Opcode.SHL, Shl], + //[Opcode.SHR, Shr], + //// Compute - Type Conversions + //[Opcode.CAST, Cast], + + //// Execution Environment + //[Opcode.ADDRESS, Address], + //[Opcode.STORAGEADDRESS, Storageaddress], + //[Opcode.ORIGIN, Origin], + //[Opcode.SENDER, Sender], + //[Opcode.PORTAL, Portal], + //[Opcode.FEEPERL1GAS, Feeperl1gas], + //[Opcode.FEEPERL2GAS, Feeperl2gas], + //[Opcode.FEEPERDAGAS, Feeperdagas], + //[Opcode.CONTRACTCALLDEPTH, Contractcalldepth], + //// Execution Environment - Globals + //[Opcode.CHAINID, Chainid], + //[Opcode.VERSION, Version], + //[Opcode.BLOCKNUMBER, Blocknumber], + //[Opcode.TIMESTAMP, Timestamp], + //[Opcode.COINBASE, Coinbase], + //[Opcode.BLOCKL1GASLIMIT, Blockl1gaslimit], + //[Opcode.BLOCKL2GASLIMIT, Blockl2gaslimit], + //[Opcode.BLOCKDAGASLIMIT, Blockdagaslimit], + // Execution Environment - Calldata + [Opcode.CALLDATACOPY, CalldataCopy], + + //// Machine State + // Machine State - Gas + //[Opcode.L1GASLEFT, L1gasleft], + //[Opcode.L2GASLEFT, L2gasleft], + //[Opcode.DAGASLEFT, Dagasleft], + //// Machine State - Internal Control Flow + //[Opcode.JUMP, Jump], + //[Opcode.JUMPI, Jumpi], + //[Opcode.INTERNALCALL, Internalcall], + //[Opcode.INTERNALRETURN, Internalreturn], + //// Machine State - Memory + //[Opcode.SET, Set], + //[Opcode.MOV, Mov], + //[Opcode.CMOV, CMov], + + //// World State + //[Opcode.BLOCKHEADERBYNUMBER, Blockheaderbynumber], + //[Opcode.SLOAD, Sload], // Public Storage + //[Opcode.SSTORE, Sstore], // Public Storage + //[Opcode.READL1TOL2MSG, Readl1tol2msg], // Messages + //[Opcode.SENDL2TOL1MSG, Sendl2tol1msg], // Messages + //[Opcode.EMITNOTEHASH, Emitnotehash], // Notes & Nullifiers + //[Opcode.EMITNULLIFIER, Emitnullifier], // Notes & Nullifiers + + //// Accrued Substate + //[Opcode.EMITUNENCRYPTEDLOG, Emitunencryptedlog], + + //// Control Flow - Contract Calls + //[Opcode.CALL, Call], + //[Opcode.STATICCALL, Staticcall], + [Opcode.RETURN, Return], + //[Opcode.REVERT, Revert], + + //// Gadgets + //[Opcode.KECCAK, Keccak], + //[Opcode.POSEIDON, Poseidon], + ), +); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts index 38fa560a3e6..bf14c1c235b 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts @@ -47,7 +47,7 @@ export class Mov implements Instruction { } /** - */ -export class CallDataCopy implements Instruction { +export class CalldataCopy implements Instruction { static type: string = 'CALLDATACOPY'; static numberOfOperands = 3; diff --git a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts index 2a7fa5a1758..e0760e10213 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/opcodes.ts @@ -1,7 +1,7 @@ /** * All AVM opcodes */ -export enum Opcodes { +export enum Opcode { // Compute // Compute - Arithmetic ADD, @@ -54,7 +54,6 @@ export enum Opcodes { JUMPI, INTERNALCALL, INTERNALRETURN, - INTERNALCALLDEPTH, // Machine State - Memory SET, MOV, diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALCALLDEPTH.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/INTERNALCALLDEPTH.png new file mode 100644 index 0000000000000000000000000000000000000000..45f5b1502c358671929abc3b25f08ad87a735e94 GIT binary patch literal 3651 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 literal 0 HcmV?d00001 From 3138816b8b7480bd85eab8739e1d0bc72a5a5361 Mon Sep 17 00:00:00 2001 From: josh crites Date: Thu, 18 Jan 2024 10:57:25 -0500 Subject: [PATCH 12/27] chore(docs): Update lsp install instructions (#4110) Remove the recommendation to install `nargo` for syntax highlighting. Add recommendation to install the LSP extensions and point it to aztec-nargo. closes #4098 --- docs/docs/dev_docs/contracts/main.md | 14 +++++++++++--- .../getting_started/aztecnr-getting-started.md | 12 +++++++++--- .../tutorials/writing_dapp/contract_deployment.md | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/docs/docs/dev_docs/contracts/main.md b/docs/docs/dev_docs/contracts/main.md index 36a2d59f496..40f7a53af9d 100644 --- a/docs/docs/dev_docs/contracts/main.md +++ b/docs/docs/dev_docs/contracts/main.md @@ -20,15 +20,23 @@ An **Aztec smart contract** is a smart contract with **private** state variables ## Install aztec-nargo -To write an Aztec.nr contract, you need to write Noir, `aztec-nargo` comes with a built-in compiler for Aztec contracts written in Noir. See install instructions [here](../cli/sandbox-reference.md). +To write an Aztec.nr contract, you need to the compiler, `aztec-nargo` which is installed when you install the sandbox. See install instructions [here](../cli/sandbox-reference.md). :::info For those coming from vanilla Noir, the version used for aztec.nr is tracked separately to nargo for vanilla Noir. Be sure to use `aztec-nargo` to compile your contracts. ::: -## Install `nargo` (recommended) +## Install Noir LSP (recommended) -`aztec-nargo` comes with the Noir compiler, so installing `nargo` is not required, however it is recommended as it provides a better developer experience for writing contracts. You will need nargo installed to take advantage of the [Noir Language Server](https://noir-lang.org/docs/getting_started/tooling/language_server), which provides syntax highlighting and formatting for your Aztec contracts. +Install the [Noir Language Support extension](https://marketplace.visualstudio.com/items?itemName=noir-lang.vscode-noir) to get syntax highlighting, syntax error detection and go-to definitions for your Aztec contracts. + +Once the extension is installed, go to your VSCode settings, search for "noir" and update the `Noir: Nargo Path` field to point to your `aztec-nargo` executable. + +You can print the path of your `aztec-nargo` executable by running: + +```bash +which aztec-nargo +``` ## Install Noir tooling diff --git a/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md b/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md index f9c7906b10c..27357e5640e 100644 --- a/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md +++ b/docs/docs/dev_docs/getting_started/aztecnr-getting-started.md @@ -205,11 +205,17 @@ You can also test the functions by applying what you learned in the [quickstart] Congratulations, you have now written, compiled, and deployed your first Aztec.nr smart contract! -## Install `nargo` (recommended) +## Install Noir LSP (recommended) -The CLI comes with the Noir compiler, so installing `nargo` is not required, however it is recommended as it provides a better developer experience for writing contracts. You will need nargo installed to take advantage of the [Noir Language Server](https://noir-lang.org/docs/getting_started/tooling/language_server), which provides syntax highlighting and formatting for your Aztec contracts. +Install the [Noir Language Support extension](https://marketplace.visualstudio.com/items?itemName=noir-lang.vscode-noir) to get syntax highlighting, syntax error detection and go-to definitions for your Aztec contracts. -You will also need `nargo` if you want to run unit tests in Noir. +Once the extension is installed, go to your VSCode settings, search for "noir" and update the `Noir: Nargo Path` field to point to your `aztec-nargo` executable. + +You can print the path of your `aztec-nargo` executable by running: + +```bash +which aztec-nargo +``` ## What's next? diff --git a/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md b/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md index 7459287af51..10906728034 100644 --- a/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md +++ b/docs/docs/dev_docs/tutorials/writing_dapp/contract_deployment.md @@ -3,7 +3,7 @@ To add contracts to your application, we'll start by creating a new `aztec-nargo` project. We'll then compile the contracts, and write a simple script to deploy them to our Sandbox. :::info -Follow the instructions [here](../../contracts/setup.md) to install `nargo` if you haven't done so already. +Follow the instructions [here](../../cli/sandbox-reference.md) to install `aztec-nargo` if you haven't done so already. ::: ## Initialize Aztec project From 2bbf7a919172bea9842b4e65129160e0e4ee0050 Mon Sep 17 00:00:00 2001 From: Rahul Kothari Date: Thu, 18 Jan 2024 16:19:01 +0000 Subject: [PATCH 13/27] chore(docs): aztec-up doesnt need `latest`, remove warnings around sandbox/cli npm pkgs (#4138) its been long enough that we don't nede to tell people to not use aztec-cli or sandbox npm pkgs --- docs/docs/dev_docs/cli/cli-commands.md | 22 ----------------- docs/docs/dev_docs/updating.md | 34 ++++++-------------------- yarn-project/cli/README.md | 18 ++++---------- 3 files changed, 12 insertions(+), 62 deletions(-) diff --git a/docs/docs/dev_docs/cli/cli-commands.md b/docs/docs/dev_docs/cli/cli-commands.md index 922cc512447..080dd071ab5 100644 --- a/docs/docs/dev_docs/cli/cli-commands.md +++ b/docs/docs/dev_docs/cli/cli-commands.md @@ -13,28 +13,6 @@ Here you will find a reference to the commands available in the Aztec CLI. The CLI will be installed automatically via Docker by running the command to install and start the sandbox, [instructions here](./sandbox-reference.md#with-docker). -:::info - -The `@aztec/aztec-sandbox` and `@aztec/cli` packages published to npm **should not be used**, in favor of Docker. If you've installed the sandbox or the CLI via NPM, **uninstall** them and remove them from your project dependencies and [install via Docker](./sandbox-reference.md#with-docker). - - - - - -yarn global remove @aztec/aztec-sandbox @aztec/cli - - - - - - -npm -g uninstall @aztec/aztec-sandbox @aztec/cli - - - - -::: - ## Update The CLI comes with an update command. diff --git a/docs/docs/dev_docs/updating.md b/docs/docs/dev_docs/updating.md index 690f3fe27e2..e9f0b54abcc 100644 --- a/docs/docs/dev_docs/updating.md +++ b/docs/docs/dev_docs/updating.md @@ -2,34 +2,12 @@ title: Updating --- -:::info -The `@aztec/aztec-sandbox` and `@aztec/cli` packages published to npm **should not be used**, in favor of Docker. If you've installed the sandbox or the CLI via NPM, **uninstall** them and remove them from your project dependencies and [install via Docker](./cli/sandbox-reference.md#with-docker). - - - - - -yarn global remove @aztec/aztec-sandbox @aztec/cli - - - - - - -npm -g uninstall @aztec/aztec-sandbox @aztec/cli - - - - - -::: - ## TL;DR 1. Updating the sandbox and CLI: ```shell -aztec-up latest +aztec-up ``` 2. Updating aztec-nr and individual @aztec dependencies: @@ -47,13 +25,15 @@ The sandbox must be running for the update command to work. Make sure it is [ins --- -There are three components whose versions need to be kept compatible: +There are four components whose versions need to be kept compatible: 1. Aztec Sandbox 2. Aztec CLI -3. `Aztec.nr`, the Noir framework for writing Aztec contracts +3. aztec-nargo +4. `Aztec.nr`, the Noir framework for writing Aztec contracts -All three are using the same versioning scheme and their versions must match. Docker ensures that the sandbox and CLI are always compatible, but you need to update Aztec.nr manually or using `aztec-cli update`. +First three are packaged together in docker and are kept compatible by running `aztec-up`. +But you need to update your Aztec.nr version manually or using `aztec-cli update`. ## Updating Aztec.nr packages @@ -91,5 +71,5 @@ If the dependencies fail to resolve ensure that the tag matches a tag in the [az `aztec-nargo` is updated by running: ```bash -aztec-up latest +aztec-up ``` diff --git a/yarn-project/cli/README.md b/yarn-project/cli/README.md index 70007f28da5..15fe370f183 100644 --- a/yarn-project/cli/README.md +++ b/yarn-project/cli/README.md @@ -3,20 +3,12 @@ The Aztec CLI `aztec-cli` is a command-line interface (CLI) tool for interacting with Aztec. It provides various commands for deploying contracts, creating accounts, interacting with contracts, and retrieving blockchain data. ## Installation +1. In your terminal, download the sandbox by running +``` +bash -i <(curl -s install.aztec.network) +``` -To use `aztec-cli`, you need to have Node.js installed on your system. Follow these steps to install and set up the CLI tool: - -1. Install Node.js: Visit the official Node.js website (https://nodejs.org) and download the installer for your operating system. Follow the installation instructions to install Node.js. - -2. Install `aztec-cli` package: Open a terminal or command prompt and run the following command to install `aztec-cli` globally on your system: - - ```shell - npm install -g @aztec/cli - ``` - - This will install the `aztec-cli` globally, making it accessible from any location in your terminal. - -3. Verify the installation: After the installation is complete, run the following command to verify that `aztec-cli` is installed correctly: +2. Verify the installation: After the installation is complete, run the following command to verify that `aztec-cli` is installed correctly: ```shell aztec-cli --version From de6e2edc09b823542f45e14b45c32ec10894f6c7 Mon Sep 17 00:00:00 2001 From: David Banks <47112877+dbanks12@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:57:23 -0500 Subject: [PATCH 14/27] feat(avm): encode TS AVM instructions as bytecode, especially for testing (#4115) --- .../acir-simulator/src/avm/avm_context.ts | 4 +- .../acir-simulator/src/avm/index.test.ts | 41 +++++++++++++++++++ ...tecode.test.ts => decode_bytecode.test.ts} | 14 +++---- .../{from_bytecode.ts => decode_bytecode.ts} | 23 ++++------- .../avm/opcodes/encode_to_bytecode.test.ts | 30 ++++++++++++++ .../src/avm/opcodes/encode_to_bytecode.ts | 32 +++++++++++++++ .../src/avm/opcodes/instruction.ts | 3 ++ 7 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 yarn-project/acir-simulator/src/avm/index.test.ts rename yarn-project/acir-simulator/src/avm/opcodes/{from_bytecode.test.ts => decode_bytecode.test.ts} (63%) rename yarn-project/acir-simulator/src/avm/opcodes/{from_bytecode.ts => decode_bytecode.ts} (61%) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts diff --git a/yarn-project/acir-simulator/src/avm/avm_context.ts b/yarn-project/acir-simulator/src/avm/avm_context.ts index 9d52f869acf..79e763f79f4 100644 --- a/yarn-project/acir-simulator/src/avm/avm_context.ts +++ b/yarn-project/acir-simulator/src/avm/avm_context.ts @@ -4,7 +4,7 @@ import { AvmMachineState } from './avm_machine_state.js'; import { AvmMessageCallResult } from './avm_message_call_result.js'; import { AvmStateManager } from './avm_state_manager.js'; import { AvmInterpreter } from './interpreter/index.js'; -import { interpretBytecode } from './opcodes/from_bytecode.js'; +import { decodeBytecode } from './opcodes/decode_bytecode.js'; import { Instruction } from './opcodes/index.js'; /** @@ -34,7 +34,7 @@ export class AvmContext { // const bytecode = stateManager.journal.hostStorage.contractsDb.getBytecode(contractAddress); const bytecode = Buffer.from('0x01000100020003'); - const instructions: Instruction[] = interpretBytecode(bytecode); + const instructions: Instruction[] = decodeBytecode(bytecode); const context = new AvmMachineState(calldata); const interpreter = new AvmInterpreter(context, this.stateManager, instructions); diff --git a/yarn-project/acir-simulator/src/avm/index.test.ts b/yarn-project/acir-simulator/src/avm/index.test.ts new file mode 100644 index 00000000000..1db8306447a --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/index.test.ts @@ -0,0 +1,41 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { mock } from 'jest-mock-extended'; + +import { AvmMachineState } from './avm_machine_state.js'; +import { AvmStateManager } from './avm_state_manager.js'; +import { AvmInterpreter } from './interpreter/interpreter.js'; +import { decodeBytecode } from './opcodes/decode_bytecode.js'; +import { encodeToBytecode } from './opcodes/encode_to_bytecode.js'; +import { Opcode } from './opcodes/opcodes.js'; + +describe('avm', () => { + it('Should execute bytecode', () => { + const calldata: Fr[] = [new Fr(1), new Fr(2)]; + const stateManager = mock(); + + // Construct bytecode + const calldataCopyArgs = [0, 2, 0]; + const addArgs = [0, 1, 2]; + const returnArgs = [2, 1]; + + const calldataCopyBytecode = encodeToBytecode(Opcode.CALLDATACOPY, calldataCopyArgs); + const addBytecode = encodeToBytecode(Opcode.ADD, addArgs); + const returnBytecode = encodeToBytecode(Opcode.RETURN, returnArgs); + const fullBytecode = Buffer.concat([calldataCopyBytecode, addBytecode, returnBytecode]); + + // Decode bytecode into instructions + const instructions = decodeBytecode(fullBytecode); + + // Execute instructions + const context = new AvmMachineState(calldata); + const interpreter = new AvmInterpreter(context, stateManager, instructions); + const avmReturnData = interpreter.run(); + + expect(avmReturnData.reverted).toBe(false); + + const returnData = avmReturnData.output; + expect(returnData.length).toBe(1); + expect(returnData).toEqual([new Fr(3)]); + }); +}); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts similarity index 63% rename from yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts rename to yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts index b5ba48bd23a..57502440e2d 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.test.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.test.ts @@ -1,20 +1,20 @@ import { Add, Sub } from './arithmetic.js'; -import { OPCODE_BYTE_LENGTH, OPERAND_BYTE_LENGTH, interpretBytecode } from './from_bytecode.js'; -import { Instruction } from './instruction.js'; +import { decodeBytecode } from './decode_bytecode.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH, Instruction } from './instruction.js'; -describe('Avm Interpreter', () => { +describe('Avm Decoder', () => { const toByte = (num: number): Buffer => { - const buf = Buffer.alloc(OPCODE_BYTE_LENGTH); + const buf = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH); buf.writeUInt8(num); return buf; }; const to4Byte = (num: number): Buffer => { - const buf = Buffer.alloc(OPERAND_BYTE_LENGTH); + const buf = Buffer.alloc(AVM_OPERAND_BYTE_LENGTH); buf.writeUInt32BE(num); return buf; }; - it('Should read bytecode string into a list of opcodes', () => { + it('Should read bytecode buffer into a list of opcodes', () => { const opcode = 1; const opcode2 = 2; const a = 1; @@ -30,7 +30,7 @@ describe('Avm Interpreter', () => { const expectedInstructions: Instruction[] = [new Add(a, b, c), new Sub(a, b, c)]; - const instructions = interpretBytecode(bytecode); + const instructions = decodeBytecode(bytecode); expect(instructions).toEqual(expectedInstructions); }); }); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts similarity index 61% rename from yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts rename to yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts index 3225123f00b..624546cfbeb 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/from_bytecode.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/decode_bytecode.ts @@ -1,26 +1,21 @@ -import { Instruction } from './instruction.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH, Instruction } from './instruction.js'; import { INSTRUCTION_SET } from './instruction_set.js'; import { Opcode } from './opcodes.js'; -export const OPERAND_BIT_LENGTH = 32; -export const OPERAND_BYTE_LENGTH = 4; -export const OPCODE_BIT_LENGTH = 8; -export const OPCODE_BYTE_LENGTH = 1; - /** * Convert a buffer of bytecode into an array of instructions * @param bytecode - Buffer of bytecode - * @returns Bytecode interpreted into an ordered array of Instructions + * @returns Bytecode decoded into an ordered array of Instructions */ -export function interpretBytecode(bytecode: Buffer): Instruction[] { - let readPtr = 0; +export function decodeBytecode(bytecode: Buffer): Instruction[] { + let bytePtr = 0; const bytecodeLength = bytecode.length; const instructions: Instruction[] = []; - while (readPtr < bytecodeLength) { - const opcodeByte = bytecode[readPtr]; - readPtr += 1; + while (bytePtr < bytecodeLength) { + const opcodeByte = bytecode[bytePtr]; + bytePtr += AVM_OPCODE_BYTE_LENGTH; if (!(opcodeByte in Opcode)) { throw new Error(`Opcode ${opcodeByte} not implemented`); } @@ -33,8 +28,8 @@ export function interpretBytecode(bytecode: Buffer): Instruction[] { const numberOfOperands = instructionType.numberOfOperands; const operands: number[] = []; for (let i = 0; i < numberOfOperands; i++) { - const operand = bytecode.readUInt32BE(readPtr); - readPtr += OPERAND_BYTE_LENGTH; + const operand = bytecode.readUInt32BE(bytePtr); + bytePtr += AVM_OPERAND_BYTE_LENGTH; operands.push(operand); } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts new file mode 100644 index 00000000000..8b1ea033dee --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.test.ts @@ -0,0 +1,30 @@ +import { encodeToBytecode } from './encode_to_bytecode.js'; +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH } from './instruction.js'; +import { Opcode } from './opcodes.js'; + +describe('Avm Encoder', () => { + const toByte = (num: number): Buffer => { + const buf = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH); + buf.writeUInt8(num); + return buf; + }; + const to4Byte = (num: number): Buffer => { + const buf = Buffer.alloc(AVM_OPERAND_BYTE_LENGTH); + buf.writeUInt32BE(num); + return buf; + }; + + it('Should properly encode instructions into bytecode buffers', () => { + const addArgs = [0, 1, 2]; + const subArgs = [3, 4, 5]; + + const addBytecode = encodeToBytecode(Opcode.ADD, addArgs); + const subBytecode = encodeToBytecode(Opcode.SUB, subArgs); + + const expectedAddBytecode = Buffer.concat([toByte(Opcode.ADD), to4Byte(0), to4Byte(1), to4Byte(2)]); + const expectedSubBytecode = Buffer.concat([toByte(Opcode.SUB), to4Byte(3), to4Byte(4), to4Byte(5)]); + + expect(addBytecode).toEqual(expectedAddBytecode); + expect(subBytecode).toEqual(expectedSubBytecode); + }); +}); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts new file mode 100644 index 00000000000..186706847d3 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/encode_to_bytecode.ts @@ -0,0 +1,32 @@ +import { AVM_OPCODE_BYTE_LENGTH, AVM_OPERAND_BYTE_LENGTH } from './instruction.js'; +import { INSTRUCTION_SET } from './instruction_set.js'; +import { Opcode } from './opcodes.js'; + +/** + * Encode an instruction (opcode & arguments) to bytecode. + * @param opcode - the opcode to encode + * @param args - the arguments to encode + * @returns the bytecode for this one instruction + */ +export function encodeToBytecode(opcode: Opcode, args: number[]): Buffer { + const instructionType = INSTRUCTION_SET.get(opcode); + if (instructionType === undefined) { + throw new Error(`Opcode ${opcode} not implemented`); + } + + const numberOfOperands = instructionType.numberOfOperands; + if (args.length !== numberOfOperands) { + throw new Error(`Opcode ${opcode} expects ${numberOfOperands} arguments, but ${args.length} were provided`); + } + + const bytecode = Buffer.alloc(AVM_OPCODE_BYTE_LENGTH + numberOfOperands * AVM_OPERAND_BYTE_LENGTH); + + let bytePtr = 0; + bytecode.writeUInt8(opcode as number, bytePtr); + bytePtr += AVM_OPCODE_BYTE_LENGTH; + for (let i = 0; i < args.length; i++) { + bytecode.writeUInt32BE(args[i], bytePtr); + bytePtr += AVM_OPERAND_BYTE_LENGTH; + } + return bytecode; +} diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts index 0411251b705..9a97ab21a00 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts @@ -1,6 +1,9 @@ import { AvmMachineState } from '../avm_machine_state.js'; import { AvmStateManager } from '../avm_state_manager.js'; +export const AVM_OPERAND_BYTE_LENGTH = 4; +export const AVM_OPCODE_BYTE_LENGTH = 1; + /** * Opcode base class */ From b77afb14c609cfc04663a318eecaa8cbd3b2fa85 Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Thu, 18 Jan 2024 19:12:16 +0000 Subject: [PATCH 15/27] feat(avm): add internal jump and return, adjust control flow (#4140) fixes: https://github.com/AztecProtocol/aztec-packages/issues/4132 --- .../src/avm/avm_machine_state.ts | 14 ++ .../src/avm/interpreter/interpreter.test.ts | 18 ++- .../src/avm/interpreter/interpreter.ts | 31 +++- .../src/avm/opcodes/arithmetic.ts | 36 +++-- .../acir-simulator/src/avm/opcodes/bitwise.ts | 52 +++++-- .../src/avm/opcodes/comparators.ts | 24 ++- .../src/avm/opcodes/control_flow.test.ts | 146 ++++++++++++++++++ .../src/avm/opcodes/control_flow.ts | 84 +++++++++- .../src/avm/opcodes/instruction.ts | 8 + .../src/avm/opcodes/instruction_set.ts | 10 +- .../acir-simulator/src/avm/opcodes/memory.ts | 32 +++- 11 files changed, 409 insertions(+), 46 deletions(-) create mode 100644 yarn-project/acir-simulator/src/avm/opcodes/control_flow.test.ts diff --git a/yarn-project/acir-simulator/src/avm/avm_machine_state.ts b/yarn-project/acir-simulator/src/avm/avm_machine_state.ts index aa0fc689b58..53e8599b7c3 100644 --- a/yarn-project/acir-simulator/src/avm/avm_machine_state.ts +++ b/yarn-project/acir-simulator/src/avm/avm_machine_state.ts @@ -12,11 +12,22 @@ export class AvmMachineState { /** - */ public memory: Fr[]; + /** + * When an internal_call is invoked, the internal call stack is added to with the current pc + 1 + * When internal_return is invoked, the latest value is popped from the internal call stack and set to the pc. + */ + public internalCallStack: number[]; + /** - */ public pc: number; /** - */ public callStack: number[]; + /** + * If an instruction triggers a halt, then it ends execution of the VM + */ + public halted: boolean; + /** * Create a new avm context * @param calldata - @@ -25,9 +36,12 @@ export class AvmMachineState { this.calldata = calldata; this.returnData = []; this.memory = []; + this.internalCallStack = []; this.pc = 0; this.callStack = []; + + this.halted = false; } /** diff --git a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts index 19fb0e99b54..a52a2c13222 100644 --- a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts +++ b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.test.ts @@ -5,7 +5,7 @@ import { mock } from 'jest-mock-extended'; import { AvmMachineState } from '../avm_machine_state.js'; import { AvmStateManager } from '../avm_state_manager.js'; import { Add } from '../opcodes/arithmetic.js'; -import { Return } from '../opcodes/control_flow.js'; +import { Jump, Return } from '../opcodes/control_flow.js'; import { Instruction } from '../opcodes/instruction.js'; import { CalldataCopy } from '../opcodes/memory.js'; import { AvmInterpreter } from './interpreter.js'; @@ -34,4 +34,20 @@ describe('interpreter', () => { expect(returnData.length).toBe(1); expect(returnData).toEqual([new Fr(3)]); }); + + it('Should revert with an invalid jump', () => { + const calldata: Fr[] = []; + const stateManager = mock(); + + const invalidJumpDestination = 22; + + const instructions: Instruction[] = [new Jump(invalidJumpDestination)]; + + const context = new AvmMachineState(calldata); + const interpreter = new AvmInterpreter(context, stateManager, instructions); + + const avmReturnData = interpreter.run(); + + expect(avmReturnData.reverted).toBe(true); + }); }); diff --git a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.ts b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.ts index 47fb9c3771d..9bbd511c2d3 100644 --- a/yarn-project/acir-simulator/src/avm/interpreter/interpreter.ts +++ b/yarn-project/acir-simulator/src/avm/interpreter/interpreter.ts @@ -30,8 +30,18 @@ export class AvmInterpreter { */ run(): AvmMessageCallResult { try { - for (const instruction of this.instructions) { + while (!this.machineState.halted && this.machineState.pc < this.instructions.length) { + const instruction = this.instructions[this.machineState.pc]; + + if (!instruction) { + throw new InvalidInstructionError(this.machineState.pc); + } + instruction.execute(this.machineState, this.stateManager); + + if (this.machineState.pc >= this.instructions.length) { + throw new InvalidProgramCounterError(this.machineState.pc, this.instructions.length); + } } const returnData = this.machineState.getReturnData(); @@ -52,3 +62,22 @@ export class AvmInterpreter { return this.machineState.getReturnData(); } } + +/** + * Error is thrown when the program counter goes to an invalid location. + * There is no instruction at the provided pc + */ +class InvalidProgramCounterError extends Error { + constructor(pc: number, max: number) { + super(`Invalid program counter ${pc}, max is ${max}`); + } +} + +/** + * This assertion should never be hit - there should always be a valid instruction + */ +class InvalidInstructionError extends Error { + constructor(pc: number) { + super(`Invalid instruction at ${pc}`); + } +} diff --git a/yarn-project/acir-simulator/src/avm/opcodes/arithmetic.ts b/yarn-project/acir-simulator/src/avm/opcodes/arithmetic.ts index ab6465debf4..7f2fb3db052 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/arithmetic.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/arithmetic.ts @@ -5,43 +5,53 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Instruction } from './instruction.js'; /** -*/ -export class Add implements Instruction { +export class Add extends Instruction { static type: string = 'ADD'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a = machineState.readMemory(this.aOffset); const b = machineState.readMemory(this.bOffset); - const dest = new Fr(a.toBigInt() + (b.toBigInt() % Fr.MODULUS)); + const dest = new Fr((a.toBigInt() + b.toBigInt()) % Fr.MODULUS); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Sub implements Instruction { +export class Sub extends Instruction { static type: string = 'SUB'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a = machineState.readMemory(this.aOffset); const b = machineState.readMemory(this.bOffset); - const dest = new Fr(a.toBigInt() - (b.toBigInt() % Fr.MODULUS)); + const dest = new Fr((a.toBigInt() - b.toBigInt()) % Fr.MODULUS); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Mul implements Instruction { +export class Mul extends Instruction { static type: string = 'MUL'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -49,15 +59,19 @@ export class Mul implements Instruction { const dest = new Fr((a.toBigInt() * b.toBigInt()) % Fr.MODULUS); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Div implements Instruction { +export class Div extends Instruction { static type: string = 'DIV'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -66,5 +80,7 @@ export class Div implements Instruction { // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3993): proper field division const dest = new Fr(a.toBigInt() / b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/bitwise.ts b/yarn-project/acir-simulator/src/avm/opcodes/bitwise.ts index 62376269d8e..bc5c3a211cb 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/bitwise.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/bitwise.ts @@ -5,11 +5,13 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Instruction } from './instruction.js'; /** - */ -export class And implements Instruction { +export class And extends Instruction { static type: string = 'AND'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -17,15 +19,19 @@ export class And implements Instruction { const dest = new Fr(a.toBigInt() & b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** - */ -export class Or implements Instruction { +export class Or extends Instruction { static type: string = 'OR'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -33,15 +39,19 @@ export class Or implements Instruction { const dest = new Fr(a.toBigInt() | b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** - */ -export class Xor implements Instruction { +export class Xor extends Instruction { static type: string = 'XOR'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -49,30 +59,40 @@ export class Xor implements Instruction { const dest = new Fr(a.toBigInt() ^ b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** - */ -export class Not implements Instruction { +export class Not extends Instruction { static type: string = 'NOT'; static numberOfOperands = 2; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); - const dest = new Fr(~a.toBigInt()); + // TODO: hack -> until proper field arithmetic is implemented + const result = ~a.toBigInt(); + const dest = new Fr(result < 0 ? Fr.MODULUS + /* using a + as result is -ve*/ result : result); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Shl implements Instruction { +export class Shl extends Instruction { static type: string = 'SHL'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -80,15 +100,19 @@ export class Shl implements Instruction { const dest = new Fr(a.toBigInt() << b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Shr implements Instruction { +export class Shr extends Instruction { static type: string = 'SHR'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -96,5 +120,7 @@ export class Shr implements Instruction { const dest = new Fr(a.toBigInt() >> b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/comparators.ts b/yarn-project/acir-simulator/src/avm/opcodes/comparators.ts index ddd3c9d1de9..685a5438c42 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/comparators.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/comparators.ts @@ -5,11 +5,13 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Instruction } from './instruction.js'; /** -*/ -export class Eq implements Instruction { +export class Eq extends Instruction { static type: string = 'EQ'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -17,14 +19,18 @@ export class Eq implements Instruction { const dest = new Fr(a.toBigInt() == b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Lt implements Instruction { +export class Lt extends Instruction { static type: string = 'Lt'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -32,15 +38,19 @@ export class Lt implements Instruction { const dest = new Fr(a.toBigInt() < b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } /** -*/ -export class Lte implements Instruction { +export class Lte extends Instruction { static type: string = 'LTE'; static numberOfOperands = 3; - constructor(private aOffset: number, private bOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private bOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a: Fr = machineState.readMemory(this.aOffset); @@ -48,5 +58,7 @@ export class Lte implements Instruction { const dest = new Fr(a.toBigInt() < b.toBigInt()); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/control_flow.test.ts b/yarn-project/acir-simulator/src/avm/opcodes/control_flow.test.ts new file mode 100644 index 00000000000..864ee0d0b42 --- /dev/null +++ b/yarn-project/acir-simulator/src/avm/opcodes/control_flow.test.ts @@ -0,0 +1,146 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { mock } from 'jest-mock-extended'; + +import { AvmMachineState } from '../avm_machine_state.js'; +import { AvmStateManager } from '../avm_state_manager.js'; +import { Add, Mul, Sub } from './arithmetic.js'; +import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; +import { Eq, Lt, Lte } from './comparators.js'; +import { InternalCall, InternalCallStackEmptyError, InternalReturn, Jump, JumpI } from './control_flow.js'; +import { CalldataCopy, Cast, Mov, Set } from './memory.js'; + +describe('Control Flow Opcodes', () => { + let stateManager = mock(); + let machineState: AvmMachineState; + + beforeEach(() => { + stateManager = mock(); + machineState = new AvmMachineState([]); + }); + + it('Should implement JUMP', () => { + const jumpLocation = 22; + + expect(machineState.pc).toBe(0); + + const instruction = new Jump(jumpLocation); + instruction.execute(machineState, stateManager); + expect(machineState.pc).toBe(jumpLocation); + }); + + it('Should implement JUMPI - truthy', () => { + const jumpLocation = 22; + const jumpLocation1 = 69; + + expect(machineState.pc).toBe(0); + + machineState.writeMemory(0, new Fr(1n)); + machineState.writeMemory(1, new Fr(2n)); + + const instruction = new JumpI(jumpLocation, 0); + instruction.execute(machineState, stateManager); + expect(machineState.pc).toBe(jumpLocation); + + // Truthy can be greater than 1 + const instruction1 = new JumpI(jumpLocation1, 1); + instruction1.execute(machineState, stateManager); + expect(machineState.pc).toBe(jumpLocation1); + }); + + it('Should implement JUMPI - falsy', () => { + const jumpLocation = 22; + + expect(machineState.pc).toBe(0); + + machineState.writeMemory(0, new Fr(0n)); + + const instruction = new JumpI(jumpLocation, 0); + instruction.execute(machineState, stateManager); + expect(machineState.pc).toBe(1); + }); + + it('Should implement Internal Call and Return', () => { + const jumpLocation = 22; + + expect(machineState.pc).toBe(0); + + const instruction = new InternalCall(jumpLocation); + const returnInstruction = new InternalReturn(); + + instruction.execute(machineState, stateManager); + expect(machineState.pc).toBe(jumpLocation); + + returnInstruction.execute(machineState, stateManager); + expect(machineState.pc).toBe(1); + }); + + it('Should chain series of control flow instructions', () => { + const jumpLocation0 = 22; + const jumpLocation1 = 69; + const jumpLocation2 = 1337; + + const aloneJumpLocation = 420; + + const instructions = [ + // pc | internal call stack + new InternalCall(jumpLocation0), // 22 | [1] + new InternalCall(jumpLocation1), // 69 | [1, 23] + new InternalReturn(), // 23 | [1] + new Jump(aloneJumpLocation), // 420 | [1] + new InternalCall(jumpLocation2), // 1337| [1, 421] + new InternalReturn(), // 421 | [1] + new InternalReturn(), // 1 | [] + ]; + + // The expected program counter after each instruction is invoked + const expectedPcs = [ + jumpLocation0, + jumpLocation1, + jumpLocation0 + 1, + aloneJumpLocation, + jumpLocation2, + aloneJumpLocation + 1, + 1, + ]; + + for (let i = 0; i < instructions.length; i++) { + instructions[i].execute(machineState, stateManager); + expect(machineState.pc).toBe(expectedPcs[i]); + } + }); + + it('Should error if Internal Return is called without a corresponding Internal Call', () => { + const returnInstruction = new InternalReturn(); + expect(() => returnInstruction.execute(machineState, stateManager)).toThrow(InternalCallStackEmptyError); + }); + + it('Should increment PC on All other Instructions', () => { + const instructions = [ + new Add(0, 1, 2), + new Sub(0, 1, 2), + new Mul(0, 1, 2), + new Lt(0, 1, 2), + new Lte(0, 1, 2), + new Eq(0, 1, 2), + new Xor(0, 1, 2), + new And(0, 1, 2), + new Or(0, 1, 2), + new Shl(0, 1, 2), + new Shr(0, 1, 2), + new Not(0, 2), + new CalldataCopy(0, 1, 2), + new Set(0n, 1), + new Mov(0, 1), + new Cast(0, 1), + ]; + + for (const instruction of instructions) { + // Use a fresh machine state each run + const innerMachineState = new AvmMachineState([]); + expect(machineState.pc).toBe(0); + instruction.execute(innerMachineState, stateManager); + expect(innerMachineState.pc).toBe(1); + } + }); +}); diff --git a/yarn-project/acir-simulator/src/avm/opcodes/control_flow.ts b/yarn-project/acir-simulator/src/avm/opcodes/control_flow.ts index 31336e397be..b988979076e 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/control_flow.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/control_flow.ts @@ -3,14 +3,94 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Instruction } from './instruction.js'; /** - */ -export class Return implements Instruction { +export class Return extends Instruction { static type: string = 'RETURN'; static numberOfOperands = 2; - constructor(private returnOffset: number, private copySize: number) {} + constructor(private returnOffset: number, private copySize: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const returnData = machineState.readMemoryChunk(this.returnOffset, this.returnOffset + this.copySize); machineState.setReturnData(returnData); + + this.halt(machineState); + } +} + +/** -*/ +export class Jump extends Instruction { + static type: string = 'JUMP'; + static numberOfOperands = 1; + + constructor(private jumpOffset: number) { + super(); + } + + execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { + machineState.pc = this.jumpOffset; + } +} + +/** -*/ +export class JumpI extends Instruction { + static type: string = 'JUMPI'; + static numberOfOperands = 1; + + constructor(private jumpOffset: number, private condOffset: number) { + super(); + } + + execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { + const condition = machineState.readMemory(this.condOffset); + + if (condition.toBigInt() == 0n) { + this.incrementPc(machineState); + } else { + machineState.pc = this.jumpOffset; + } + } +} + +/** -*/ +export class InternalCall extends Instruction { + static type: string = 'INTERNALCALL'; + static numberOfOperands = 1; + + constructor(private jumpOffset: number) { + super(); + } + + execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { + machineState.internalCallStack.push(machineState.pc + 1); + machineState.pc = this.jumpOffset; + } +} + +/** -*/ +export class InternalReturn extends Instruction { + static type: string = 'INTERNALRETURN'; + static numberOfOperands = 0; + + constructor() { + super(); + } + + execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { + const jumpOffset = machineState.internalCallStack.pop(); + if (jumpOffset === undefined) { + throw new InternalCallStackEmptyError(); + } + machineState.pc = jumpOffset; + } +} + +/** + * Thrown if the internal call stack is popped when it is empty + */ +export class InternalCallStackEmptyError extends Error { + constructor() { + super('Internal call stack is empty'); } } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts index 9a97ab21a00..c77a1a9ddd3 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction.ts @@ -9,4 +9,12 @@ export const AVM_OPCODE_BYTE_LENGTH = 1; */ export abstract class Instruction { abstract execute(machineState: AvmMachineState, stateManager: AvmStateManager): void; + + incrementPc(machineState: AvmMachineState): void { + machineState.pc++; + } + + halt(machineState: AvmMachineState): void { + machineState.halted = true; + } } diff --git a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts index 5d8c8921daf..1211205b979 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/instruction_set.ts @@ -6,7 +6,7 @@ import { } from './arithmetic.js'; //import { And, Not, Or, Shl, Shr, Xor } from './bitwise.js'; //import { Eq, Lt, Lte } from './comparators.js'; -import { Return } from './control_flow.js'; +import { InternalCall, InternalReturn, Jump, JumpI, Return } from './control_flow.js'; import { Instruction } from './instruction.js'; import { CalldataCopy, @@ -72,10 +72,10 @@ export const INSTRUCTION_SET: Map = ne //[Opcode.L2GASLEFT, L2gasleft], //[Opcode.DAGASLEFT, Dagasleft], //// Machine State - Internal Control Flow - //[Opcode.JUMP, Jump], - //[Opcode.JUMPI, Jumpi], - //[Opcode.INTERNALCALL, Internalcall], - //[Opcode.INTERNALRETURN, Internalreturn], + [Opcode.JUMP, Jump], + [Opcode.JUMPI, JumpI], + [Opcode.INTERNALCALL, InternalCall], + [Opcode.INTERNALRETURN, InternalReturn], //// Machine State - Memory //[Opcode.SET, Set], //[Opcode.MOV, Mov], diff --git a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts index bf14c1c235b..c856645eef9 100644 --- a/yarn-project/acir-simulator/src/avm/opcodes/memory.ts +++ b/yarn-project/acir-simulator/src/avm/opcodes/memory.ts @@ -5,56 +5,72 @@ import { AvmStateManager } from '../avm_state_manager.js'; import { Instruction } from './instruction.js'; /** - */ -export class Set implements Instruction { +export class Set extends Instruction { static type: string = 'SET'; static numberOfOperands = 2; - constructor(private constt: bigint, private destOffset: number) {} + constructor(private constt: bigint, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const dest = new Fr(this.constt); machineState.writeMemory(this.destOffset, dest); + + this.incrementPc(machineState); } } // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3987): tags are not implemented yet - this will behave as a mov /** - */ -export class Cast implements Instruction { +export class Cast extends Instruction { static type: string = 'CAST'; static numberOfOperands = 2; - constructor(private aOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a = machineState.readMemory(this.aOffset); machineState.writeMemory(this.destOffset, a); + + this.incrementPc(machineState); } } /** - */ -export class Mov implements Instruction { +export class Mov extends Instruction { static type: string = 'MOV'; static numberOfOperands = 2; - constructor(private aOffset: number, private destOffset: number) {} + constructor(private aOffset: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const a = machineState.readMemory(this.aOffset); machineState.writeMemory(this.destOffset, a); + + this.incrementPc(machineState); } } /** - */ -export class CalldataCopy implements Instruction { +export class CalldataCopy extends Instruction { static type: string = 'CALLDATACOPY'; static numberOfOperands = 3; - constructor(private cdOffset: number, private copySize: number, private destOffset: number) {} + constructor(private cdOffset: number, private copySize: number, private destOffset: number) { + super(); + } execute(machineState: AvmMachineState, _stateManager: AvmStateManager): void { const calldata = machineState.calldata.slice(this.cdOffset, this.cdOffset + this.copySize); machineState.writeMemoryChunk(this.destOffset, calldata); + + this.incrementPc(machineState); } } From d719738926eb7d27139bd0f6047aa7e711565bbd Mon Sep 17 00:00:00 2001 From: AztecBot Date: Fri, 19 Jan 2024 02:16:38 +0000 Subject: [PATCH 16/27] git subrepo push --branch=master barretenberg subrepo: subdir: "barretenberg" merged: "f01329ccb" upstream: origin: "https://github.com/AztecProtocol/barretenberg" branch: "master" commit: "f01329ccb" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- barretenberg/.gitrepo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/.gitrepo b/barretenberg/.gitrepo index b27c908e440..f0f2d934989 100644 --- a/barretenberg/.gitrepo +++ b/barretenberg/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/barretenberg branch = master - commit = ee6b91e5ecd6bc57dd83834d27442008672dbddb - parent = 04f8e0dfde5a3d4f54621726891aedc071212a8a + commit = f01329ccb7a07c8828a06a19d0a4d77d3f89087a + parent = b77afb14c609cfc04663a318eecaa8cbd3b2fa85 method = merge cmdver = 0.4.6 From 44d91361274a54f0e59f0ad5f8869f3f3aa49c2b Mon Sep 17 00:00:00 2001 From: AztecBot Date: Fri, 19 Jan 2024 02:17:02 +0000 Subject: [PATCH 17/27] chore: replace relative paths to noir-protocol-circuits --- yarn-project/aztec-nr/aztec/Nargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec-nr/aztec/Nargo.toml b/yarn-project/aztec-nr/aztec/Nargo.toml index fb8ba9b6fd4..52f313a6472 100644 --- a/yarn-project/aztec-nr/aztec/Nargo.toml +++ b/yarn-project/aztec-nr/aztec/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "lib" [dependencies] -protocol_types = { path = "../../noir-protocol-circuits/src/crates/types" } +protocol_types = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.19.0", directory="yarn-project/noir-protocol-circuits/src/crates/types" } From 8318f4a6052b0621d8337bdd1980968f55fb81b9 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Fri, 19 Jan 2024 02:17:02 +0000 Subject: [PATCH 18/27] git_subrepo.sh: Fix parent in .gitrepo file. [skip ci] --- yarn-project/aztec-nr/.gitrepo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec-nr/.gitrepo b/yarn-project/aztec-nr/.gitrepo index 2e153fae335..0caa7f4911b 100644 --- a/yarn-project/aztec-nr/.gitrepo +++ b/yarn-project/aztec-nr/.gitrepo @@ -9,4 +9,4 @@ commit = 8309aa264079c6382dcff4384bab3cce452f5c97 method = merge cmdver = 0.4.6 - parent = 0818fdee5b7a0121ce1c064d06ca5ab7f27fdd58 + parent = 52c3bdc065b08abea24896fd751e91f5ce161d60 From deff54c19308ea5ceaa2c379d2b0a65fd58f7799 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Fri, 19 Jan 2024 02:17:06 +0000 Subject: [PATCH 19/27] git subrepo push --branch=master yarn-project/aztec-nr subrepo: subdir: "yarn-project/aztec-nr" merged: "ecbd4b0a4" upstream: origin: "https://github.com/AztecProtocol/aztec-nr" branch: "master" commit: "ecbd4b0a4" git-subrepo: version: "0.4.6" origin: "???" commit: "???" [skip ci] --- yarn-project/aztec-nr/.gitrepo | 4 ++-- yarn-project/aztec-nr/aztec/Nargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn-project/aztec-nr/.gitrepo b/yarn-project/aztec-nr/.gitrepo index 0caa7f4911b..5374705e2df 100644 --- a/yarn-project/aztec-nr/.gitrepo +++ b/yarn-project/aztec-nr/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/aztec-nr branch = master - commit = 8309aa264079c6382dcff4384bab3cce452f5c97 + commit = ecbd4b0a4bf02c8221499b700b7da72363d561fc method = merge cmdver = 0.4.6 - parent = 52c3bdc065b08abea24896fd751e91f5ce161d60 + parent = eb0c17382c5ae5f97b4a796b42bfe59edc24699c diff --git a/yarn-project/aztec-nr/aztec/Nargo.toml b/yarn-project/aztec-nr/aztec/Nargo.toml index 52f313a6472..fb8ba9b6fd4 100644 --- a/yarn-project/aztec-nr/aztec/Nargo.toml +++ b/yarn-project/aztec-nr/aztec/Nargo.toml @@ -5,4 +5,4 @@ compiler_version = ">=0.18.0" type = "lib" [dependencies] -protocol_types = { git="https://github.com/AztecProtocol/aztec-packages", tag="aztec-packages-v0.19.0", directory="yarn-project/noir-protocol-circuits/src/crates/types" } +protocol_types = { path = "../../noir-protocol-circuits/src/crates/types" } From 7438db31b29860aa2c0af54afa8413711a24e1eb Mon Sep 17 00:00:00 2001 From: ludamad Date: Thu, 18 Jan 2024 23:14:13 -0500 Subject: [PATCH 20/27] refactor(bb): namespace proof_system=>bb (#4116) This is just a rename. Followups include getting rid of 'using namespace bb;' statements where now redundant Co-authored-by: ludamad --- .../benchmark/goblin_bench/eccvm.bench.cpp | 2 +- .../benchmark/goblin_bench/goblin.bench.cpp | 2 +- .../benchmark/ipa_bench/ipa.bench.cpp | 4 +- .../benchmark/plonk_bench/plonk.bench.cpp | 4 +- .../plonk_bench/standard_plonk.bench.cpp | 8 +-- .../protogalaxy_bench/protogalaxy.bench.cpp | 4 +- .../relations_bench/barycentric.bench.cpp | 4 +- .../relations_bench/relations.bench.cpp | 8 +-- .../ultra_bench/benchmark_utilities.hpp | 65 ++++++++--------- .../ultra_bench/ultra_honk.bench.cpp | 2 +- .../ultra_bench/ultra_honk_rounds.bench.cpp | 2 +- .../ultra_bench/ultra_plonk.bench.cpp | 2 +- .../ultra_bench/ultra_plonk_rounds.bench.cpp | 2 +- .../benchmark/widgets_bench/widget.bench.cpp | 4 +- .../barretenberg/commitment_schemes/claim.hpp | 4 +- .../commitment_schemes/commitment_key.hpp | 4 +- .../commitment_key.test.hpp | 4 +- .../commitment_schemes/gemini/gemini.cpp | 4 +- .../commitment_schemes/gemini/gemini.hpp | 8 +-- .../commitment_schemes/gemini/gemini.test.cpp | 4 +- .../commitment_schemes/ipa/ipa.hpp | 4 +- .../commitment_schemes/ipa/ipa.test.cpp | 4 +- .../commitment_schemes/kzg/kzg.hpp | 4 +- .../commitment_schemes/kzg/kzg.test.cpp | 4 +- .../commitment_schemes/shplonk/shplonk.hpp | 4 +- .../shplonk/shplonk.test.cpp | 4 +- .../commitment_schemes/verification_key.hpp | 4 +- .../commitment_schemes/wrapper.hpp | 4 +- .../zeromorph/zeromorph.hpp | 4 +- .../zeromorph/zeromorph.test.cpp | 4 +- .../cpp/src/barretenberg/common/fuzzer.hpp | 2 +- .../dsl/acir_format/blake2s_constraint.cpp | 6 +- .../dsl/acir_format/blake3_constraint.cpp | 6 +- .../dsl/acir_format/block_constraint.cpp | 12 ++-- .../dsl/acir_format/ecdsa_secp256k1.cpp | 18 ++--- .../dsl/acir_format/ecdsa_secp256k1.hpp | 4 +- .../dsl/acir_format/ecdsa_secp256k1.test.cpp | 2 +- .../dsl/acir_format/ecdsa_secp256r1.cpp | 8 +-- .../dsl/acir_format/ecdsa_secp256r1.test.cpp | 2 +- .../dsl/acir_format/fixed_base_scalar_mul.cpp | 6 +- .../dsl/acir_format/keccak_constraint.cpp | 21 +++--- .../dsl/acir_format/logic_constraint.cpp | 4 +- .../barretenberg/dsl/acir_format/pedersen.cpp | 6 +- .../dsl/acir_format/recursion_constraint.cpp | 4 +- .../dsl/acir_format/recursion_constraint.hpp | 2 +- .../acir_format/recursion_constraint.test.cpp | 2 +- .../dsl/acir_format/schnorr_verify.cpp | 21 +++--- .../dsl/acir_format/sha256_constraint.cpp | 6 +- .../dsl/acir_proofs/acir_composer.cpp | 10 +-- .../dsl/acir_proofs/acir_composer.hpp | 10 +-- .../cpp/src/barretenberg/dsl/types.hpp | 58 +++++++-------- .../cpp/src/barretenberg/ecc/curves/types.hpp | 2 +- .../src/barretenberg/eccvm/eccvm_composer.cpp | 4 +- .../src/barretenberg/eccvm/eccvm_composer.hpp | 4 +- .../eccvm/eccvm_composer.test.cpp | 7 +- .../src/barretenberg/eccvm/eccvm_prover.cpp | 4 +- .../src/barretenberg/eccvm/eccvm_prover.hpp | 6 +- .../eccvm/eccvm_transcript.test.cpp | 6 +- .../src/barretenberg/eccvm/eccvm_verifier.cpp | 6 +- .../src/barretenberg/eccvm/eccvm_verifier.hpp | 4 +- .../cpp/src/barretenberg/examples/c_bind.cpp | 2 +- .../barretenberg/examples/simple/simple.cpp | 4 +- .../barretenberg/examples/simple/simple.hpp | 4 +- .../cpp/src/barretenberg/flavor/ecc_vm.hpp | 4 +- .../cpp/src/barretenberg/flavor/flavor.hpp | 16 ++--- .../src/barretenberg/flavor/flavor.test.cpp | 10 +-- .../flavor/generated/AvmMini_flavor.hpp | 4 +- .../flavor/generated/Toy_flavor.hpp | 4 +- .../barretenberg/flavor/goblin_translator.hpp | 4 +- .../src/barretenberg/flavor/goblin_ultra.hpp | 29 ++++---- .../flavor/goblin_ultra_recursive.hpp | 6 +- .../src/barretenberg/flavor/plonk_flavors.hpp | 8 +-- .../flavor/relation_definitions.hpp | 12 ++-- .../cpp/src/barretenberg/flavor/ultra.hpp | 19 +++-- .../barretenberg/flavor/ultra_recursive.hpp | 18 ++--- .../goblin/full_goblin_recursion.test.cpp | 4 +- .../cpp/src/barretenberg/goblin/goblin.hpp | 30 ++++---- .../src/barretenberg/goblin/mock_circuits.hpp | 17 +++-- .../proof_system/logderivative_library.hpp | 4 +- .../honk/proof_system/permutation_library.hpp | 8 +-- .../src/barretenberg/honk/utils/testing.hpp | 4 +- .../join_split/compute_circuit_data.cpp | 4 +- .../proofs/join_split/join_split.cpp | 6 +- .../proofs/join_split/join_split.test.cpp | 6 +- .../proofs/join_split/join_split_circuit.cpp | 6 +- .../join_split/join_split_js_parity.test.cpp | 4 +- .../proofs/join_split/join_split_tx.hpp | 4 +- .../proofs/mock/mock_circuit.hpp | 2 +- .../proofs/mock/mock_circuit.test.cpp | 2 +- .../proofs/notes/circuit/asset_id.cpp | 2 +- .../proofs/notes/circuit/asset_id.hpp | 2 +- .../proofs/notes/circuit/bridge_call_data.hpp | 2 +- .../proofs/notes/circuit/claim/claim_note.hpp | 2 +- .../claim/complete_partial_commitment.hpp | 2 +- .../notes/circuit/claim/witness_data.hpp | 2 +- .../notes/circuit/value/compute_nullifier.cpp | 4 +- .../proofs/notes/circuit/value/value_note.hpp | 2 +- .../notes/circuit/value/value_note.test.cpp | 2 +- .../notes/circuit/value/witness_data.hpp | 2 +- .../barretenberg/join_split_example/types.hpp | 28 ++++---- .../plonk/composer/composer_lib.cpp | 6 +- .../plonk/composer/composer_lib.hpp | 4 +- .../plonk/composer/standard_composer.cpp | 4 +- .../plonk/composer/standard_composer.hpp | 4 +- .../plonk/composer/standard_composer.test.cpp | 4 +- .../plonk/composer/ultra_composer.cpp | 4 +- .../plonk/composer/ultra_composer.hpp | 4 +- .../plonk/composer/ultra_composer.test.cpp | 12 ++-- .../commitment_scheme/commitment_scheme.hpp | 4 +- .../commitment_scheme.test.cpp | 2 +- .../kate_commitment_scheme.cpp | 4 +- .../kate_commitment_scheme.hpp | 4 +- .../plonk/proof_system/constants.hpp | 4 +- .../plonk/proof_system/prover/prover.cpp | 6 +- .../plonk/proof_system/prover/prover.hpp | 4 +- .../plonk/proof_system/prover/prover.test.cpp | 2 +- .../proof_system/proving_key/proving_key.cpp | 4 +- .../proof_system/proving_key/proving_key.hpp | 4 +- .../proving_key/proving_key.test.cpp | 4 +- .../proof_system/proving_key/serialize.hpp | 4 +- .../public_inputs/public_inputs.hpp | 2 +- .../public_inputs/public_inputs.test.cpp | 4 +- .../public_inputs/public_inputs_impl.hpp | 4 +- .../types/commitment_open_proof.hpp | 4 +- .../types/polynomial_manifest.hpp | 4 +- .../proof_system/types/program_settings.hpp | 4 +- .../plonk/proof_system/types/proof.hpp | 4 +- .../proof_system/types/prover_settings.hpp | 4 +- .../utils/generalized_permutation.hpp | 4 +- .../proof_system/utils/kate_verification.hpp | 4 +- .../plonk/proof_system/utils/permutation.hpp | 4 +- .../proof_system/verification_key/sol_gen.hpp | 6 +- .../verification_key/verification_key.cpp | 6 +- .../verification_key/verification_key.hpp | 6 +- .../verification_key.test.cpp | 6 +- .../plonk/proof_system/verifier/verifier.cpp | 4 +- .../plonk/proof_system/verifier/verifier.hpp | 4 +- .../proof_system/verifier/verifier.test.cpp | 2 +- .../random_widgets/permutation_widget.hpp | 4 +- .../permutation_widget_impl.hpp | 4 +- .../widgets/random_widgets/plookup_widget.hpp | 4 +- .../random_widgets/plookup_widget_impl.hpp | 6 +- .../widgets/random_widgets/random_widget.hpp | 4 +- .../transition_widgets/arithmetic_widget.hpp | 4 +- .../transition_widgets/elliptic_widget.hpp | 4 +- .../genperm_sort_widget.hpp | 4 +- .../plookup_arithmetic_widget.hpp | 4 +- .../plookup_auxiliary_widget.hpp | 4 +- .../transition_widgets/transition_widget.hpp | 6 +- .../plonk/transcript/transcript.hpp | 2 +- .../plonk/work_queue/work_queue.cpp | 4 +- .../plonk/work_queue/work_queue.hpp | 4 +- .../polynomials/evaluation_domain.cpp | 2 +- .../arithmetization/gate_data.hpp | 4 +- .../circuit_builder/circuit_builder_base.cpp | 4 +- .../circuit_builder/circuit_builder_base.hpp | 4 +- .../eccvm/eccvm_builder_types.hpp | 4 +- .../eccvm/eccvm_circuit_builder.hpp | 31 ++++---- .../eccvm/eccvm_circuit_builder.test.cpp | 28 ++++---- .../circuit_builder/eccvm/msm_builder.hpp | 12 ++-- .../eccvm/precomputed_tables_builder.hpp | 14 ++-- .../eccvm/transcript_builder.hpp | 9 ++- .../generated/AvmMini_circuit_builder.hpp | 6 +- .../generated/Toy_circuit_builder.hpp | 10 +-- .../goblin_translator_circuit_builder.cpp | 4 +- .../goblin_translator_circuit_builder.hpp | 4 +- ...goblin_translator_circuit_builder.test.cpp | 4 +- .../goblin_translator_mini.fuzzer.cpp | 8 +-- .../goblin_ultra_circuit_builder.cpp | 4 +- .../goblin_ultra_circuit_builder.hpp | 4 +- .../goblin_ultra_circuit_builder.test.cpp | 4 +- .../standard_circuit_builder.cpp | 4 +- .../standard_circuit_builder.hpp | 4 +- .../standard_circuit_builder.test.cpp | 2 +- .../toy_avm/toy_avm_circuit_builder.test.cpp | 4 +- .../circuit_builder/ultra_circuit_builder.cpp | 6 +- .../circuit_builder/ultra_circuit_builder.hpp | 4 +- .../ultra_circuit_builder.test.cpp | 6 +- .../proof_system/composer/composer_lib.hpp | 4 +- .../composer/composer_lib.test.cpp | 4 +- .../proof_system/composer/permutation_lib.hpp | 4 +- .../composer/permutation_lib.test.cpp | 4 +- .../library/grand_product_delta.hpp | 4 +- .../library/grand_product_library.hpp | 8 +-- .../library/grand_product_library.test.cpp | 22 +++--- .../proof_system/op_queue/ecc_op_queue.hpp | 6 +- .../op_queue/ecc_op_queue.test.cpp | 4 +- .../polynomial_store/polynomial_store.cpp | 4 +- .../polynomial_store/polynomial_store.hpp | 4 +- .../polynomial_store.test.cpp | 38 +++++----- .../polynomial_store_cache.cpp | 4 +- .../polynomial_store_cache.hpp | 4 +- .../polynomial_store_wasm.cpp | 4 +- .../polynomial_store_wasm.hpp | 4 +- .../proof_system/types/circuit_type.hpp | 4 +- .../proof_system/types/merkle_hash_type.hpp | 4 +- .../types/pedersen_commitment_type.hpp | 4 +- .../protogalaxy/combiner.test.cpp | 12 ++-- .../protogalaxy/decider_prover.cpp | 4 +- .../protogalaxy/decider_prover.hpp | 6 +- .../protogalaxy/decider_verifier.cpp | 6 +- .../protogalaxy/decider_verifier.hpp | 4 +- .../protogalaxy/folding_result.hpp | 4 +- .../protogalaxy/protogalaxy_prover.cpp | 6 +- .../protogalaxy/protogalaxy_prover.hpp | 4 +- .../protogalaxy/protogalaxy_verifier.cpp | 6 +- .../protogalaxy/protogalaxy_verifier.hpp | 4 +- .../relations/auxiliary_relation.hpp | 4 +- .../relations/databus_lookup_relation.hpp | 4 +- .../relations/ecc_op_queue_relation.hpp | 4 +- .../relations/ecc_vm/ecc_lookup_relation.cpp | 4 +- .../relations/ecc_vm/ecc_lookup_relation.hpp | 4 +- .../relations/ecc_vm/ecc_msm_relation.cpp | 4 +- .../relations/ecc_vm/ecc_msm_relation.hpp | 4 +- .../ecc_vm/ecc_point_table_relation.cpp | 4 +- .../ecc_vm/ecc_point_table_relation.hpp | 4 +- .../relations/ecc_vm/ecc_set_relation.cpp | 4 +- .../relations/ecc_vm/ecc_set_relation.hpp | 4 +- .../ecc_vm/ecc_transcript_relation.cpp | 4 +- .../ecc_vm/ecc_transcript_relation.hpp | 4 +- .../relations/ecc_vm/ecc_wnaf_relation.cpp | 4 +- .../relations/ecc_vm/ecc_wnaf_relation.hpp | 4 +- .../relations/elliptic_relation.hpp | 4 +- .../relations/gen_perm_sort_relation.hpp | 4 +- .../relations/generated/AvmMini/avm_mini.hpp | 4 +- .../relations/generated/AvmMini/mem_trace.hpp | 4 +- .../relations/generated/Toy/lookup_xor.hpp | 4 +- .../relations/generated/Toy/toy_avm.hpp | 4 +- .../generated/Toy/two_column_perm.hpp | 4 +- .../generic_lookup_relation.hpp | 4 +- .../generic_permutation_relation.hpp | 4 +- .../relations/lookup_relation.hpp | 4 +- .../relations/nested_containers.hpp | 4 +- .../relations/nested_containers.test.cpp | 6 +- .../relations/permutation_relation.hpp | 4 +- .../relations/poseidon2_external_relation.hpp | 4 +- .../relations/poseidon2_internal_relation.hpp | 6 +- .../relations/relation_manual.test.cpp | 4 +- .../relations/relation_parameters.hpp | 4 +- .../barretenberg/relations/relation_types.hpp | 4 +- ...n_translator_relation_consistency.test.cpp | 6 +- .../translator_decomposition_relation.cpp | 4 +- .../translator_decomposition_relation.hpp | 4 +- .../translator_extra_relations.cpp | 4 +- .../translator_extra_relations.hpp | 4 +- .../translator_gen_perm_sort_relation.cpp | 4 +- .../translator_gen_perm_sort_relation.hpp | 4 +- .../translator_non_native_field_relation.cpp | 4 +- .../translator_non_native_field_relation.hpp | 4 +- .../translator_permutation_relation.cpp | 4 +- .../translator_permutation_relation.hpp | 4 +- .../relations/ultra_arithmetic_relation.hpp | 4 +- .../ultra_relation_consistency.test.cpp | 6 +- .../cpp/src/barretenberg/relations/utils.hpp | 8 +-- .../smt_verification/smt_bigfield.test.cpp | 8 +-- .../smt_verification/smt_examples.test.cpp | 8 +-- .../smt_verification/smt_polynomials.test.cpp | 8 +-- .../circuits/add_2_circuit.hpp | 4 +- .../circuits/blake_circuit.hpp | 4 +- .../circuits/ecdsa_circuit.hpp | 2 +- .../circuits/recursive_circuit.hpp | 4 +- .../barretenberg/solidity_helpers/key_gen.cpp | 2 +- .../stdlib/commitment/pedersen/pedersen.cpp | 10 +-- .../stdlib/commitment/pedersen/pedersen.hpp | 4 +- .../commitment/pedersen/pedersen.test.cpp | 4 +- .../stdlib/encryption/aes128/aes128.cpp | 8 +-- .../stdlib/encryption/aes128/aes128.hpp | 4 +- .../stdlib/encryption/aes128/aes128.test.cpp | 8 +-- .../stdlib/encryption/ecdsa/ecdsa.hpp | 4 +- .../stdlib/encryption/ecdsa/ecdsa.test.cpp | 4 +- .../stdlib/encryption/ecdsa/ecdsa_impl.hpp | 8 +-- .../stdlib/encryption/schnorr/schnorr.cpp | 28 ++++---- .../stdlib/encryption/schnorr/schnorr.hpp | 4 +- .../encryption/schnorr/schnorr.test.cpp | 10 +-- .../hash/benchmarks/celer/sha256.bench.cpp | 12 ++-- .../benchmarks/external/external.bench.cpp | 16 ++--- .../hash/benchmarks/sha256/sha256.bench.cpp | 12 ++-- .../stdlib/hash/blake2s/blake2s.cpp | 13 ++-- .../stdlib/hash/blake2s/blake2s.hpp | 4 +- .../stdlib/hash/blake2s/blake2s.test.cpp | 4 +- .../stdlib/hash/blake2s/blake2s_plookup.cpp | 10 ++- .../stdlib/hash/blake2s/blake2s_plookup.hpp | 4 +- .../stdlib/hash/blake2s/blake_util.hpp | 4 +- .../stdlib/hash/blake3s/blake3s.cpp | 13 ++-- .../stdlib/hash/blake3s/blake3s.hpp | 4 +- .../stdlib/hash/blake3s/blake3s.test.cpp | 16 ++--- .../stdlib/hash/blake3s/blake3s_plookup.cpp | 10 ++- .../stdlib/hash/blake3s/blake3s_plookup.hpp | 4 +- .../stdlib/hash/keccak/keccak.cpp | 8 +-- .../stdlib/hash/keccak/keccak.hpp | 4 +- .../stdlib/hash/keccak/keccak.test.cpp | 4 +- .../stdlib/hash/pedersen/pedersen.bench.cpp | 10 +-- .../stdlib/hash/pedersen/pedersen.cpp | 12 ++-- .../stdlib/hash/pedersen/pedersen.hpp | 4 +- .../stdlib/hash/pedersen/pedersen.test.cpp | 4 +- .../stdlib/hash/poseidon2/poseidon2.cpp | 8 +-- .../stdlib/hash/poseidon2/poseidon2.hpp | 6 +- .../stdlib/hash/poseidon2/poseidon2.test.cpp | 4 +- .../hash/poseidon2/poseidon2_permutation.cpp | 4 +- .../hash/poseidon2/poseidon2_permutation.hpp | 6 +- .../stdlib/hash/poseidon2/sponge/sponge.hpp | 4 +- .../stdlib/hash/sha256/sha256.cpp | 24 +++---- .../stdlib/hash/sha256/sha256.hpp | 6 +- .../stdlib/hash/sha256/sha256.test.cpp | 62 ++++++++-------- .../stdlib/hash/sha256/sha256_plookup.cpp | 11 ++- .../stdlib/hash/sha256/sha256_plookup.hpp | 4 +- .../barretenberg/stdlib/merkle_tree/hash.hpp | 4 +- .../stdlib/merkle_tree/hash.test.cpp | 8 +-- .../stdlib/merkle_tree/hash_path.hpp | 8 +-- .../stdlib/merkle_tree/membership.hpp | 8 +-- .../stdlib/merkle_tree/membership.test.cpp | 10 +-- .../stdlib/merkle_tree/memory_store.hpp | 4 +- .../stdlib/merkle_tree/memory_tree.cpp | 8 +-- .../stdlib/merkle_tree/memory_tree.hpp | 8 +-- .../stdlib/merkle_tree/memory_tree.test.cpp | 2 +- .../stdlib/merkle_tree/merkle_tree.bench.cpp | 2 +- .../stdlib/merkle_tree/merkle_tree.cpp | 4 +- .../stdlib/merkle_tree/merkle_tree.hpp | 4 +- .../stdlib/merkle_tree/merkle_tree.test.cpp | 10 +-- .../nullifier_tree/nullifier_leaf.hpp | 4 +- .../nullifier_tree/nullifier_memory_tree.cpp | 4 +- .../nullifier_tree/nullifier_memory_tree.hpp | 4 +- .../nullifier_memory_tree.test.cpp | 2 +- .../nullifier_tree/nullifier_tree.cpp | 4 +- .../nullifier_tree/nullifier_tree.hpp | 4 +- .../nullifier_tree/nullifier_tree.test.cpp | 2 +- .../stdlib/primitives/address/address.hpp | 4 +- .../primitives/bigfield/bigfield.fuzzer.hpp | 14 ++-- .../stdlib/primitives/bigfield/bigfield.hpp | 4 +- .../primitives/bigfield/bigfield.test.cpp | 8 +-- .../primitives/bigfield/bigfield_impl.hpp | 10 +-- .../stdlib/primitives/biggroup/biggroup.hpp | 4 +- .../primitives/biggroup/biggroup.test.cpp | 20 +++--- .../biggroup/biggroup_batch_mul.hpp | 4 +- .../primitives/biggroup/biggroup_bn254.hpp | 4 +- .../primitives/biggroup/biggroup_goblin.hpp | 4 +- .../biggroup/biggroup_goblin.test.cpp | 4 +- .../primitives/biggroup/biggroup_impl.hpp | 4 +- .../primitives/biggroup/biggroup_nafs.hpp | 4 +- .../biggroup/biggroup_secp256k1.hpp | 4 +- .../primitives/biggroup/biggroup_tables.hpp | 4 +- .../stdlib/primitives/bit_array/bit_array.cpp | 10 +-- .../primitives/bit_array/bit_array.fuzzer.hpp | 17 +++-- .../stdlib/primitives/bit_array/bit_array.hpp | 4 +- .../primitives/bit_array/bit_array.test.cpp | 4 +- .../stdlib/primitives/bool/bool.cpp | 12 ++-- .../stdlib/primitives/bool/bool.fuzzer.hpp | 8 +-- .../stdlib/primitives/bool/bool.hpp | 4 +- .../stdlib/primitives/bool/bool.test.cpp | 4 +- .../primitives/byte_array/byte_array.cpp | 10 +-- .../byte_array/byte_array.fuzzer.hpp | 10 +-- .../primitives/byte_array/byte_array.hpp | 4 +- .../primitives/byte_array/byte_array.test.cpp | 4 +- .../circuit_builders/circuit_builders.hpp | 5 +- .../circuit_builders/circuit_builders_fwd.hpp | 8 +-- .../stdlib/primitives/curves/bn254.hpp | 6 +- .../stdlib/primitives/curves/secp256k1.hpp | 6 +- .../stdlib/primitives/curves/secp256r1.hpp | 6 +- .../stdlib/primitives/field/array.hpp | 4 +- .../stdlib/primitives/field/array.test.cpp | 4 +- .../stdlib/primitives/field/field.cpp | 14 ++-- .../stdlib/primitives/field/field.fuzzer.hpp | 16 ++--- .../stdlib/primitives/field/field.hpp | 4 +- .../stdlib/primitives/field/field.test.cpp | 6 +- .../stdlib/primitives/group/cycle_group.cpp | 16 ++--- .../stdlib/primitives/group/cycle_group.hpp | 4 +- .../primitives/group/cycle_group.test.cpp | 4 +- .../stdlib/primitives/logic/logic.cpp | 10 +-- .../stdlib/primitives/logic/logic.hpp | 4 +- .../stdlib/primitives/logic/logic.test.cpp | 4 +- .../primitives/memory/dynamic_array.cpp | 8 +-- .../primitives/memory/dynamic_array.hpp | 4 +- .../primitives/memory/dynamic_array.test.cpp | 4 +- .../stdlib/primitives/memory/ram_table.cpp | 8 +-- .../stdlib/primitives/memory/ram_table.hpp | 4 +- .../primitives/memory/ram_table.test.cpp | 4 +- .../stdlib/primitives/memory/rom_table.cpp | 8 +-- .../stdlib/primitives/memory/rom_table.hpp | 4 +- .../primitives/memory/rom_table.test.cpp | 4 +- .../primitives/memory/twin_rom_table.cpp | 8 +-- .../primitives/memory/twin_rom_table.hpp | 4 +- .../packed_byte_array/packed_byte_array.cpp | 10 +-- .../packed_byte_array/packed_byte_array.hpp | 4 +- .../packed_byte_array.test.cpp | 4 +- .../stdlib/primitives/plookup/plookup.cpp | 12 ++-- .../stdlib/primitives/plookup/plookup.hpp | 4 +- .../primitives/plookup/plookup.test.cpp | 6 +- .../stdlib/primitives/safe_uint/safe_uint.cpp | 10 +-- .../primitives/safe_uint/safe_uint.fuzzer.hpp | 14 ++-- .../stdlib/primitives/safe_uint/safe_uint.hpp | 4 +- .../primitives/safe_uint/safe_uint.test.cpp | 4 +- .../stdlib/primitives/uint/arithmetic.cpp | 14 ++-- .../stdlib/primitives/uint/comparison.cpp | 12 ++-- .../stdlib/primitives/uint/logic.cpp | 14 ++-- .../primitives/uint/plookup/arithmetic.cpp | 22 +++--- .../primitives/uint/plookup/comparison.cpp | 20 +++--- .../stdlib/primitives/uint/plookup/logic.cpp | 20 +++--- .../stdlib/primitives/uint/plookup/uint.cpp | 20 +++--- .../stdlib/primitives/uint/plookup/uint.hpp | 4 +- .../stdlib/primitives/uint/uint.cpp | 14 ++-- .../stdlib/primitives/uint/uint.fuzzer.hpp | 18 ++--- .../stdlib/primitives/uint/uint.hpp | 4 +- .../stdlib/primitives/uint/uint.test.cpp | 12 ++-- .../stdlib/primitives/witness/witness.hpp | 4 +- .../aggregation_state/aggregation_state.hpp | 4 +- .../native_aggregation_state.hpp | 4 +- .../recursion/honk/transcript/transcript.hpp | 6 +- .../honk/transcript/transcript.test.cpp | 10 +-- .../honk/verifier/goblin_verifier.test.cpp | 14 ++-- .../verifier/merge_recursive_verifier.cpp | 4 +- .../verifier/merge_recursive_verifier.hpp | 8 +-- .../honk/verifier/merge_verifier.test.cpp | 10 +-- .../verifier/ultra_recursive_verifier.cpp | 23 +++--- .../verifier/ultra_recursive_verifier.hpp | 4 +- .../recursion/honk/verifier/verifier.test.cpp | 14 ++-- .../recursion/transcript/transcript.hpp | 4 +- .../recursion/transcript/transcript.test.cpp | 4 +- .../verification_key/verification_key.hpp | 4 +- .../verification_key.test.cpp | 8 +-- .../recursion/verifier/program_settings.hpp | 40 +++++------ .../stdlib/recursion/verifier/verifier.hpp | 6 +- .../recursion/verifier/verifier.test.cpp | 14 ++-- .../src/barretenberg/stdlib/types/ultra.hpp | 8 +-- .../barretenberg/stdlib/utility/utility.hpp | 4 +- .../sumcheck/instance/instances.hpp | 6 +- .../sumcheck/instance/prover_instance.cpp | 4 +- .../sumcheck/instance/prover_instance.hpp | 6 +- .../instance/prover_instance.test.cpp | 2 +- .../sumcheck/instance/verifier_instance.hpp | 4 +- .../sumcheck/partial_evaluation.test.cpp | 4 +- .../src/barretenberg/sumcheck/sumcheck.hpp | 8 +-- .../barretenberg/sumcheck/sumcheck.test.cpp | 8 +-- .../barretenberg/sumcheck/sumcheck_output.hpp | 4 +- .../barretenberg/sumcheck/sumcheck_round.hpp | 12 ++-- .../sumcheck/sumcheck_round.test.cpp | 10 +-- .../barretenberg/transcript/transcript.hpp | 4 +- .../transcript/transcript.test.cpp | 2 +- .../goblin_translator_composer.cpp | 13 ++-- .../goblin_translator_composer.hpp | 4 +- .../goblin_translator_composer.test.cpp | 6 +- .../goblin_translator_prover.cpp | 4 +- .../goblin_translator_prover.hpp | 6 +- .../goblin_translator_verifier.cpp | 6 +- .../goblin_translator_verifier.hpp | 4 +- .../ultra_honk/databus_composer.test.cpp | 6 +- .../ultra_honk/goblin_ultra_composer.test.cpp | 18 ++--- .../goblin_ultra_transcript.test.cpp | 4 +- .../barretenberg/ultra_honk/merge_prover.cpp | 4 +- .../barretenberg/ultra_honk/merge_prover.hpp | 4 +- .../ultra_honk/merge_verifier.cpp | 4 +- .../ultra_honk/merge_verifier.hpp | 4 +- .../ultra_honk/protogalaxy.test.cpp | 6 +- .../ultra_honk/relation_correctness.test.cpp | 27 ++++--- .../barretenberg/ultra_honk/sumcheck.test.cpp | 8 +-- .../ultra_honk/ultra_composer.cpp | 4 +- .../ultra_honk/ultra_composer.hpp | 4 +- .../ultra_honk/ultra_composer.test.cpp | 72 +++++++++---------- .../barretenberg/ultra_honk/ultra_prover.cpp | 4 +- .../barretenberg/ultra_honk/ultra_prover.hpp | 6 +- .../ultra_honk/ultra_transcript.test.cpp | 4 +- .../ultra_honk/ultra_verifier.cpp | 8 +-- .../ultra_honk/ultra_verifier.hpp | 4 +- .../vm/avm_trace/AvmMini_common.hpp | 4 +- .../vm/generated/AvmMini_composer.cpp | 4 +- .../vm/generated/AvmMini_composer.hpp | 4 +- .../vm/generated/AvmMini_prover.cpp | 11 ++- .../vm/generated/AvmMini_prover.hpp | 6 +- .../vm/generated/AvmMini_verifier.cpp | 6 +- .../vm/generated/AvmMini_verifier.hpp | 4 +- .../vm/generated/Toy_composer.cpp | 4 +- .../vm/generated/Toy_composer.hpp | 4 +- .../barretenberg/vm/generated/Toy_prover.cpp | 11 ++- .../barretenberg/vm/generated/Toy_prover.hpp | 6 +- .../vm/generated/Toy_verifier.cpp | 6 +- .../vm/generated/Toy_verifier.hpp | 4 +- .../barretenberg/vm/tests/helpers.test.cpp | 4 +- 476 files changed, 1611 insertions(+), 1668 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/eccvm.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/eccvm.bench.cpp index 59e793ce187..630484837e1 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/eccvm.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/eccvm.bench.cpp @@ -5,7 +5,7 @@ #include "barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp" using namespace benchmark; -using namespace proof_system; +using namespace bb; using Flavor = honk::flavor::ECCVM; using Builder = ECCVMCircuitBuilder; diff --git a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp index 44fe8180c9c..40b95b7a7d2 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp @@ -9,7 +9,7 @@ using namespace benchmark; using namespace bb; -using namespace proof_system; +using namespace bb; namespace { void goblin_full(State& state) noexcept diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ipa_bench/ipa.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ipa_bench/ipa.bench.cpp index ff0c24b72c8..e3da4560115 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ipa_bench/ipa.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ipa_bench/ipa.bench.cpp @@ -3,8 +3,8 @@ using namespace benchmark; using namespace bb; -using namespace proof_system; -using namespace proof_system::honk::pcs::ipa; +using namespace bb; +using namespace bb::honk::pcs::ipa; namespace { using Curve = curve::Grumpkin; using Fr = Curve::ScalarField; diff --git a/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/plonk.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/plonk.bench.cpp index 8b62462e884..167f5baf01a 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/plonk.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/plonk.bench.cpp @@ -12,8 +12,8 @@ constexpr size_t START = (MAX_GATES) >> (NUM_CIRCUITS - 1); // constexpr size_t MAX_HASH_ROUNDS = 8192; // constexpr size_t START_HASH_ROUNDS = 64; -using Builder = proof_system::StandardCircuitBuilder; -using Composer = proof_system::plonk::StandardComposer; +using Builder = bb::StandardCircuitBuilder; +using Composer = bb::plonk::StandardComposer; void generate_test_plonk_circuit(Builder& builder, size_t num_gates) { diff --git a/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/standard_plonk.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/standard_plonk.bench.cpp index 403367d9159..71d790519c0 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/standard_plonk.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/plonk_bench/standard_plonk.bench.cpp @@ -4,8 +4,8 @@ using namespace benchmark; -using StandardBuilder = proof_system::StandardCircuitBuilder; -using StandardPlonk = proof_system::plonk::StandardComposer; +using StandardBuilder = bb::StandardCircuitBuilder; +using StandardPlonk = bb::plonk::StandardComposer; /** * @brief Benchmark: Construction of a Standard proof for a circuit determined by the provided circuit function @@ -13,8 +13,8 @@ using StandardPlonk = proof_system::plonk::StandardComposer; static void construct_proof_standard_power_of_2(State& state) noexcept { auto log2_of_gates = static_cast(state.range(0)); - bench_utils::construct_proof_with_specified_num_iterations( - state, &bench_utils::generate_basic_arithmetic_circuit, log2_of_gates); + bench_utils::construct_proof_with_specified_num_iterations( + state, &bench_utils::generate_basic_arithmetic_circuit, log2_of_gates); } BENCHMARK(construct_proof_standard_power_of_2) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp index cecb40bbf9f..80fd2e0d3b5 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp @@ -6,7 +6,7 @@ using namespace benchmark; -namespace proof_system::honk { +namespace bb::honk { using Flavor = flavor::Ultra; using Instance = ProverInstance_; using Instances = ProverInstances_; @@ -38,4 +38,4 @@ void fold_one(State& state) noexcept } BENCHMARK(fold_one)->/* vary the circuit size */ DenseRange(14, 20)->Unit(kMillisecond); -} // namespace proof_system::honk \ No newline at end of file +} // namespace bb::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp index 3c731e49652..19572fe6a0e 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp @@ -12,7 +12,7 @@ using FF = bb::fr; using bb::BarycentricData; using bb::Univariate; -namespace proof_system::benchmark { +namespace bb::benchmark { void extend_2_to_6(State& state) noexcept { @@ -23,4 +23,4 @@ void extend_2_to_6(State& state) noexcept } BENCHMARK(extend_2_to_6); -} // namespace proof_system::benchmark \ No newline at end of file +} // namespace bb::benchmark \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/relations.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/relations.bench.cpp index c88167a4c97..e683523a7e3 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/relations.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/relations.bench.cpp @@ -8,9 +8,9 @@ namespace { auto& engine = numeric::random::get_debug_engine(); } -using namespace proof_system::honk::sumcheck; +using namespace bb::honk::sumcheck; -namespace proof_system::benchmark::relations { +namespace bb::benchmark::relations { using Fr = bb::fr; using Fq = grumpkin::fr; @@ -21,7 +21,7 @@ template void execute_relation(::benchmark: using AllValues = typename Flavor::AllValues; using SumcheckArrayOfValuesOverSubrelations = typename Relation::SumcheckArrayOfValuesOverSubrelations; - auto params = proof_system::RelationParameters::get_random(); + auto params = bb::RelationParameters::get_random(); // Extract an array containing all the polynomial evaluations at a given row i AllValues new_value{}; @@ -56,4 +56,4 @@ BENCHMARK(execute_relation>); BENCHMARK(execute_relation>); BENCHMARK(execute_relation>); -} // namespace proof_system::benchmark::relations +} // namespace bb::benchmark::relations diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/benchmark_utilities.hpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/benchmark_utilities.hpp index e1419a591e9..3b7bf803455 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/benchmark_utilities.hpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/benchmark_utilities.hpp @@ -32,9 +32,9 @@ namespace bench_utils { */ template void generate_basic_arithmetic_circuit(Builder& builder, size_t log2_num_gates) { - proof_system::plonk::stdlib::field_t a(proof_system::plonk::stdlib::witness_t(&builder, bb::fr::random_element())); - proof_system::plonk::stdlib::field_t b(proof_system::plonk::stdlib::witness_t(&builder, bb::fr::random_element())); - proof_system::plonk::stdlib::field_t c(&builder); + bb::plonk::stdlib::field_t a(bb::plonk::stdlib::witness_t(&builder, bb::fr::random_element())); + bb::plonk::stdlib::field_t b(bb::plonk::stdlib::witness_t(&builder, bb::fr::random_element())); + bb::plonk::stdlib::field_t c(&builder); size_t passes = (1UL << log2_num_gates) / 4 - 4; if (static_cast(passes) <= 0) { throw std::runtime_error("too few gates"); @@ -58,9 +58,9 @@ template void generate_sha256_test_circuit(Builder& builder, { std::string in; in.resize(32); - proof_system::plonk::stdlib::packed_byte_array input(&builder, in); + bb::plonk::stdlib::packed_byte_array input(&builder, in); for (size_t i = 0; i < num_iterations; i++) { - input = proof_system::plonk::stdlib::sha256(input); + input = bb::plonk::stdlib::sha256(input); } } @@ -74,9 +74,9 @@ template void generate_keccak_test_circuit(Builder& builder, { std::string in = "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01"; - proof_system::plonk::stdlib::byte_array input(&builder, in); + bb::plonk::stdlib::byte_array input(&builder, in); for (size_t i = 0; i < num_iterations; i++) { - input = proof_system::plonk::stdlib::keccak::hash(input); + input = bb::plonk::stdlib::keccak::hash(input); } } @@ -88,7 +88,7 @@ template void generate_keccak_test_circuit(Builder& builder, */ template void generate_ecdsa_verification_test_circuit(Builder& builder, size_t num_iterations) { - using curve = proof_system::plonk::stdlib::secp256k1; + using curve = bb::plonk::stdlib::secp256k1; using fr = typename curve::fr; using fq = typename curve::fq; using g1 = typename curve::g1; @@ -114,19 +114,18 @@ template void generate_ecdsa_verification_test_circuit(Builde typename curve::g1_bigfr_ct public_key = curve::g1_bigfr_ct::from_witness(&builder, account.public_key); - proof_system::plonk::stdlib::ecdsa::signature sig{ typename curve::byte_array_ct(&builder, rr), - typename curve::byte_array_ct(&builder, ss), - proof_system::plonk::stdlib::uint8( - &builder, vv) }; + bb::plonk::stdlib::ecdsa::signature sig{ typename curve::byte_array_ct(&builder, rr), + typename curve::byte_array_ct(&builder, ss), + bb::plonk::stdlib::uint8(&builder, vv) }; typename curve::byte_array_ct message(&builder, message_string); // Verify ecdsa signature - proof_system::plonk::stdlib::ecdsa::verify_signature(message, public_key, sig); + bb::plonk::stdlib::ecdsa::verify_signature(message, public_key, sig); } } @@ -138,7 +137,7 @@ template void generate_ecdsa_verification_test_circuit(Builde */ template void generate_merkle_membership_test_circuit(Builder& builder, size_t num_iterations) { - using namespace proof_system::plonk::stdlib; + using namespace bb::plonk::stdlib; using field_ct = field_t; using witness_ct = witness_t; using witness_ct = witness_t; @@ -165,35 +164,33 @@ template void generate_merkle_membership_test_circuit(Builder } // ultrahonk -inline proof_system::honk::UltraProver get_prover( - proof_system::honk::UltraComposer& composer, - void (*test_circuit_function)(proof_system::honk::UltraComposer::CircuitBuilder&, size_t), - size_t num_iterations) +inline bb::honk::UltraProver get_prover(bb::honk::UltraComposer& composer, + void (*test_circuit_function)(bb::honk::UltraComposer::CircuitBuilder&, size_t), + size_t num_iterations) { - proof_system::honk::UltraComposer::CircuitBuilder builder; + bb::honk::UltraComposer::CircuitBuilder builder; test_circuit_function(builder, num_iterations); - std::shared_ptr instance = composer.create_instance(builder); + std::shared_ptr instance = composer.create_instance(builder); return composer.create_prover(instance); } // standard plonk -inline proof_system::plonk::Prover get_prover(proof_system::plonk::StandardComposer& composer, - void (*test_circuit_function)(proof_system::StandardCircuitBuilder&, - size_t), - size_t num_iterations) +inline bb::plonk::Prover get_prover(bb::plonk::StandardComposer& composer, + void (*test_circuit_function)(bb::StandardCircuitBuilder&, size_t), + size_t num_iterations) { - proof_system::StandardCircuitBuilder builder; + bb::StandardCircuitBuilder builder; test_circuit_function(builder, num_iterations); return composer.create_prover(builder); } // ultraplonk -inline proof_system::plonk::UltraProver get_prover( - proof_system::plonk::UltraComposer& composer, - void (*test_circuit_function)(proof_system::honk::UltraComposer::CircuitBuilder&, size_t), - size_t num_iterations) +inline bb::plonk::UltraProver get_prover(bb::plonk::UltraComposer& composer, + void (*test_circuit_function)(bb::honk::UltraComposer::CircuitBuilder&, + size_t), + size_t num_iterations) { - proof_system::plonk::UltraComposer::CircuitBuilder builder; + bb::plonk::UltraComposer::CircuitBuilder builder; test_circuit_function(builder, num_iterations); return composer.create_prover(builder); } diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk.bench.cpp index 610f968157f..1109a928f4c 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk.bench.cpp @@ -5,7 +5,7 @@ #include "barretenberg/ultra_honk/ultra_composer.hpp" using namespace benchmark; -using namespace proof_system; +using namespace bb; /** * @brief Benchmark: Construction of a Ultra Honk proof for a circuit determined by the provided circuit function diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp index 333b6ddcc86..b36e168b446 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp @@ -6,7 +6,7 @@ #include "barretenberg/ultra_honk/ultra_prover.hpp" using namespace benchmark; -using namespace proof_system; +using namespace bb; // The rounds to measure enum { diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk.bench.cpp index c9fc158c532..0f16f152d2c 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk.bench.cpp @@ -3,7 +3,7 @@ #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" using namespace benchmark; -using namespace proof_system; +using namespace bb; /** * @brief Benchmark: Construction of a Ultra Plonk proof for a circuit determined by the provided circuit function diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk_rounds.bench.cpp index ecc086303b9..8565dd96fbe 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_plonk_rounds.bench.cpp @@ -4,7 +4,7 @@ #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" using namespace benchmark; -using namespace proof_system; +using namespace bb; // The rounds to measure enum { diff --git a/barretenberg/cpp/src/barretenberg/benchmark/widgets_bench/widget.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/widgets_bench/widget.bench.cpp index 0ec974da527..b96f9f6ce78 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/widgets_bench/widget.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/widgets_bench/widget.bench.cpp @@ -22,7 +22,7 @@ namespace { auto& engine = numeric::random::get_debug_engine(); } -namespace proof_system::plonk { +namespace bb::plonk { #ifdef GET_PER_ROW_TIME constexpr size_t LARGE_DOMAIN_SIZE = 4; @@ -113,4 +113,4 @@ BENCHMARK(accumulate_contribution>); BENCHMARK(accumulate_contribution>); BENCHMARK(accumulate_contribution>); -} // namespace proof_system::plonk +} // namespace bb::plonk diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 27dea27d358..2ef8c69637e 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -3,7 +3,7 @@ #include "barretenberg/commitment_schemes/commitment_key.hpp" #include "barretenberg/polynomials/polynomial.hpp" -namespace proof_system::honk::pcs { +namespace bb::honk::pcs { /** * @brief Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v * @@ -72,4 +72,4 @@ template class OpeningClaim { bool operator==(const OpeningClaim& other) const = default; }; -} // namespace proof_system::honk::pcs +} // namespace bb::honk::pcs diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp index c820054558a..201a022fdb5 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp @@ -19,7 +19,7 @@ #include #include -namespace proof_system::honk::pcs { +namespace bb::honk::pcs { /** * @brief CommitmentKey object over a pairing group 𝔾₁. @@ -74,4 +74,4 @@ template class CommitmentKey { std::shared_ptr> srs; }; -} // namespace proof_system::honk::pcs +} // namespace bb::honk::pcs diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.test.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.test.hpp index 27d8e2ed93f..df031f7404d 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.test.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.test.hpp @@ -13,7 +13,7 @@ #include -namespace proof_system::honk::pcs { +namespace bb::honk::pcs { template inline std::shared_ptr CreateCommitmentKey(); @@ -206,4 +206,4 @@ using IpaCommitmentSchemeParams = ::testing::Types; // using CommitmentSchemeParams = // ::testing::Types, fake::Params, kzg::Params>; -} // namespace proof_system::honk::pcs +} // namespace bb::honk::pcs diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp index 72705c516db..0d1890abd66 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp @@ -42,7 +42,7 @@ * The verifier is able to computed the simulated commitments to A₀₊(X) and A₀₋(X) * since they are linear-combinations of the commitments [fⱼ] and [gⱼ]. */ -namespace proof_system::honk::pcs::gemini { +namespace bb::honk::pcs::gemini { /** * @brief Computes d-1 fold polynomials Fold_i, i = 1, ..., d-1 @@ -188,4 +188,4 @@ ProverOutput GeminiProver_::compute_fold_polynomial_evaluations( template class GeminiProver_; template class GeminiProver_; -}; // namespace proof_system::honk::pcs::gemini +}; // namespace bb::honk::pcs::gemini diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp index 03b77e9645f..c417b4b76b3 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp @@ -42,7 +42,7 @@ * The verifier is able to computed the simulated commitments to A₀₊(X) and A₀₋(X) * since they are linear-combinations of the commitments [fⱼ] and [gⱼ]. */ -namespace proof_system::honk::pcs::gemini { +namespace bb::honk::pcs::gemini { /** * @brief Prover output (evalutation pair, witness) that can be passed on to Shplonk batch opening. @@ -109,7 +109,7 @@ template class GeminiProver_ { static ProverOutput compute_fold_polynomial_evaluations(std::span mle_opening_point, std::vector&& gemini_polynomials, const Fr& r_challenge); -}; // namespace proof_system::honk::pcs::gemini +}; // namespace bb::honk::pcs::gemini template class GeminiVerifier_ { using Fr = typename Curve::ScalarField; @@ -262,6 +262,6 @@ template class GeminiVerifier_ { return { C0_r_pos, C0_r_neg }; } -}; // namespace proof_system::honk::pcs::gemini +}; // namespace bb::honk::pcs::gemini -} // namespace proof_system::honk::pcs::gemini +} // namespace bb::honk::pcs::gemini diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.test.cpp index 80b93ed89e3..1d6dd6779c2 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.test.cpp @@ -7,7 +7,7 @@ #include #include -namespace proof_system::honk::pcs::gemini { +namespace bb::honk::pcs::gemini { template class GeminiTest : public CommitmentTest { using GeminiProver = GeminiProver_; @@ -238,4 +238,4 @@ TYPED_TEST(GeminiTest, DoubleWithShift) multilinear_commitments_to_be_shifted); } -} // namespace proof_system::honk::pcs::gemini +} // namespace bb::honk::pcs::gemini diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp index b4b2a405187..9a254f34740 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp @@ -14,7 +14,7 @@ * https://hackmd.io/q-A8y6aITWyWJrvsGGMWNA?view. * */ -namespace proof_system::honk::pcs::ipa { +namespace bb::honk::pcs::ipa { template class IPA { using Fr = typename Curve::ScalarField; using GroupElement = typename Curve::Element; @@ -280,4 +280,4 @@ template class IPA { } }; -} // namespace proof_system::honk::pcs::ipa \ No newline at end of file +} // namespace bb::honk::pcs::ipa \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.test.cpp index 6abfce080c6..3a9c26d1961 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.test.cpp @@ -9,7 +9,7 @@ #include "barretenberg/polynomials/polynomial_arithmetic.hpp" #include using namespace bb; -namespace proof_system::honk::pcs::ipa::test { +namespace bb::honk::pcs::ipa::test { using Curve = curve::Grumpkin; @@ -176,4 +176,4 @@ TEST_F(IPATest, GeminiShplonkIPAWithShift) EXPECT_EQ(verified, true); } -} // namespace proof_system::honk::pcs::ipa::test +} // namespace bb::honk::pcs::ipa::test diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp index 940cefd30e8..3780b10ef85 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp @@ -9,7 +9,7 @@ #include #include -namespace proof_system::honk::pcs::kzg { +namespace bb::honk::pcs::kzg { template class KZG { using CK = CommitmentKey; @@ -101,4 +101,4 @@ template class KZG { return { P_0, P_1 }; }; }; -} // namespace proof_system::honk::pcs::kzg +} // namespace bb::honk::pcs::kzg diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.test.cpp index e55633c575c..5e933bb7d6c 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.test.cpp @@ -12,7 +12,7 @@ #include #include -namespace proof_system::honk::pcs::kzg { +namespace bb::honk::pcs::kzg { template class KZGTest : public CommitmentTest { public: @@ -177,4 +177,4 @@ TYPED_TEST(KZGTest, GeminiShplonkKzgWithShift) EXPECT_EQ(verified, true); } -} // namespace proof_system::honk::pcs::kzg +} // namespace bb::honk::pcs::kzg diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index fd61cf43191..7f0f53093a4 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -18,7 +18,7 @@ * The challenges are ρ (batching) and r (random evaluation). * */ -namespace proof_system::honk::pcs::shplonk { +namespace bb::honk::pcs::shplonk { /** * @brief Polynomial G(X) = Q(X) - ∑ₖ ẑₖ(r)⋅( Bₖ(X) − Tₖ(z) ), where Q(X) = ∑ₖ ( Bₖ(X) − Tₖ(X) ) / zₖ(X) @@ -271,4 +271,4 @@ template class ShplonkVerifier_ { return { { z_challenge, Fr(0) }, G_commitment }; }; }; -} // namespace proof_system::honk::pcs::shplonk +} // namespace bb::honk::pcs::shplonk diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp index fbf01d10f5d..6e754ae127b 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp @@ -10,7 +10,7 @@ #include "../commitment_key.test.hpp" #include "barretenberg/commitment_schemes/claim.hpp" #include "barretenberg/polynomials/polynomial.hpp" -namespace proof_system::honk::pcs::shplonk { +namespace bb::honk::pcs::shplonk { template class ShplonkTest : public CommitmentTest {}; using CurveTypes = ::testing::Types; @@ -71,4 +71,4 @@ TYPED_TEST(ShplonkTest, ShplonkSimple) this->verify_opening_claim(verifier_claim, shplonk_prover_witness); } -} // namespace proof_system::honk::pcs::shplonk +} // namespace bb::honk::pcs::shplonk diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/verification_key.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/verification_key.hpp index b9bcb636d11..3d6429875bc 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/verification_key.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/verification_key.hpp @@ -20,7 +20,7 @@ #include #include -namespace proof_system::honk::pcs { +namespace bb::honk::pcs { template class VerifierCommitmentKey; @@ -98,4 +98,4 @@ template <> class VerifierCommitmentKey { std::shared_ptr> srs; }; -} // namespace proof_system::honk::pcs +} // namespace bb::honk::pcs diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/wrapper.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/wrapper.hpp index 0fb5d130875..a79d42e5f1f 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/wrapper.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/wrapper.hpp @@ -3,7 +3,7 @@ #include "barretenberg/ecc/curves/bn254/g1.hpp" #include "gemini/gemini.hpp" -namespace proof_system::honk { +namespace bb::honk { struct OpeningProof { std::vector gemini; @@ -11,4 +11,4 @@ struct OpeningProof { bb::g1::affine_element kzg; }; -} // namespace proof_system::honk +} // namespace bb::honk diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 562f90cf355..9878925c236 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -5,7 +5,7 @@ #include "barretenberg/polynomials/polynomial.hpp" #include "barretenberg/transcript/transcript.hpp" -namespace proof_system::honk::pcs::zeromorph { +namespace bb::honk::pcs::zeromorph { /** * @brief Compute powers of a given challenge @@ -728,4 +728,4 @@ template class ZeroMorphVerifier_ { } }; -} // namespace proof_system::honk::pcs::zeromorph +} // namespace bb::honk::pcs::zeromorph diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp index dcc5e39bed1..e933aaa07fa 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp @@ -4,7 +4,7 @@ #include -namespace proof_system::honk::pcs::zeromorph { +namespace bb::honk::pcs::zeromorph { template class ZeroMorphTest : public CommitmentTest { public: @@ -532,4 +532,4 @@ TYPED_TEST(ZeroMorphWithConcatenationTest, ProveAndVerify) auto verified = this->execute_zeromorph_protocol(num_unshifted, num_shifted, num_concatenated); EXPECT_TRUE(verified); } -} // namespace proof_system::honk::pcs::zeromorph +} // namespace bb::honk::pcs::zeromorph diff --git a/barretenberg/cpp/src/barretenberg/common/fuzzer.hpp b/barretenberg/cpp/src/barretenberg/common/fuzzer.hpp index 2e56c71afa9..9ffa30975f0 100644 --- a/barretenberg/cpp/src/barretenberg/common/fuzzer.hpp +++ b/barretenberg/cpp/src/barretenberg/common/fuzzer.hpp @@ -690,7 +690,7 @@ template