polygonID SDK部分代码分析
回到polygonID SDK project,在项目中,理论性的iden3和polygonID算法,在实际代码中,如何连接呢?本文接续上文 iden3和polygonID原理应用和实战,讲述具体代码,如何实现的。
算法1:生成最终的proof
从技术角度来看,一个身份包括三棵树:claims tree,revocation tree,roots of roots tree。
代码实现:
- 为生成proof,准备入参:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// Prepare atomic query inputs 准备计算查询的入参
Uint8List res = await _proofRepository
.calculateAtomicQueryInputs(
id: didEntity.identifier, // 用户 DID
profileNonce: param.profileNonce, // 用户个人资料随机数
claimSubjectProfileNonce: param.claimSubjectProfileNonce, // 用户声明主题资料随机数
authClaim: authClaim, // 用户授权声明
incProof: incProof, // 如上图中 用户Claims Tree Root
nonRevProof: nonRevProof, // 如上图中 用户Revocation Tree Root
gistProof: gistProof, // 如上图中 用户Roots Tree Toot
treeState: treeState, // 如上图中 用户Identity State
challenge: param.challenge, // 挑战,由Issuer生成,作为生成proof的一部分
signature: signature, // 用户针对challenge的签名
claim: param.credential, // 用户证书,其中包含的PII Data
proofScopeRequest: param.request.toJson(),
circuitId: param.request.circuitId, // 使用的电路ID
config: config,
)
其中部分参数的示例如下:
1 | { |
- 生成证明:
1
2
3
4
5
6// Prove 生成最终证明,其中的步骤实际是在调用iden3的类库
return _proveUseCase
.execute(param: ProveParam(atomicQueryInputs, param.circuitData))
.then((proof) {
_stacktraceManager.addTrace("[GenerateIden3commProofUseCase] proof");
logger().i("[GenerateProofUseCase] proof: $proof");
2.1 生成证明的具体过程:
1 | Future<ZKProofEntity> execute({required ProveParam param}) async { |
算法2:稀疏默克尔树
代码接口如下
1 | abstract class SMTRepository { |
综上,polygonID 很好地在手机端(Flutter)和web端(JavaScript and TypeScript)实现了DID-Holder端SDK。