Add usage example at README.md
arnaucube root@arnaucube.com
Fri, 06 Aug 2021 18:44:41 +0200
4 files changed,
39 insertions(+),
6 deletions(-)
M
README.md
→
README.md
@@ -1,5 +1,36 @@
# kzg-commitments-study [](https://godoc.org/github.com/arnaucube/kzg-commitments-study) [](https://goreportcard.com/report/github.com/arnaucube/kzg-commitments-study) [](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)