2个版本
0.1.2 | 2020年1月21日 |
---|---|
0.1.0 | 2020年1月16日 |
#559 在 身份验证
34 每月下载
200KB
445 行
使用双线性映射的累积器
基于论文《基于双线性映射和匿名凭证的高效撤销的累积器》。修改为与类型-3配对一起工作。增加了论文中没有提到的两个特性
- 能够从累积器中移除索引。
- 使用陷门知识的高效见证生成(与累积器的大小无关)
论文第3.2节中的累积器
API
-
累积器定义在群G1上。要初始化一个新的累积器,调用
Accumulator::new
。 -
为了跟踪累积器中存在的索引,以便它们不会意外地再次添加或删除,并且在它们不存在时更新见证,定义了一个名为
AccumulatorState
的特质。为了测试,提供了一个内存中的实现。 -
为了生成和查询添加到累积器中的条目,定义了一个名为
AccumulatorEntries
的特质。为了测试,定义了一个内存中的实现。 -
要了解累积器设置的一个示例,请查看测试函数
setup_accumulator_for_testing
。 -
要在累积器中添加索引
idx
,使用方法Accumulator::add_index
。该方法返回一个新的累积器并更新state
。假设accum
是添加该索引之前的累积器,state
是一个AccumulatorState
,entries
是一个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);
-
要检查累积器中值的存在,需要一个
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);
-
要检查索引
idx
是否存在于累加器中,请使用方法Accumulator::has_index
。// `witness` is a `Witness` and `z` = e(g1, g2)^{gamma^{size+1}} accum_1.has_index(idx, &witness, &entries, &z);
-
在添加或删除一些元素之后更新见证,可以使用
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);
-
要删除索引
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);
-
如果更新累加器的条目可以访问陷阱门,有一个方便的方法可以添加索引并有效地计算见证。
let (new_accum, wit) = cur_accum.add_index_and_compute_witness(idx, &entries, &mut state, &trapdoor);
请参阅测试以获取详细示例。
待办事项
- 签名以证明对累积值的了解。
- 检查是否可以避免 BBS+ 并使用 PS。
- 检查通过切换群 G1 和 G2 可否实现权衡。
- 将断言转换为错误
依赖关系
~6MB
~114K SLoC