Browse Source

Add golangci-lint to GHA & fix lint warnings

fix/hash-parsers
arnaucube 4 years ago
parent
commit
3093442590
7 changed files with 50 additions and 55 deletions
  1. +16
    -0
      .github/workflows/lint.yml
  2. +1
    -2
      db/leveldb/leveldb.go
  3. +0
    -2
      db/memory/memory.go
  4. +1
    -1
      db/pebble/pebble.go
  5. +12
    -11
      db/test/test.go
  6. +12
    -31
      merkletree.go
  7. +8
    -8
      merkletree_test.go

+ 16
- 0
.github/workflows/lint.yml

@ -0,0 +1,16 @@
name: Lint
on: [ push, pull_request ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Install Go
uses: actions/setup-go@v1
with:
go-version: 1.14.x
- name: Checkout code
uses: actions/checkout@v2
- name: Lint
run: |
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0
$(go env GOPATH)/bin/golangci-lint run --timeout=5m -E whitespace -E gosec -E gci -E misspell -E gomnd --max-same-issues 0

+ 1
- 2
db/leveldb/leveldb.go

@ -3,13 +3,12 @@ package leveldb
import ( import (
"encoding/json" "encoding/json"
"github.com/iden3/go-merkletree/db"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/errors"
"github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/util" "github.com/syndtr/goleveldb/leveldb/util"
"github.com/iden3/go-merkletree/db"
) )
// LevelDbStorage implements the db.Storage interface // LevelDbStorage implements the db.Storage interface

+ 0
- 2
db/memory/memory.go

@ -57,7 +57,6 @@ func (m *MemoryStorage) Iterate(f func([]byte, []byte) (bool, error)) error {
} }
localkey := v.K[len(m.prefix):] localkey := v.K[len(m.prefix):]
kvs = append(kvs, db.KV{K: localkey, V: v.V}) kvs = append(kvs, db.KV{K: localkey, V: v.V})
} }
sort.SliceStable(kvs, func(i, j int) bool { return bytes.Compare(kvs[i].K, kvs[j].K) < 0 }) sort.SliceStable(kvs, func(i, j int) bool { return bytes.Compare(kvs[i].K, kvs[j].K) < 0 })
@ -73,7 +72,6 @@ func (m *MemoryStorage) Iterate(f func([]byte, []byte) (bool, error)) error {
// Get implements the method Get of the interface db.Tx // Get implements the method Get of the interface db.Tx
func (tx *MemoryStorageTx) Get(key []byte) ([]byte, error) { func (tx *MemoryStorageTx) Get(key []byte) ([]byte, error) {
if v, ok := tx.kv.Get(db.Concat(tx.s.prefix, key)); ok { if v, ok := tx.kv.Get(db.Concat(tx.s.prefix, key)); ok {
return v, nil return v, nil
} }

+ 1
- 1
db/pebble/pebble.go

@ -154,7 +154,7 @@ func (tx *PebbleStorageTx) Add(atx db.Tx) {
func (tx *PebbleStorageTx) Commit() error { func (tx *PebbleStorageTx) Commit() error {
batch := tx.PebbleStorage.pdb.NewBatch() batch := tx.PebbleStorage.pdb.NewBatch()
for _, v := range tx.cache { for _, v := range tx.cache {
batch.Set(v.K, v.V, nil)
_ = batch.Set(v.K, v.V, nil)
} }
tx.cache = nil tx.cache = nil

+ 12
- 11
db/test/test.go

@ -1,3 +1,4 @@
//nolint:gomnd
package test package test
import ( import (
@ -108,17 +109,17 @@ func TestIterate(t *testing.T, sto db.Storage) {
err = sto1.Iterate(lister) err = sto1.Iterate(lister)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 3, len(r)) assert.Equal(t, 3, len(r))
assert.Equal(t, db.KV{[]byte{1}, []byte{4}}, r[0])
assert.Equal(t, db.KV{[]byte{2}, []byte{5}}, r[1])
assert.Equal(t, db.KV{[]byte{3}, []byte{6}}, r[2])
assert.Equal(t, db.KV{K: []byte{1}, V: []byte{4}}, r[0])
assert.Equal(t, db.KV{K: []byte{2}, V: []byte{5}}, r[1])
assert.Equal(t, db.KV{K: []byte{3}, V: []byte{6}}, r[2])
r = []db.KV{} r = []db.KV{}
err = sto2.Iterate(lister) err = sto2.Iterate(lister)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 3, len(r)) assert.Equal(t, 3, len(r))
assert.Equal(t, db.KV{[]byte{1}, []byte{7}}, r[0])
assert.Equal(t, db.KV{[]byte{2}, []byte{8}}, r[1])
assert.Equal(t, db.KV{[]byte{3}, []byte{9}}, r[2])
assert.Equal(t, db.KV{K: []byte{1}, V: []byte{7}}, r[0])
assert.Equal(t, db.KV{K: []byte{2}, V: []byte{8}}, r[1])
assert.Equal(t, db.KV{K: []byte{3}, V: []byte{9}}, r[2])
} }
// TestConcatTx checks that the implementation of the db.Storage interface // TestConcatTx checks that the implementation of the db.Storage interface
@ -180,13 +181,13 @@ func TestList(t *testing.T, sto db.Storage) {
r, err := sto1.List(100) r, err := sto1.List(100)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 3, len(r)) assert.Equal(t, 3, len(r))
assert.Equal(t, r[0], db.KV{[]byte{1}, []byte{4}})
assert.Equal(t, r[1], db.KV{[]byte{2}, []byte{5}})
assert.Equal(t, r[2], db.KV{[]byte{3}, []byte{6}})
assert.Equal(t, r[0], db.KV{K: []byte{1}, V: []byte{4}})
assert.Equal(t, r[1], db.KV{K: []byte{2}, V: []byte{5}})
assert.Equal(t, r[2], db.KV{K: []byte{3}, V: []byte{6}})
r, err = sto1.List(2) r, err = sto1.List(2)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 2, len(r)) assert.Equal(t, 2, len(r))
assert.Equal(t, r[0], db.KV{[]byte{1}, []byte{4}})
assert.Equal(t, r[1], db.KV{[]byte{2}, []byte{5}})
assert.Equal(t, r[0], db.KV{K: []byte{1}, V: []byte{4}})
assert.Equal(t, r[1], db.KV{K: []byte{2}, V: []byte{5}})
} }

+ 12
- 31
merkletree.go

@ -20,6 +20,8 @@ const (
proofFlagsLen = 2 proofFlagsLen = 2
// ElemBytesLen is the length of the Hash byte array // ElemBytesLen is the length of the Hash byte array
ElemBytesLen = 32 ElemBytesLen = 32
numCharPrint = 8
) )
var ( var (
@ -60,10 +62,10 @@ type Hash [32]byte
// String returns decimal representation in string format of the Hash // String returns decimal representation in string format of the Hash
func (h Hash) String() string { func (h Hash) String() string {
s := h.BigInt().String() s := h.BigInt().String()
if len(s) < 8 {
if len(s) < numCharPrint {
return s return s
} }
return s[0:8] + "..."
return s[0:numCharPrint] + "..."
} }
// Hex returns the hexadecimal representation of the Hash // Hex returns the hexadecimal representation of the Hash
@ -93,10 +95,10 @@ func (h *Hash) Bytes() []byte {
// from a byte array that previously has ben generated by the Hash.Bytes() // from a byte array that previously has ben generated by the Hash.Bytes()
// method. // method.
func NewBigIntFromBytes(b []byte) (*big.Int, error) { func NewBigIntFromBytes(b []byte) (*big.Int, error) {
if len(b) != 32 {
if len(b) != ElemBytesLen {
return nil, fmt.Errorf("Expected 32 bytes, found %d bytes", len(b)) return nil, fmt.Errorf("Expected 32 bytes, found %d bytes", len(b))
} }
return new(big.Int).SetBytes(common.SwapEndianness(b[:32])), nil
return new(big.Int).SetBytes(common.SwapEndianness(b[:ElemBytesLen])), nil
} }
// NewHashFromBigInt returns a *Hash representation of the given *big.Int // NewHashFromBigInt returns a *Hash representation of the given *big.Int
@ -110,7 +112,7 @@ func NewHashFromBigInt(b *big.Int) *Hash {
// in the process. This is the intended method to get a *Hash from a byte array // in the process. This is the intended method to get a *Hash from a byte array
// that previously has ben generated by the Hash.Bytes() method. // that previously has ben generated by the Hash.Bytes() method.
func NewHashFromBytes(b []byte) (*Hash, error) { func NewHashFromBytes(b []byte) (*Hash, error) {
if len(b) != 32 {
if len(b) != ElemBytesLen {
return nil, fmt.Errorf("Expected 32 bytes, found %d bytes", len(b)) return nil, fmt.Errorf("Expected 32 bytes, found %d bytes", len(b))
} }
var h Hash var h Hash
@ -224,7 +226,7 @@ func (mt *MerkleTree) AddAndGetCircomProof(k, v *big.Int) (*CircomProcessorProof
var cp CircomProcessorProof var cp CircomProcessorProof
cp.Fnc = 2 cp.Fnc = 2
cp.OldRoot = mt.rootKey cp.OldRoot = mt.rootKey
gettedK, gettedV, siblings, err := mt.Get(k)
gettedK, gettedV, _, err := mt.Get(k)
if err != nil && err != ErrKeyNotFound { if err != nil && err != ErrKeyNotFound {
return nil, err return nil, err
} }
@ -233,7 +235,7 @@ func (mt *MerkleTree) AddAndGetCircomProof(k, v *big.Int) (*CircomProcessorProof
if bytes.Equal(cp.OldKey[:], HashZero[:]) { if bytes.Equal(cp.OldKey[:], HashZero[:]) {
cp.IsOld0 = true cp.IsOld0 = true
} }
_, _, siblings, err = mt.Get(k)
_, _, siblings, err := mt.Get(k)
if err != nil && err != ErrKeyNotFound { if err != nil && err != ErrKeyNotFound {
return nil, err return nil, err
} }
@ -583,12 +585,12 @@ func (mt *MerkleTree) rmAndUpload(tx db.Tx, path []bool, kHash *Hash, siblings [
} }
toUpload := siblings[len(siblings)-1] toUpload := siblings[len(siblings)-1]
if len(siblings) < 2 {
if len(siblings) < 2 { //nolint:gomnd
mt.rootKey = siblings[0] mt.rootKey = siblings[0]
mt.dbInsert(tx, rootNodeValue, DBEntryTypeRoot, mt.rootKey[:]) mt.dbInsert(tx, rootNodeValue, DBEntryTypeRoot, mt.rootKey[:])
return tx.Commit() return tx.Commit()
} }
for i := len(siblings) - 2; i >= 0; i-- {
for i := len(siblings) - 2; i >= 0; i-- { //nolint:gomnd
if !bytes.Equal(siblings[i][:], HashZero[:]) { if !bytes.Equal(siblings[i][:], HashZero[:]) {
var newNode *Node var newNode *Node
if path[i] { if path[i] {
@ -646,27 +648,6 @@ func (mt *MerkleTree) recalculatePathUntilRoot(tx db.Tx, path []bool, node *Node
return nodeKey, err return nodeKey, err
} }
// dbGet is a helper function to get the node of a key from the internal
// storage.
func (mt *MerkleTree) dbGet(k []byte) (NodeType, []byte, error) {
if bytes.Equal(k, HashZero[:]) {
return 0, nil, nil
}
value, err := mt.db.Get(k)
if err != nil {
return 0, nil, err
}
if len(value) < 2 {
return 0, nil, ErrInvalidDBValue
}
nodeType := value[0]
nodeBytes := value[1:]
return NodeType(nodeType), nodeBytes, nil
}
// dbInsert is a helper function to insert a node into a key in an open db // dbInsert is a helper function to insert a node into a key in an open db
// transaction. // transaction.
func (mt *MerkleTree) dbInsert(tx db.Tx, k []byte, t NodeType, data []byte) { func (mt *MerkleTree) dbInsert(tx db.Tx, k []byte, t NodeType, data []byte) {
@ -756,7 +737,7 @@ func NewProofFromBytes(bs []byte) (*Proof, error) {
func (p *Proof) Bytes() []byte { func (p *Proof) Bytes() []byte {
bsLen := proofFlagsLen + len(p.notempties) + ElemBytesLen*len(p.Siblings) bsLen := proofFlagsLen + len(p.notempties) + ElemBytesLen*len(p.Siblings)
if p.NodeAux != nil { if p.NodeAux != nil {
bsLen += 2 * ElemBytesLen
bsLen += 2 * ElemBytesLen //nolint:gomnd
} }
bs := make([]byte, bsLen) bs := make([]byte, bsLen)

+ 8
- 8
merkletree_test.go

@ -350,12 +350,12 @@ func TestGraphViz(t *testing.T) {
mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10) mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
assert.Nil(t, err) assert.Nil(t, err)
mt.Add(big.NewInt(1), big.NewInt(0))
mt.Add(big.NewInt(2), big.NewInt(0))
mt.Add(big.NewInt(3), big.NewInt(0))
mt.Add(big.NewInt(4), big.NewInt(0))
mt.Add(big.NewInt(5), big.NewInt(0))
mt.Add(big.NewInt(100), big.NewInt(0))
_ = mt.Add(big.NewInt(1), big.NewInt(0))
_ = mt.Add(big.NewInt(2), big.NewInt(0))
_ = mt.Add(big.NewInt(3), big.NewInt(0))
_ = mt.Add(big.NewInt(4), big.NewInt(0))
_ = mt.Add(big.NewInt(5), big.NewInt(0))
_ = mt.Add(big.NewInt(100), big.NewInt(0))
// mt.PrintGraphViz(nil) // mt.PrintGraphViz(nil)
@ -381,7 +381,8 @@ node [fontname=Monospace,fontsize=10,shape=box]
} }
` `
w := bytes.NewBufferString("") w := bytes.NewBufferString("")
mt.GraphViz(w, nil)
err = mt.GraphViz(w, nil)
assert.Nil(t, err)
assert.Equal(t, []byte(expected), w.Bytes()) assert.Equal(t, []byte(expected), w.Bytes())
} }
@ -415,7 +416,6 @@ func TestDelete(t *testing.T) {
err = mt.Delete(big.NewInt(1)) err = mt.Delete(big.NewInt(1))
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "0", mt.Root().String()) assert.Equal(t, "0", mt.Root().String())
} }
func TestDelete2(t *testing.T) { func TestDelete2(t *testing.T) {

Loading…
Cancel
Save