mirror of
https://github.com/arnaucube/gnark-plonky2-verifier.git
synced 2026-01-12 09:01:32 +01:00
got merkle proof traversal working
This commit is contained in:
@@ -59,19 +59,18 @@ type MerkleProofRaw struct {
|
||||
}
|
||||
|
||||
func (m *MerkleProofRaw) UnmarshalJSON(data []byte) error {
|
||||
var siblingDict map[string]interface{}
|
||||
if err := json.Unmarshal(data, &siblingDict); err != nil {
|
||||
type SiblingObject struct {
|
||||
Siblings []map[string][]uint64 // "siblings"
|
||||
}
|
||||
|
||||
var siblings SiblingObject
|
||||
if err := json.Unmarshal(data, &siblings); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
siblings := siblingDict["siblings"].([]interface{})
|
||||
m.hash = make([][]uint64, len(siblings))
|
||||
for siblingIdx, sibling := range siblings {
|
||||
siblingHash := sibling.(map[string]interface{})["elements"].([]interface{})
|
||||
m.hash[siblingIdx] = make([]uint64, 4)
|
||||
for siblingElementIdx, siblingElement := range siblingHash {
|
||||
m.hash[siblingIdx][siblingElementIdx] = uint64(siblingElement.(float64))
|
||||
}
|
||||
m.hash = make([][]uint64, len(siblings.Siblings))
|
||||
for siblingIdx, sibling := range siblings.Siblings {
|
||||
m.hash[siblingIdx] = sibling["elements"]
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -100,30 +100,37 @@ func (f *FriChip) hashOrNoop(data []F) Hash {
|
||||
|
||||
func (f *FriChip) verifyMerkleProofToCapWithCapIndex(leafData []F, leafIndexBits []frontend.Variable, capIndex F, merkleCap MerkleCap, proof *MerkleProof) {
|
||||
currentDigest := f.hashOrNoop(leafData)
|
||||
|
||||
if len(leafIndexBits) != len(proof.Siblings) {
|
||||
panic("len(leafIndexBits) != len(proof.Siblings)")
|
||||
}
|
||||
|
||||
fourZeros := [4]F{f.qe.ZERO_F, f.qe.ZERO_F, f.qe.ZERO_F, f.qe.ZERO_F}
|
||||
for i, bit := range leafIndexBits {
|
||||
sibling := proof.Siblings[i]
|
||||
field.PrintHash(f.field, currentDigest)
|
||||
for i, sibling := range proof.Siblings {
|
||||
bit := leafIndexBits[i]
|
||||
|
||||
var leftSiblingState poseidon.PoseidonState
|
||||
copy(leftSiblingState[0:4], sibling[0:4])
|
||||
copy(leftSiblingState[4:8], currentDigest[0:4])
|
||||
copy(leftSiblingState[8:12], fourZeros[0:4])
|
||||
|
||||
leftHash := f.poseidonChip.Poseidon(leftSiblingState)
|
||||
leftHashCompress := leftHash[0:4]
|
||||
var leftHashCompress Hash
|
||||
leftHashCompress[0] = leftHash[0]
|
||||
leftHashCompress[1] = leftHash[1]
|
||||
leftHashCompress[2] = leftHash[2]
|
||||
leftHashCompress[3] = leftHash[3]
|
||||
|
||||
var rightSiblingState poseidon.PoseidonState
|
||||
copy(rightSiblingState[0:4], currentDigest[0:4])
|
||||
copy(rightSiblingState[4:8], sibling[0:4])
|
||||
copy(rightSiblingState[8:12], fourZeros[0:4])
|
||||
rightHash := f.poseidonChip.Poseidon(rightSiblingState)
|
||||
rightHashCompress := rightHash[0:4]
|
||||
|
||||
currentDigest = f.api.Select(bit, leftHashCompress, rightHashCompress).(Hash)
|
||||
rightHash := f.poseidonChip.Poseidon(rightSiblingState)
|
||||
var rightHashCompress Hash
|
||||
rightHashCompress[0] = rightHash[0]
|
||||
rightHashCompress[1] = rightHash[1]
|
||||
rightHashCompress[2] = rightHash[2]
|
||||
rightHashCompress[3] = rightHash[3]
|
||||
|
||||
currentDigest = SelectHash(f.field, bit, leftHashCompress, rightHashCompress)
|
||||
field.PrintHash(f.field, currentDigest)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ import (
|
||||
"fmt"
|
||||
. "gnark-ed25519/field"
|
||||
"math/bits"
|
||||
|
||||
"github.com/consensys/gnark/frontend"
|
||||
)
|
||||
|
||||
func reduceWithPowers(qe *QuadraticExtensionAPI, terms []QuadraticExtension, scalar QuadraticExtension) QuadraticExtension {
|
||||
@@ -30,3 +32,12 @@ 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user