arnaucube
arnaucube/go-merkletree-iden3Public Self-hosted repository
Update mt.Delete for empty Tree cases
arnaucube root@arnaucube.com
Wed, 08 Jul 2020 08:48:53 +0200
commit

1883b404bae65c5164816d7319def6b7aee8ce36

parent

e68d9e31d428f9181ec71e456f3858dd0f7afcec

2 files changed, 36 insertions(+), 1 deletions(-)

jump to
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) +}