Token导航 LogoToken导航TokenDH.com
研究检索只读github未标认证来源可访问许可证需确认审计通过

noir-idioms黑色习语

Agent Skill

noir-idioms 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

1,001

周安装

43

GitHub Stars

1,284

下载量

351
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:noir-idioms(黑色习语)
来源仓库:https://github.com/noir-lang/noir
仓库路径:skills/noir-idioms
安装命令:
npx skills add https://github.com/noir-lang/noir --skill noir-idioms
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/noir-lang/noir --skill noir-idioms

简介

noir-idioms 用于查找、检索和筛选相关信息。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中根据关键词或任务场景快速定位候选结果。
  • 支持 Noir 语言相关语法和惯用模式的搜索。
  • 安装命令:npx skills add https://github.com/noir-lang/noir --skill noir-idioms。
  • 使用前需确认权限范围和维护状态,避免触发不必要的联网或文件操作。

SKILL.md

Writing Idiomatic Noir

These guidelines help you write Noir programs that are readable, idiomatic, and produce efficient circuits.

Core Principle: Hint and Verify

Computing a value is often more expensive in a circuit than verifying a claimed value is correct. Use unconstrained functions to compute results off-circuit, then verify them with cheap constraints.

// Expensive: sorting an array in-circuit requires many comparisons and swaps
let sorted = sort_in_circuit(arr);

// Cheaper: hint the sorted array, verify it's a valid permutation and is ordered
let sorted = unsafe { sort_hint(arr) };
// verify sorted order and that sorted is a permutation of arr

Note that the compiler already injects unconstrained helpers for some operations automatically (e.g., integer division). Don't hint what the compiler already optimizes — focus on higher-level computations like sorting, searching, and array construction where the compiler cannot automatically apply this pattern.

What to Hint

Hint the final result, not intermediate values. If your unconstrained function computes helper structures (masks, indices, accumulators) on the way to an answer, return only the answer and verify it directly against the inputs. Fewer hinted values means fewer constraints needed.

Safety Comments

Every unsafe block must have a // Safety: comment that explains *why* the constrained code makes the hint sound — not just *where* the verification happens, but what property it enforces:

// Safety: each result element is checked against a[i] or b[i] depending on
// whether i <= index, so a dishonest prover cannot substitute arbitrary values
let result = unsafe { my_hint(a, b, index) };

ACIR vs Brillig: Different Optimization Goals

Noir compiles to two different targets depending on context, and they have fundamentally different performance characteristics.

ACIR (constrained code) — the default. Every operation becomes arithmetic constraints in a circuit. Optimize for gate/constraint count: fewer constraints = faster proving.

Brillig (unconstrained code) — functions marked unconstrained. Runs on a conventional VM. Optimize for execution speed and bytecode size: familiar performance intuitions apply.

Key Differences

AspectACIR (constrained)Brillig (unconstrained)
LoopsFully unrolled — bounds must be comptime-knownNative loop support — runtime-dynamic bounds are fine
Control flowFlattened into conditional selects — both branches are always evaluatedReal branching — only the taken branch executes
Function callsAlways inlinedPreserved when beneficial
ComparisonsInequality (<, <=) requires range checks (costs gates)Native comparison instructions (cheap)

Branching with is_unconstrained()

When a function may be called in either context, use is_unconstrained() to provide optimized implementations for each target. This is common in the standard library:

pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {
    let mut ret = false;
    if is_unconstrained() {
        // Brillig path: use the actual length directly
        for i in 0..self.len {
            ret |= predicate(self.storage[i]);
        }
    } else {
        // ACIR path: iterate the full static capacity, guard with a flag
        let mut exceeded_len = false;
        for i in 0..MaxLen {
            exceeded_len |= i == self.len;
            if !exceeded_len {
                ret |= predicate(self.storage[i]);
            }
        }
    }
    ret
}

The constrained path must iterate the full MaxLen because ACIR loops are unrolled at compile time — the compiler needs a static bound. The unconstrained path can loop over exactly self.len elements because Brillig supports runtime-dynamic loop bounds.

Practical Guidelines

  • Constrained code: minimize constraints — use hint-and-verify, avoid unnecessary comparisons, leverage type-system range guarantees to simplify constraints.
  • Unconstrained code: write for clarity and speed like normal imperative code — use dynamic loops, early returns, and mutable state freely.
  • Don't add constraint-style verification inside unconstrained functions — it wastes execution time without adding security (unconstrained results are verified by the constrained caller).
  • Don't use runtime-dynamic loop bounds in constrained code — the compiler must be able to unroll all loops.

Leveraging the Type System

Noir's type system provides range guarantees that make subsequent constraints cheaper — the compiler knows what values a type can hold and can emit simpler arithmetic as a result. Use typed values instead of manual field arithmetic.

Use bool Instead of Field Arithmetic

The bool type guarantees values are 0 or 1, so the compiler can use simpler constraints for operations on booleans. Prefer boolean operators over field multiplication for logical conditions:

// Prefer: readable, compiler knows switched[i] is 0 or 1
assert(!switched[i] | switched[i - 1]);

// Avoid: manual field encoding of the same logic
let s = switched[i] as Field;
let prev = switched[i - 1] as Field;
assert(s * (1 - prev) == 0);

Both compile to equivalent constraints, but the boolean version communicates intent.

Conditionals

Use if/else Expressions for Conditional Values

The compiler lowers if cond {a} else {b} into an optimized conditional select. Don't hand-roll the arithmetic:

// Prefer: clear intent
let val = if condition { x } else { y };

// Avoid: manual select
let c = condition as Field;
let val = c * (x - y) + y;

Hoist Assertions Out of Conditional Branches

When both branches of an if/else contain assertions, extract the condition into a value and assert once. The compiler optimizes a single assertion against a conditional value better than separate assertions in each branch:

// Prefer: one assertion, compiler optimizes the conditional select
let expected = if condition { a } else { b };
assert_eq(result, expected);

// Avoid: duplicated assertions in each branch
if condition {
    assert_eq(result, a);
} else {
    assert_eq(result, b);
}

Assertions

Use assert_eq over assert(x == y). It provides better error messages on failure and reads more naturally:

assert_eq(result[i], expected);

Comparison Costs

Integer comparisons (<, <=, >, >=) require range checks, which cost gates. Equality checks (==) are cheaper. Strategies to reduce comparison costs:

  • Avoid redundant comparisons: If you need to check i <= index in a loop, do it once per iteration — don't check the same condition in multiple places.
  • Don't over-optimize comparisons: Replacing a simple <= with flag-tracking (if i == index {flag = true}) adds state and may produce *more* gates. Always measure before committing to a "cleverer" approach.

Summary Checklist

When writing or reviewing Noir code:

  1. Can any in-circuit computation be replaced with hint-and-verify?
  2. Are you hinting only final results, not intermediate scaffolding?
  3. Are boolean conditions using bool types and operators, not Field arithmetic?
  4. Are conditional values using if/else expressions, not manual selects?
  5. Are assertions using assert_eq where applicable?
  6. Are constrained and unconstrained paths optimized for their respective targets?
  7. Do all loops in constrained code have comptime-known bounds?

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

34.62%
按下载量换算122

Claude

28.54%
按下载量换算100

Cursor

18.84%
按下载量换算66

Gemini CLI

9.91%
按下载量换算35

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

只读

该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills