Skip to content

Commit

Permalink
fix: remove RangeProofs (cosmos#586)
Browse files Browse the repository at this point in the history
Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com>
Co-authored-by: Marko <marbar3778@yahoo.com>
  • Loading branch information
3 people authored and Manav-Aggarwal committed Jan 5, 2023
1 parent 29711ff commit b53ed43
Show file tree
Hide file tree
Showing 17 changed files with 182 additions and 3,154 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

- [#599](https://github.com/cosmos/iavl/pull/599) Populate ImmutableTree creation in copy function with missing field
- [#589](https://github.com/cosmos/iavl/pull/589) Wrap `tree.addUnsavedRemoval()` with missing `if !tree.skipFastStorageUpgrade` statement
- [#586](https://github.com/cosmos/iavl/pull/586) Remove the `RangeProof` and refactor the ics23_proof to use the internal methods.

## 0.19.3 (October 8, 2022)

Expand Down
46 changes: 19 additions & 27 deletions basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -513,13 +513,17 @@ func TestProof(t *testing.T) {

// Now for each item, construct a proof and verify
tree.Iterate(func(key []byte, value []byte) bool {
value2, proof, err := tree.GetWithProof(key)
proof, err := tree.GetMembershipProof(key)
assert.NoError(t, err)
assert.Equal(t, value, value2)
if assert.NotNil(t, proof) {
hash, err := tree.WorkingHash()
require.NoError(t, err)
verifyProof(t, proof, hash)
assert.Equal(t, value, proof.GetExist().Value)
res, err := tree.VerifyMembership(proof, key)
assert.NoError(t, err)
value2, err := tree.ImmutableTree.Get(key)
assert.NoError(t, err)
if value2 != nil {
assert.True(t, res)
} else {
assert.False(t, res)
}
return false
})
Expand All @@ -534,11 +538,8 @@ func TestTreeProof(t *testing.T) {
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", hex.EncodeToString(hash))

// should get false for proof with nil root
value, proof, err := tree.GetWithProof([]byte("foo"))
assert.Nil(t, value)
assert.Nil(t, proof)
assert.Error(t, proof.Verify([]byte(nil)))
assert.NoError(t, err)
_, err = tree.GetProof([]byte("foo"))
require.Error(t, err)

// insert lots of info and store the bytes
keys := make([][]byte, 200)
Expand All @@ -551,27 +552,18 @@ func TestTreeProof(t *testing.T) {
tree.SaveVersion()

// query random key fails
value, proof, err = tree.GetWithProof([]byte("foo"))
assert.Nil(t, value)
assert.NotNil(t, proof)
assert.NoError(t, err)
hash, err = tree.Hash()
assert.NoError(t, err)
assert.NoError(t, proof.Verify(hash))
assert.NoError(t, proof.VerifyAbsence([]byte("foo")))
_, err = tree.GetMembershipProof([]byte("foo"))
assert.Error(t, err)

// valid proof for real keys
root, err := tree.WorkingHash()
assert.NoError(t, err)
for _, key := range keys {
value, proof, err := tree.GetWithProof(key)
proof, err := tree.GetMembershipProof(key)
if assert.NoError(t, err) {
require.Nil(t, err, "Failed to read proof from bytes: %v", err)
assert.Equal(t, key, value)
err := proof.Verify(root)
assert.NoError(t, err, "#### %v", proof.String())
err = proof.VerifyItem(key, key)
assert.NoError(t, err, "#### %v", proof.String())
assert.Equal(t, key, proof.GetExist().Value)
res, err := tree.VerifyMembership(proof, key)
require.NoError(t, err)
require.True(t, res)
}
}
}
9 changes: 5 additions & 4 deletions mutable_tree_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,18 @@ func TestDelete(t *testing.T) {

require.NoError(t, tree.DeleteVersion(version))

k1Value, _, _ := tree.GetVersionedWithProof([]byte("k1"), version)
require.Nil(t, k1Value)
proof, err := tree.GetVersionedProof([]byte("k1"), version)
require.EqualError(t, err, ErrVersionDoesNotExist.Error())
require.Nil(t, proof)

key := tree.ndb.rootKey(version)
err = tree.ndb.db.Set(key, hash)
require.NoError(t, err)
tree.versions[version] = true

k1Value, _, err = tree.GetVersionedWithProof([]byte("k1"), version)
proof, err = tree.GetVersionedProof([]byte("k1"), version)
require.Nil(t, err)
require.Equal(t, 0, bytes.Compare([]byte("Fred"), k1Value))
require.Equal(t, 0, bytes.Compare([]byte("Fred"), proof.GetExist().Value))
}

func TestGetRemove(t *testing.T) {
Expand Down
51 changes: 0 additions & 51 deletions proof.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@ import (
"bytes"
"crypto/sha256"
"fmt"
"math"
"sync"

"github.com/pkg/errors"

hexbytes "github.com/cosmos/iavl/internal/bytes"
"github.com/cosmos/iavl/internal/encoding"
iavlproto "github.com/cosmos/iavl/proto"
)

var bufPool = &sync.Pool{
Expand Down Expand Up @@ -109,34 +107,6 @@ func (pin ProofInnerNode) Hash(childHash []byte) ([]byte, error) {
return hasher.Sum(nil), nil
}

// toProto converts the inner node proof to Protobuf, for use in ProofOps.
func (pin ProofInnerNode) toProto() *iavlproto.ProofInnerNode {
return &iavlproto.ProofInnerNode{
Height: int32(pin.Height),
Size_: pin.Size,
Version: pin.Version,
Left: pin.Left,
Right: pin.Right,
}
}

// proofInnerNodeFromProto converts a Protobuf ProofInnerNode to a ProofInnerNode.
func proofInnerNodeFromProto(pbInner *iavlproto.ProofInnerNode) (ProofInnerNode, error) {
if pbInner == nil {
return ProofInnerNode{}, errors.New("inner node cannot be nil")
}
if pbInner.Height > math.MaxInt8 || pbInner.Height < math.MinInt8 {
return ProofInnerNode{}, fmt.Errorf("height must fit inside an int8, got %v", pbInner.Height)
}
return ProofInnerNode{
Height: int8(pbInner.Height),
Size: pbInner.Size_,
Version: pbInner.Version,
Left: pbInner.Left,
Right: pbInner.Right,
}, nil
}

//----------------------------------------

type ProofLeafNode struct {
Expand Down Expand Up @@ -193,27 +163,6 @@ func (pln ProofLeafNode) Hash() ([]byte, error) {
return hasher.Sum(nil), nil
}

// toProto converts the leaf node proof to Protobuf, for use in ProofOps.
func (pln ProofLeafNode) toProto() *iavlproto.ProofLeafNode {
return &iavlproto.ProofLeafNode{
Key: pln.Key,
ValueHash: pln.ValueHash,
Version: pln.Version,
}
}

// proofLeafNodeFromProto converts a Protobuf ProofLeadNode to a ProofLeafNode.
func proofLeafNodeFromProto(pbLeaf *iavlproto.ProofLeafNode) (ProofLeafNode, error) {
if pbLeaf == nil {
return ProofLeafNode{}, errors.New("leaf node cannot be nil")
}
return ProofLeafNode{
Key: pbLeaf.Key,
ValueHash: pbLeaf.ValueHash,
Version: pbLeaf.Version,
}, nil
}

//----------------------------------------

// If the key does not exist, returns the path to the next leaf left of key (w/
Expand Down
106 changes: 0 additions & 106 deletions proof_forgery_test.go

This file was deleted.

Loading

0 comments on commit b53ed43

Please sign in to comment.