arnaucube
arnaucube/kzg-commitments-studyPublic Self-hosted repository
Add usage example at README.md
arnaucube root@arnaucube.com
Fri, 06 Aug 2021 18:44:41 +0200
commit

ee95842b45a1d92423a541cc4ff95257497f5312

parent

d7a6a4b2b7a087fd8f3c0c753c2f22da700fb254

4 files changed, 39 insertions(+), 6 deletions(-)

jump to
M README.md → README.md

@@ -1,5 +1,36 @@

# kzg-commitments-study [![GoDoc](https://godoc.org/github.com/arnaucube/kzg-commitments-study?status.svg)](https://godoc.org/github.com/arnaucube/kzg-commitments-study) [![Go Report Card](https://goreportcard.com/badge/github.com/arnaucube/kzg-commitments-study)](https://goreportcard.com/report/github.com/arnaucube/kzg-commitments-study) [![Test](https://github.com/arnaucube/kzg-commitments-study/workflows/Test/badge.svg)](https://github.com/arnaucube/kzg-commitments-study/actions?query=workflow%3ATest) -Doing this to study and learn [KZG commitments](http://cacr.uwaterloo.ca/techreports/2010/cacr2010-10.pdf), do not use in production. +Doing this to study and learn [KZG commitments](http://cacr.uwaterloo.ca/techreports/2010/cacr2010-10.pdf), do not use in production. More details at https://arnaucube.com/blog/kzg-commitments.html . Thanks to [Dankrad Feist](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html), [Alin Tomescu](https://alinush.github.io/2020/05/06/kzg-polynomial-commitments.html), [Tom Walton-Pocock](https://hackmd.io/@tompocock/Hk2A7BD6U) for their articles, which helped me understand a bit the KZG Commitments. + +### Usage +```go +// p(x) = x^3 + x + 5 +p := []*big.Int{ + big.NewInt(5), + big.NewInt(1), // x^1 + big.NewInt(0), // x^2 + big.NewInt(1), // x^3 +} +assert.Equal(t, "1x³ + 1x¹ + 5", PolynomialToString(p)) + +// TrustedSetup +ts, err := NewTrustedSetup(p) +assert.Nil(t, err) + +// Commit +c := Commit(ts, p) + +// p(z)=y --> p(3)=35 +z := big.NewInt(3) +y := big.NewInt(35) + +// z & y: to prove an evaluation p(z)=y +proof, err := EvaluationProof(ts, p, z, y) +assert.Nil(t, err) + +// verification +v := Verify(ts, c, proof, z, y) +assert.True(t, v) +```
M arithmetic.go → arithmetic.go

@@ -224,7 +224,9 @@ }

return sN } -func polynomialToString(p []*big.Int) string { +// PolynomialToString converts a polynomial represented by a *big.Int array, +// into its string human readable representation +func PolynomialToString(p []*big.Int) string { s := "" for i := len(p) - 1; i >= 1; i-- { if !bytes.Equal(p[i].Bytes(), big.NewInt(0).Bytes()) {
M kzg.go → kzg.go

@@ -65,14 +65,15 @@ }

// EvaluationProof generates the evaluation proof func EvaluationProof(ts *TrustedSetup, p []*big.Int, z, y *big.Int) (*bn256.G1, error) { - n := polynomialSub(p, []*big.Int{y}) // p-y + n := polynomialSub(p, []*big.Int{y}) // p-y + // n := p // we can omit y (p(z)) d := []*big.Int{fNeg(z), big.NewInt(1)} // x-z q, rem := polynomialDiv(n, d) if compareBigIntArray(rem, arrayOfZeroes(len(rem))) { return nil, fmt.Errorf("remainder should be 0, instead is %d", rem) } - fmt.Println("q(x):", polynomialToString(q)) // TMP DBG + fmt.Println("q(x):", PolynomialToString(q)) // TMP DBG // proof: e = [q(s)]₁ e := evaluateG1(ts, q)
M kzg_test.go → kzg_test.go

@@ -15,8 +15,7 @@ big.NewInt(1), // x^1

big.NewInt(0), // x^2 big.NewInt(1), // x^3 } - // fmt.Println("p(x):", polynomialToString(p)) - assert.Equal(t, "1x³ + 1x¹ + 5", polynomialToString(p)) + assert.Equal(t, "1x³ + 1x¹ + 5", PolynomialToString(p)) // TrustedSetup ts, err := NewTrustedSetup(p)