Skip to content

Commit

Permalink
Add anonymous envelope (zk) verification with test
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaucube committed Sep 16, 2021
1 parent 8239102 commit 31d448d
Show file tree
Hide file tree
Showing 7 changed files with 412 additions and 52 deletions.
62 changes: 62 additions & 0 deletions crypto/zk/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Package zk provides utilities around the zkSNARK (Groth16) tooling.
package zk

import (
"fmt"
"io/ioutil"
"math/big"

"github.com/vocdoni/go-snark/parsers"
"github.com/vocdoni/go-snark/types"
models "go.vocdoni.io/proto/build/go/models"
)

func LoadVkFromFile(path string) (*types.Vk, error) {
vkJSON, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}

vk, err := parsers.ParseVk(vkJSON)
if err != nil {
return nil, err
}
return vk, nil
}

func ProtobufZKProofToCircomProof(p *models.ProofZkSNARK) (*types.Proof, []*big.Int, error) {
if len(p.A) != 3 && len(p.B) != 6 && len(p.C) != 3 {
return nil, nil, fmt.Errorf("error on zkProof format")
}
proofString := parsers.ProofString{
A: p.A,
B: [][]string{
{
p.B[0],
p.B[1],
},
{
p.B[2],
p.B[3],
},
{
p.B[4],
p.B[5],
},
},
C: p.C,
}
publicInputsString := p.PublicInputs

// parse zkProof & PublicInputs from tx.Proof
proof, err := parsers.ProofStringToProof(proofString)
if err != nil {
return nil, nil, err
}
publicInputs, err := parsers.PublicSignalsStringToPublicSignals(publicInputsString)
if err != nil {
return nil, nil, err
}

return proof, publicInputs, nil
}
46 changes: 46 additions & 0 deletions crypto/zk/utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package zk

import (
"encoding/json"
"math/big"
"testing"

qt "github.com/frankban/quicktest"
models "go.vocdoni.io/proto/build/go/models"
)

func TestProtobufZKProofToCircomProof(t *testing.T) {
protoProof := &models.ProofZkSNARK{
A: []string{
"17569240301865190069940703408776620561950070507358357198130890464508555015742",
"14719281396036152924308513019111720587276284390020911371919541479835430607528",
"1",
},
B: []string{
"19366523330111704407267566338410994924319459949138724547828188860719056192113",
"3554431156699466263343064300468289853516840393068286815512868805374822045471",
"7069001739799325309551446576989712671469685847725867674777886436500905588451",
"9519609195825772265125524447464801412742967232326200600178197674408796399758",
"1",
"0",
},
C: []string{
"1803067082675811010286176187174786634523306099072027370858753233512049893073",
"12821812994233574817558778896965446058705557189286765124075749479926329638171",
"1",
},
PublicInputs: []string{"1", "2", "3"},
}
proof, pubInputs, err := ProtobufZKProofToCircomProof(protoProof)
qt.Assert(t, err, qt.IsNil)

expectedStr := `{"pi_a":"26d7d66de7e4ed7fa7abf7078ef9e4e45bf0000787c451874ee9f31c930bb63e208ad16ae0f6916670dcf183c1d23efe1e2ddc45dbb138d922c79ad1b4bcdaa8","pi_b":"07dbbc9b161442d63d59869a61a2b1724f49f8ce7cd83f92bc33edf4e697d71f2ad1105288e9d12915b079725ad629845a3c6cdd4311b21778be06cc82ae8271150be869d01f1fcb87fb7f4930e690c3b873d29529f3d9db0f8021253806a88e0fa0e9c753288b4110ef539418f37c30de082a0bc60083222e8ca6694b2ef6e3","pi_c":"03fc7ff321b29905a8a64f324906272e69c9a0e7b097b523ef57fc6a320f5ed11c58e39436354cb151affb97a664401f1eb6b54a9f3a6a366543bf6813f5fd1b"}`

proofJSON, err := json.Marshal(proof)
qt.Assert(t, err, qt.IsNil)
qt.Assert(t, expectedStr, qt.Equals, string(proofJSON))
a := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}
for i := range a {
qt.Assert(t, a[i].String(), qt.Equals, pubInputs[i].String())
}
}
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ require (
github.com/timshannon/badgerhold/v3 v3.0.0-20210415132401-e7c90fb5919f
github.com/vocdoni/arbo v0.0.0-20210909102959-f09b0b039255
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319
github.com/vocdoni/storage-proofs-eth-go v0.1.6
go.uber.org/zap v1.18.1
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d
google.golang.org/protobuf v1.27.1
Expand Down
10 changes: 6 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHj
github.com/ethereum/go-ethereum v1.8.27/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
github.com/ethereum/go-ethereum v1.9.3/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
github.com/ethereum/go-ethereum v1.9.12/go.mod h1:PvsVkQmhZFx92Y+h2ylythYlheEDt/uBgFbl61Js/jo=
github.com/ethereum/go-ethereum v1.9.13/go.mod h1:qwN9d1GLyDh0N7Ab8bMGd0H9knaji2jOBm2RrMGjXls=
github.com/ethereum/go-ethereum v1.9.20/go.mod h1:JSSTypSMTkGZtAdAChH2wP5dZEvPGh3nUTuDpH+hNrg=
github.com/ethereum/go-ethereum v1.9.23/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM=
github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
Expand Down Expand Up @@ -676,6 +677,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/iden3/go-iden3-core v0.0.8-0.20200325104031-1ed04a261b78/go.mod h1:N9xiQvwx5EZhrVuO0hW8GBF9Uy0ZbONdhguPHSC+wQg=
github.com/iden3/go-iden3-crypto v0.0.4/go.mod h1:LLcgB7DLWAUs+8eBSKne+ZHy5z7xtAmlYlEz0M9M8gE=
github.com/iden3/go-iden3-crypto v0.0.5/go.mod h1:XKw1oDwYn2CIxKOtr7m/mL5jMn4mLOxAxtZBRxQBev8=
github.com/iden3/go-iden3-crypto v0.0.6-0.20210308142348-8f85683b2cef h1:72PG9b2eDlLqKszJVLrsoJbpt4CtgJLhKOjH1MJqCVY=
github.com/iden3/go-iden3-crypto v0.0.6-0.20210308142348-8f85683b2cef/go.mod h1:oBgthFLboAWi9feaBUFy7OxEcyn9vA1khHSL/WwWFyg=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
Expand Down Expand Up @@ -1977,6 +1979,8 @@ github.com/vocdoni/blind-ca v0.1.4/go.mod h1:4ouWDqlvXrrNS0Csf3hKA3cuDTmKh6nP7kS
github.com/vocdoni/eth-storage-proof v0.1.4-0.20201128112323-de7513ce5e25/go.mod h1:NLA1A55raZ1VNMmKulPUm+Lu9CVetCDVuDCYk5bSYrE=
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44 h1:OK5B1GPq2zPu2Z1sYaUcAmt3CpILABwYsvkK2raI1AQ=
github.com/vocdoni/go-external-ip v0.0.0-20210705122950-fae6195a1d44/go.mod h1:o/kqzlz81Aq5/++p7zIRaaOiEUmCOiap7ulEAUeSQWI=
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319 h1:W8N7yfnWsVD3l2Sh0pTtXCDd4+LNh58lE427D1U9SVY=
github.com/vocdoni/go-snark v0.0.0-20210709152824-f6e4c27d7319/go.mod h1:A4ZJ8jq+ZbNvxrNUmScv2ghL34A6c6vw5Y1Oza2h7lo=
github.com/vocdoni/multirpc v0.1.9/go.mod h1:SETFzlLbdZq2YFGy0udT1u2ouQUU2cIesopAIgyAjOU=
github.com/vocdoni/multirpc v0.1.12/go.mod h1:OYWh2wBX0rztgatZC7VEcPW0Ew4Hm8f/msRAO24mpk0=
github.com/vocdoni/multirpc v0.1.21/go.mod h1:zCx0l/hu/Vdeav44geFJmK4PAawN+qoo1HYT2icU4GM=
Expand Down Expand Up @@ -2105,10 +2109,8 @@ go.vocdoni.io/proto v0.1.7/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M
go.vocdoni.io/proto v0.1.8/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M=
go.vocdoni.io/proto v0.1.9-0.20210304214308-6f7363b52750/go.mod h1:cyITrt7+sHmUJH06WLu69xB7LBY9c9FakFaBOe8gs/M=
go.vocdoni.io/proto v1.0.4-0.20210726091234-bceaf416353b/go.mod h1:QV3gKc9Zf0xHW3o8wEaqSn8iZ94UTl8gOzekxoz3kWs=
go.vocdoni.io/proto v1.0.4-0.20210909161946-f3158498ba88 h1:EJnuknmHjwPQL44d5TVOZJhzVA4oFzZT41etyaRervk=
go.vocdoni.io/proto v1.0.4-0.20210909161946-f3158498ba88/go.mod h1:QV3gKc9Zf0xHW3o8wEaqSn8iZ94UTl8gOzekxoz3kWs=
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a h1:7QimTKlkCY0O5KRFi0ejafFkLQze7zN0qOE/BuZosbE=
go.vocdoni.io/proto v1.0.4-0.20210910085433-e7c056b7c23a/go.mod h1:oi/WtiBFJ6QwNDv2aUQYwOnUKzYuS/fBqXF8xDNwcGo=
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c h1:kM/ZBLJ7UQZqqu8INlFbaHDxAt4o7L1omJMgL4AJcJw=
go.vocdoni.io/proto v1.0.4-0.20210910152144-4f30a5b8664c/go.mod h1:oi/WtiBFJ6QwNDv2aUQYwOnUKzYuS/fBqXF8xDNwcGo=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU=
go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=
Expand Down
7 changes: 5 additions & 2 deletions vochain/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
nm "github.com/tendermint/tendermint/node"
ctypes "github.com/tendermint/tendermint/rpc/core/types"
tmtypes "github.com/tendermint/tendermint/types"
snarkTypes "github.com/vocdoni/go-snark/types"
"google.golang.org/protobuf/proto"

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

var _ abcitypes.Application = (*BaseApplication)(nil)
Expand Down Expand Up @@ -323,7 +326,7 @@ func (app *BaseApplication) CheckTx(req abcitypes.RequestCheckTx) abcitypes.Resp
return abcitypes.ResponseCheckTx{Code: 0, Data: data}
}
if tx, txBytes, signature, err = UnmarshalTx(req.Tx); err == nil {
if data, err = AddTx(tx, txBytes, signature, app.State, TxKey(req.Tx), false); err != nil {
if data, err = app.AddTx(tx, txBytes, signature, TxKey(req.Tx), false); err != nil {
log.Debugf("checkTx error: %s", err)
return abcitypes.ResponseCheckTx{Code: 1, Data: []byte("addTx " + err.Error())}
}
Expand All @@ -344,7 +347,7 @@ func (app *BaseApplication) DeliverTx(req abcitypes.RequestDeliverTx) abcitypes.
defer app.State.TxCounterAdd()
if tx, txBytes, signature, err = UnmarshalTx(req.Tx); err == nil {
log.Debugf("deliver tx: %s", log.FormatProto(tx))
if data, err = AddTx(tx, txBytes, signature, app.State, TxKey(req.Tx), true); err != nil {
if data, err = app.AddTx(tx, txBytes, signature, TxKey(req.Tx), true); err != nil {
log.Debugf("rejected tx: %v", err)
return abcitypes.ResponseDeliverTx{Code: 1, Data: []byte(err.Error())}
}
Expand Down
Loading

0 comments on commit 31d448d

Please sign in to comment.