Update mt.Delete for empty Tree cases
arnaucube root@arnaucube.com
Wed, 08 Jul 2020 08:48:53 +0200
2 files changed,
36 insertions(+),
1 deletions(-)
M
merkletree.go
→
merkletree.go
@@ -310,7 +310,7 @@ return err
} switch n.Type { case NodeTypeEmpty: - return nil + return ErrKeyNotFound case NodeTypeLeaf: if bytes.Equal(kHash[:], n.Entry[0][:]) { // remove and go up with the sibling@@ -337,6 +337,12 @@ }
// rmAndUpload removes the key, and goes up until the root updating all the nodes with the new values. func (mt *MerkleTree) rmAndUpload(tx db.Tx, path []bool, kHash *Hash, siblings []*Hash) error { + if len(siblings) == 0 { + mt.rootKey = &HashZero + mt.dbInsert(tx, rootNodeValue, DBEntryTypeRoot, mt.rootKey[:]) + return tx.Commit() + } + toUpload := siblings[len(siblings)-1] if len(siblings) < 2 { mt.rootKey = siblings[0]
M
merkletree_test.go
→
merkletree_test.go
@@ -315,6 +315,12 @@ err = mt.Delete(big.NewInt(33))
// mt.PrintGraphViz(nil) assert.Nil(t, err) assert.Equal(t, "12820263606494630162816839760750120928463716794691735985748071431547370997091", mt.Root().BigInt().String()) + + err = mt.Delete(big.NewInt(1234)) + assert.Nil(t, err) + err = mt.Delete(big.NewInt(1)) + assert.Nil(t, err) + assert.Equal(t, "0", mt.Root().String()) } func TestDelete2(t *testing.T) {@@ -420,3 +426,26 @@ err = mt2.Add(big.NewInt(33), big.NewInt(44))
assert.Nil(t, err) assert.Equal(t, mt2.Root(), mt.Root()) } + +func TestDeleteNonExistingKeys(t *testing.T) { + mt, err := NewMerkleTree(db.NewMemoryStorage(), 10) + assert.Nil(t, err) + + err = mt.Add(big.NewInt(1), big.NewInt(2)) + assert.Nil(t, err) + err = mt.Add(big.NewInt(33), big.NewInt(44)) + assert.Nil(t, err) + + err = mt.Delete(big.NewInt(33)) + assert.Nil(t, err) + err = mt.Delete(big.NewInt(33)) + assert.Equal(t, ErrKeyNotFound, err) + + err = mt.Delete(big.NewInt(1)) + assert.Nil(t, err) + + assert.Equal(t, "0", mt.Root().String()) + + err = mt.Delete(big.NewInt(33)) + assert.Equal(t, ErrKeyNotFound, err) +}