#accumulator #pairing #anonymous-credentials #witness #paper #maps #indices

cks_accumulator

基于论文的配对累积器 - 基于双线性映射和匿名凭证的高效撤销的累积器

2个版本

0.1.2 2020年1月21日
0.1.0 2020年1月16日

#559身份验证

34 每月下载

Apache-2.0

200KB
445

使用双线性映射的累积器

基于论文《基于双线性映射和匿名凭证的高效撤销的累积器》。修改为与类型-3配对一起工作。增加了论文中没有提到的两个特性

  1. 能够从累积器中移除索引。
  2. 使用陷门知识的高效见证生成(与累积器的大小无关)

论文第3.2节中的累积器

API

  1. 累积器定义在群G1上。要初始化一个新的累积器,调用 Accumulator::new

  2. 为了跟踪累积器中存在的索引,以便它们不会意外地再次添加或删除,并且在它们不存在时更新见证,定义了一个名为 AccumulatorState 的特质。为了测试,提供了一个内存中的实现。

  3. 为了生成和查询添加到累积器中的条目,定义了一个名为 AccumulatorEntries 的特质。为了测试,定义了一个内存中的实现。

  4. 要了解累积器设置的一个示例,请查看测试函数 setup_accumulator_for_testing

  5. 要在累积器中添加索引 idx,使用方法 Accumulator::add_index。该方法返回一个新的累积器并更新 state。假设 accum 是添加该索引之前的累积器,state 是一个 AccumulatorStateentries 是一个 AccumulatorEntries,那么添加索引的方法如下

    // indices are 1-based. `accum` does not have the index `idx` but `accum_1` does
    let accum_1 = accum.add_index(idx, &entries, &mut state);
    
  6. 要检查累积器中值的存在,需要一个 Witness。要生成见证,有两种方法,较慢的方法不需要陷门,其复杂性与累积器的大小成比例,而较快的方
    要在不使用陷阱门的情况下生成索引 idx 的见证,请使用方法 Witness::for_index,该方法遍历 state 中的索引并从 entries 获取相应的条目。

    let witness = Witness::for_index(idx, &state, &entries);
    

    要使用陷阱门生成索引 idx 的见证

    // `cur_accum` is the accumulator without `idx`. 
    let witness = Witness::for_index_using_trapdoor(idx, &cur_accum, &entries, &state, &trapdoor);
    
  7. 要检查索引 idx 是否存在于累加器中,请使用方法 Accumulator::has_index

    // `witness` is a `Witness` and `z` = e(g1, g2)^{gamma^{size+1}} 
    accum_1.has_index(idx, &witness, &entries, &z);
    
  8. 在添加或删除一些元素之后更新见证,可以使用 Witness:update 更新旧的见证。

    // `witness_old` is the old witness which is being updated, `added` and `removed` are the `HashSet`s of added and 
    removed indices. 
    let witness_updated = witness_old.update(added, removed, &entries);
    
  9. 要删除索引 idx,请使用 Accumulator::remove_index 获取一个删除了索引的新累加器。

    // indices are 1-based. `accum` has the index `idx` but `accum_1` does not
    let accum_1 = accum.remove_index(idx, &entries, &mut state);
    
  10. 如果更新累加器的条目可以访问陷阱门,有一个方便的方法可以添加索引并有效地计算见证。

    let (new_accum, wit) = cur_accum.add_index_and_compute_witness(idx, &entries, &mut state, &trapdoor);
    

请参阅测试以获取详细示例。

待办事项

  • 签名以证明对累积值的了解。
  • 检查是否可以避免 BBS+ 并使用 PS。
  • 检查通过切换群 G1 和 G2 可否实现权衡。
  • 将断言转换为错误

依赖关系

~6MB
~114K SLoC