Skip to content
This repository has been archived by the owner on Feb 27, 2023. It is now read-only.

Modernize error handling #21

Merged
merged 4 commits into from
Mar 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
go.mod
go.sum
- name: install
run: GOOS=linux GOARCH=${{ matrix.goarch }} make build
run: GOOS=linux GOARCH=${{ matrix.goarch }} go build
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Somehow we missed this during all reviews and testing 😂

if: "env.GIT_DIFF != ''"

tests:
Expand Down
13 changes: 5 additions & 8 deletions deepsubtree.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package smt

import (
"errors"
"hash"
)

// BadProofError is returned when an invalid Merkle proof is supplied.
type BadProofError struct{}

func (e *BadProofError) Error() string {
return "bad proof"
}
// ErrBadProof is returned when an invalid Merkle proof is supplied.
var ErrBadProof = errors.New("bad proof")

// DeepSparseMerkleSubTree is a deep Sparse Merkle subtree for working on only a few leafs.
type DeepSparseMerkleSubTree struct {
Expand All @@ -30,11 +27,11 @@ func NewDeepSparseMerkleSubTree(ms MapStore, hasher hash.Hash, root []byte) *Dee

// AddBranch adds a branch to the tree.
// These branches are generated by smt.ProveForRoot.
// If the proof is invalid, a BadProofError is returned.
// If the proof is invalid, a ErrBadProof is returned.
func (dsmst *DeepSparseMerkleSubTree) AddBranch(proof SparseMerkleProof, key []byte, value []byte) error {
result, updates := verifyProofWithUpdates(proof, dsmst.Root(), key, value, dsmst.th.hasher)
if !result {
return &BadProofError{}
return ErrBadProof
}

for _, update := range updates {
Expand Down
5 changes: 3 additions & 2 deletions deepsubtree_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package smt
import (
"bytes"
"crypto/sha256"
"errors"
"testing"
)

Expand Down Expand Up @@ -131,7 +132,7 @@ func TestDeepSparseMerkleSubTreeBadInput(t *testing.T) {

dsmst := NewDeepSparseMerkleSubTree(NewSimpleMap(), sha256.New(), smt.Root())
err := dsmst.AddBranch(badProof, []byte("testKey1"), []byte("testValue1"))
if _, ok := err.(*BadProofError); !ok {
t.Error("did not return BadProofError for bad proof input")
if !errors.Is(err, ErrBadProof) {
t.Error("did not return ErrBadProof for bad proof input")
}
}
5 changes: 2 additions & 3 deletions proofs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package smt

import (
"bytes"
"errors"
"hash"
"math"
)
Expand Down Expand Up @@ -161,7 +160,7 @@ func CompactProof(proof SparseMerkleProof, hasher hash.Hash) (SparseCompactMerkl
th := newTreeHasher(hasher)

if !proof.sanityCheck(th) {
return SparseCompactMerkleProof{}, errors.New("bad proof")
return SparseCompactMerkleProof{}, ErrBadProof
}

bitMask := emptyBytes(int(math.Ceil(float64(len(proof.SideNodes)) / float64(8))))
Expand Down Expand Up @@ -189,7 +188,7 @@ func DecompactProof(proof SparseCompactMerkleProof, hasher hash.Hash) (SparseMer
th := newTreeHasher(hasher)

if !proof.sanityCheck(th) {
return SparseMerkleProof{}, errors.New("bad proof")
return SparseMerkleProof{}, ErrBadProof
}

decompactedSideNodes := make([][]byte, proof.NumSideNodes)
Expand Down
13 changes: 5 additions & 8 deletions smt.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package smt

import (
"bytes"
"errors"
"hash"
)

Expand All @@ -12,11 +13,7 @@ const (

var defaultValue = []byte{}

type keyAlreadyEmptyError struct{}

func (e *keyAlreadyEmptyError) Error() string {
return "key already empty"
}
var errKeyAlreadyEmpty = errors.New("key already empty")

// SparseMerkleTree is a Sparse Merkle tree.
type SparseMerkleTree struct {
Expand Down Expand Up @@ -162,7 +159,7 @@ func (smt *SparseMerkleTree) UpdateForRoot(key []byte, value []byte, root []byte
if bytes.Equal(value, defaultValue) {
// Delete operation.
newRoot, err = smt.deleteWithSideNodes(path, sideNodes, oldLeafHash, oldLeafData)
if _, ok := err.(*keyAlreadyEmptyError); ok {
if errors.Is(err, errKeyAlreadyEmpty) {
// This key is already empty; return the old root.
return root, nil
}
Expand All @@ -181,10 +178,10 @@ func (smt *SparseMerkleTree) DeleteForRoot(key, root []byte) ([]byte, error) {
func (smt *SparseMerkleTree) deleteWithSideNodes(path []byte, sideNodes [][]byte, oldLeafHash []byte, oldLeafData []byte) ([]byte, error) {
if bytes.Equal(oldLeafHash, smt.th.placeholder()) {
// This key is already empty as it is a placeholder; return an error.
return nil, &keyAlreadyEmptyError{}
return nil, errKeyAlreadyEmpty
} else if actualPath, _ := smt.th.parseLeaf(oldLeafData); !bytes.Equal(path, actualPath) {
// This key is already empty as a different key was found its place; return an error.
return nil, &keyAlreadyEmptyError{}
return nil, errKeyAlreadyEmpty
}

var currentHash, currentData []byte
Expand Down