Skip to content

Commit 0dd98e2

Browse files
Add children of siblings as well
1 parent cec8884 commit 0dd98e2

4 files changed

Lines changed: 56 additions & 6 deletions

File tree

deepsubtree.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func GetSiblingExistenceProofsNonExistence(
8686
return existenceProofs, nil
8787
}
8888

89-
// Returns the sibling node of a leaf node with given key
89+
// Returns the sibling nodes of a node with given key
9090
func (tree *ImmutableTree) GetSiblingNodes(key []byte) ([]*Node, error) {
9191
siblingNodes := make([]*Node, 0)
9292
err := tree.recursiveGetSiblingNodes(tree.root, key, &siblingNodes)
@@ -96,6 +96,21 @@ func (tree *ImmutableTree) GetSiblingNodes(key []byte) ([]*Node, error) {
9696
return siblingNodes, nil
9797
}
9898

99+
func (tree *ImmutableTree) getAllChildren(node *Node) ([]*Node, error) {
100+
if node.isLeaf() {
101+
return nil, nil
102+
}
103+
leftNode, err := node.getLeftNode(tree)
104+
if err != nil {
105+
return nil, err
106+
}
107+
rightNode, err := node.getRightNode(tree)
108+
if err != nil {
109+
return nil, err
110+
}
111+
return []*Node{leftNode, rightNode}, nil
112+
}
113+
99114
// Recursively iterates the tree to return all the siblings node of nodes with given key
100115
func (tree *ImmutableTree) recursiveGetSiblingNodes(node *Node, key []byte, siblingNodes *[]*Node) error {
101116
if node == nil || node.isLeaf() {
@@ -112,11 +127,26 @@ func (tree *ImmutableTree) recursiveGetSiblingNodes(node *Node, key []byte, sibl
112127
if bytes.Compare(key, node.key) < 0 {
113128
if rightNode != nil {
114129
*siblingNodes = append(*siblingNodes, rightNode)
130+
siblingChildren, err := tree.getAllChildren(rightNode)
131+
if err != nil {
132+
return err
133+
}
134+
if siblingChildren != nil {
135+
*siblingNodes = append(*siblingNodes, siblingChildren...)
136+
137+
}
115138
}
116139
return tree.recursiveGetSiblingNodes(leftNode, key, siblingNodes)
117140
}
118141
if rightNode != nil {
119142
*siblingNodes = append(*siblingNodes, leftNode)
143+
siblingChildren, err := tree.getAllChildren(leftNode)
144+
if err != nil {
145+
return err
146+
}
147+
if siblingChildren != nil {
148+
*siblingNodes = append(*siblingNodes, siblingChildren...)
149+
}
120150
}
121151
return tree.recursiveGetSiblingNodes(rightNode, key, siblingNodes)
122152
}

deepsubtree_test.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ func FuzzBatchAddReverse(f *testing.F) {
311311
kString := keyList[int(readByte(r))%len(keys)]
312312
return false, []byte(kString)
313313
}
314+
flag, flag2 := false, false
314315
for i := 0; r.Len() != 0; i++ {
315316
b, err := r.ReadByte()
316317
if err != nil {
@@ -390,19 +391,32 @@ func FuzzBatchAddReverse(f *testing.F) {
390391
if keyToDelete == nil {
391392
continue
392393
}
393-
keys.Delete(string(keyToDelete))
394+
if string(keyToDelete) == "2712" && i == 6 {
395+
flag = true
396+
}
397+
398+
if flag2 {
399+
if (string(keyToDelete) == "7M8b" || string(keyToDelete) == "B01002212010879202192B72") && i == 7 {
400+
ics23proof := ics23.ExistenceProof{}
401+
_ = ics23proof
402+
}
403+
}
394404

395-
// TODO: Add more information needed for Delete operation in Deep Subtree
405+
ics23proof, err := tree.GetMembershipProof(keyToDelete)
406+
require.NoError(err)
396407
existenceProofs, err := tree.GetSiblingExistenceProofs(keyToDelete)
397408
require.NoError(err)
409+
existenceProofs = append(existenceProofs, ics23proof.GetExist())
398410
err = dst.AddExistenceProofs(existenceProofs)
399411
require.NoError(err)
400412
rootHash, err := tree.WorkingHash()
401413
require.NoError(err)
402414
err = dst.BuildTree(rootHash)
403415
require.NoError(err)
404416

405-
dst.Remove(keyToDelete)
417+
_, removed, err := dst.Remove(keyToDelete)
418+
require.NoError(err)
419+
require.True(removed)
406420
rootHash, err = dst.WorkingHash()
407421
require.NoError(err)
408422
err = dst.BuildTree(rootHash)
@@ -412,12 +426,17 @@ func FuzzBatchAddReverse(f *testing.F) {
412426
tree.Remove(keyToDelete)
413427
tree.SaveVersion()
414428

429+
keys.Delete(string(keyToDelete))
430+
415431
areEqual, err := haveEqualRoots(dst.MutableTree, tree)
416432
require.NoError(err)
417433
if !areEqual {
418434
t.Error("Remove: Unequal roots for Deep subtree and IAVL tree")
419435
}
420436
}
437+
if flag {
438+
flag2 = true
439+
}
421440
}
422441
t.Log("Done")
423442
})

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ require (
3131
github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect
3232
go.etcd.io/bbolt v1.3.6 // indirect
3333
golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 // indirect
34-
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect
34+
golang.org/x/sys v0.2.0 // indirect
3535
google.golang.org/protobuf v1.28.0 // indirect
3636
gopkg.in/yaml.v3 v3.0.1 // indirect
3737
)

go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1302,8 +1302,9 @@ golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBc
13021302
golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
13031303
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
13041304
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1305-
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU=
13061305
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1306+
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
1307+
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
13071308
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
13081309
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
13091310
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

0 commit comments

Comments
 (0)