Upgrade go-verkle to its IPA version (#24)

verkle/onleaf
Guillaume Ballet 3 years ago
parent 162780515a
commit 719bf47354
  1. 2
      core/blockchain.go
  2. 39
      trie/verkle.go
  3. 6
      trie/verkle_iterator.go

@ -1602,7 +1602,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool)
receipts, logs, _, usedGas, err = bc.processor.Process(block, statedb, bc.vmConfig) receipts, logs, _, usedGas, err = bc.processor.Process(block, statedb, bc.vmConfig)
} else { } else {
var leaves map[common.Hash]common.Hash var leaves map[common.Hash]common.Hash
_, _, _, leaves, err = trie.DeserializeAndVerifyVerkleProof(block.Header().VerkleProof) leaves, err = trie.DeserializeAndVerifyVerkleProof(block.Header().VerkleProof)
if err != nil { if err != nil {
return it.index, err return it.index, err
} }

@ -27,7 +27,6 @@ import (
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie/utils" "github.com/ethereum/go-ethereum/trie/utils"
"github.com/gballet/go-verkle" "github.com/gballet/go-verkle"
"github.com/protolambda/go-kzg/bls"
) )
// VerkleTrie is a wrapper around VerkleNode that implements the trie.Trie // VerkleTrie is a wrapper around VerkleNode that implements the trie.Trie
@ -105,11 +104,11 @@ func (trie *VerkleTrie) TryDelete(key []byte) error {
func (trie *VerkleTrie) Hash() common.Hash { func (trie *VerkleTrie) Hash() common.Hash {
// TODO cache this value // TODO cache this value
rootC := trie.root.ComputeCommitment() rootC := trie.root.ComputeCommitment()
return bls.FrTo32(rootC) return rootC.Bytes()
} }
func nodeToDBKey(n verkle.VerkleNode) []byte { func nodeToDBKey(n verkle.VerkleNode) []byte {
ret := bls.FrTo32(n.ComputeCommitment()) ret := n.ComputeCommitment().Bytes()
return ret[:] return ret[:]
} }
@ -172,23 +171,19 @@ type KeyValuePair struct {
} }
type verkleproof struct { type verkleproof struct {
D *bls.G1Point Proof *verkle.Proof
Y *bls.Fr
Σ *bls.G1Point
Cis []*bls.G1Point Cis []*verkle.Point
Indices []uint Indices []byte
Yis []*bls.Fr Yis []*verkle.Fr
Leaves []KeyValuePair Leaves []KeyValuePair
} }
func (trie *VerkleTrie) ProveAndSerialize(keys [][]byte, kv map[common.Hash][]byte) ([]byte, error) { func (trie *VerkleTrie) ProveAndSerialize(keys [][]byte, kv map[common.Hash][]byte) ([]byte, error) {
d, y, σ, cis, indices, yis := verkle.MakeVerkleMultiProof(trie.root, keys) proof, cis, indices, yis := verkle.MakeVerkleMultiProof(trie.root, keys)
vp := verkleproof{ vp := verkleproof{
D: d, Proof: proof,
Y: y,
Σ: σ,
Cis: cis, Cis: cis,
Indices: indices, Indices: indices,
Yis: yis, Yis: yis,
@ -204,29 +199,29 @@ func (trie *VerkleTrie) ProveAndSerialize(keys [][]byte, kv map[common.Hash][]by
return rlp.EncodeToBytes(vp) return rlp.EncodeToBytes(vp)
} }
func DeserializeAndVerifyVerkleProof(proof []byte) (*bls.G1Point, *bls.Fr, *bls.G1Point, map[common.Hash]common.Hash, error) { func DeserializeAndVerifyVerkleProof(serialized []byte) (map[common.Hash]common.Hash, error) {
d, y, σ, cis, indices, yis, leaves, err := deserializeVerkleProof(proof) proof, cis, indices, yis, leaves, err := deserializeVerkleProof(serialized)
if err != nil { if err != nil {
return nil, nil, nil, nil, fmt.Errorf("could not deserialize proof: %w", err) return nil, fmt.Errorf("could not deserialize proof: %w", err)
} }
if !verkle.VerifyVerkleProof(d, σ, y, cis, indices, yis, verkle.GetKZGConfig()) { if !verkle.VerifyVerkleProof(proof, cis, indices, yis, verkle.GetConfig()) {
return nil, nil, nil, nil, errInvalidProof return nil, errInvalidProof
} }
return d, y, σ, leaves, nil return leaves, nil
} }
func deserializeVerkleProof(proof []byte) (*bls.G1Point, *bls.Fr, *bls.G1Point, []*bls.G1Point, []uint, []*bls.Fr, map[common.Hash]common.Hash, error) { func deserializeVerkleProof(proof []byte) (*verkle.Proof, []*verkle.Point, []byte, []*verkle.Fr, map[common.Hash]common.Hash, error) {
var vp verkleproof var vp verkleproof
err := rlp.DecodeBytes(proof, &vp) err := rlp.DecodeBytes(proof, &vp)
if err != nil { if err != nil {
return nil, nil, nil, nil, nil, nil, nil, fmt.Errorf("verkle proof deserialization error: %w", err) return nil, nil, nil, nil, nil, fmt.Errorf("verkle proof deserialization error: %w", err)
} }
leaves := make(map[common.Hash]common.Hash, len(vp.Leaves)) leaves := make(map[common.Hash]common.Hash, len(vp.Leaves))
for _, kvp := range vp.Leaves { for _, kvp := range vp.Leaves {
leaves[common.BytesToHash(kvp.Key)] = common.BytesToHash(kvp.Value) leaves[common.BytesToHash(kvp.Key)] = common.BytesToHash(kvp.Value)
} }
return vp.D, vp.Y, vp.Σ, vp.Cis, vp.Indices, vp.Yis, leaves, nil return vp.Proof, vp.Cis, vp.Indices, vp.Yis, leaves, nil
} }
// Copy the values here so as to avoid an import cycle // Copy the values here so as to avoid an import cycle

@ -21,9 +21,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
"github.com/protolambda/go-kzg/bls"
//"github.com/ethereum/go-ethereum/rlp"
"github.com/gballet/go-verkle" "github.com/gballet/go-verkle"
) )
@ -133,13 +131,13 @@ func (it *verkleNodeIterator) Error() error {
// Hash returns the hash of the current node. // Hash returns the hash of the current node.
func (it *verkleNodeIterator) Hash() common.Hash { func (it *verkleNodeIterator) Hash() common.Hash {
return bls.FrTo32(it.current.ComputeCommitment()) return it.current.ComputeCommitment().Bytes()
} }
// Parent returns the hash of the parent of the current node. The hash may be the one // Parent returns the hash of the parent of the current node. The hash may be the one
// grandparent if the immediate parent is an internal node with no hash. // grandparent if the immediate parent is an internal node with no hash.
func (it *verkleNodeIterator) Parent() common.Hash { func (it *verkleNodeIterator) Parent() common.Hash {
return bls.FrTo32(it.stack[len(it.stack)-1].Node.ComputeCommitment()) return it.stack[len(it.stack)-1].Node.ComputeCommitment().Bytes()
} }
// Path returns the hex-encoded path to the current node. // Path returns the hex-encoded path to the current node.

Loading…
Cancel
Save