/
deposit.go
88 lines (74 loc) · 2.61 KB
/
deposit.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/consensys/gnark/frontend"
"github.com/golang/protobuf/proto"
"github.com/pkg/errors"
)
func makeNullifierSetReceipt(hash string, data proto.Message) *types.Receipt {
return makeReceipt(calcNullifierHashKey(hash), mixTy.TyLogNulliferSet, data)
}
func (a *action) depositVerify(proof *mixTy.ZkProofInfo) (*mixTy.DepositCircuit, error) {
var input mixTy.DepositCircuit
err := mixTy.ConstructCircuitPubInput(proof.PublicInput, &input)
if err != nil {
return nil, errors.Wrapf(err, "setCircuitPubInput")
}
err = zkProofVerify(a.db, proof, mixTy.VerifyType_DEPOSIT)
if err != nil {
return nil, errors.Wrapf(err, "verify fail for input=%s", proof.PublicInput)
}
return &input, nil
}
/*
1. verify zk-proof
2. verify commit value vs value
3. deposit to mix contract
4. add new commits to merkle tree
*/
func (a *action) Deposit(deposit *mixTy.MixDepositAction) (*types.Receipt, error) {
var notes []string
var sum uint64
//1. zk-proof校验
for _, p := range deposit.Proofs {
input, err := a.depositVerify(p)
if err != nil {
return nil, errors.Wrap(err, "get pub input")
}
v := frontend.FromInterface(frontend.GetAssignedValue(input.Amount))
sum += v.Uint64()
noteHash := frontend.FromInterface(frontend.GetAssignedValue(input.NoteHash))
notes = append(notes, noteHash.String())
}
//存款
cfg := a.api.GetConfig()
execer, symbol := mixTy.GetAssetExecSymbol(cfg, deposit.AssetExec, deposit.AssetSymbol)
accoutDb, err := createAccount(cfg, execer, symbol, a.db)
if err != nil {
return nil, errors.Wrapf(err, "createAccount,execer=%s,symbol=%s", execer, symbol)
}
//主链上存入toAddr为mix 执行器地址,平行链上为user.p.{}.mix执行器地址,execAddr和toAddr一致
execAddr := address.ExecAddress(string(a.tx.Execer))
receipt, err := accoutDb.ExecTransfer(a.fromaddr, execAddr, execAddr, int64(sum))
if err != nil {
return nil, errors.Wrapf(err, "account save to exec")
}
//push new commit to merkle tree
var leaves [][]byte
for _, n := range notes {
leaves = append(leaves, mixTy.Str2Byte(n))
}
conf := types.ConfSub(cfg, mixTy.MixX)
maxTreeLeaves := conf.GInt("maxTreeLeaves")
rpt, err := pushTree(a.db, execer, symbol, leaves, int32(maxTreeLeaves))
if err != nil {
return nil, errors.Wrap(err, "pushTree")
}
mergeReceipt(receipt, rpt)
return receipt, nil
}