天狼星作为夜空中最亮的恒星而闻名, 它欺骗了肉眼,看似是一个孤立的光点, 实际上却是一个双星系统。受这种二元性的启发, 我们的项目以天狼星命名,捕捉了 看似单一实体的折叠实例的本质。
简介
天狼星是一个开源的Plonkish折叠框架,用于增量可验证计算[IVC]。
在IVC方案的背景下,证明者的角色是证明:将步骤函数F
连续精确应用n
次于初始值$z_0$后,结果为$z_n$。这里,步骤函数F
接受两个输入$z_i$和$w$,并产生输出$z_{i+1}$。
架构
Sirius
折叠框架采用三层架构设计。
- 算术化层:该层作为约束系统的接口。用户定义的电路和证明数据被转换为由折叠方案定义的中间表示格式。我们当前的实现遵循Protostar中的特殊声音交互协议(SPS)。
- 折叠方案层:框架的核心是折叠方案IVC电路,它积累多个步骤的计算。在每个步骤中,证明者首先计算前一步骤的实例-证明对,并将它们折叠到累加器中,然后计算折叠后实例-证明对的交叉项和误差向量。IVC电路接收证明者的输出并执行以下步骤:应用步骤函数
F
,将前一步骤的实例折叠到累加器实例中,并验证IVC电路的输入。 - SNARK层:SNARK层利用多项式交互式预言机证明(PIOP)和多项式承诺方案(PCS)生成简洁的零知识证明(zkSNARKs)以实现简洁和零知识验证。IVC判定器的多项式关系检查被转换为多变量和检查协议。和检查协议的评估阶段取决于我们选择的多项式承诺方案(PCS),例如Hyrax。值得注意的是,当多项式稀疏时,我们可以使用Spartan的Spark编译器来高效处理它们。
路线图
- 2023年第四季度 - 支持halo2前端
- 2023年第四季度 - 针对plonkish自定义门的折叠方案
- 2023年第四季度 - 针对查找参数的折叠方案
- 2024年第一季度 - IVC电路
- 2024年第一季度 - IVC基准测试
- 2024年第二季度 - 来自Protogalaxy的高次门优化
- 2024年第三季度 - 带有cyclefold的IVC
- 2024年第三季度 - Snarkify Cloud集成和GPU加速
- 2024年第四季度 - 聚合电路
- 2024年第四季度 - 支持IOP + PCS SNARK(Spartan / Hyperplonk)
- 2025年第一季度 - 支持链上验证器
预计时间表可能会发生变化。
入门指南
安装Rust
使用rustup
添加依赖
cargo add --git https://github.com/snarkify/sirius.git --tag v0.1.0 sirius
实现StepCircuit
特质
/// 要允许您的电路被折叠,请实现此特质
/// `ARITY` - 输入和输出的大小
pub trait StepCircuit<const ARITY: usize, F: PrimeField> {
type Config: Clone;
fn configure(cs: &mut ConstraintSystem<F>) -> Self::Config;
/// 此方法表示步骤函数`F: z_i -> z_{i+1}`
///
/// 与`halo2::Circuit`不同,它接受已分配单元格的数组
/// 并返回已分配单元格的数组
fn synthesize_step(
&self,
config: Self::Config,
layouter: &mut impl Layouter<F>,
z_in: &[AssignedCell<F, F>; ARITY],
) -> Result<[AssignedCell<F, F>; ARITY], SynthesisError>;
}
设置和运行IVC
实例
有关可运行的示例,请查看examples文件夹。 以下是使用 IVC API 的示例:
fn main() {
let primary = poseidon_step_circuit::TestPoseidonCircuit::default();
let secondary = step_circuit::trivial::Circuit::<ARITY2, _>::default();
// 作为 IVC 算法一部分的随机预言机规格
let primary_spec = RandomOracleConstant::<C1Scalar>::new(10, 10);
let secondary_spec = RandomOracleConstant::<C2Scalar>::new(10, 10);
let primary_commitment_key = get_or_create_commitment_key::<C1Affine>(COMMITMENT_KEY_SIZE, "bn256");
let secondary_commitment_key = get_or_create_commitment_key::<C2Affine>(COMMITMENT_KEY_SIZE, "grumpkin");
let pp = PublicParams::<
'_,
ARITY1,
ARITY2,
MAIN_GATE_SIZE,
C1Affine,
C2Affine,
TestPoseidonCircuit<_>,
step_circuit::trivial::Circuit<ARITY, _>,
RandomOracle,
RandomOracle,
>::new(
CircuitPublicParamsInput::new(
PRIMARY_CIRCUIT_TABLE_SIZE as u32,
&primary_commitment_key,
primary_spec,
&primary,
),
CircuitPublicParamsInput::new(
SECONDARY_CIRCUIT_TABLE_SIZE as u32,
&secondary_commitment_key,
secondary_spec,
&secondary,
),
LIMB_WIDTH,
LIMBS_COUNT,
)
.expect("创建公共参数失败");
let primary_input = array::from_fn(|i| C1Scalar::from_u128(i as u128));
let secondary_input = array::from_fn(|i| C2Scalar::from_u128(i as u128));
let fold_step_count = NonZeroUsize::new(10).unwrap();
IVC::fold(
&pp,
primary,
primary_input,
secondary,
secondary_input,
fold_step_count,
)
.expect("运行 IVC 失败");
}
此代码将执行 fold_step_count
次折叠步骤,并在执行后检查证明。
运行示例
对于可运行的示例,请查看 examples 文件夹。
# 're' 是 'run example' 的缩写
# 通过命令行参数运行 IVC 的别名
cargo re-cli --help
# 运行 IVC 的平凡 `StepCircuit`(只是原样返回其输入)的别名
cargo re-trivial
# 运行 IVC 的 poseidon 电路的别名
cargo re-poseidon
时间分析
实现了跨度生命周期跟踪,可以让你详细了解特定步骤完成所需的时间。
# 're' 是 'run example' 的缩写
# 默认情况下,它会输出所有生命周期大于 1 秒的跨度
cargo re-poseidon | python3 .scripts/build_profiling.py
# 可以指定输出跨度的下限
cargo re-poseidon | python3 .scripts/build_profiling.py --min-runtime 0.1s
# 你也可以存储日志并在稍后处理它们
cargo re-poseidon > log; cat log | python3 .scripts/build_profiling.py
内存分析
使用了 dhat 工具和实验性的 dhat-rs crate
# 使用默认 IVC(poseidon+trivial)运行 dhat
cargo cli-dhat
# 查看可用的运行参数
cargo cli-dhat --help
基准测试
对于基准测试,请查看 benches 文件夹。
cargo bench
Criterion
你也可以获得更详细的报告。请查看 criterion.rs 了解更多信息
cargo criterion
参与其中
我们希望你能成为我们社区的一员!
如果你和我们一样对 Sirius
充满热情,我们邀请你加入我们的 Telegram 开发者社区。这是一个很好的地方,可以及时了解最新情况、参与其中并为项目做出贡献。无论你是想贡献代码、提供反馈,还是仅仅想保持联系,我们的 Telegram 群组都是最佳选择。
:point_right: 加入我们的开发者社区
感谢你对 Sirius
的贡献兴趣!:sparkles: