Skip to content

Commit 6f2bd4a

Browse files
authored
Merge pull request #4 from jsign/jsign-migrate-ipa
innerproductargument: support for Gt
2 parents d392506 + ec7fb7f commit 6f2bd4a

File tree

5 files changed

+376
-205
lines changed

5 files changed

+376
-205
lines changed

group/g1.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package group
22

33
import (
4+
"fmt"
45
"math/big"
56

67
bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381"
78
"github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
9+
"github.com/jsign/curdleproofs/common"
810
)
911

1012
type GroupG1 struct {
@@ -45,6 +47,26 @@ func (z *G1Element) AddAssign(e Element) Element {
4547
return z
4648
}
4749

50+
func (z *G1Element) Add(a, b Element) Element {
51+
aa := a.(*G1Element).inner
52+
bb := b.(*G1Element).inner
53+
z.inner.Set(&aa)
54+
z.inner.AddAssign(&bb)
55+
return z
56+
}
57+
58+
func (z *G1Element) MultiExp(base []Element, scalars []fr.Element) (Element, error) {
59+
jacs := make([]bls12381.G1Jac, len(base))
60+
for i := 0; i < len(base); i++ {
61+
jacs[i] = base[i].(*G1Element).inner
62+
}
63+
affs := bls12381.BatchJacobianToAffineG1(jacs)
64+
if _, err := z.inner.MultiExp(affs, scalars, common.MultiExpConf); err != nil {
65+
return nil, fmt.Errorf("g1 multiexp: %s", err)
66+
}
67+
return z, nil
68+
}
69+
4870
func (z *G1Element) Equal(e Element) bool {
4971
ee := e.(*G1Element).inner
5072
return z.inner.Equal(&ee)

group/group.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package group
22

33
import (
4+
"fmt"
5+
46
"github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
7+
"github.com/jsign/curdleproofs/common"
58
)
69

710
type Group interface {
@@ -11,9 +14,11 @@ type Group interface {
1114
type Element interface {
1215
ScalarMultiplication(e Element, scalar fr.Element) Element
1316
Set(e Element) Element
17+
Add(a, b Element) Element
1418
AddAssign(e Element) Element
1519
Equal(e Element) bool
1620
Bytes() []byte
21+
MultiExp([]Element, []fr.Element) (Element, error)
1722
}
1823

1924
type GroupCommitment struct {
@@ -68,3 +73,73 @@ func (gc *GroupCommitment) Mul(scalar fr.Element) GroupCommitment {
6873
func (t GroupCommitment) Eq(cm GroupCommitment) bool {
6974
return t.T_1.Equal(cm.T_1) && t.T_2.Equal(cm.T_2)
7075
}
76+
77+
type MsmAccumulator struct {
78+
g Group
79+
A_c Element
80+
baseScalarMap []msmCoeff
81+
}
82+
83+
type msmCoeff struct {
84+
basis Element
85+
scalar fr.Element
86+
}
87+
88+
func NewMsmAccumulator(g Group) *MsmAccumulator {
89+
return &MsmAccumulator{
90+
g: g,
91+
A_c: g.CreateElement(),
92+
baseScalarMap: nil,
93+
}
94+
}
95+
96+
func (ma *MsmAccumulator) AccumulateCheck(
97+
C Element,
98+
scalar []fr.Element,
99+
basis []Element,
100+
rand *common.Rand) error {
101+
if len(basis) != len(scalar) {
102+
return fmt.Errorf("x and v must have the same length")
103+
}
104+
105+
alpha, err := rand.GetFr()
106+
if err != nil {
107+
return fmt.Errorf("get random scalar: %s", err)
108+
}
109+
110+
var tmp fr.Element
111+
outer:
112+
for i := 0; i < len(basis); i++ {
113+
tmp.Mul(&alpha, &scalar[i])
114+
115+
for j := range ma.baseScalarMap {
116+
if ma.baseScalarMap[j].basis.Equal(basis[i]) {
117+
var scalar fr.Element
118+
scalar.Add(&ma.baseScalarMap[j].scalar, &tmp)
119+
ma.baseScalarMap[j].scalar = scalar
120+
continue outer
121+
}
122+
}
123+
ma.baseScalarMap = append(ma.baseScalarMap, msmCoeff{basis: basis[i], scalar: tmp})
124+
}
125+
ma.A_c.AddAssign(C.ScalarMultiplication(C, alpha))
126+
127+
return nil
128+
}
129+
130+
func (ma *MsmAccumulator) Verify() (bool, error) {
131+
x := make([]fr.Element, 0, len(ma.baseScalarMap))
132+
v := make([]Element, 0, len(ma.baseScalarMap))
133+
134+
for _, coeff := range ma.baseScalarMap {
135+
v = append(v, coeff.basis)
136+
x = append(x, coeff.scalar)
137+
}
138+
139+
msmRes := ma.g.CreateElement()
140+
if _, err := msmRes.MultiExp(v, x); err != nil {
141+
return false, fmt.Errorf("computing msm: %s", err)
142+
}
143+
144+
return msmRes.Equal(ma.A_c), nil
145+
}

group/gt.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ func (z *GtElement) AddAssign(e Element) Element {
4545
return z
4646
}
4747

48+
func (z *GtElement) Add(a, b Element) Element {
49+
z.Set(a)
50+
z.AddAssign(b)
51+
return z
52+
}
53+
54+
func (z *GtElement) MultiExp(basis []Element, scalars []fr.Element) (Element, error) {
55+
// Maybe quite naive; but it works. Prob could use some Pippenger algorithm?
56+
z.inner = bls12381.GT{}
57+
for i := 0; i < len(basis); i++ {
58+
var tmp GtElement
59+
tmp.ScalarMultiplication(basis[i], scalars[i])
60+
z.AddAssign(&tmp)
61+
}
62+
return z, nil
63+
}
64+
4865
func (z *GtElement) Equal(e Element) bool {
4966
ee := e.(*GtElement).inner
5067
return z.inner.Equal(&ee)

0 commit comments

Comments
 (0)