From 54d396c0d60cb2e506dad54364d5b5fb2124f697 Mon Sep 17 00:00:00 2001 From: Cat McGee Date: Mon, 21 Oct 2024 09:43:14 +0100 Subject: [PATCH 01/15] moved things around --- docs/docusaurus.config.js | 18 +++--------------- docs/sidebars.js | 40 +++++++++++++++++---------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 678e9cce230..1a6f4d2a13b 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -225,25 +225,13 @@ const config = { type: "doc", docId: "aztec/overview", position: "left", - label: "Concepts", + label: "Learn", }, { type: "docSidebar", - sidebarId: "guidesSidebar", + sidebarId: "buildSidebar", position: "left", - label: "Guides", - }, - { - type: "docSidebar", - sidebarId: "tutorialsSidebar", - position: "left", - label: "Examples", - }, - { - type: "docSidebar", - sidebarId: "referenceSidebar", - position: "left", - label: "References", + label: "Build", }, { type: "dropdown", diff --git a/docs/sidebars.js b/docs/sidebars.js index b6b2d2537c0..a425b88d1e9 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -68,17 +68,17 @@ export default { ], - guidesSidebar: [ + buildSidebar: [ + { + type: "html", + value: 'How-To Guides', + className: "sidebar-title", + }, { type: "doc", label: "Popular Guides", id: "guides/index" }, - { - type: "html", - value: 'Developer Guides', - className: "sidebar-title", - }, { type: "autogenerated", dirName: "guides/developer_guides" @@ -87,13 +87,6 @@ export default { type: "html", value: '', }, - { - type: "doc", - label: "Privacy Considerations", - id: "guides/privacy_considerations" - }, - ], - tutorialsSidebar: [ { type: "doc", label: "Tutorials and Examples", @@ -117,18 +110,14 @@ export default { type: "autogenerated", dirName: "tutorials/examples" }, - ], - - referenceSidebar: [ { - type: "doc", - label: "References", - id: "reference/index" + type: "html", + value: '', }, { - type: "html", - value: 'Developer References', - className: "sidebar-title", + type: "doc", + label: "Reference", + id: "reference/index" }, { type: "autogenerated", @@ -138,6 +127,11 @@ export default { type: "doc", id: "migration_notes", }, + { + type: "doc", + label: "Privacy Considerations", + id: "guides/privacy_considerations" + }, { type: "html", value: '', @@ -146,7 +140,7 @@ export default { type: "doc", id: "aztec_connect_sunset", }, - ], + ], roadmapSidebar: [ { From 132f861d7f6e0874e3ce60c3f4a305b93fdf0468 Mon Sep 17 00:00:00 2001 From: Cat McGee Date: Mon, 21 Oct 2024 11:43:01 +0100 Subject: [PATCH 02/15] moved stuff --- .../aztec/{overview.md => concepts/index.md} | 3 +- docs/docs/aztec/concepts_overview.md | 141 ++++++++++++++++++ docs/docs/aztec/what_is_aztec.md | 8 + .../writing_contracts/storage/notes.md | 2 +- .../{developer_guides => }/getting_started.md | 0 docs/docs/guides/index.md | 97 ++---------- docs/docs/index.mdx | 23 +-- .../developer_references/debugging.md | 2 +- .../advanced/_category_.json | 6 - .../{advanced => }/token_bridge/0_setup.md | 0 .../token_bridge/1_depositing_to_aztec.md | 0 .../token_bridge/2_minting_on_aztec.md | 0 .../token_bridge/3_withdrawing_to_l1.md | 0 .../token_bridge/4_typescript_glue_code.md | 0 .../{advanced => }/token_bridge/index.md | 2 +- .../codealong/js_tutorials/_category_.json | 6 + .../aztecjs-getting-started.md | 2 +- .../simple_dapp/0_project_setup.md | 0 .../simple_dapp/1_pxe_service.md | 0 .../simple_dapp/2_contract_deployment.md | 0 .../simple_dapp/3_contract_interaction.md | 0 .../simple_dapp/4_testing.md | 2 +- .../{ => js_tutorials}/simple_dapp/index.md | 2 +- docs/docs/tutorials/index.md | 112 -------------- docs/docusaurus.config.js | 12 +- docs/sidebars.js | 63 +++++--- 26 files changed, 242 insertions(+), 241 deletions(-) rename docs/docs/aztec/{overview.md => concepts/index.md} (99%) create mode 100644 docs/docs/aztec/concepts_overview.md create mode 100644 docs/docs/aztec/what_is_aztec.md rename docs/docs/guides/{developer_guides => }/getting_started.md (100%) delete mode 100644 docs/docs/tutorials/codealong/contract_tutorials/advanced/_category_.json rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/0_setup.md (100%) rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/1_depositing_to_aztec.md (100%) rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/2_minting_on_aztec.md (100%) rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/3_withdrawing_to_l1.md (100%) rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/4_typescript_glue_code.md (100%) rename docs/docs/tutorials/codealong/contract_tutorials/{advanced => }/token_bridge/index.md (99%) create mode 100644 docs/docs/tutorials/codealong/js_tutorials/_category_.json rename docs/docs/tutorials/codealong/{ => js_tutorials}/aztecjs-getting-started.md (99%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/0_project_setup.md (100%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/1_pxe_service.md (100%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/2_contract_deployment.md (100%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/3_contract_interaction.md (100%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/4_testing.md (98%) rename docs/docs/tutorials/codealong/{ => js_tutorials}/simple_dapp/index.md (96%) delete mode 100644 docs/docs/tutorials/index.md diff --git a/docs/docs/aztec/overview.md b/docs/docs/aztec/concepts/index.md similarity index 99% rename from docs/docs/aztec/overview.md rename to docs/docs/aztec/concepts/index.md index 32a353fa80e..bb943c63e65 100644 --- a/docs/docs/aztec/overview.md +++ b/docs/docs/aztec/concepts/index.md @@ -1,7 +1,6 @@ --- -title: What is Aztec? +title: Concepts Overview sidebar_position: 0 -id: overview tags: [protocol] --- diff --git a/docs/docs/aztec/concepts_overview.md b/docs/docs/aztec/concepts_overview.md new file mode 100644 index 00000000000..4deaaaeec28 --- /dev/null +++ b/docs/docs/aztec/concepts_overview.md @@ -0,0 +1,141 @@ +--- +title: Overview +sidebar_position: 0 +tags: [protocol] +draft: true +--- + +import Image from "@theme/IdealImage"; + +This page outlines Aztec's fundamental technical concepts. + +## Aztec Overview + + + +1. A user interacts with Aztec through Aztec.js (like web3js or ethersjs) +2. Private functions are executed in the PXE, which is client-side +3. They are rolled up and sent to the Public VM (running on an Aztec node) +4. Public functions are executed in the Public VM +5. The Public VM rolls up the private & public transaction rollups +6. These rollups are submitted to Ethereum + +The PXE is unaware of the Public VM. And the Public VM is unaware of the PXE. They are completely separate execution environments. This means: + +- The PXE and the Public VM cannot directly communicate with each other +- Private transactions in the PXE are executed first, followed by public transactions + +### Private and public state + +Private state works with UTXOs, or what we call notes. To keep things private, everything is stored in an [append-only UTXO tree](./concepts/storage/trees/index.md), and a nullifier is created when notes are invalidated. Nullifiers are then stored in their own [nullifier tree](./concepts/storage/trees/index.md). + +Public state works similarly to other chains like Ethereum, behaving like a public ledger. Public data is stored in a [public data tree](./concepts/storage/trees/index.md#public-state-tree). + +Aztec [smart contract](./smart_contracts_overview.md) developers should keep in mind that different types are used when manipulating private or public state. Working with private state is creating commitments and nullifiers to state, whereas working with public state is directly updating state. + +## Accounts + +Every account in Aztec is a smart contract (account abstraction). This allows implementing different schemes for transaction signing, nonce management, and fee payments. + +Developers can write their own account contract to define the rules by which user transactions are authorized and paid for, as well as how user keys are managed. + +Learn more about account contracts [here](./concepts/accounts/index.md). + +## Smart contracts + +Developers can write [smart contracts](./smart_contracts_overview.md) that manipulate both public and private state. They are written in a framework on top of Noir, the zero-knowledge domain-specific language developed specifically for Aztec. Outside of Aztec, Noir is used for writing circuits that can be verified on EVM chains. + +Noir has its own doc site that you can find [here](https://noir-lang.org). + +## Communication with Ethereum + +Aztec allows private communications with Ethereum - ie no-one knows where the transaction is coming from, just that it is coming from somewhere on Aztec. + +This is achieved through portals - these are smart contracts deployed on an EVM that are related to the Ethereum smart contract you want to interact with. + +Learn more about portals [here](../protocol-specs/l1-smart-contracts/index.md). + +## Circuits + +Aztec operates on three types of circuits: + +- [Private kernel circuits](../aztec/concepts/circuits/kernels/private_kernel.md), which are executed by the user on their own device and prove correct execution of a function +- [Public kernel circuits](../aztec/concepts/circuits/kernels/public_kernel.md), which are executed by the [sequencer](./network/sequencer/index.md) and ensure the stack trace of transactions adheres to function execution rules +- [Rollup circuits](../aztec/concepts/circuits/index.md), which bundle all of the Aztec transactions into a proof that can be efficiently verified on Ethereum + +## What's next? + +### Dive deeper into how Aztec works + +Explore the Concepts for a deeper understanding into the components that make up Aztec: + +
+ + + +

Accounts

+
+ + Learn about Aztec's native account abstraction - every account in Aztec is a smart contract which defines the rules for whether a transaction is or is not valid + +
+ + + +

Circuits

+
+ + Central to Aztec's operations are circuits in the core protocol and the developer-written Aztec.nr contracts + +
+ + + +

PXE (pronounced 'pixie')

+
+ + The Private Execution Environment (or PXE) is a client-side library for the execution of private operations + +
+ + + +

State model

+
+ + Aztec has a hybrid public/private state model + +
+ + + +

Storage

+
+ + In Aztec, private data and public data are stored in two trees: a public data tree and a note hashes tree + +
+ + + +

Wallets

+
+ + Wallets expose to dapps an interface that allows them to act on behalf of the user, such as querying private state or sending transactions + +
+ +
+ +### Start coding + +
+ + +

Developer Getting Started Guide

+
+ + Follow the getting started guide to start developing with the Aztec Sandbox + +
+
\ No newline at end of file diff --git a/docs/docs/aztec/what_is_aztec.md b/docs/docs/aztec/what_is_aztec.md new file mode 100644 index 00000000000..b962b4497d2 --- /dev/null +++ b/docs/docs/aztec/what_is_aztec.md @@ -0,0 +1,8 @@ +--- +title: What is Aztec? +sidebar_position: 0 +id: what_is_aztec +tags: [protocol] +--- + +This will be more of a very very high level overview of Aztec in a paragraph or two with some bullets. \ No newline at end of file diff --git a/docs/docs/guides/developer_guides/smart_contracts/writing_contracts/storage/notes.md b/docs/docs/guides/developer_guides/smart_contracts/writing_contracts/storage/notes.md index bea6aa7461b..532582947ae 100644 --- a/docs/docs/guides/developer_guides/smart_contracts/writing_contracts/storage/notes.md +++ b/docs/docs/guides/developer_guides/smart_contracts/writing_contracts/storage/notes.md @@ -83,7 +83,7 @@ To update a value, its previous note hash(es) are nullified. The new note value Some optional background resources on notes can be found here: -- [High level network architecture](../../../../../aztec/overview.md), specifically the Private Execution Environment +- [High level network architecture](../../../../../aztec/what_is_aztec.md), specifically the Private Execution Environment - [Transaction lifecycle (simple diagram)](../../../../../aztec/concepts/transactions.md#simple-example-of-the-private-transaction-lifecycle) - [Public and Private state](../../../../../aztec/concepts/state_model/index.md) diff --git a/docs/docs/guides/developer_guides/getting_started.md b/docs/docs/guides/getting_started.md similarity index 100% rename from docs/docs/guides/developer_guides/getting_started.md rename to docs/docs/guides/getting_started.md diff --git a/docs/docs/guides/index.md b/docs/docs/guides/index.md index 174895e4a37..5b05c16060a 100644 --- a/docs/docs/guides/index.md +++ b/docs/docs/guides/index.md @@ -1,12 +1,15 @@ --- id: index sidebar_position: 0 -title: Guides +title: Guides and Tutorials --- -# Popular Guides +# Guides and Tutorials -Guides are step-by-step how-tos to achieve a specific goal. On this page you can find the most popular ones. You can also explore them all by checking out the sidebar. +In this section you will find: + +- A list of tutorials in order of increasing complexity, allowing you to write contracts and build applications on Aztec +- How-to guides for accomplishing quick, specific goals ## Getting Started @@ -21,94 +24,24 @@ Guides are step-by-step how-tos to achieve a specific goal. On this page you can -## Building smart contracts +## Building applications
- - -

Compile a contract

-
- - Learn how to compile a smart contract and generate TypeScript bindings - -
- - - -

Deploy a contract

-
- - Deploy a contract to a local Aztec sandbox - -
- - + -

Testing Contracts

+

Contract Tutorials

- Write tests for your contracts and run them in the TXE + Go from zero to hero by following these tutorials in order, starting with a counter contract
- + -

Communicate with L1

+

Full stack app on Aztec

- How to use portals to communicate with L1 from your contract - -
-
- - - -## JavaScript - -
- - -

Send a transaction

-
- - Use Aztec.JS to send a transaction by calling a function on a smart contract - -
- - - -

Testing

-
- - Write end-to-end tests in Javascript using Aztec.JS - -
-
- - - -## Local environment - -
- - -

Update your environment

-
- - Update all aspects of your Aztec environment, including the sandbox, aztec-nargo, Aztec.nr packages, and Aztec.js packages - -
- - - -

Run more than one PXE

-
- - Test that your contracts can work with multiple interactions by running a second PXE + Learn how everything works together by building an app in JavaScript that connects to a contract
@@ -132,8 +65,4 @@ Guides are step-by-step how-tos to achieve a specific goal. On this page you can Participate in the Aztec protocol as a prover node, proving the rollup integrity that is pivotal to the protocol. Runs on hardware fit for data centers. - - - \ No newline at end of file diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx index b38e104d38e..6f29721e31c 100644 --- a/docs/docs/index.mdx +++ b/docs/docs/index.mdx @@ -11,25 +11,28 @@ sidebar_position: 0 On Ethereum today, everything is publicly visible, by everyone. In the real world, people enjoy privacy. Aztec brings privacy to Ethereum. -## Get started +## Start coding -
- +
+ -

Tutorials

+

Developer Getting Started Guide

- Start writing Aztec contracts with our tutorials. + Follow the getting started guide to start developing with the Aztec Sandbox
+
+ +## Learn how Aztec works - +
+ -

References

+

Aztec Overview

- Review reference materials for building on Aztec. + Learn the core concepts that make up the Aztec Protocol -
-
+
\ No newline at end of file diff --git a/docs/docs/reference/developer_references/debugging.md b/docs/docs/reference/developer_references/debugging.md index 29b6be17ff4..9ed2dcf9a62 100644 --- a/docs/docs/reference/developer_references/debugging.md +++ b/docs/docs/reference/developer_references/debugging.md @@ -1,5 +1,5 @@ --- -title: Debugging +title: Logging sidebar_position: 2 --- diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/_category_.json b/docs/docs/tutorials/codealong/contract_tutorials/advanced/_category_.json deleted file mode 100644 index 5fe169c13f3..00000000000 --- a/docs/docs/tutorials/codealong/contract_tutorials/advanced/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Advanced", - "position": 6, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/0_setup.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/0_setup.md similarity index 100% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/0_setup.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/0_setup.md diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/1_depositing_to_aztec.md similarity index 100% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/1_depositing_to_aztec.md diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/2_minting_on_aztec.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/2_minting_on_aztec.md similarity index 100% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/2_minting_on_aztec.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/2_minting_on_aztec.md diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/3_withdrawing_to_l1.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/3_withdrawing_to_l1.md similarity index 100% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/3_withdrawing_to_l1.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/3_withdrawing_to_l1.md diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/4_typescript_glue_code.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/4_typescript_glue_code.md similarity index 100% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/4_typescript_glue_code.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/4_typescript_glue_code.md diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/index.md b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/index.md similarity index 99% rename from docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/index.md rename to docs/docs/tutorials/codealong/contract_tutorials/token_bridge/index.md index 8b3873c5a91..1e77207eac9 100644 --- a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/index.md +++ b/docs/docs/tutorials/codealong/contract_tutorials/token_bridge/index.md @@ -1,6 +1,6 @@ --- title: Token Bridge -sidebar_position: 2 +sidebar_position: 6 --- import Image from "@theme/IdealImage"; diff --git a/docs/docs/tutorials/codealong/js_tutorials/_category_.json b/docs/docs/tutorials/codealong/js_tutorials/_category_.json new file mode 100644 index 00000000000..79b35ed8528 --- /dev/null +++ b/docs/docs/tutorials/codealong/js_tutorials/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Dapp Tutorials", + "position": 1, + "collapsible": true, + "collapsed": true +} \ No newline at end of file diff --git a/docs/docs/tutorials/codealong/aztecjs-getting-started.md b/docs/docs/tutorials/codealong/js_tutorials/aztecjs-getting-started.md similarity index 99% rename from docs/docs/tutorials/codealong/aztecjs-getting-started.md rename to docs/docs/tutorials/codealong/js_tutorials/aztecjs-getting-started.md index d9c59554bf4..a85a4e384b0 100644 --- a/docs/docs/tutorials/codealong/aztecjs-getting-started.md +++ b/docs/docs/tutorials/codealong/js_tutorials/aztecjs-getting-started.md @@ -1,6 +1,6 @@ --- title: Transferring Tokens with Aztec.js -sidebar_position: 1 +sidebar_position: 0 --- import Image from "@theme/IdealImage"; diff --git a/docs/docs/tutorials/codealong/simple_dapp/0_project_setup.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/0_project_setup.md similarity index 100% rename from docs/docs/tutorials/codealong/simple_dapp/0_project_setup.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/0_project_setup.md diff --git a/docs/docs/tutorials/codealong/simple_dapp/1_pxe_service.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/1_pxe_service.md similarity index 100% rename from docs/docs/tutorials/codealong/simple_dapp/1_pxe_service.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/1_pxe_service.md diff --git a/docs/docs/tutorials/codealong/simple_dapp/2_contract_deployment.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/2_contract_deployment.md similarity index 100% rename from docs/docs/tutorials/codealong/simple_dapp/2_contract_deployment.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/2_contract_deployment.md diff --git a/docs/docs/tutorials/codealong/simple_dapp/3_contract_interaction.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/3_contract_interaction.md similarity index 100% rename from docs/docs/tutorials/codealong/simple_dapp/3_contract_interaction.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/3_contract_interaction.md diff --git a/docs/docs/tutorials/codealong/simple_dapp/4_testing.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/4_testing.md similarity index 98% rename from docs/docs/tutorials/codealong/simple_dapp/4_testing.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/4_testing.md index e6f89bbf86e..85efb62452e 100644 --- a/docs/docs/tutorials/codealong/simple_dapp/4_testing.md +++ b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/4_testing.md @@ -67,4 +67,4 @@ yarn node --experimental-vm-modules $(yarn bin jest) --testRegex '.*\.test\.mjs$ ## Next steps -Now that you have finished the tutorial, you can learn more about [writing contracts with Noir](../../../aztec/smart_contracts_overview.md) or read about the [fundamental concepts behind Aztec Network](../../../aztec/overview.md). +Now that you have finished the tutorial, you can learn more about [writing contracts with Noir](../../../aztec/smart_contracts_overview.md) or read about the [fundamental concepts behind Aztec Network](../../../aztec/what_is_aztec.md). diff --git a/docs/docs/tutorials/codealong/simple_dapp/index.md b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/index.md similarity index 96% rename from docs/docs/tutorials/codealong/simple_dapp/index.md rename to docs/docs/tutorials/codealong/js_tutorials/simple_dapp/index.md index 26b04daebdc..ac1b4481d92 100644 --- a/docs/docs/tutorials/codealong/simple_dapp/index.md +++ b/docs/docs/tutorials/codealong/js_tutorials/simple_dapp/index.md @@ -1,5 +1,5 @@ --- -title: Dapp Tutorial +title: Node.js app that interacts with contracts --- In this tutorial we'll go through the steps for building a simple application that interacts with the Aztec Sandbox. We'll be building a console application using Javascript and NodeJS, but you may reuse the same concepts here for a web-based app. All Aztec libraries are written in Typescript and fully typed, so you can use Typescript instead of Javascript to make the most out of its type checker. diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md deleted file mode 100644 index c6e9362c344..00000000000 --- a/docs/docs/tutorials/index.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -id: index -sidebar_position: 0 -title: Tutorials and Examples ---- - -# Code-Along Tutorials and Examples - -In this section, you will find two things: code-along tutorials and code examples of Aztec applications. - -Tutorials will teach you how to build a full application or smart contract locally. Examples are not intended for you to replicate locally as they have more complex setups, but can be useful for exploring what you can do with Aztec. - -This page includes the most popular tutorials in order of increasing complexity. Explore the sidebar for more! - -## Code-Along Tutorials - -### Beginner: Write your first smart contract - -
- - -

Simple counter contract

-
- - Follow this tutorial to build, compile and deploy your first Aztec smart contract - a simple private counter - -
-
- - -### Intermediate: Write increasingly more complex contracts - -It is recommended to follow these in order. - -
- - -

Simple private voting contract

-
- - Build a contract with hybrid state and calling public functions from private - -
- - - -

Crowdfunding contract

-
- - A more complex contract that interacts with other contracts - -
- - - -

Token contract with hybrid state

-
- - A very complex contract for a token that can move across public & private state and be transferred to others - -
- - - -

Accounts contract

-
- - A simple accounts contract that will teach you about account abstraction in Aztec - -
-
- - - -## Examples - -
- - -

Interacting with L1 Uniswap from L2 Aztec

-
- - An example app inspired by Aztec Connect that allows users to swap publicly & privately on L1 Uniswap from Aztec - -
- - - - - - -

Card game contract ↗️

-
- - A set of contracts that allow players to take turns playing cards - -
-
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 1a6f4d2a13b..893230058c2 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -223,15 +223,21 @@ const config = { items: [ { type: "doc", - docId: "aztec/overview", + docId: "aztec/what_is_aztec", position: "left", label: "Learn", }, { type: "docSidebar", - sidebarId: "buildSidebar", + sidebarId: "guidesSidebar", position: "left", - label: "Build", + label: "Guides", + }, + { + type: "docSidebar", + sidebarId: "referenceSidebar", + position: "left", + label: "Reference", }, { type: "dropdown", diff --git a/docs/sidebars.js b/docs/sidebars.js index a425b88d1e9..4ae320e5d86 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -7,15 +7,20 @@ const path = require("path"); export default { sidebar: [ + { + type: "doc", + id: "aztec/what_is_aztec", + label: "What is Aztec?", + }, { type: "html", - value: 'Aztec Protocol', + value: 'Concepts', className: "sidebar-title", }, { type: "doc", - id: "aztec/overview", - label: "What is Aztec?", + id: "aztec/concepts_overview", + label: "Concepts Overview", }, { type: "category", @@ -68,30 +73,26 @@ export default { ], - buildSidebar: [ + guidesSidebar: [ + { + type: "doc", + id: "guides/index", + label: "Guides and Tutorials", + }, { type: "html", - value: 'How-To Guides', + value: 'Getting Started', className: "sidebar-title", }, { type: "doc", - label: "Popular Guides", - id: "guides/index" - }, - { - type: "autogenerated", - dirName: "guides/developer_guides" + label: "Quickstart", + id: "guides/getting_started" }, { type: "html", value: '', }, - { - type: "doc", - label: "Tutorials and Examples", - id: "tutorials/index" - }, { type: "html", value: 'Code-along Tutorials', @@ -103,7 +104,7 @@ export default { }, { type: "html", - value: 'Examples', + value: 'Advanced Examples', className: "sidebar-title", }, { @@ -114,15 +115,41 @@ export default { type: "html", value: '', }, + { + type: "html", + value: 'How-to Guides', + className: "sidebar-title", + }, + { + type: "autogenerated", + dirName: "guides/developer_guides" + }, + { + type: "html", + value: '', + }, + ], + + referenceSidebar: [ { type: "doc", - label: "Reference", + label: "References", id: "reference/index" }, + { + type: "html", + value: 'Developer References', + className: "sidebar-title", + }, { type: "autogenerated", dirName: "reference/developer_references" }, + { + type: "html", + value: 'Considerations', + className: "sidebar-title", + }, { type: "doc", id: "migration_notes", From 6e7951b07e4225140d685870970e0949a98983b5 Mon Sep 17 00:00:00 2001 From: Cat McGee Date: Mon, 21 Oct 2024 15:53:33 +0100 Subject: [PATCH 03/15] concepts overeview --- docs/docs/aztec/concepts/index.md | 55 +++++++++++-------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/docs/docs/aztec/concepts/index.md b/docs/docs/aztec/concepts/index.md index bb943c63e65..5a357fadf48 100644 --- a/docs/docs/aztec/concepts/index.md +++ b/docs/docs/aztec/concepts/index.md @@ -8,8 +8,6 @@ import Image from "@theme/IdealImage"; This page outlines Aztec's fundamental technical concepts. -## Aztec Overview - 1. A user interacts with Aztec through Aztec.js (like web3js or ethersjs) @@ -24,7 +22,7 @@ The PXE is unaware of the Public VM. And the Public VM is unaware of the PXE. Th - The PXE and the Public VM cannot directly communicate with each other - Private transactions in the PXE are executed first, followed by public transactions -### Private and public state +## Private and public state Private state works with UTXOs, or what we call notes. To keep things private, everything is stored in an [append-only UTXO tree](./concepts/storage/trees/index.md), and a nullifier is created when notes are invalidated. Nullifiers are then stored in their own [nullifier tree](./concepts/storage/trees/index.md). @@ -32,7 +30,11 @@ Public state works similarly to other chains like Ethereum, behaving like a publ Aztec [smart contract](./smart_contracts_overview.md) developers should keep in mind that different types are used when manipulating private or public state. Working with private state is creating commitments and nullifiers to state, whereas working with public state is directly updating state. -## Accounts +#### PXE + +## Accounts and keys + +### Account abstraction Every account in Aztec is a smart contract (account abstraction). This allows implementing different schemes for transaction signing, nonce management, and fee payments. @@ -40,29 +42,24 @@ Developers can write their own account contract to define the rules by which use Learn more about account contracts [here](./concepts/accounts/index.md). -## Smart contracts - -Developers can write [smart contracts](./smart_contracts_overview.md) that manipulate both public and private state. They are written in a framework on top of Noir, the zero-knowledge domain-specific language developed specifically for Aztec. Outside of Aztec, Noir is used for writing circuits that can be verified on EVM chains. - -Noir has its own doc site that you can find [here](https://noir-lang.org). - -## Communication with Ethereum - -Aztec allows private communications with Ethereum - ie no-one knows where the transaction is coming from, just that it is coming from somewhere on Aztec. - -This is achieved through portals - these are smart contracts deployed on an EVM that are related to the Ethereum smart contract you want to interact with. - -Learn more about portals [here](../protocol-specs/l1-smart-contracts/index.md). +### Key pairs -## Circuits +TODO -Aztec operates on three types of circuits: +## What's next? -- [Private kernel circuits](../aztec/concepts/circuits/kernels/private_kernel.md), which are executed by the user on their own device and prove correct execution of a function -- [Public kernel circuits](../aztec/concepts/circuits/kernels/public_kernel.md), which are executed by the [sequencer](./network/sequencer/index.md) and ensure the stack trace of transactions adheres to function execution rules -- [Rollup circuits](../aztec/concepts/circuits/index.md), which bundle all of the Aztec transactions into a proof that can be efficiently verified on Ethereum +### Start coding -## What's next? +
+ + +

Developer Getting Started Guide

+
+ + Follow the getting started guide to start developing with the Aztec Sandbox + +
+
### Dive deeper into how Aztec works @@ -126,15 +123,3 @@ Explore the Concepts for a deeper understanding into the components that make up -### Start coding - -
- - -

Developer Getting Started Guide

-
- - Follow the getting started guide to start developing with the Aztec Sandbox - -
-
\ No newline at end of file From 04a17ac8b86281caf3b38744898065e066ad6995 Mon Sep 17 00:00:00 2001 From: Cat McGee Date: Thu, 24 Oct 2024 12:49:53 +0100 Subject: [PATCH 04/15] concepts overview --- docs/docs/aztec/concepts/index.md | 125 ------------------ docs/docs/aztec/concepts_overview.md | 75 ++++++----- .../img/public-and-private-state-diagram.png | Bin 0 -> 153312 bytes 3 files changed, 40 insertions(+), 160 deletions(-) delete mode 100644 docs/docs/aztec/concepts/index.md create mode 100644 docs/static/img/public-and-private-state-diagram.png diff --git a/docs/docs/aztec/concepts/index.md b/docs/docs/aztec/concepts/index.md deleted file mode 100644 index 5a357fadf48..00000000000 --- a/docs/docs/aztec/concepts/index.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Concepts Overview -sidebar_position: 0 -tags: [protocol] ---- - -import Image from "@theme/IdealImage"; - -This page outlines Aztec's fundamental technical concepts. - - - -1. A user interacts with Aztec through Aztec.js (like web3js or ethersjs) -2. Private functions are executed in the PXE, which is client-side -3. They are rolled up and sent to the Public VM (running on an Aztec node) -4. Public functions are executed in the Public VM -5. The Public VM rolls up the private & public transaction rollups -6. These rollups are submitted to Ethereum - -The PXE is unaware of the Public VM. And the Public VM is unaware of the PXE. They are completely separate execution environments. This means: - -- The PXE and the Public VM cannot directly communicate with each other -- Private transactions in the PXE are executed first, followed by public transactions - -## Private and public state - -Private state works with UTXOs, or what we call notes. To keep things private, everything is stored in an [append-only UTXO tree](./concepts/storage/trees/index.md), and a nullifier is created when notes are invalidated. Nullifiers are then stored in their own [nullifier tree](./concepts/storage/trees/index.md). - -Public state works similarly to other chains like Ethereum, behaving like a public ledger. Public data is stored in a [public data tree](./concepts/storage/trees/index.md#public-state-tree). - -Aztec [smart contract](./smart_contracts_overview.md) developers should keep in mind that different types are used when manipulating private or public state. Working with private state is creating commitments and nullifiers to state, whereas working with public state is directly updating state. - -#### PXE - -## Accounts and keys - -### Account abstraction - -Every account in Aztec is a smart contract (account abstraction). This allows implementing different schemes for transaction signing, nonce management, and fee payments. - -Developers can write their own account contract to define the rules by which user transactions are authorized and paid for, as well as how user keys are managed. - -Learn more about account contracts [here](./concepts/accounts/index.md). - -### Key pairs - -TODO - -## What's next? - -### Start coding - -
- - -

Developer Getting Started Guide

-
- - Follow the getting started guide to start developing with the Aztec Sandbox - -
-
- -### Dive deeper into how Aztec works - -Explore the Concepts for a deeper understanding into the components that make up Aztec: - -
- - - -

Accounts

-
- - Learn about Aztec's native account abstraction - every account in Aztec is a smart contract which defines the rules for whether a transaction is or is not valid - -
- - - -

Circuits

-
- - Central to Aztec's operations are circuits in the core protocol and the developer-written Aztec.nr contracts - -
- - - -

PXE (pronounced 'pixie')

-
- - The Private Execution Environment (or PXE) is a client-side library for the execution of private operations - -
- - - -

State model

-
- - Aztec has a hybrid public/private state model - -
- - - -

Storage

-
- - In Aztec, private data and public data are stored in two trees: a public data tree and a note hashes tree - -
- - - -

Wallets

-
- - Wallets expose to dapps an interface that allows them to act on behalf of the user, such as querying private state or sending transactions - -
- -
- diff --git a/docs/docs/aztec/concepts_overview.md b/docs/docs/aztec/concepts_overview.md index 4deaaaeec28..2a5fe5de429 100644 --- a/docs/docs/aztec/concepts_overview.md +++ b/docs/docs/aztec/concepts_overview.md @@ -1,15 +1,14 @@ --- -title: Overview +title: Concepts Overview sidebar_position: 0 tags: [protocol] -draft: true --- import Image from "@theme/IdealImage"; -This page outlines Aztec's fundamental technical concepts. +This page outlines Aztec's fundamental technical concepts. It is recommended to read this before diving into building on Aztec. -## Aztec Overview +## High level view of Aztec @@ -20,20 +19,37 @@ This page outlines Aztec's fundamental technical concepts. 5. The Public VM rolls up the private & public transaction rollups 6. These rollups are submitted to Ethereum +## Private and public execution + +Private functions and public functions are executed in different environments. + +### Private Execution Environment (PXE) + +Private functions are executed first on the user's device in the Private Execution Environment (PXE, pronounced 'pixie'). It is a client-side library for the execution of private operations. It holds keys, notes, and generates proofs. It is a TypeScript library and can be run within Node, such as when you run the sandbox. + +### Aztec VM + +Public functions are executed by the Aztec Virtual Machine (AVM), which is very similar to the Ethereum Virtual Machine (EVM). To learn more about how it works and its instruction set, go to the [protocol specs](../protocol-specs/public-vm/intro.md). + The PXE is unaware of the Public VM. And the Public VM is unaware of the PXE. They are completely separate execution environments. This means: - The PXE and the Public VM cannot directly communicate with each other - Private transactions in the PXE are executed first, followed by public transactions -### Private and public state +## Private and public state Private state works with UTXOs, or what we call notes. To keep things private, everything is stored in an [append-only UTXO tree](./concepts/storage/trees/index.md), and a nullifier is created when notes are invalidated. Nullifiers are then stored in their own [nullifier tree](./concepts/storage/trees/index.md). Public state works similarly to other chains like Ethereum, behaving like a public ledger. Public data is stored in a [public data tree](./concepts/storage/trees/index.md#public-state-tree). +![Public vs private state](../../static/img/public-and-private-state-diagram.png) + Aztec [smart contract](./smart_contracts_overview.md) developers should keep in mind that different types are used when manipulating private or public state. Working with private state is creating commitments and nullifiers to state, whereas working with public state is directly updating state. -## Accounts + +## Accounts and keys + +### Account abstraction Every account in Aztec is a smart contract (account abstraction). This allows implementing different schemes for transaction signing, nonce management, and fee payments. @@ -41,29 +57,30 @@ Developers can write their own account contract to define the rules by which use Learn more about account contracts [here](./concepts/accounts/index.md). -## Smart contracts - -Developers can write [smart contracts](./smart_contracts_overview.md) that manipulate both public and private state. They are written in a framework on top of Noir, the zero-knowledge domain-specific language developed specifically for Aztec. Outside of Aztec, Noir is used for writing circuits that can be verified on EVM chains. +### Key pairs -Noir has its own doc site that you can find [here](https://noir-lang.org). +Each account in Aztec is backed by 3 key pairs: -## Communication with Ethereum +- A **nullifier key pair** used for note nullifier computation +- A **incoming viewing key pair** used to encrypt a note for the recipientt +- A **outgoing viewing key pair** used to encrypt a note for the sender -Aztec allows private communications with Ethereum - ie no-one knows where the transaction is coming from, just that it is coming from somewhere on Aztec. +As Aztec has native account abstraction, accounts do not automatically have a signing key pair to authenticate transactions. This is up to the account contract developer to implement. -This is achieved through portals - these are smart contracts deployed on an EVM that are related to the Ethereum smart contract you want to interact with. - -Learn more about portals [here](../protocol-specs/l1-smart-contracts/index.md). - -## Circuits - -Aztec operates on three types of circuits: +## What's next? -- [Private kernel circuits](../aztec/concepts/circuits/kernels/private_kernel.md), which are executed by the user on their own device and prove correct execution of a function -- [Public kernel circuits](../aztec/concepts/circuits/kernels/public_kernel.md), which are executed by the [sequencer](./network/sequencer/index.md) and ensure the stack trace of transactions adheres to function execution rules -- [Rollup circuits](../aztec/concepts/circuits/index.md), which bundle all of the Aztec transactions into a proof that can be efficiently verified on Ethereum +### Start coding -## What's next? +
+ + +

Developer Getting Started Guide

+
+ + Follow the getting started guide to start developing with the Aztec Sandbox + +
+
### Dive deeper into how Aztec works @@ -127,15 +144,3 @@ Explore the Concepts for a deeper understanding into the components that make up -### Start coding - -
- - -

Developer Getting Started Guide

-
- - Follow the getting started guide to start developing with the Aztec Sandbox - -
-
\ No newline at end of file diff --git a/docs/static/img/public-and-private-state-diagram.png b/docs/static/img/public-and-private-state-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1f6ef534950fdbae3d37afa7409b9544a4c6de GIT binary patch literal 153312 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%0AP+ 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