Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
0ccc4d97
Commit
0ccc4d97
authored
Jan 18, 2021
by
madengji
Committed by
vipwzw
Sep 18, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add checkTx
parent
aa4ca7cd
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
96 additions
and
48 deletions
+96
-48
chain33.para.toml
chain33.para.toml
+6
-3
paracreate.go
plugin/consensus/para/paracreate.go
+1
-0
util.go
plugin/dapp/mix/cmd/gnark/circuit/util.go
+5
-3
authorize.go
plugin/dapp/mix/executor/authorize.go
+1
-1
config.go
plugin/dapp/mix/executor/config.go
+5
-4
deposit.go
plugin/dapp/mix/executor/deposit.go
+4
-3
mix.go
plugin/dapp/mix/executor/mix.go
+21
-0
transfer.go
plugin/dapp/mix/executor/transfer.go
+31
-20
withdraw.go
plugin/dapp/mix/executor/withdraw.go
+7
-6
mixsignature.go
plugin/dapp/mix/wallet/mixsignature.go
+15
-8
No files found.
chain33.para.toml
View file @
0ccc4d97
...
@@ -73,7 +73,8 @@ grpcFuncWhitelist=["*"]
...
@@ -73,7 +73,8 @@ grpcFuncWhitelist=["*"]
[mempool]
[mempool]
name
=
"para"
name
=
"para"
poolCacheSize
=
10240
poolCacheSize
=
10240
minTxFeeRate
=
100000
#平行链的最小feeRate为0
#minTxFeeRate=100000
maxTxNumPerAccount
=
10000
maxTxNumPerAccount
=
10000
[consensus]
[consensus]
...
@@ -119,11 +120,13 @@ writeBlockSeconds=2
...
@@ -119,11 +120,13 @@ writeBlockSeconds=2
authAccount
=
""
authAccount
=
""
#创世地址额度
#创世地址额度
genesisAmount
=
100000000
genesisAmount
=
100000000
#主链计算blockhash forkheight,需要和主链保持严格一致,不可修改,
209186
是bityuan主链对应高度, ycc或其他按实际修改
#主链计算blockhash forkheight,需要和主链保持严格一致,不可修改,
1
是bityuan主链对应高度, ycc或其他按实际修改
mainBlockHashForkHeight
=
209186
mainBlockHashForkHeight
=
1
#主链支持平行链共识tx分叉高度,需要和主链保持严格一致,不可修改,2270000是bityuan主链对应高度, ycc或其他按实际修改
#主链支持平行链共识tx分叉高度,需要和主链保持严格一致,不可修改,2270000是bityuan主链对应高度, ycc或其他按实际修改
#不可为0,主链Local时候需特殊配置
mainForkParacrossCommitTx
=
2270000
mainForkParacrossCommitTx
=
2270000
#主链开启循环检查共识交易done的fork高度,需要和主链保持严格一致,不可修改,4320000是bityuan主链对应高度, ycc或其他按实际修改
#主链开启循环检查共识交易done的fork高度,需要和主链保持严格一致,不可修改,4320000是bityuan主链对应高度, ycc或其他按实际修改
#不可为0,主链Local时候需特殊配置
mainLoopCheckCommitTxDoneForkHeight
=
4320000
mainLoopCheckCommitTxDoneForkHeight
=
4320000
#无平行链交易的主链区块间隔,平行链产生一个空块,从高度0开始,配置[blockHeight:interval],比如["0:50","1000:100"]
#无平行链交易的主链区块间隔,平行链产生一个空块,从高度0开始,配置[blockHeight:interval],比如["0:50","1000:100"]
emptyBlockInterval
=
["0:50"]
emptyBlockInterval
=
["0:50"]
...
...
plugin/consensus/para/paracreate.go
View file @
0ccc4d97
...
@@ -326,6 +326,7 @@ func validMainBlocks(txs *types.ParaTxDetails) *types.ParaTxDetails {
...
@@ -326,6 +326,7 @@ func validMainBlocks(txs *types.ParaTxDetails) *types.ParaTxDetails {
return
txs
return
txs
}
}
//主链blockchain支持按过滤平行链交易后,此接口弃用
func
(
client
*
client
)
requestTxsFromBlock
(
currSeq
int64
,
preMainBlockHash
[]
byte
)
(
*
types
.
ParaTxDetails
,
error
)
{
func
(
client
*
client
)
requestTxsFromBlock
(
currSeq
int64
,
preMainBlockHash
[]
byte
)
(
*
types
.
ParaTxDetails
,
error
)
{
cfg
:=
client
.
GetAPI
()
.
GetConfig
()
cfg
:=
client
.
GetAPI
()
.
GetConfig
()
blockSeq
,
err
:=
client
.
GetBlockOnMainBySeq
(
currSeq
)
blockSeq
,
err
:=
client
.
GetBlockOnMainBySeq
(
currSeq
)
...
...
plugin/dapp/mix/cmd/gnark/circuit/util.go
View file @
0ccc4d97
...
@@ -73,9 +73,11 @@ func CommitValuePart(circuit *frontend.CS, spendValue *frontend.Constraint) {
...
@@ -73,9 +73,11 @@ func CommitValuePart(circuit *frontend.CS, spendValue *frontend.Constraint) {
// set point G in the circuit
// set point G in the circuit
pointGSnark
:=
twistededwards_gadget
.
NewPointGadget
(
circuit
,
nil
,
nil
)
pointGSnark
:=
twistededwards_gadget
.
NewPointGadget
(
circuit
,
nil
,
nil
)
//scalar := circuit.ALLOCATE("-1")
//to avoid <0 values input
//100000000*1e8 to avoid <0 values input
//negOne := circuit.ALLOCATE("-1")
circuit
.
MUSTBE_LESS_OR_EQ
(
spendValue
,
10000000000000000
,
256
)
//negSpendVal := circuit.MUL(spendValue,negOne)
//circuit.MUSTBE_LESS_OR_EQ(negSpendVal, 0, 256)
circuit
.
MUSTBE_LESS_OR_EQ
(
spendValue
,
1000000000000000000
,
256
)
// set point G in the circuit
// set point G in the circuit
pointGSnark
.
ScalarMulFixedBase
(
circuit
,
edgadget
.
BaseX
,
edgadget
.
BaseY
,
spendValue
,
edgadget
)
pointGSnark
.
ScalarMulFixedBase
(
circuit
,
edgadget
.
BaseX
,
edgadget
.
BaseY
,
spendValue
,
edgadget
)
...
...
plugin/dapp/mix/executor/authorize.go
View file @
0ccc4d97
...
@@ -67,7 +67,7 @@ func (a *action) authorizeVerify(proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePubl
...
@@ -67,7 +67,7 @@ func (a *action) authorizeVerify(proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePubl
}
}
//zk-proof校验
//zk-proof校验
err
=
a
.
zkProofVerify
(
proof
,
mixTy
.
VerifyType_AUTHORIZE
)
err
=
zkProofVerify
(
a
.
db
,
proof
,
mixTy
.
VerifyType_AUTHORIZE
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
...
plugin/dapp/mix/executor/config.go
View file @
0ccc4d97
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
package
executor
package
executor
import
(
import
(
dbm
"github.com/33cn/chain33/common/db"
manager
"github.com/33cn/chain33/system/dapp/manage/types"
manager
"github.com/33cn/chain33/system/dapp/manage/types"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
...
@@ -60,9 +61,9 @@ func makeConfigVerifyKeyReceipt(data *mixTy.ZkVerifyKeys) *types.Receipt {
...
@@ -60,9 +61,9 @@ func makeConfigVerifyKeyReceipt(data *mixTy.ZkVerifyKeys) *types.Receipt {
}
}
func
(
a
*
action
)
getVerifyKeys
(
)
(
*
mixTy
.
ZkVerifyKeys
,
error
)
{
func
getVerifyKeys
(
db
dbm
.
KV
)
(
*
mixTy
.
ZkVerifyKeys
,
error
)
{
key
:=
getVerifyKeysKey
()
key
:=
getVerifyKeysKey
()
v
,
err
:=
a
.
db
.
Get
(
key
)
v
,
err
:=
db
.
Get
(
key
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get db verify key"
)
return
nil
,
errors
.
Wrapf
(
err
,
"get db verify key"
)
}
}
...
@@ -76,7 +77,7 @@ func (a *action) getVerifyKeys() (*mixTy.ZkVerifyKeys, error) {
...
@@ -76,7 +77,7 @@ func (a *action) getVerifyKeys() (*mixTy.ZkVerifyKeys, error) {
}
}
func
(
a
*
action
)
ConfigAddVerifyKey
(
newKey
*
mixTy
.
ZkVerifyKey
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
ConfigAddVerifyKey
(
newKey
*
mixTy
.
ZkVerifyKey
)
(
*
types
.
Receipt
,
error
)
{
keys
,
err
:=
a
.
getVerifyKeys
(
)
keys
,
err
:=
getVerifyKeys
(
a
.
db
)
if
isNotFound
(
errors
.
Cause
(
err
))
{
if
isNotFound
(
errors
.
Cause
(
err
))
{
keys
:=
&
mixTy
.
ZkVerifyKeys
{}
keys
:=
&
mixTy
.
ZkVerifyKeys
{}
keys
.
Data
=
append
(
keys
.
Data
,
newKey
)
keys
.
Data
=
append
(
keys
.
Data
,
newKey
)
...
@@ -92,7 +93,7 @@ func (a *action) ConfigAddVerifyKey(newKey *mixTy.ZkVerifyKey) (*types.Receipt,
...
@@ -92,7 +93,7 @@ func (a *action) ConfigAddVerifyKey(newKey *mixTy.ZkVerifyKey) (*types.Receipt,
}
}
func
(
a
*
action
)
ConfigDeleteVerifyKey
(
config
*
mixTy
.
ZkVerifyKey
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
ConfigDeleteVerifyKey
(
config
*
mixTy
.
ZkVerifyKey
)
(
*
types
.
Receipt
,
error
)
{
keys
,
err
:=
a
.
getVerifyKeys
(
)
keys
,
err
:=
getVerifyKeys
(
a
.
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
...
plugin/dapp/mix/executor/deposit.go
View file @
0ccc4d97
...
@@ -10,6 +10,7 @@ import (
...
@@ -10,6 +10,7 @@ import (
"strconv"
"strconv"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/address"
dbm
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/mix/executor/zksnark"
"github.com/33cn/plugin/plugin/dapp/mix/executor/zksnark"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
...
@@ -23,8 +24,8 @@ func makeNullifierSetReceipt(hash string, data proto.Message) *types.Receipt {
...
@@ -23,8 +24,8 @@ func makeNullifierSetReceipt(hash string, data proto.Message) *types.Receipt {
}
}
func
(
a
*
action
)
zkProofVerify
(
proof
*
mixTy
.
ZkProofInfo
,
verifyTy
mixTy
.
VerifyType
)
error
{
func
zkProofVerify
(
db
dbm
.
KV
,
proof
*
mixTy
.
ZkProofInfo
,
verifyTy
mixTy
.
VerifyType
)
error
{
keys
,
err
:=
a
.
getVerifyKeys
(
)
keys
,
err
:=
getVerifyKeys
(
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -65,7 +66,7 @@ func (a *action) depositVerify(proof *mixTy.ZkProofInfo) (string, uint64, error)
...
@@ -65,7 +66,7 @@ func (a *action) depositVerify(proof *mixTy.ZkProofInfo) (string, uint64, error)
return
""
,
0
,
errors
.
Wrapf
(
err
,
"parseUint=%s"
,
input
.
Amount
)
return
""
,
0
,
errors
.
Wrapf
(
err
,
"parseUint=%s"
,
input
.
Amount
)
}
}
err
=
a
.
zkProofVerify
(
proof
,
mixTy
.
VerifyType_DEPOSIT
)
err
=
zkProofVerify
(
a
.
db
,
proof
,
mixTy
.
VerifyType_DEPOSIT
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
0
,
err
return
""
,
0
,
err
}
}
...
...
plugin/dapp/mix/executor/mix.go
View file @
0ccc4d97
...
@@ -50,3 +50,24 @@ func newMix() drivers.Driver {
...
@@ -50,3 +50,24 @@ func newMix() drivers.Driver {
func
(
m
*
Mix
)
GetDriverName
()
string
{
func
(
m
*
Mix
)
GetDriverName
()
string
{
return
mixTy
.
MixX
return
mixTy
.
MixX
}
}
// CheckTx check transaction
func
(
m
*
Mix
)
CheckTx
(
tx
*
types
.
Transaction
,
index
int
)
error
{
action
:=
new
(
mixTy
.
MixAction
)
if
err
:=
types
.
Decode
(
tx
.
Payload
,
action
);
err
!=
nil
{
mlog
.
Error
(
"CheckTx decode"
,
"err"
,
err
)
return
err
}
if
action
.
Ty
!=
mixTy
.
MixActionTransfer
{
// mix隐私交易,只私对私需要特殊签名验证
return
m
.
DriverBase
.
CheckTx
(
tx
,
index
)
}
_
,
_
,
err
:=
MixTransferInfoVerify
(
m
.
GetStateDB
(),
action
.
GetTransfer
())
if
err
!=
nil
{
mlog
.
Error
(
"checkTx"
,
"err"
,
err
)
return
err
}
return
nil
}
plugin/dapp/mix/executor/transfer.go
View file @
0ccc4d97
...
@@ -12,6 +12,7 @@ import (
...
@@ -12,6 +12,7 @@ import (
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/consensys/gurvy/bn256/twistededwards"
"github.com/consensys/gurvy/bn256/twistededwards"
dbm
"github.com/33cn/chain33/common/db"
"github.com/consensys/gurvy/bn256/fr"
"github.com/consensys/gurvy/bn256/fr"
"github.com/pkg/errors"
"github.com/pkg/errors"
)
)
...
@@ -21,7 +22,7 @@ import (
...
@@ -21,7 +22,7 @@ import (
2. check if exist in authorize pool and nullifier pool
2. check if exist in authorize pool and nullifier pool
*/
*/
func
(
a
*
action
)
transferInputVerify
(
proof
*
mixTy
.
ZkProofInfo
)
(
*
mixTy
.
TransferInputPublicInput
,
error
)
{
func
transferInputVerify
(
db
dbm
.
KV
,
proof
*
mixTy
.
ZkProofInfo
)
(
*
mixTy
.
TransferInputPublicInput
,
error
)
{
var
input
mixTy
.
TransferInputPublicInput
var
input
mixTy
.
TransferInputPublicInput
data
,
err
:=
hex
.
DecodeString
(
proof
.
PublicInput
)
data
,
err
:=
hex
.
DecodeString
(
proof
.
PublicInput
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -32,12 +33,12 @@ func (a *action) transferInputVerify(proof *mixTy.ZkProofInfo) (*mixTy.TransferI
...
@@ -32,12 +33,12 @@ func (a *action) transferInputVerify(proof *mixTy.ZkProofInfo) (*mixTy.TransferI
return
nil
,
errors
.
Wrapf
(
err
,
"transferInput verify unmarshal string=%s"
,
proof
.
PublicInput
)
return
nil
,
errors
.
Wrapf
(
err
,
"transferInput verify unmarshal string=%s"
,
proof
.
PublicInput
)
}
}
err
=
a
.
spendVerify
(
input
.
TreeRootHash
,
input
.
NullifierHash
,
input
.
AuthorizeSpendHash
)
err
=
spendVerify
(
db
,
input
.
TreeRootHash
,
input
.
NullifierHash
,
input
.
AuthorizeSpendHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"transferInput verify spendVerify"
)
return
nil
,
errors
.
Wrap
(
err
,
"transferInput verify spendVerify"
)
}
}
err
=
a
.
zkProofVerify
(
proof
,
mixTy
.
VerifyType_TRANSFERINPUT
)
err
=
zkProofVerify
(
db
,
proof
,
mixTy
.
VerifyType_TRANSFERINPUT
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"transferInput verify proof verify"
)
return
nil
,
errors
.
Wrap
(
err
,
"transferInput verify proof verify"
)
}
}
...
@@ -51,7 +52,7 @@ func (a *action) transferInputVerify(proof *mixTy.ZkProofInfo) (*mixTy.TransferI
...
@@ -51,7 +52,7 @@ func (a *action) transferInputVerify(proof *mixTy.ZkProofInfo) (*mixTy.TransferI
2. check if exist in authorize pool and nullifier pool
2. check if exist in authorize pool and nullifier pool
*/
*/
func
(
a
*
action
)
transferOutputVerify
(
proof
*
mixTy
.
ZkProofInfo
)
(
*
mixTy
.
TransferOutputPublicInput
,
error
)
{
func
transferOutputVerify
(
db
dbm
.
KV
,
proof
*
mixTy
.
ZkProofInfo
)
(
*
mixTy
.
TransferOutputPublicInput
,
error
)
{
var
input
mixTy
.
TransferOutputPublicInput
var
input
mixTy
.
TransferOutputPublicInput
data
,
err
:=
hex
.
DecodeString
(
proof
.
PublicInput
)
data
,
err
:=
hex
.
DecodeString
(
proof
.
PublicInput
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -62,7 +63,7 @@ func (a *action) transferOutputVerify(proof *mixTy.ZkProofInfo) (*mixTy.Transfer
...
@@ -62,7 +63,7 @@ func (a *action) transferOutputVerify(proof *mixTy.ZkProofInfo) (*mixTy.Transfer
return
nil
,
errors
.
Wrapf
(
err
,
"Output verify unmarshal string=%s"
,
proof
.
PublicInput
)
return
nil
,
errors
.
Wrapf
(
err
,
"Output verify unmarshal string=%s"
,
proof
.
PublicInput
)
}
}
err
=
a
.
zkProofVerify
(
proof
,
mixTy
.
VerifyType_TRANSFEROUTPUT
)
err
=
zkProofVerify
(
db
,
proof
,
mixTy
.
VerifyType_TRANSFEROUTPUT
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"Output verify proof verify"
)
return
nil
,
errors
.
Wrap
(
err
,
"Output verify proof verify"
)
}
}
...
@@ -75,10 +76,11 @@ func getFee() *twistededwards.Point {
...
@@ -75,10 +76,11 @@ func getFee() *twistededwards.Point {
//手续费 可配, 缺省100000, 即0.001, point=fee*G + 0*H
//手续费 可配, 缺省100000, 即0.001, point=fee*G + 0*H
var
fee
fr
.
Element
var
fee
fr
.
Element
fee
.
SetUint64
(
100000
)
.
FromMont
()
fee
.
SetUint64
(
100000
)
.
FromMont
()
var
pFee
twistededwards
.
Point
var
pointFee
twistededwards
.
Point
ed
:=
twistededwards
.
GetEdwardsCurve
()
ed
:=
twistededwards
.
GetEdwardsCurve
()
pFee
.
ScalarMul
(
&
ed
.
Base
,
fee
)
p
oint
Fee
.
ScalarMul
(
&
ed
.
Base
,
fee
)
return
&
pFee
return
&
p
oint
Fee
}
}
func
VerifyCommitValues
(
inputs
[]
*
mixTy
.
TransferInputPublicInput
,
outputs
[]
*
mixTy
.
TransferOutputPublicInput
)
bool
{
func
VerifyCommitValues
(
inputs
[]
*
mixTy
.
TransferInputPublicInput
,
outputs
[]
*
mixTy
.
TransferOutputPublicInput
)
bool
{
...
@@ -115,33 +117,42 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
...
@@ -115,33 +117,42 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
return
false
return
false
}
}
/*
func
MixTransferInfoVerify
(
db
dbm
.
KV
,
transfer
*
mixTy
.
MixTransferAction
)
([]
*
mixTy
.
TransferInputPublicInput
,
[]
*
mixTy
.
TransferOutputPublicInput
,
error
)
{
1. verify(zk-proof, sum value of spend and new commits)
2. check if exist in authorize pool and nullifier pool
3. add nullifier to pool
*/
func
(
a
*
action
)
Transfer
(
transfer
*
mixTy
.
MixTransferAction
)
(
*
types
.
Receipt
,
error
)
{
var
inputs
[]
*
mixTy
.
TransferInputPublicInput
var
inputs
[]
*
mixTy
.
TransferInputPublicInput
var
outputs
[]
*
mixTy
.
TransferOutputPublicInput
var
outputs
[]
*
mixTy
.
TransferOutputPublicInput
for
_
,
k
:=
range
transfer
.
Input
{
for
_
,
k
:=
range
transfer
.
Input
{
in
,
err
:=
a
.
transferInputVerify
(
k
)
in
,
err
:=
transferInputVerify
(
db
,
k
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
nil
,
err
}
}
inputs
=
append
(
inputs
,
in
)
inputs
=
append
(
inputs
,
in
)
}
}
for
_
,
k
:=
range
transfer
.
Output
{
for
_
,
k
:=
range
transfer
.
Output
{
out
,
err
:=
a
.
transferOutputVerify
(
k
)
out
,
err
:=
transferOutputVerify
(
db
,
k
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
nil
,
err
}
}
outputs
=
append
(
outputs
,
out
)
outputs
=
append
(
outputs
,
out
)
}
}
if
!
VerifyCommitValues
(
inputs
,
outputs
)
{
if
!
VerifyCommitValues
(
inputs
,
outputs
)
{
return
nil
,
errors
.
Wrap
(
mixTy
.
ErrSpendInOutValueNotMatch
,
"verifyValue"
)
return
nil
,
nil
,
errors
.
Wrap
(
mixTy
.
ErrSpendInOutValueNotMatch
,
"verifyValue"
)
}
return
inputs
,
outputs
,
nil
}
/*
1. verify(zk-proof, sum value of spend and new commits)
2. check if exist in authorize pool and nullifier pool
3. add nullifier to pool
*/
func
(
a
*
action
)
Transfer
(
transfer
*
mixTy
.
MixTransferAction
)
(
*
types
.
Receipt
,
error
)
{
inputs
,
outputs
,
err
:=
MixTransferInfoVerify
(
a
.
db
,
transfer
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"Transfer.MixTransferInfoVerify"
)
}
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
...
@@ -157,7 +168,7 @@ func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, er
...
@@ -157,7 +168,7 @@ func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, er
}
}
rpt
,
err
:=
pushTree
(
a
.
db
,
leaves
)
rpt
,
err
:=
pushTree
(
a
.
db
,
leaves
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
ors
.
Wrap
(
err
,
"transfer.pushTree"
)
}
}
mergeReceipt
(
receipt
,
rpt
)
mergeReceipt
(
receipt
,
rpt
)
return
receipt
,
nil
return
receipt
,
nil
...
...
plugin/dapp/mix/executor/withdraw.go
View file @
0ccc4d97
...
@@ -10,21 +10,22 @@ import (
...
@@ -10,21 +10,22 @@ import (
"strconv"
"strconv"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/address"
dbm
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/pkg/errors"
"github.com/pkg/errors"
)
)
func
(
a
*
action
)
spendVerify
(
treeRootHash
,
nulliferHash
,
authorizeSpendHash
string
)
error
{
func
spendVerify
(
db
dbm
.
KV
,
treeRootHash
,
nulliferHash
,
authorizeSpendHash
string
)
error
{
//zk-proof校验
//zk-proof校验
//check tree rootHash exist
//check tree rootHash exist
if
!
checkTreeRootHashExist
(
a
.
db
,
transferFr2Bytes
(
treeRootHash
))
{
if
!
checkTreeRootHashExist
(
db
,
transferFr2Bytes
(
treeRootHash
))
{
return
errors
.
Wrapf
(
mixTy
.
ErrTreeRootHashNotFound
,
"roothash=%s"
,
treeRootHash
)
return
errors
.
Wrapf
(
mixTy
.
ErrTreeRootHashNotFound
,
"roothash=%s"
,
treeRootHash
)
}
}
//nullifier should not exist
//nullifier should not exist
nullifierKey
:=
calcNullifierHashKey
(
nulliferHash
)
nullifierKey
:=
calcNullifierHashKey
(
nulliferHash
)
_
,
err
:=
a
.
db
.
Get
(
nullifierKey
)
_
,
err
:=
db
.
Get
(
nullifierKey
)
if
err
==
nil
{
if
err
==
nil
{
return
errors
.
Wrapf
(
mixTy
.
ErrNulliferHashExist
,
"nullifier=%s"
,
nulliferHash
)
return
errors
.
Wrapf
(
mixTy
.
ErrNulliferHashExist
,
"nullifier=%s"
,
nulliferHash
)
}
}
...
@@ -35,7 +36,7 @@ func (a *action) spendVerify(treeRootHash, nulliferHash, authorizeSpendHash stri
...
@@ -35,7 +36,7 @@ func (a *action) spendVerify(treeRootHash, nulliferHash, authorizeSpendHash stri
// authorize should exist if needed
// authorize should exist if needed
if
len
(
authorizeSpendHash
)
>
1
{
if
len
(
authorizeSpendHash
)
>
1
{
authKey
:=
calcAuthorizeSpendHashKey
(
authorizeSpendHash
)
authKey
:=
calcAuthorizeSpendHashKey
(
authorizeSpendHash
)
_
,
err
=
a
.
db
.
Get
(
authKey
)
_
,
err
=
db
.
Get
(
authKey
)
if
err
!=
nil
{
if
err
!=
nil
{
return
errors
.
Wrapf
(
err
,
"authorize=%s"
,
authorizeSpendHash
)
return
errors
.
Wrapf
(
err
,
"authorize=%s"
,
authorizeSpendHash
)
}
}
...
@@ -60,12 +61,12 @@ func (a *action) withdrawVerify(proof *mixTy.ZkProofInfo) (string, uint64, error
...
@@ -60,12 +61,12 @@ func (a *action) withdrawVerify(proof *mixTy.ZkProofInfo) (string, uint64, error
return
""
,
0
,
errors
.
Wrapf
(
err
,
"parseUint=%s"
,
input
.
Amount
)
return
""
,
0
,
errors
.
Wrapf
(
err
,
"parseUint=%s"
,
input
.
Amount
)
}
}
err
=
a
.
spendVerify
(
input
.
TreeRootHash
,
input
.
NullifierHash
,
input
.
AuthorizeSpendHash
)
err
=
spendVerify
(
a
.
db
,
input
.
TreeRootHash
,
input
.
NullifierHash
,
input
.
AuthorizeSpendHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
0
,
err
return
""
,
0
,
err
}
}
err
=
a
.
zkProofVerify
(
proof
,
mixTy
.
VerifyType_WITHDRAW
)
err
=
zkProofVerify
(
a
.
db
,
proof
,
mixTy
.
VerifyType_WITHDRAW
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
0
,
err
return
""
,
0
,
err
}
}
...
...
plugin/dapp/mix/wallet/mixsignature.go
View file @
0ccc4d97
...
@@ -12,6 +12,8 @@ import (
...
@@ -12,6 +12,8 @@ import (
"bytes"
"bytes"
"fmt"
"fmt"
"github.com/pkg/errors"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/common/crypto"
...
@@ -44,7 +46,7 @@ func (r *MixSignature) Bytes() []byte {
...
@@ -44,7 +46,7 @@ func (r *MixSignature) Bytes() []byte {
// IsZero check is zero
// IsZero check is zero
func
(
r
*
MixSignature
)
IsZero
()
bool
{
func
(
r
*
MixSignature
)
IsZero
()
bool
{
return
false
return
len
(
r
.
sign
.
Output
)
==
0
||
len
(
r
.
sign
.
Input
)
==
0
}
}
// String convert to string
// String convert to string
...
@@ -100,14 +102,14 @@ func (pubkey *MixSignPublicKey) Bytes() []byte {
...
@@ -100,14 +102,14 @@ func (pubkey *MixSignPublicKey) Bytes() []byte {
return
pubkey
.
key
[
:
]
return
pubkey
.
key
[
:
]
}
}
func
verifyCommitAmount
(
transfer
*
mixTy
.
MixTransferAction
)
bool
{
func
verifyCommitAmount
(
transfer
*
mixTy
.
MixTransferAction
)
error
{
var
inputs
[]
*
mixTy
.
TransferInputPublicInput
var
inputs
[]
*
mixTy
.
TransferInputPublicInput
var
outputs
[]
*
mixTy
.
TransferOutputPublicInput
var
outputs
[]
*
mixTy
.
TransferOutputPublicInput
for
_
,
k
:=
range
transfer
.
Input
{
for
_
,
k
:=
range
transfer
.
Input
{
v
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFERINPUT
,
k
.
PublicInput
)
v
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFERINPUT
,
k
.
PublicInput
)
if
err
!=
nil
{
if
err
!=
nil
{
return
false
return
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"decode transfer Input"
)
}
}
inputs
=
append
(
inputs
,
v
.
(
*
mixTy
.
TransferInputPublicInput
))
inputs
=
append
(
inputs
,
v
.
(
*
mixTy
.
TransferInputPublicInput
))
}
}
...
@@ -115,15 +117,15 @@ func verifyCommitAmount(transfer *mixTy.MixTransferAction) bool {
...
@@ -115,15 +117,15 @@ func verifyCommitAmount(transfer *mixTy.MixTransferAction) bool {
for
_
,
k
:=
range
transfer
.
Output
{
for
_
,
k
:=
range
transfer
.
Output
{
v
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
k
.
PublicInput
)
v
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
k
.
PublicInput
)
if
err
!=
nil
{
if
err
!=
nil
{
return
false
return
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"decode transfer output"
)
}
}
outputs
=
append
(
outputs
,
v
.
(
*
mixTy
.
TransferOutputPublicInput
))
outputs
=
append
(
outputs
,
v
.
(
*
mixTy
.
TransferOutputPublicInput
))
}
}
if
!
mixExec
.
VerifyCommitValues
(
inputs
,
outputs
)
{
if
!
mixExec
.
VerifyCommitValues
(
inputs
,
outputs
)
{
return
false
return
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"verify commit amount"
)
}
}
return
true
return
nil
}
}
// VerifyBytes verify bytes
// VerifyBytes verify bytes
...
@@ -135,23 +137,28 @@ func (pubkey *MixSignPublicKey) VerifyBytes(msg []byte, sign crypto.Signature) b
...
@@ -135,23 +137,28 @@ func (pubkey *MixSignPublicKey) VerifyBytes(msg []byte, sign crypto.Signature) b
tx
:=
new
(
types
.
Transaction
)
tx
:=
new
(
types
.
Transaction
)
if
err
:=
types
.
Decode
(
msg
,
tx
);
err
!=
nil
||
!
bytes
.
Equal
([]
byte
(
mixTy
.
MixX
),
types
.
GetRealExecName
(
tx
.
Execer
))
{
if
err
:=
types
.
Decode
(
msg
,
tx
);
err
!=
nil
||
!
bytes
.
Equal
([]
byte
(
mixTy
.
MixX
),
types
.
GetRealExecName
(
tx
.
Execer
))
{
// mix特定执行器的签名
// mix特定执行器的签名
bizlog
.
Error
(
"pubkey.VerifyBytes"
,
"err"
,
err
,
"exec"
,
string
(
types
.
GetRealExecName
(
tx
.
Execer
)))
return
false
return
false
}
}
action
:=
new
(
mixTy
.
MixAction
)
action
:=
new
(
mixTy
.
MixAction
)
if
err
:=
types
.
Decode
(
tx
.
Payload
,
action
);
err
!=
nil
{
if
err
:=
types
.
Decode
(
tx
.
Payload
,
action
);
err
!=
nil
{
bizlog
.
Error
(
"pubkey.VerifyBytes decode tx"
)
return
false
return
false
}
}
if
action
.
Ty
!=
mixTy
.
MixActionTransfer
{
if
action
.
Ty
!=
mixTy
.
MixActionTransfer
{
// mix隐私交易,只私对私需要特殊签名验证
// mix隐私交易,只私对私需要特殊签名验证
bizlog
.
Error
(
"pubkey.VerifyBytes"
,
"ty"
,
action
.
Ty
)
return
false
return
false
}
}
//确保签名数据和tx 一致
//确保签名数据和tx 一致
if
!
bytes
.
Equal
(
sign
.
Bytes
(),
common
.
BytesToHash
(
types
.
Encode
(
action
.
GetTransfer
()))
.
Bytes
())
{
if
!
bytes
.
Equal
(
sign
.
Bytes
(),
common
.
BytesToHash
(
types
.
Encode
(
action
.
GetTransfer
()))
.
Bytes
())
{
bizlog
.
Error
(
"pubkey.VerifyBytes tx and sign not match"
,
"sign"
,
common
.
ToHex
(
sign
.
Bytes
()),
"tx"
,
common
.
ToHex
(
common
.
BytesToHash
(
types
.
Encode
(
action
.
GetTransfer
()))
.
Bytes
()))
return
false
return
false
}
}
if
!
verifyCommitAmount
(
action
.
GetTransfer
())
{
if
err
:=
verifyCommitAmount
(
action
.
GetTransfer
());
err
!=
nil
{
bizlog
.
Error
(
"pubkey.VerifyBytes verify amount"
,
"err"
,
err
)
return
false
return
false
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment