diff --git a/plonky2_verifier/hash.go b/plonky2_verifier/hash.go new file mode 100644 index 0000000..fff7e20 --- /dev/null +++ b/plonky2_verifier/hash.go @@ -0,0 +1,42 @@ +package plonky2_verifier + +import ( + "fmt" + . "gnark-ed25519/field" + + "github.com/consensys/gnark/frontend" +) + +type Hash = [4]F + +func SelectHash(fieldAPI frontend.API, bit frontend.Variable, leftHash, rightHash Hash) Hash { + var returnHash Hash + for i := 0; i < 4; i++ { + returnHash[i] = fieldAPI.Select(bit, leftHash[i], rightHash[i]).(F) + } + + return returnHash +} + +func Lookup2Hash(fieldAPI frontend.API, b0 frontend.Variable, b1 frontend.Variable, h0, h1, h2, h3 Hash) Hash { + var returnHash Hash + + for i := 0; i < 4; i++ { + returnHash[i] = fieldAPI.Lookup2(b0, b1, h0[i], h1[i], h2[i], h3[i]).(F) + } + + return returnHash +} + +func AssertIsEqualHash(fieldAPI frontend.API, h1, h2 Hash) { + for i := 0; i < 4; i++ { + fieldAPI.AssertIsEqual(h1[0], h2[0]) + } +} + +func PrintHash(f frontend.API, h Hash) { + for i := 0; i < 4; i++ { + fmt.Println("Hash Limb", i) + f.Println(h[i]) + } +} diff --git a/plonky2_verifier/quadratic_extension.go b/plonky2_verifier/quadratic_extension.go index 31a3f9c..f841469 100644 --- a/plonky2_verifier/quadratic_extension.go +++ b/plonky2_verifier/quadratic_extension.go @@ -2,7 +2,6 @@ package plonky2_verifier import ( "fmt" - "gnark-ed25519/field" . "gnark-ed25519/field" "math/bits" @@ -67,7 +66,7 @@ func (c *QuadraticExtensionAPI) InverseExtension(a QuadraticExtension) Quadratic a1_is_zero := c.fieldAPI.IsZero(a[1]) // assert that a0_is_zero OR a1_is_zero == false - c.fieldAPI.AssertIsEqual(c.fieldAPI.Mul(a0_is_zero, a1_is_zero).(F), field.ZERO_F) + c.fieldAPI.AssertIsEqual(c.fieldAPI.Mul(a0_is_zero, a1_is_zero).(F), ZERO_F) a_pow_r_minus_1 := QuadraticExtension{a[0], c.fieldAPI.Mul(a[1], c.DTH_ROOT).(F)} a_pow_r := c.MulExtension(a_pow_r_minus_1, a) @@ -79,7 +78,7 @@ func (c *QuadraticExtensionAPI) ScalarMulExtension(a QuadraticExtension, scalar } func (c *QuadraticExtensionAPI) FieldToQE(a F) QuadraticExtension { - return QuadraticExtension{a, field.ZERO_F} + return QuadraticExtension{a, ZERO_F} } // / Exponentiate `base` to the power of a known `exponent`. @@ -110,6 +109,22 @@ func (c *QuadraticExtensionAPI) ExpU64Extension(a QuadraticExtension, exponent u return product } +func (c *QuadraticExtensionAPI) reduceWithPowers(terms []QuadraticExtension, scalar QuadraticExtension) QuadraticExtension { + sum := c.ZERO_QE + + for i := len(terms) - 1; i >= 0; i-- { + sum = c.AddExtension( + c.MulExtension( + sum, + scalar, + ), + terms[i], + ) + } + + return sum +} + func (c *QuadraticExtensionAPI) Println(a QuadraticExtension) { fmt.Print("Degree 0 coefficient") c.fieldAPI.Println(a[0]) diff --git a/plonky2_verifier/utils.go b/plonky2_verifier/utils.go index 226a97e..ae69bfe 100644 --- a/plonky2_verifier/utils.go +++ b/plonky2_verifier/utils.go @@ -2,28 +2,9 @@ package plonky2_verifier import ( "fmt" - . "gnark-ed25519/field" "math/bits" - - "github.com/consensys/gnark/frontend" ) -func reduceWithPowers(qe *QuadraticExtensionAPI, terms []QuadraticExtension, scalar QuadraticExtension) QuadraticExtension { - sum := qe.ZERO_QE - - for i := len(terms) - 1; i >= 0; i-- { - sum = qe.AddExtension( - qe.MulExtension( - sum, - scalar, - ), - terms[i], - ) - } - - return sum -} - // Computes `log_2(n)`, panicking if `n` is not a power of two. func log2Strict(n uint) int { res := bits.TrailingZeros(n) @@ -32,35 +13,3 @@ func log2Strict(n uint) int { } return res } - -func SelectHash(fieldAPI frontend.API, bit frontend.Variable, leftHash, rightHash Hash) Hash { - var returnHash Hash - for i := 0; i < 4; i++ { - returnHash[i] = fieldAPI.Select(bit, leftHash[i], rightHash[i]).(F) - } - - return returnHash -} - -func Lookup2Hash(fieldAPI frontend.API, b0 frontend.Variable, b1 frontend.Variable, h0, h1, h2, h3 Hash) Hash { - var returnHash Hash - - for i := 0; i < 4; i++ { - returnHash[i] = fieldAPI.Lookup2(b0, b1, h0[i], h1[i], h2[i], h3[i]).(F) - } - - return returnHash -} - -func AssertIsEqualHash(fieldAPI frontend.API, h1, h2 Hash) { - for i := 0; i < 4; i++ { - fieldAPI.AssertIsEqual(h1[0], h2[0]) - } -} - -func PrintHash(f frontend.API, h Hash) { - for i := 0; i < 4; i++ { - fmt.Println("Hash Limb", i) - f.Println(h[i]) - } -}