Skip to content

Commit 31d448d

Browse files
committed
Add anonymous envelope (zk) verification with test
1 parent 8239102 commit 31d448d

File tree

7 files changed

+412
-52
lines changed

7 files changed

+412
-52
lines changed

crypto/zk/utils.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Package zk provides utilities around the zkSNARK (Groth16) tooling.
2+
package zk
3+
4+
import (
5+
"fmt"
6+
"io/ioutil"
7+
"math/big"
8+
9+
"github.com/vocdoni/go-snark/parsers"
10+
"github.com/vocdoni/go-snark/types"
11+
models "go.vocdoni.io/proto/build/go/models"
12+
)
13+
14+
func LoadVkFromFile(path string) (*types.Vk, error) {
15+
vkJSON, err := ioutil.ReadFile(path)
16+
if err != nil {
17+
return nil, err
18+
}
19+
20+
vk, err := parsers.ParseVk(vkJSON)
21+
if err != nil {
22+
return nil, err
23+
}
24+
return vk, nil
25+
}
26+
27+
func ProtobufZKProofToCircomProof(p *models.ProofZkSNARK) (*types.Proof, []*big.Int, error) {
28+
if len(p.A) != 3 && len(p.B) != 6 && len(p.C) != 3 {
29+
return nil, nil, fmt.Errorf("error on zkProof format")
30+
}
31+
proofString := parsers.ProofString{
32+
A: p.A,
33+
B: [][]string{
34+
{
35+
p.B[0],
36+
p.B[1],
37+
},
38+
{
39+
p.B[2],
40+
p.B[3],
41+
},
42+
{
43+
p.B[4],
44+
p.B[5],
45+
},
46+
},
47+
C: p.C,
48+
}
49+
publicInputsString := p.PublicInputs
50+
51+
// parse zkProof & PublicInputs from tx.Proof
52+
proof, err := parsers.ProofStringToProof(proofString)
53+
if err != nil {
54+
return nil, nil, err
55+
}
56+
publicInputs, err := parsers.PublicSignalsStringToPublicSignals(publicInputsString)
57+
if err != nil {
58+
return nil, nil, err
59+
}
60+
61+
return proof, publicInputs, nil
62+
}

crypto/zk/utils_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package zk
2+
3+
import (
4+
"encoding/json"
5+
"math/big"
6+
"testing"
7+
8+
qt "github.com/frankban/quicktest"
9+
models "go.vocdoni.io/proto/build/go/models"
10+
)
11+
12+
func TestProtobufZKProofToCircomProof(t *testing.T) {
13+
protoProof := &models.ProofZkSNARK{
14+
A: []string{
15+
"17569240301865190069940703408776620561950070507358357198130890464508555015742",
16+
"14719281396036152924308513019111720587276284390020911371919541479835430607528",
17+
"1",
18+
},
19+
B: []string{
20+
"19366523330111704407267566338410994924319459949138724547828188860719056192113",
21+
"3554431156699466263343064300468289853516840393068286815512868805374822045471",
22+
"7069001739799325309551446576989712671469685847725867674777886436500905588451",
23+
"9519609195825772265125524447464801412742967232326200600178197674408796399758",
24+
"1",
25+
"0",
26+
},
27+
C: []string{
28+
"1803067082675811010286176187174786634523306099072027370858753233512049893073",
29+
"12821812994233574817558778896965446058705557189286765124075749479926329638171",
30+
"1",
31+
},
32+
PublicInputs: []string{"1", "2", "3"},
33+
}
34+
proof, pubInputs, err := ProtobufZKProofToCircomProof(protoProof)
35+
qt.Assert(t, err, qt.IsNil)
36+
37+
expectedStr := `{"pi_a":"26d7d66de7e4ed7fa7abf7078ef9e4e45bf0000787c451874ee9f31c930bb63e208ad16ae0f6916670dcf183c1d23efe1e2ddc45dbb138d922c79ad1b4bcdaa8","pi_b":"07dbbc9b161442d63d59869a61a2b1724f49f8ce7cd83f92bc33edf4e697d71f2ad1105288e9d12915b079725ad629845a3c6cdd4311b21778be06cc82ae8271150be869d01f1fcb87fb7f4930e690c3b873d29529f3d9db0f8021253806a88e0fa0e9c753288b4110ef539418f37c30de082a0bc60083222e8ca6694b2ef6e3","pi_c":"03fc7ff321b29905a8a64f324906272e69c9a0e7b097b523ef57fc6a320f5ed11c58e39436354cb151affb97a664401f1eb6b54a9f3a6a366543bf6813f5fd1b"}`
38+
39+
proofJSON, err := json.Marshal(proof)
40+
qt.Assert(t, err, qt.IsNil)
41+
qt.Assert(t, expectedStr, qt.Equals, string(proofJSON))
42+
a := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}
43+
for i := range a {
44+
qt.Assert(t, a[i].String(), qt.Equals, pubInputs[i].String())
45+
}
46+
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ require (
5050
github.com/timshannon/badgerhold/v3 v3.0.0-20210415132401-e7c90fb5919f
5151
github.com/vocdoni/arbo v0.0.0-20210909102959-f09b0b039255
5252
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44
53+
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319
5354
github.com/vocdoni/storage-proofs-eth-go v0.1.6
5455
go.uber.org/zap v1.18.1
55-
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a
56+
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c
5657
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
5758
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d
5859
google.golang.org/protobuf v1.27.1

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHj
354354
github.com/ethereum/go-ethereum v1.8.27/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
355355
github.com/ethereum/go-ethereum v1.9.3/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
356356
github.com/ethereum/go-ethereum v1.9.12/go.mod h1:PvsVkQmhZFx92Y+h2ylythYlheEDt/uBgFbl61Js/jo=
357+
github.com/ethereum/go-ethereum v1.9.13/go.mod h1:qwN9d1GLyDh0N7Ab8bMGd0H9knaji2jOBm2RrMGjXls=
357358
github.com/ethereum/go-ethereum v1.9.20/go.mod h1:JSSTypSMTkGZtAdAChH2wP5dZEvPGh3nUTuDpH+hNrg=
358359
github.com/ethereum/go-ethereum v1.9.23/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM=
359360
github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
@@ -676,6 +677,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
676677
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
677678
github.com/iden3/go-iden3-core v0.0.8-0.20200325104031-1ed04a261b78/go.mod h1:N9xiQvwx5EZhrVuO0hW8GBF9Uy0ZbONdhguPHSC+wQg=
678679
github.com/iden3/go-iden3-crypto v0.0.4/go.mod h1:LLcgB7DLWAUs+8eBSKne+ZHy5z7xtAmlYlEz0M9M8gE=
680+
github.com/iden3/go-iden3-crypto v0.0.5/go.mod h1:XKw1oDwYn2CIxKOtr7m/mL5jMn4mLOxAxtZBRxQBev8=
679681
github.com/iden3/go-iden3-crypto v0.0.6-0.20210308142348-8f85683b2cef h1:72PG9b2eDlLqKszJVLrsoJbpt4CtgJLhKOjH1MJqCVY=
680682
github.com/iden3/go-iden3-crypto v0.0.6-0.20210308142348-8f85683b2cef/go.mod h1:oBgthFLboAWi9feaBUFy7OxEcyn9vA1khHSL/WwWFyg=
681683
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
@@ -1977,6 +1979,8 @@ github.com/vocdoni/blind-ca v0.1.4/go.mod h1:4ouWDqlvXrrNS0Csf3hKA3cuDTmKh6nP7kS
19771979
github.com/vocdoni/eth-storage-proof v0.1.4-0.20201128112323-de7513ce5e25/go.mod h1:NLA1A55raZ1VNMmKulPUm+Lu9CVetCDVuDCYk5bSYrE=
19781980
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44 h1:OK5B1GPq2zPu2Z1sYaUcAmt3CpILABwYsvkK2raI1AQ=
19791981
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44/go.mod h1:o/kqzlz81Aq5/++p7zIRaaOiEUmCOiap7ulEAUeSQWI=
1982+
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319 h1:W8N7yfnWsVD3l2Sh0pTtXCDd4+LNh58lE427D1U9SVY=
1983+
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319/go.mod h1:A4ZJ8jq+ZbNvxrNUmScv2ghL34A6c6vw5Y1Oza2h7lo=
19801984
github.com/vocdoni/multirpc v0.1.9/go.mod h1:SETFzlLbdZq2YFGy0udT1u2ouQUU2cIesopAIgyAjOU=
19811985
github.com/vocdoni/multirpc v0.1.12/go.mod h1:OYWh2wBX0rztgatZC7VEcPW0Ew4Hm8f/msRAO24mpk0=
19821986
github.com/vocdoni/multirpc v0.1.21/go.mod h1:zCx0l/hu/Vdeav44geFJmK4PAawN+qoo1HYT2icU4GM=
@@ -2105,10 +2109,8 @@ go.vocdoni.io/proto v0.1.7/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M
21052109
go.vocdoni.io/proto v0.1.8/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M=
21062110
go.vocdoni.io/proto v0.1.9-0.20210304214308-6f7363b52750/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M=
21072111
go.vocdoni.io/proto v1.0.4-0.20210726091234-bceaf416353b/go.mod h1:QV3gKc9Zf0xHW3o8wEaqSn8iZ94UTl8gOzekxoz3kWs=
2108-
go.vocdoni.io/proto v1.0.4-0.20210909161946-f3158498ba88 h1:EJnuknmHjwPQL44d5TVOZJhzVA4oFzZT41etyaRervk=
2109-
go.vocdoni.io/proto v1.0.4-0.20210909161946-f3158498ba88/go.mod h1:QV3gKc9Zf0xHW3o8wEaqSn8iZ94UTl8gOzekxoz3kWs=
2110-
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a h1:7QimTKlkCY0O5KRFi0ejafFkLQze7zN0qOE/BuZosbE=
2111-
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a/go.mod h1:oi/WtiBFJ6QwNDv2aUQYwOnUKzYuS/fBqXF8xDNwcGo=
2112+
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c h1:kM/ZBLJ7UQZqqu8INlFbaHDxAt4o7L1omJMgL4AJcJw=
2113+
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c/go.mod h1:oi/WtiBFJ6QwNDv2aUQYwOnUKzYuS/fBqXF8xDNwcGo=
21122114
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
21132115
go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU=
21142116
go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=

vochain/app.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
nm "github.com/tendermint/tendermint/node"
1616
ctypes "github.com/tendermint/tendermint/rpc/core/types"
1717
tmtypes "github.com/tendermint/tendermint/types"
18+
snarkTypes "github.com/vocdoni/go-snark/types"
1819
"google.golang.org/protobuf/proto"
1920

2021
"go.vocdoni.io/dvote/config"
@@ -40,6 +41,8 @@ type BaseApplication struct {
4041
height uint32
4142
timestamp int64
4243
chainId string
44+
// ZkVks contains the VerificationKey for each circuit parameters index
45+
ZkVks []*snarkTypes.Vk
4346
}
4447

4548
var _ abcitypes.Application = (*BaseApplication)(nil)
@@ -323,7 +326,7 @@ func (app *BaseApplication) CheckTx(req abcitypes.RequestCheckTx) abcitypes.Resp
323326
return abcitypes.ResponseCheckTx{Code: 0, Data: data}
324327
}
325328
if tx, txBytes, signature, err = UnmarshalTx(req.Tx); err == nil {
326-
if data, err = AddTx(tx, txBytes, signature, app.State, TxKey(req.Tx), false); err != nil {
329+
if data, err = app.AddTx(tx, txBytes, signature, TxKey(req.Tx), false); err != nil {
327330
log.Debugf("checkTx error: %s", err)
328331
return abcitypes.ResponseCheckTx{Code: 1, Data: []byte("addTx " + err.Error())}
329332
}
@@ -344,7 +347,7 @@ func (app *BaseApplication) DeliverTx(req abcitypes.RequestDeliverTx) abcitypes.
344347
defer app.State.TxCounterAdd()
345348
if tx, txBytes, signature, err = UnmarshalTx(req.Tx); err == nil {
346349
log.Debugf("deliver tx: %s", log.FormatProto(tx))
347-
if data, err = AddTx(tx, txBytes, signature, app.State, TxKey(req.Tx), true); err != nil {
350+
if data, err = app.AddTx(tx, txBytes, signature, TxKey(req.Tx), true); err != nil {
348351
log.Debugf("rejected tx: %v", err)
349352
return abcitypes.ResponseDeliverTx{Code: 1, Data: []byte(err.Error())}
350353
}

0 commit comments

Comments
 (0)