From 205db8e4d39216c68222e418c7c7a3779bd5eb8c Mon Sep 17 00:00:00 2001 From: arnaucube Date: Mon, 17 Aug 2020 11:27:33 +0200 Subject: [PATCH] Implement StateDB Checkpoints & Resets system --- db/statedb/statedb.go | 220 ++++++++++++++++++++++++++++++------- db/statedb/statedb_test.go | 129 +++++++++++++++++++++- go.mod | 2 +- go.sum | 36 ++++++ 4 files changed, 342 insertions(+), 45 deletions(-) diff --git a/db/statedb/statedb.go b/db/statedb/statedb.go index b66e96f..768c5b0 100644 --- a/db/statedb/statedb.go +++ b/db/statedb/statedb.go @@ -1,13 +1,17 @@ package statedb import ( + "encoding/binary" "errors" + "fmt" + "os" + "os/exec" + "strconv" "github.com/hermeznetwork/hermez-node/common" "github.com/iden3/go-merkletree" "github.com/iden3/go-merkletree/db" - "github.com/iden3/go-merkletree/db/leveldb" - "github.com/iden3/go-merkletree/db/memory" + "github.com/iden3/go-merkletree/db/pebble" ) // ErrStateDBWithoutMT is used when a method that requires a MerkleTree is called in a StateDB that does not have a MerkleTree defined @@ -16,25 +20,30 @@ var ErrStateDBWithoutMT = errors.New("Can not call method to use MerkleTree in a // ErrAccountAlreadyExists is used when CreateAccount is called and the Account already exists var ErrAccountAlreadyExists = errors.New("Can not CreateAccount because Account already exists") +// KEYCURRENTBATCH is used as key in the db to store the current BatchNum +var KEYCURRENTBATCH = []byte("currentbatch") + +// STATEDBPATH defines the subpath of the StateDB +const STATEDBPATH = "/statedb" + // StateDB represents the StateDB object type StateDB struct { - db db.Storage - mt *merkletree.MerkleTree + path string + currentBatch uint64 + db *pebble.PebbleStorage + mt *merkletree.MerkleTree } // NewStateDB creates a new StateDB, allowing to use an in-memory or in-disk // storage -func NewStateDB(path string, inDisk bool, withMT bool, nLevels int) (*StateDB, error) { - var sto db.Storage +func NewStateDB(path string, withMT bool, nLevels int) (*StateDB, error) { + var sto *pebble.PebbleStorage var err error - if inDisk { - sto, err = leveldb.NewLevelDbStorage(path, false) - if err != nil { - return nil, err - } - } else { - sto = memory.NewMemoryStorage() + sto, err = pebble.NewPebbleStorage(path+STATEDBPATH+"/current", false) + if err != nil { + return nil, err } + var mt *merkletree.MerkleTree = nil if withMT { mt, err = merkletree.NewMerkleTree(sto, nLevels) @@ -43,32 +52,124 @@ func NewStateDB(path string, inDisk bool, withMT bool, nLevels int) (*StateDB, e } } - return &StateDB{ - db: sto, - mt: mt, - }, nil + sdb := &StateDB{ + path: path + STATEDBPATH, + db: sto, + mt: mt, + } + + // load currentBatch + sdb.currentBatch, err = sdb.GetCurrentBatch() + if err != nil { + return nil, err + } + + return sdb, nil } -// CheckPointAt does a checkpoint at the given batchNum in the defined path -func (s *StateDB) CheckPointAt(batchNum uint64, path string) error { - // TODO +// DB returns the *pebble.PebbleStorage from the StateDB +func (s *StateDB) DB() *pebble.PebbleStorage { + return s.db +} + +// GetCurrentBatch returns the current BatchNum stored in the StateDB +func (s *StateDB) GetCurrentBatch() (uint64, error) { + cbBytes, err := s.db.Get(KEYCURRENTBATCH) + if err == db.ErrNotFound { + return 0, nil + } + if err != nil { + return 0, err + } + cb := binary.LittleEndian.Uint64(cbBytes[:8]) + return cb, nil +} +// setCurrentBatch stores the current BatchNum in the StateDB +func (s *StateDB) setCurrentBatch() error { + tx, err := s.db.NewTx() + if err != nil { + return err + } + var cbBytes [8]byte + binary.LittleEndian.PutUint64(cbBytes[:], s.currentBatch) + tx.Put(KEYCURRENTBATCH, cbBytes[:]) + if err := tx.Commit(); err != nil { + return err + } return nil } -// Reset resets the StateDB to the checkpoint at the given batchNum -func (s *StateDB) Reset(batchNum uint64) error { - // TODO +// CheckPointAt does a checkpoint at the given batchNum in the defined path +func (s *StateDB) MakeCheckpoint() error { + // advance currentBatch + s.currentBatch++ + + checkpointPath := s.path + "/BatchNum" + strconv.Itoa(int(s.currentBatch)) + + s.setCurrentBatch() + + // if checkpoint BatchNum already exist in disk, delete it + if _, err := os.Stat(checkpointPath); !os.IsNotExist(err) { + err := os.RemoveAll(checkpointPath) + if err != nil { + return err + } + } + + // execute Checkpoint + err := s.db.Pebble().Checkpoint(checkpointPath) + if err != nil { + return err + } return nil } -// Checkpoints returns a list of the checkpoints (batchNums) -func (s *StateDB) Checkpoints() ([]uint64, error) { - // TODO +// DeleteCheckpoint removes if exist the checkpoint of the given batchNum +func (s *StateDB) DeleteCheckpoint(batchNum uint64) error { + checkpointPath := s.path + "/BatchNum" + strconv.Itoa(int(batchNum)) - //batchnums, err - return nil, nil + if _, err := os.Stat(checkpointPath); os.IsNotExist(err) { + return fmt.Errorf("Checkpoint with batchNum %d does not exist in DB", batchNum) + } + + return os.RemoveAll(checkpointPath) +} + +// Reset resets the StateDB to the checkpoint at the given batchNum. Reset +// does not delete the checkpoints between old current and the new current, +// those checkpoints will remain in the storage, and eventually will be +// deleted when MakeCheckpoint overwrites them. +func (s *StateDB) Reset(batchNum uint64) error { + checkpointPath := s.path + "/BatchNum" + strconv.Itoa(int(batchNum)) + currentPath := s.path + "/current" + + // remove 'current' + err := os.RemoveAll(currentPath) + if err != nil { + return err + } + // copy 'BatchNumX' to 'current' + cmd := exec.Command("cp", "-r", checkpointPath, currentPath) + err = cmd.Run() + if err != nil { + return err + } + + // open the new 'current' + sto, err := pebble.NewPebbleStorage(currentPath, false) + if err != nil { + return err + } + s.db = sto + + // get currentBatch num + s.currentBatch, err = s.GetCurrentBatch() + if err != nil { + return err + } + return nil } // GetAccount returns the account for the given Idx @@ -195,8 +296,8 @@ type LocalStateDB struct { // NewLocalStateDB returns a new LocalStateDB connected to the given // synchronizerDB -func NewLocalStateDB(synchronizerDB *StateDB, withMT bool, nLevels int) (*LocalStateDB, error) { - s, err := NewStateDB("", false, withMT, nLevels) +func NewLocalStateDB(path string, synchronizerDB *StateDB, withMT bool, nLevels int) (*LocalStateDB, error) { + s, err := NewStateDB(path, withMT, nLevels) if err != nil { return nil, err } @@ -206,16 +307,53 @@ func NewLocalStateDB(synchronizerDB *StateDB, withMT bool, nLevels int) (*LocalS }, nil } -// Reset performs a reset, getting the state from -// LocalStateDB.synchronizerStateDB for the given batchNum +// Reset performs a reset in the LocaStateDB. If fromSynchronizer is true, it +// gets the state from LocalStateDB.synchronizerStateDB for the given batchNum. If fromSynchronizer is false, get the state from LocalStateDB checkpoints. func (l *LocalStateDB) Reset(batchNum uint64, fromSynchronizer bool) error { - // TODO - // if fromSynchronizer==true: - // make copy from l.synchronizerStateDB at the batchNum to the localStateDB - // if synchronizerStateDB does not have batchNum, return err - // the localStateDB checkpoint is set to batchNum - // else fromSynchronizer==false: - // the localStateDB checkpoint is set to batchNum - // if localStateDB does not have batchNum, return err - return nil + + synchronizerCheckpointPath := l.synchronizerStateDB.path + "/BatchNum" + strconv.Itoa(int(batchNum)) + checkpointPath := l.path + "/BatchNum" + strconv.Itoa(int(batchNum)) + currentPath := l.path + "/current" + + if fromSynchronizer { + // use checkpoint from SynchronizerStateDB + if _, err := os.Stat(synchronizerCheckpointPath); os.IsNotExist(err) { + // if synchronizerStateDB does not have checkpoint at batchNum, return err + return fmt.Errorf("Checkpoint not exist in Synchronizer") + } + + // remove 'current' + err := os.RemoveAll(currentPath) + if err != nil { + return err + } + // copy synchronizer'BatchNumX' to 'current' + cmd := exec.Command("cp", "-r", synchronizerCheckpointPath, currentPath) + err = cmd.Run() + if err != nil { + return err + } + // copy synchronizer-'BatchNumX' to 'BatchNumX' + cmd = exec.Command("cp", "-r", synchronizerCheckpointPath, checkpointPath) + err = cmd.Run() + if err != nil { + return err + } + + // open the new 'current' + sto, err := pebble.NewPebbleStorage(currentPath, false) + if err != nil { + return err + } + l.db = sto + + // get currentBatch num + l.currentBatch, err = l.GetCurrentBatch() + if err != nil { + return err + } + return nil + } + // use checkpoint from LocalStateDB + return l.StateDB.Reset(batchNum) } diff --git a/db/statedb/statedb_test.go b/db/statedb/statedb_test.go index b99ce55..0087dd2 100644 --- a/db/statedb/statedb_test.go +++ b/db/statedb/statedb_test.go @@ -2,6 +2,7 @@ package statedb import ( "encoding/hex" + "fmt" "io/ioutil" "math/big" "testing" @@ -38,7 +39,7 @@ func TestStateDBWithoutMT(t *testing.T) { dir, err := ioutil.TempDir("", "tmpdb") require.Nil(t, err) - sdb, err := NewStateDB(dir, false, false, 0) + sdb, err := NewStateDB(dir, false, 0) assert.Nil(t, err) // create test accounts @@ -96,12 +97,12 @@ func TestStateDBWithMT(t *testing.T) { dir, err := ioutil.TempDir("", "tmpdb") require.Nil(t, err) - sdb, err := NewStateDB(dir, false, true, 32) + sdb, err := NewStateDB(dir, true, 32) assert.Nil(t, err) // create test accounts var accounts []*common.Account - for i := 0; i < 100; i++ { + for i := 0; i < 20; i++ { accounts = append(accounts, newAccount(t, i)) } @@ -142,3 +143,125 @@ func TestStateDBWithMT(t *testing.T) { assert.Nil(t, err) assert.Equal(t, accounts[1].Nonce, a.Nonce) } + +func TestCheckpoints(t *testing.T) { + dir, err := ioutil.TempDir("", "sdb") + require.Nil(t, err) + + sdb, err := NewStateDB(dir, true, 32) + assert.Nil(t, err) + + // create test accounts + var accounts []*common.Account + for i := 0; i < 10; i++ { + accounts = append(accounts, newAccount(t, i)) + } + + // add test accounts + for i := 0; i < len(accounts); i++ { + _, err = sdb.MTCreateAccount(common.Idx(i), accounts[i]) + assert.Nil(t, err) + } + + // do checkpoints and check that currentBatch is correct + err = sdb.MakeCheckpoint() + assert.Nil(t, err) + cb, err := sdb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(1), cb) + + for i := 1; i < 10; i++ { + err = sdb.MakeCheckpoint() + assert.Nil(t, err) + + cb, err = sdb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(i+1), cb) + } + + // printCheckpoints(t, sdb.path) + + // reset checkpoint + err = sdb.Reset(3) + assert.Nil(t, err) + + // check that reset can be repeated (as there exist the 'current' and + // 'BatchNum3', from where the 'current' is a copy) + err = sdb.Reset(3) + require.Nil(t, err) + + // check that currentBatch is as expected after Reset + cb, err = sdb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(3), cb) + + // advance one checkpoint and check that currentBatch is fine + err = sdb.MakeCheckpoint() + assert.Nil(t, err) + cb, err = sdb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(4), cb) + + err = sdb.DeleteCheckpoint(uint64(9)) + assert.Nil(t, err) + err = sdb.DeleteCheckpoint(uint64(10)) + assert.Nil(t, err) + err = sdb.DeleteCheckpoint(uint64(9)) // does not exist, should return err + assert.NotNil(t, err) + err = sdb.DeleteCheckpoint(uint64(11)) // does not exist, should return err + assert.NotNil(t, err) + + // Create a LocalStateDB from the initial StateDB + dirLocal, err := ioutil.TempDir("", "ldb") + require.Nil(t, err) + ldb, err := NewLocalStateDB(dirLocal, sdb, true, 32) + assert.Nil(t, err) + + // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB) + err = ldb.Reset(4, true) + assert.Nil(t, err) + // check that currentBatch is 4 after the Reset + cb, err = ldb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(4), cb) + // advance one checkpoint in ldb + err = ldb.MakeCheckpoint() + assert.Nil(t, err) + cb, err = ldb.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(5), cb) + + // Create a 2nd LocalStateDB from the initial StateDB + dirLocal2, err := ioutil.TempDir("", "ldb2") + require.Nil(t, err) + ldb2, err := NewLocalStateDB(dirLocal2, sdb, true, 32) + assert.Nil(t, err) + + // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB) + err = ldb2.Reset(4, true) + assert.Nil(t, err) + // check that currentBatch is 4 after the Reset + cb, err = ldb2.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(4), cb) + // advance one checkpoint in ldb2 + err = ldb2.MakeCheckpoint() + assert.Nil(t, err) + cb, err = ldb2.GetCurrentBatch() + assert.Nil(t, err) + assert.Equal(t, uint64(5), cb) + + // printCheckpoints(t, sdb.path) + // printCheckpoints(t, ldb.path) + // printCheckpoints(t, ldb2.path) +} + +func printCheckpoints(t *testing.T, path string) { + files, err := ioutil.ReadDir(path) + assert.Nil(t, err) + + fmt.Println(path) + for _, f := range files { + fmt.Println(" " + f.Name()) + } +} diff --git a/go.mod b/go.mod index c59d6a9..a803a52 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/ethereum/go-ethereum v1.9.17 github.com/gobuffalo/packr/v2 v2.8.0 github.com/iden3/go-iden3-crypto v0.0.6-0.20200806115047-327a8175d6eb - github.com/iden3/go-merkletree v0.0.0-20200807083900-f6f82d8375d5 + github.com/iden3/go-merkletree v0.0.0-20200815144208-1f1bd54b93ae github.com/jinzhu/gorm v1.9.15 github.com/jmoiron/sqlx v1.2.0 github.com/lib/pq v1.8.0 diff --git a/go.sum b/go.sum index f2f3e7f..46f5d6d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -69,6 +70,8 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894 h1:JLaf/iINcLyjwbtTsCJjc6rtlASgHeIJPrB6QmwURnA= +github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -78,6 +81,14 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20200814004841-77c18adb0ee3 h1:ldllxzWS2OC6KatCsBBxrzKxx6LwKnO2jS0/2glSecM= +github.com/cockroachdb/pebble v0.0.0-20200814004841-77c18adb0ee3/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= +github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3 h1:2+dpIJzYMSbLi0587YXpi8tOJT52qCOI/1I0UNThc/I= +github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -138,10 +149,14 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -174,6 +189,8 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -187,6 +204,7 @@ github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20200707131729-196ae77b8a26 h1:lMm2hD9Fy0ynom5+85/pbdkiYcBqM1JWmhpAXLmy0fw= github.com/golang/snappy v0.0.2-0.20200707131729-196ae77b8a26/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -260,6 +278,10 @@ github.com/iden3/go-merkletree v0.0.0-20200806171216-dd600560e44c h1:EzVMSVkwKdf github.com/iden3/go-merkletree v0.0.0-20200806171216-dd600560e44c/go.mod h1:Fc49UeywIsj8nUfb5lxBzmWrMeMmqzTJ5F0OcjdiEME= github.com/iden3/go-merkletree v0.0.0-20200807083900-f6f82d8375d5 h1:qvWSCt3AYxj65uTdW6lLSKlrbckcHghOAW4TwdfJ+N8= github.com/iden3/go-merkletree v0.0.0-20200807083900-f6f82d8375d5/go.mod h1:Fc49UeywIsj8nUfb5lxBzmWrMeMmqzTJ5F0OcjdiEME= +github.com/iden3/go-merkletree v0.0.0-20200815105542-2277604e65dd h1:AkPlODLWkgQT9p1k6LnO3aRLIIeVL9ENof/YW87QL14= +github.com/iden3/go-merkletree v0.0.0-20200815105542-2277604e65dd/go.mod h1:/MsQOzDnxK8X/u7XP9ZBoZwZ4gIm9FlwfqckH5dRuTM= +github.com/iden3/go-merkletree v0.0.0-20200815144208-1f1bd54b93ae h1:CC8oKPM+38/Dkq20QymuIjyRo0UFzJZeH5DPbGWURrI= +github.com/iden3/go-merkletree v0.0.0-20200815144208-1f1bd54b93ae/go.mod h1:/MsQOzDnxK8X/u7XP9ZBoZwZ4gIm9FlwfqckH5dRuTM= github.com/iden3/go-wasm3 v0.0.1/go.mod h1:j+TcAB94Dfrjlu5kJt83h2OqAU+oyNUTwNZnQyII1sI= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= @@ -294,6 +316,7 @@ github.com/karrick/godirwalk v1.15.3 h1:0a2pXOgtB16CqIqXTiT7+K9L73f74n/aNQUnH6Or github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -402,6 +425,8 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -538,7 +563,10 @@ golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20200513190911-00229845015e h1:rMqLP+9XLy+LdbCXHjJHAmTfXCr93W7oruWA6Hq1Alc= +golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -547,10 +575,12 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20200329125638-4c31acba0007/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -601,16 +631,20 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -619,6 +653,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -634,6 +669,7 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=