Upgrade go-verkle to its IPA version (#24)
This commit is contained in:
parent
162780515a
commit
719bf47354
@ -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…
x
Reference in New Issue
Block a user