pub trait ExampleCircuit: Sized {
type Params: Args;
type Instance: Args;
// Required methods
fn build(params: Self::Params, builder: &mut CircuitBuilder) -> Result<Self>;
fn populate_witness(
&self,
instance: Self::Instance,
filler: &mut WitnessFiller<'_>,
) -> Result<()>;
// Provided method
fn param_summary(params: &Self::Params) -> Option<String> { ... }
}Expand description
Trait for standardizing circuit examples in the Binius framework.
This trait provides a common pattern for implementing circuit examples by separating:
- Circuit parameters (
Params): compile-time configuration that affects circuit structure - Instance data (
Instance): runtime data used to populate the witness - Circuit building: logic to construct the circuit based on parameters
- Witness population: logic to fill in witness values based on instance data
§Example Implementation
ⓘ
struct MyExample {
params: MyParams,
// Store any gadgets or wire references needed for witness population
}
#[derive(clap::Args)]
struct MyParams {
#[arg(long)]
max_size: usize,
}
#[derive(clap::Args)]
struct MyInstance {
#[arg(long)]
input_value: Option<String>,
}
impl ExampleCircuit for MyExample {
type Params = MyParams;
type Instance = MyInstance;
fn build(params: MyParams, builder: &mut CircuitBuilder) -> Result<Self> {
// Construct circuit based on parameters
Ok(Self { params })
}
fn populate_witness(&self, instance: MyInstance, filler: &mut WitnessFiller) -> Result<()> {
// Fill witness values based on instance data
Ok(())
}
}§Lifecycle
- Parse CLI arguments to get
ParamsandInstance - Call
build()with parameters to construct the circuit - Build the constraint system
- Set up prover and verifier
- Call
populate_witness()to fill witness values - Generate and verify proof
Required Associated Types§
Required Methods§
Sourcefn build(params: Self::Params, builder: &mut CircuitBuilder) -> Result<Self>
fn build(params: Self::Params, builder: &mut CircuitBuilder) -> Result<Self>
Build the circuit with the given parameters.
This method should:
- Add witnesses, constants, and constraints to the builder
- Store any wire references needed for witness population
- Return a Self instance that can later populate witness values
Sourcefn populate_witness(
&self,
instance: Self::Instance,
filler: &mut WitnessFiller<'_>,
) -> Result<()>
fn populate_witness( &self, instance: Self::Instance, filler: &mut WitnessFiller<'_>, ) -> Result<()>
Populate witness values for a specific instance.
This method should:
- Process the instance data (e.g., parse inputs, compute hashes)
- Fill all witness values using the provided filler
- Validate that instance data is compatible with circuit parameters
Provided Methods§
Sourcefn param_summary(params: &Self::Params) -> Option<String>
fn param_summary(params: &Self::Params) -> Option<String>
Generate a concise parameter summary for perfetto trace filenames.
This method should return a short string (5-10 chars max) that captures the most important parameters for this circuit configuration. Used to differentiate traces with different parameter settings.
Format suggestions:
- Bytes: “2048b”, “4096b”
- Counts: “10p” (permutations), “5s” (signatures)
Returns None if no meaningful parameters to include in filename.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".