Skip to content

Commit

Permalink
Merge branch 'master' into aztec-packages
Browse files Browse the repository at this point in the history
* master:
  chore(docs): devcontainer docs (#4007)
  chore(ci): disable commit comments on docs publishing (#3998)
  feat: simplify chains of casts to be all in terms of the original `ValueId` (#3984)
  chore: quiet down aztec-bot! (#4006)
  chore: force public functions for trait implementation (#3986)
  • Loading branch information
TomAFrench committed Jan 11, 2024
2 parents 3f6a24d + 5ae9d2f commit f4bbe21
Show file tree
Hide file tree
Showing 9 changed files with 144 additions and 2 deletions.
1 change: 1 addition & 0 deletions .github/workflows/publish-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
enable-github-deployment: false
deploy-message: "Deploy from GitHub Actions for tag ${{ inputs.noir-ref }}"
enable-commit-comment: false
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
Expand Down
8 changes: 8 additions & 0 deletions compiler/noirc_evaluator/src/ssa/ir/instruction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,14 @@ impl Instruction {
/// that value is returned. Otherwise None is returned.
fn simplify_cast(value: ValueId, dst_typ: &Type, dfg: &mut DataFlowGraph) -> SimplifyResult {
use SimplifyResult::*;
let value = dfg.resolve(value);

if let Value::Instruction { instruction, .. } = &dfg[value] {
if let Instruction::Cast(original_value, _) = &dfg[*instruction] {
return SimplifiedToInstruction(Instruction::Cast(*original_value, dst_typ.clone()));
}
}

if let Some(constant) = dfg.get_numeric_constant(value) {
let src_typ = dfg.type_of_value(value);
match (src_typ, dst_typ) {
Expand Down
7 changes: 7 additions & 0 deletions compiler/noirc_frontend/src/parser/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ pub enum ParserErrorReason {
EarlyReturn,
#[error("Patterns aren't allowed in a trait's function declarations")]
PatternInTraitFunctionParameter,
#[error("Modifiers are ignored on a trait impl method")]
TraitImplFunctionModifiers,
#[error("comptime keyword is deprecated")]
ComptimeDeprecated,
#[error("{0} are experimental and aren't fully supported yet")]
Expand Down Expand Up @@ -148,6 +150,11 @@ impl From<ParserError> for Diagnostic {
"".into(),
error.span,
),
ParserErrorReason::TraitImplFunctionModifiers => Diagnostic::simple_warning(
reason.to_string(),
"".into(),
error.span,
),
ParserErrorReason::ExpectedPatternButFoundType(ty) => {
Diagnostic::simple_error("Expected a ; separating these two statements".into(), format!("{ty} is a type and cannot be used as a variable name"), error.span)
}
Expand Down
13 changes: 12 additions & 1 deletion compiler/noirc_frontend/src/parser/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,18 @@ fn trait_implementation() -> impl NoirParser<TopLevelStatement> {
}

fn trait_implementation_body() -> impl NoirParser<Vec<TraitImplItem>> {
let function = function_definition(true).map(TraitImplItem::Function);
let function = function_definition(true).validate(|mut f, span, emit| {
if f.def().is_internal
|| f.def().is_unconstrained
|| f.def().is_open
|| f.def().visibility != FunctionVisibility::Private
{
emit(ParserError::with_reason(ParserErrorReason::TraitImplFunctionModifiers, span));
}
// Trait impl functions are always public
f.def_mut().visibility = FunctionVisibility::Public;
TraitImplItem::Function(f)
});

let alias = keyword(Keyword::Type)
.ignore_then(ident())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ The easiest way to use these tools is by installing the [Noir VS Code extension]

Some Noir repos have leveraged Codespaces in order to ease the development process. You can visit the [noir-starter](https://github.com/noir-lang/noir-starter) for an example.

<video width="100%" height="auto" controls>
<source src={require('@site/static/video/codespaces_showcase.mp4').default} type="video/mp4" />
Your browser does not support the video tag.
</video>

## GitHub Actions

You can use `noirup` with GitHub Actions for CI/CD and automated testing. It is as simple as
Expand Down
110 changes: 110 additions & 0 deletions docs/docs/how_to/using-devcontainers.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
title: Developer Containers and Codespaces
description: "Learn how to set up a devcontainer in your GitHub repository for a seamless coding experience with Codespaces. Follow our easy 8-step guide to create your own Noir environment without installing Nargo locally."
keywords: ["Devcontainer", "Codespaces", "GitHub", "Noir Environment", "Docker Image", "Development Environment", "Remote Coding", "GitHub Codespaces", "Noir Programming", "Nargo", "VSCode Extensions", "Noirup"]
sidebar_position: 1
---

Adding a developer container configuration file to your Noir project is one of the easiest way to unlock coding in browser.

## What's a devcontainer after all?

A [Developer Container](https://containers.dev/) (devcontainer for short) is a Docker image that comes preloaded with tools, extensions, and other tools you need to quickly get started or continue a project, without having to install Nargo locally. Think of it as a development environment in a box.

There are many advantages to this:

- It's platform and architecture agnostic
- You don't need to have an IDE installed, or Nargo, or use a terminal at all
- It's safer for using on a public machine or public network

One of the best ways of using devcontainers is... not using your machine at all, for maximum control, performance, and ease of use.
Enter Codespaces.

## Codespaces

If a devcontainer is just a Docker image, then what stops you from provisioning a `p3dn.24xlarge` AWS EC2 instance with 92 vCPUs and 768 GiB RAM and using it to prove your 10-gate SNARK proof?

Nothing! Except perhaps the 30-40$ per hour it will cost you.

The problem is that provisioning takes time, and I bet you don't want to see the AWS console every time you want to code something real quick.

Fortunately, there's an easy and free way to get a decent remote machine ready and loaded in less than 2 minutes: Codespaces. [Codespaces is a Github feature](https://github.com/features/codespaces) that allows you to code in a remote machine by using devcontainers, and it's pretty cool:

- You can start coding Noir in less than a minute
- It uses the resources of a remote machine, so you can code on your grandma's phone if needed be
- It makes it easy to share work with your frens
- It's fully reusable, you can stop and restart whenever you need to

:::info

Don't take out your wallet just yet. Free GitHub accounts get about [15-60 hours of coding](https://github.com/features/codespaces) for free per month, depending on the size of your provisioned machine.

:::

## Tell me it's _actually_ easy

It is!

Github comes with a default codespace and you can use it to code your own devcontainer. That's exactly what we will be doing in this guide.

<video width="100%" height="auto" controls>
<source src={require('@site/static/video/how-tos/devcontainer.mp4').default} type="video/mp4" />
Your browser does not support the video tag.
</video>

8 simple steps:

#### 1. <a href="https://github.com/new" target="_blank">Create a new repository</a> on GitHub.

#### 2. Click "Start coding with Codespaces". This will use the default image.

#### 3. Create a folder called `.devcontainer` in the root of your repository.

#### 4. Create a Dockerfile in that folder, and paste the following code:

```docker
FROM --platform=linux/amd64 node:lts-bookworm-slim
SHELL ["/bin/bash", "-c"]
RUN apt update && apt install -y curl bash git tar gzip libc++-dev
RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash
ENV PATH="/root/.nargo/bin:$PATH"
RUN noirup
ENTRYPOINT ["nargo"]
```
#### 5. Create a file called `devcontainer.json` in the same folder, and paste the following code:

```json
{
"name": "Noir on Codespaces",
"build": {
"context": ".",
"dockerfile": "Dockerfile"
},
"customizations": {
"vscode": {
"extensions": ["noir-lang.vscode-noir"]
}
}
}
```
#### 6. Commit and push your changes

This will pull the new image and build it, so it could take a minute or so

#### 8. Done!
Just wait for the build to finish, and there's your easy Noir environment.


Refer to [noir-starter](https://github.com/noir-lang/noir-starter/) as an example of how devcontainers can be used together with codespaces.



## How do I use it?

Using the codespace is obviously much easier than setting it up.
Just navigate to your repository and click "Code" -> "Open with Codespaces". It should take a few seconds to load, and you're ready to go.

:::info

If you really like the experience, you can add a badge to your readme, links to existing codespaces, and more.
Check out the [official docs](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/setting-up-your-repository/facilitating-quick-creation-and-resumption-of-codespaces) for more info.
2 changes: 1 addition & 1 deletion docs/docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export default {
prism: {
theme: lightTheme,
darkTheme: darkTheme,
additionalLanguages: ['rust', 'powershell', 'solidity', 'toml'],
additionalLanguages: ['rust', 'powershell', 'solidity', 'toml', 'json', 'bash', 'docker'],
},
stylesheets: [
{
Expand Down
Binary file added docs/static/video/codespaces_showcase.mp4
Binary file not shown.
Binary file added docs/static/video/how-tos/devcontainer.mp4
Binary file not shown.

0 comments on commit f4bbe21

Please sign in to comment.