/
service.go
69 lines (56 loc) · 1.94 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package identitysrv
import (
// "crypto/ecdsa"
"github.com/ethereum/go-ethereum/common"
"github.com/iden3/go-iden3-crypto/babyjub"
"github.com/iden3/go-iden3/core"
"github.com/iden3/go-iden3/merkletree"
"github.com/iden3/go-iden3/services/claimsrv"
)
type Service interface {
CreateIdGenesis(kop *babyjub.PublicKey, kdis, kreen, kupdateRoot common.Address) (*core.ID, *core.ProofClaim, error)
}
type ServiceImpl struct {
cs claimsrv.Service
}
func New(cs claimsrv.Service) *ServiceImpl {
return &ServiceImpl{
cs: cs,
}
}
// CreateIdGenesis initializes the id MerkleTree with the given the kop, kdisable,
// kreenable and kupdateRoots public keys. Where the id is calculated a MerkleTree containing
// that initial data, calculated in the function CalculateIdGenesis()
func (is *ServiceImpl) CreateIdGenesis(kop *babyjub.PublicKey, kdis, kreen, kupdateRoot common.Address) (*core.ID, *core.ProofClaim, error) {
id, proofClaims, err := core.CalculateIdGenesis(kop, kdis, kreen, kupdateRoot)
if err != nil {
return nil, nil, err
}
// add the claims into the storage merkletree of that identity
stoUserId := is.cs.MT().Storage().WithPrefix(id.Bytes())
userMT, err := merkletree.NewMerkleTree(stoUserId, 140)
if err != nil {
return nil, nil, err
}
proofClaimsList := []core.ProofClaim{proofClaims.KOp, proofClaims.KDis,
proofClaims.KReen, proofClaims.KUpdateRoot}
for _, proofClaim := range proofClaimsList {
err = userMT.Add(&merkletree.Entry{Data: *proofClaim.Leaf})
if err != nil {
return nil, nil, err
}
}
// create new ClaimSetRootKey
claimSetRootKey, err := core.NewClaimSetRootKey(*id, *userMT.RootKey())
if err != nil {
return nil, nil, err
}
// add User's Id Merkle Root into the Relay's Merkle Tree
err = is.cs.MT().Add(claimSetRootKey.Entry())
if err != nil {
return nil, nil, err
}
// update Relay's Root in the Smart Contract
is.cs.RootSrv().SetRoot(*is.cs.MT().RootKey())
return id, &proofClaims.KOp, nil
}