Skip to content
Snippets Groups Projects
Unverified Commit 36d86d60 authored by Wolfgang Welz's avatar Wolfgang Welz Committed by GitHub
Browse files

Merge pull request #73 from Wollac/fix/lint-error

Resolve "go vet" errors
parents af1fee98 df8e160b
No related branches found
No related tags found
No related merge requests found
...@@ -15,7 +15,6 @@ require ( ...@@ -15,7 +15,6 @@ require (
github.com/labstack/echo v3.3.10+incompatible github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.2.9 // indirect github.com/labstack/gommon v0.2.9 // indirect
github.com/magiconair/properties v1.8.1 github.com/magiconair/properties v1.8.1
github.com/panjf2000/ants v1.1.0
github.com/pkg/errors v0.8.1 github.com/pkg/errors v0.8.1
github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4
github.com/rivo/uniseg v0.1.0 // indirect github.com/rivo/uniseg v0.1.0 // indirect
......
...@@ -6,48 +6,63 @@ import ( ...@@ -6,48 +6,63 @@ import (
"github.com/dgraph-io/badger" "github.com/dgraph-io/badger"
"github.com/dgraph-io/badger/options" "github.com/dgraph-io/badger/options"
"github.com/pkg/errors"
) )
var instance *badger.DB var instance *badger.DB
var once sync.Once
var openLock sync.Mutex // Returns whether the given file or directory exists.
func exists(path string) (bool, error) {
func GetBadgerInstance() (result *badger.DB, err error) { _, err := os.Stat(path)
openLock.Lock() if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
if instance == nil { func checkDir(dir string) error {
directory := *DIRECTORY.Value exists, err := exists(dir)
if err != nil {
return err
}
if _, osErr := os.Stat(directory); os.IsNotExist(osErr) { if !exists {
if osErr := os.Mkdir(directory, 0700); osErr != nil { return os.Mkdir(dir, 0700)
err = osErr }
return nil
}
return func createDB() (*badger.DB, error) {
} directory := *DIRECTORY.Value
} else if osErr != nil { if err := checkDir(directory); err != nil {
err = osErr return nil, errors.Wrap(err, "Could not check directory")
}
return opts := badger.DefaultOptions(directory)
} opts.Logger = &logger{}
opts.Truncate = true
opts.TableLoadingMode = options.MemoryMap
opts := badger.DefaultOptions(directory) db, err := badger.Open(opts)
opts.Logger = &logger{} if err != nil {
opts.Truncate = true return nil, errors.Wrap(err, "Could not open new DB")
opts.TableLoadingMode = options.MemoryMap }
db, badgerErr := badger.Open(opts) return db, nil
if badgerErr != nil { }
err = badgerErr
return func GetBadgerInstance() *badger.DB {
once.Do(func() {
db, err := createDB()
if err != nil {
// errors should cause a panic to avoid singleton deadlocks
panic(err)
} }
instance = db instance = db
} })
return instance
openLock.Unlock()
result = instance
return
} }
...@@ -6,12 +6,10 @@ import ( ...@@ -6,12 +6,10 @@ import (
"github.com/dgraph-io/badger" "github.com/dgraph-io/badger"
) )
var databasesByName = make(map[string]*databaseImpl) var dbMap = make(map[string]*prefixDb)
var getLock sync.Mutex var mu sync.Mutex
var ErrKeyNotFound = badger.ErrKeyNotFound type prefixDb struct {
type databaseImpl struct {
db *badger.DB db *badger.DB
name string name string
prefix []byte prefix []byte
...@@ -19,30 +17,32 @@ type databaseImpl struct { ...@@ -19,30 +17,32 @@ type databaseImpl struct {
} }
func Get(name string) (Database, error) { func Get(name string) (Database, error) {
getLock.Lock() // avoid locking if it's a clean hit
defer getLock.Unlock() if db, exists := dbMap[name]; exists {
return db, nil
if database, exists := databasesByName[name]; exists {
return database, nil
} }
badgerInstance, err := GetBadgerInstance() mu.Lock()
if err != nil { defer mu.Unlock()
return nil, err
// needs to be re-checked after locking
if db, exists := dbMap[name]; exists {
return db, nil
} }
database := &databaseImpl{ badger := GetBadgerInstance()
db: badgerInstance, db := &prefixDb{
db: badger,
name: name, name: name,
prefix: []byte(name + "_"), prefix: []byte(name + "_"),
} }
databasesByName[name] = database dbMap[name] = db
return databasesByName[name], nil return db, nil
} }
func (this *databaseImpl) Set(key []byte, value []byte) error { func (this *prefixDb) Set(key []byte, value []byte) error {
if err := this.db.Update(func(txn *badger.Txn) error { return txn.Set(append(this.prefix, key...), value) }); err != nil { if err := this.db.Update(func(txn *badger.Txn) error { return txn.Set(append(this.prefix, key...), value) }); err != nil {
return err return err
} }
...@@ -50,7 +50,7 @@ func (this *databaseImpl) Set(key []byte, value []byte) error { ...@@ -50,7 +50,7 @@ func (this *databaseImpl) Set(key []byte, value []byte) error {
return nil return nil
} }
func (this *databaseImpl) Contains(key []byte) (bool, error) { func (this *prefixDb) Contains(key []byte) (bool, error) {
err := this.db.View(func(txn *badger.Txn) error { err := this.db.View(func(txn *badger.Txn) error {
_, err := txn.Get(append(this.prefix, key...)) _, err := txn.Get(append(this.prefix, key...))
if err != nil { if err != nil {
...@@ -60,14 +60,14 @@ func (this *databaseImpl) Contains(key []byte) (bool, error) { ...@@ -60,14 +60,14 @@ func (this *databaseImpl) Contains(key []byte) (bool, error) {
return nil return nil
}) })
if err == ErrKeyNotFound { if err == badger.ErrKeyNotFound {
return false, nil return false, nil
} else { } else {
return err == nil, err return err == nil, err
} }
} }
func (this *databaseImpl) Get(key []byte) ([]byte, error) { func (this *prefixDb) Get(key []byte) ([]byte, error) {
var result []byte = nil var result []byte = nil
err := this.db.View(func(txn *badger.Txn) error { err := this.db.View(func(txn *badger.Txn) error {
...@@ -86,7 +86,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) { ...@@ -86,7 +86,7 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
return result, err return result, err
} }
func (this *databaseImpl) Delete(key []byte) error { func (this *prefixDb) Delete(key []byte) error {
err := this.db.Update(func(txn *badger.Txn) error { err := this.db.Update(func(txn *badger.Txn) error {
err := txn.Delete(append(this.prefix, key...)) err := txn.Delete(append(this.prefix, key...))
return err return err
...@@ -94,10 +94,10 @@ func (this *databaseImpl) Delete(key []byte) error { ...@@ -94,10 +94,10 @@ func (this *databaseImpl) Delete(key []byte) error {
return err return err
} }
func (this *databaseImpl) ForEach(consumer func([]byte, []byte)) error { func (this *prefixDb) ForEach(consumer func([]byte, []byte)) error {
err := this.db.View(func(txn *badger.Txn) error { err := this.db.View(func(txn *badger.Txn) error {
iteratorOptions := badger.DefaultIteratorOptions iteratorOptions := badger.DefaultIteratorOptions
iteratorOptions.Prefix = this.prefix iteratorOptions.Prefix = this.prefix // filter by prefix
// create an iterator the default options // create an iterator the default options
it := txn.NewIterator(iteratorOptions) it := txn.NewIterator(iteratorOptions)
......
package datastructure
import (
"fmt"
"testing"
)
import "runtime"
import "unsafe"
import "errors"
import "time"
func TestWeakmap(t *testing.T) {
generateA(6)
fmt.Println("")
debugWeakMap(6)
fmt.Println("")
runtime.GC()
fmt.Println("GC runned.")
time.Sleep(1 * time.Second)
debugWeakMap(6)
}
func generateA(n int) {
for i := 0; i < n; i++ {
a := NewA()
WMap.Add(a)
fmt.Println("Added to WM A with id =", a.Id)
}
}
func debugWeakMap(n int) {
for i := 0; i < n; i++ {
if WMap.Has(i) {
fmt.Println("Has id =", i)
} else {
fmt.Println("Hasn't id =", i)
}
}
}
var aId int
func NewA() *A {
aId++
return &A{aId}
}
var WMap = &WeakMap{weakMap: make(map[int]uintptr)}
type WeakMap struct {
weakMap map[int]uintptr
}
type A struct {
Id int
}
func (w *WeakMap) Add(a *A) {
runtime.SetFinalizer(a, finalizer)
w.weakMap[a.Id] = uintptr(unsafe.Pointer(a))
}
func (w *WeakMap) Get(id int) (*A, error) {
if !w.Has(id) {
return nil, errors.New("")
}
a := (*A)(unsafe.Pointer(w.weakMap[id]))
return a, nil
}
func (w *WeakMap) Has(id int) bool {
_, ok := w.weakMap[id]
return ok
}
func (w *WeakMap) Remove(a *A) {
delete(w.weakMap, a.Id)
}
func finalizer(a *A) {
fmt.Println(a.Id)
WMap.Remove(a)
}
...@@ -25,7 +25,7 @@ func intStringCaller(handler interface{}, params ...interface{}) { ...@@ -25,7 +25,7 @@ func intStringCaller(handler interface{}, params ...interface{}) {
handler.(func(int, string))(params[0].(int), params[1].(string)) handler.(func(int, string))(params[0].(int), params[1].(string))
} }
func ExampleHelloWorld() { func ExampleEvent() {
// create event object (usually exposed through a public struct that holds all the different event types) // create event object (usually exposed through a public struct that holds all the different event types)
event := NewEvent(intStringCaller) event := NewEvent(intStringCaller)
......
...@@ -15,11 +15,11 @@ func Benchmark(b *testing.B) { ...@@ -15,11 +15,11 @@ func Benchmark(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
wg.Add(1) wg.Add(1)
go func() { go func(i int) {
<-pool.Submit(i) <-pool.Submit(i)
wg.Done() wg.Done()
}() }(i)
} }
wg.Wait() wg.Wait()
......
...@@ -73,7 +73,9 @@ func (this *PeerRegister) Remove(key string, lock ...bool) { ...@@ -73,7 +73,9 @@ func (this *PeerRegister) Remove(key string, lock ...bool) {
if len(lock) == 0 || lock[0] { if len(lock) == 0 || lock[0] {
defer this.Lock()() defer this.Lock()()
if peerEntry, exists := this.Peers[key]; exists { // needs to be updated after locking
peerEntry, exists = this.Peers[key]
if exists {
delete(this.Peers, key) delete(this.Peers, key)
this.Events.Remove.Trigger(peerEntry) this.Events.Remove.Trigger(peerEntry)
......
...@@ -6,8 +6,6 @@ import ( ...@@ -6,8 +6,6 @@ import (
"github.com/iotaledger/goshimmer/packages/model/value_transaction" "github.com/iotaledger/goshimmer/packages/model/value_transaction"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
"github.com/iotaledger/goshimmer/plugins/bundleprocessor" "github.com/iotaledger/goshimmer/plugins/bundleprocessor"
"github.com/iotaledger/iota.go/address"
. "github.com/iotaledger/iota.go/consts"
"github.com/iotaledger/iota.go/kerl" "github.com/iotaledger/iota.go/kerl"
"github.com/iotaledger/iota.go/signing" "github.com/iotaledger/iota.go/signing"
. "github.com/iotaledger/iota.go/trinary" . "github.com/iotaledger/iota.go/trinary"
...@@ -15,31 +13,6 @@ import ( ...@@ -15,31 +13,6 @@ import (
var PLUGIN = node.NewPlugin("Validator", node.Enabled, configure, run) var PLUGIN = node.NewPlugin("Validator", node.Enabled, configure, run)
// Creates bundle signature fragments and the corresponding address to validate against.
// Each signature fragment after the first must go into its own meta transaction with value = 0.
func demoSign(seed Trytes, index uint64, sec SecurityLevel, bundleHash Hash) (Hash, []Trytes) {
addr, _ := address.GenerateAddress(seed, index, sec)
// compute seed based on address index
subseed, _ := signing.Subseed(seed, index)
// generate the private key
prvKey, _ := signing.Key(subseed, sec)
normalizedBundleHash := signing.NormalizedBundleHash(bundleHash)
signatureFragments := make([]Trytes, sec)
for i := 0; i < int(sec); i++ {
// each security level signs one third of the (normalized) bundle hash
signedFragTrits, _ := signing.SignatureFragment(
normalizedBundleHash[i*HashTrytesSize/3:(i+1)*HashTrytesSize/3],
prvKey[i*KeyFragmentLength:(i+1)*KeyFragmentLength],
)
signatureFragments[i] = MustTritsToTrytes(signedFragTrits)
}
return addr, signatureFragments
}
func validateSignatures(bundleHash Hash, txs []*value_transaction.ValueTransaction) (bool, error) { func validateSignatures(bundleHash Hash, txs []*value_transaction.ValueTransaction) (bool, error) {
for i, tx := range txs { for i, tx := range txs {
// ignore all non-input transactions // ignore all non-input transactions
......
package validator
import (
"fmt"
"github.com/iotaledger/iota.go/address"
. "github.com/iotaledger/iota.go/consts"
"github.com/iotaledger/iota.go/signing"
. "github.com/iotaledger/iota.go/trinary"
)
const (
exampleHash = "999999999999999999999999999999999999999999999999999999999999999999999999999999999"
exampleSeed = exampleHash
exmapleIndex = 0
exampleSec = SecurityLevelLow
)
// Creates bundle signature fragments for the given address index and bundle hash.
// Each signature fragment after the first must go into its own meta transaction with value = 0.
func signature(seed Trytes, index uint64, sec SecurityLevel, bundleHash Hash) []Trytes {
// compute seed based on address index
subseed, _ := signing.Subseed(seed, index)
// generate the private key
prvKey, _ := signing.Key(subseed, sec)
normalizedBundleHash := signing.NormalizedBundleHash(bundleHash)
signatureFragments := make([]Trytes, sec)
for i := 0; i < int(sec); i++ {
// each security level signs one third of the (normalized) bundle hash
signedFragTrits, _ := signing.SignatureFragment(
normalizedBundleHash[i*HashTrytesSize/3:(i+1)*HashTrytesSize/3],
prvKey[i*KeyFragmentLength:(i+1)*KeyFragmentLength],
)
signatureFragments[i] = MustTritsToTrytes(signedFragTrits)
}
return signatureFragments
}
func ExamplePLUGIN() {
// corresponding address to validate against.
addr, _ := address.GenerateAddress(exampleSeed, exmapleIndex, exampleSec)
fmt.Println(addr)
// compute the signature fragments which would be added to the (meta) transactions
signatureFragments := signature(exampleSeed, exmapleIndex, exampleSec, exampleHash)
fmt.Println(signatureFragments[0])
// Output:
// BSIXFJENGVJSOWPVHVALMPOPO9PUKHXDQI9VDELCBJXN9TCNQPTFEDMPQCVBOJSZUHEOABYYYAT9IAHHY
// GHHKPBXOOBOEHGGEEKYPH9MANWEKSQTQJFJ9KUTMJQAVITYRZMNLUESQARNHAWUJAPPZSQ9A9RUKABCE9KZPJDUEHVZEOSCQMTCC9AWBGWZLZEXMJ9YOQUVIBGMXSINCOLUATYDDUBAALHCBIONNRQIVIPUFPOIFHYRBFBGXXNVYXFZUSTTA9LYGGITTAJCVDE9GCFRGIOTXLQ9ZJDLONDLZ9OPS9TNYVKLTCGFBH9QPJWLIGADWMTJVCLAUCOZFDSRRCAMVWYFXRPGPMIOPIW9GBWANVSMPONQOTNLLYYHXAMZMMNRHMRXHEIXPVNORNGZZ9ZAU9RAWASOZNIBKDWYZWKCMLEUE9UVDHZ9XXGPXZABB9FGTNDTDFTYCKLKRRC9GZFKHKDGAWPBWEUPPWISYBBNZCIBERPXTMZPZHPKKUQUPBIJBIKZAGFHDDNAGCRQMWOMLUMAYKRBMHPMDWZK9JRBDWCJCBJQYMDUBNKOIRSJSVTCNKROZ9KLFBZLOXQOASLCFETCNZRPZULOABOFCUO9WKNQILLLTQ9GWVDBASBGSKUHFHRXOKQIBRCLUYZBZMTXTIG9BJNYHTJQQOECXOWLIDOYKMFJWKRCYW99VZILSPU9I9ZSTTBZVGISUHPCWLGKCFNLIHJNCL9OWQDNAKJAGRKTGCTDRHXVAYXOHNFVJYBMZLMXV9VINNIAWONYDYOKHHMOFFEOOVBMVMYABWRWLZTWJECKKAGPCIMUDZZIEJCFBXFIYKDRMWZIOEUZNLOXZJRDHVVKOTJWMLTIXVIRJSXUBLFGOCCLEIZVCDYD9FEMCRUOERPRDFGUJSALRSOBN9J9XDTUAJZFLHUGQI9MCXZCYWTTIHNQUPUYPDRJLRZG9HAXHYQDSSCQNPTBYKNQUWZDE9QUESZJASRXHNW9OKAVUKLLMVGOJJRZCPRXSRYUECLNQEFIHI9S9NNEN9KACVIKCZYDEKCDNUASUJWMTVLSPBOBQMQEMZJXJVQAMUGBTMNWEWVJSXNZKIAADSQCCLISYSUZICSIVXZUG9MTICGWXKXKJDW9TOUBS9BTOUFUKWEBVIIJTGD9IBLRHBCPICWSZQNJQERTBOZGLJFCXKGQTAHIWKOSGHRMMWXABQYHVHOPG9XDIXMIRBXHOSYBCHSFWORNLUD9JAB9ICBIPXYVLIXYNRHJVEDMIRSAGXKZKSFZADJ9GA9DGJZAJTXZGIKRXVBCCBGJPJWJJZXZRQNWLEUZEFTWOXUBTAGDPPKKPKRYPGXVSRWLRNEDAXHZYT9DRN9L9ZWXPTTOSKMGTPQQXHACAKESRQXVXXNOLIATRKDGGJNIDWWYKQSLTC9ERTPMNXQHZNVNSBGIRRQHMOCOGDWPQAU9WPRSGZMPXZWQADUFUAWVGESLIWZNV9WNANDMZAOLXIHAOSFBADWVVAHMJVFNX9BGMMYGMJCUOYCSKJWIUMYHQFQXCFQXQNB9VTBLAYGKUZLFH9UVWIQJVLMLOZDLLIPJZSNXBPWAKKZWKCVSWUSBSQLBIAX9SQGMNPCJWTQDQEASSWWCSTVJRFDBPBLNYU9CNFUYINVMQPJZGKKUH9QBMUVWFSLPXWKBBWKNLMHGCEMJWCTNXZYWCFXYU9XLTWDSROJDTCRARMBNYDDD99HCFMXMUCO9NJSRA9G9HGWRTWNDBDQLBTCNYIVRMWRWPDJDDYCDODGEBNFTNINPNMZYMJJHVZSNEIJOAPGHAIVCZHQIULTRIZ9ML9LCWTQVGLBKKBGJYZTOZZIYUBCBKHKYUHCFGZKDERTWYHNYWSWLGPUGRB9WNQTHOMBFPKUQZREUQCNXL9MFSZCNBN9PTAVCERMWTTFDZL9BJQMC9OUBWGDTURAEYTYRDNFUBATOWFSVNXJC9JUPARMU9MINY9RWRHIXBPNIUADFAEP9F9FWNJNRPNGLWHRYYCV9ZIWBOUZPFZTWDLOCNOYZQLWFJHZ99ZBLUDSIQBJOJXMQJBUCYYMROBCJJJNCETVUYRXKHAWGUBIWOKQXOIOYBQKNDXZCKXQZLWEMXYLJPODRMOQUYOAATZZQ9JZDR9KPIHRQKIEAQNO9OVXNHDFCUUIZRQDWYGKUAYIGHGIIJIOIERLVNDUEBZUAQGDZMWNGXQPYSNWUEGF9BQDFJEQRPEGFGJTQFWO9PWECFGNDH9LW
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment