-
-
Save norswap/76e627a0ce3577a9af56281b565327b6 to your computer and use it in GitHub Desktop.
Minigeth Modified Files Diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/minigeth3/.gitignore b/minigeth/.gitignore | |
index 1ee8b83..53d8b98 100644 | |
--- a/minigeth3/.gitignore | |
+++ b/minigeth/.gitignore | |
@@ -1,49 +1 @@ | |
-# See http://help.github.com/ignore-files/ for more about ignoring files. | |
-# | |
-# If you find yourself ignoring temporary files generated by your text editor | |
-# or operating system, you probably want to add a global ignore instead: | |
-# git config --global core.excludesfile ~/.gitignore_global | |
- | |
-/tmp | |
-*/**/*un~ | |
-*/**/*.test | |
-*un~ | |
-.DS_Store | |
-*/**/.DS_Store | |
-.ethtest | |
-*/**/*tx_database* | |
-*/**/*dapps* | |
-build/_vendor/pkg | |
- | |
-#* | |
-.#* | |
-*# | |
-*~ | |
-.project | |
-.settings | |
- | |
-# used by the Makefile | |
-/build/_workspace/ | |
-/build/cache/ | |
-/build/bin/ | |
-/geth*.zip | |
- | |
-# travis | |
-profile.tmp | |
-profile.cov | |
- | |
-# IdeaIDE | |
-.idea | |
- | |
-# VS Code | |
-.vscode | |
- | |
-# dashboard | |
-/dashboard/assets/flow-typed | |
-/dashboard/assets/node_modules | |
-/dashboard/assets/stats.json | |
-/dashboard/assets/bundle.js | |
-/dashboard/assets/bundle.js.map | |
-/dashboard/assets/package-lock.json | |
- | |
-**/yarn-error.log | |
+go-ethereum | |
diff --git a/minigeth3/core/state/database.go b/minigeth/core/state/database.go | |
index 1a06e33..62a1f6e 100644 | |
--- a/minigeth3/core/state/database.go | |
+++ b/minigeth/core/state/database.go | |
@@ -1,70 +1,68 @@ | |
-// Copyright 2017 The go-ethereum Authors | |
-// This file is part of the go-ethereum library. | |
-// | |
-// The go-ethereum library is free software: you can redistribute it and/or modify | |
-// it under the terms of the GNU Lesser General Public License as published by | |
-// the Free Software Foundation, either version 3 of the License, or | |
-// (at your option) any later version. | |
-// | |
-// The go-ethereum library is distributed in the hope that it will be useful, | |
-// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
-// GNU Lesser General Public License for more details. | |
-// | |
-// You should have received a copy of the GNU Lesser General Public License | |
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | |
- | |
package state | |
import ( | |
- "errors" | |
- "fmt" | |
+ "math/big" | |
- "github.com/VictoriaMetrics/fastcache" | |
"github.com/ethereum/go-ethereum/common" | |
- "github.com/ethereum/go-ethereum/core/rawdb" | |
- "github.com/ethereum/go-ethereum/ethdb" | |
+ "github.com/ethereum/go-ethereum/core/types" | |
+ "github.com/ethereum/go-ethereum/oracle" | |
"github.com/ethereum/go-ethereum/trie" | |
- lru "github.com/hashicorp/golang-lru" | |
) | |
-const ( | |
- // Number of codehash->size associations to keep. | |
- codeSizeCacheSize = 100000 | |
+// TODO: add oracle calls here | |
+// wrapper for the oracle | |
- // Cache size granted for caching clean code. | |
- codeCacheSize = 64 * 1024 * 1024 | |
-) | |
- | |
-// Database wraps access to tries and contract code. | |
-type Database interface { | |
- // OpenTrie opens the main account trie. | |
- OpenTrie(root common.Hash) (Trie, error) | |
- | |
- // OpenStorageTrie opens the storage trie of an account. | |
- OpenStorageTrie(addrHash, root common.Hash) (Trie, error) | |
- | |
- // CopyTrie returns an independent copy of the given trie. | |
- CopyTrie(Trie) Trie | |
- | |
- // ContractCode retrieves a particular contract's code. | |
- ContractCode(addrHash, codeHash common.Hash) ([]byte, error) | |
- | |
- // ContractCodeSize retrieves a particular contracts code's size. | |
- ContractCodeSize(addrHash, codeHash common.Hash) (int, error) | |
- | |
- // TrieDB retrieves the low level trie database used for data storage. | |
- TrieDB() *trie.Database | |
+type Database struct { | |
+ db *trie.Database | |
+ BlockNumber *big.Int | |
+ StateRoot common.Hash | |
} | |
-// Trie is a Ethereum Merkle Patricia trie. | |
-type Trie interface { | |
- // GetKey returns the sha3 preimage of a hashed key that was previously used | |
- // to store a value. | |
- // | |
- // TODO(fjl): remove this when SecureTrie is removed | |
- GetKey([]byte) []byte | |
+func NewDatabase(header types.Header) Database { | |
+ //triedb := trie.Database{BlockNumber: header.Number, Root: header.Root} | |
+ //triedb.Preseed() | |
+ triedb := trie.NewDatabase(header) | |
+ return Database{db: &triedb, BlockNumber: header.Number, StateRoot: header.Root} | |
+} | |
+// ContractCode retrieves a particular contract's code. | |
+func (db *Database) ContractCode(addrHash common.Hash, codeHash common.Hash) ([]byte, error) { | |
+ oracle.PrefetchCode(db.BlockNumber, addrHash) | |
+ code := oracle.Preimage(codeHash) | |
+ return code, nil | |
+} | |
+ | |
+// ContractCodeSize retrieves a particular contracts code's size. | |
+func (db *Database) ContractCodeSize(addrHash common.Hash, codeHash common.Hash) (int, error) { | |
+ oracle.PrefetchCode(db.BlockNumber, addrHash) | |
+ code := oracle.Preimage(codeHash) | |
+ return len(code), nil | |
+} | |
+ | |
+func (db *Database) CopyTrie(trie Trie) Trie { | |
+ panic("don't copy tries") | |
+} | |
+ | |
+// OpenTrie opens the main account trie at a specific root hash. | |
+func (db *Database) OpenTrie(root common.Hash) (Trie, error) { | |
+ tr, err := trie.NewSecure(root, db.db) | |
+ if err != nil { | |
+ return nil, err | |
+ } | |
+ return tr, nil | |
+} | |
+ | |
+// OpenStorageTrie opens the storage trie of an account. | |
+func (db *Database) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) { | |
+ //return SimpleTrie{db.BlockNumber, root, true, addrHash}, nil | |
+ tr, err := trie.NewSecure(root, db.db) | |
+ if err != nil { | |
+ return nil, err | |
+ } | |
+ return tr, nil | |
+} | |
+ | |
+type Trie interface { | |
// TryGet returns the value for key stored in the trie. The value bytes must | |
// not be modified by the caller. If a node was not found in the database, a | |
// trie.MissingNodeError is returned. | |
@@ -87,114 +85,26 @@ type Trie interface { | |
// Commit writes all nodes to the trie's memory database, tracking the internal | |
// and external (for account tries) references. | |
Commit(onleaf trie.LeafCallback) (common.Hash, error) | |
- | |
- // NodeIterator returns an iterator that returns nodes of the trie. Iteration | |
- // starts at the key after the given start key. | |
- NodeIterator(startKey []byte) trie.NodeIterator | |
- | |
- // Prove constructs a Merkle proof for key. The result contains all encoded nodes | |
- // on the path to the value at key. The value itself is also included in the last | |
- // node and can be retrieved by verifying the proof. | |
- // | |
- // If the trie does not contain a value for key, the returned proof contains all | |
- // nodes of the longest existing prefix of the key (at least the root), ending | |
- // with the node that proves the absence of the key. | |
- Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error | |
} | |
-// NewDatabase creates a backing store for state. The returned database is safe for | |
-// concurrent use, but does not retain any recent trie nodes in memory. To keep some | |
-// historical state in memory, use the NewDatabaseWithConfig constructor. | |
-func NewDatabase(db ethdb.Database) Database { | |
- return NewDatabaseWithConfig(db, nil) | |
+// stubbed: we don't prefetch | |
+ | |
+type triePrefetcher struct { | |
} | |
-// NewDatabaseWithConfig creates a backing store for state. The returned database | |
-// is safe for concurrent use and retains a lot of collapsed RLP trie nodes in a | |
-// large memory cache. | |
-func NewDatabaseWithConfig(db ethdb.Database, config *trie.Config) Database { | |
- csc, _ := lru.New(codeSizeCacheSize) | |
- return &cachingDB{ | |
- db: trie.NewDatabaseWithConfig(db, config), | |
- codeSizeCache: csc, | |
- codeCache: fastcache.New(codeCacheSize), | |
- } | |
+func (p *triePrefetcher) prefetch(root common.Hash, keys [][]byte) { | |
} | |
-type cachingDB struct { | |
- db *trie.Database | |
- codeSizeCache *lru.Cache | |
- codeCache *fastcache.Cache | |
+func (p *triePrefetcher) used(root common.Hash, used [][]byte) { | |
} | |
-// OpenTrie opens the main account trie at a specific root hash. | |
-func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { | |
- tr, err := trie.NewSecure(root, db.db) | |
- if err != nil { | |
- return nil, err | |
- } | |
- return tr, nil | |
+func (p *triePrefetcher) close() { | |
} | |
-// OpenStorageTrie opens the storage trie of an account. | |
-func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) { | |
- tr, err := trie.NewSecure(root, db.db) | |
- if err != nil { | |
- return nil, err | |
- } | |
- return tr, nil | |
+func (p *triePrefetcher) copy() *triePrefetcher { | |
+ return p | |
} | |
-// CopyTrie returns an independent copy of the given trie. | |
-func (db *cachingDB) CopyTrie(t Trie) Trie { | |
- switch t := t.(type) { | |
- case *trie.SecureTrie: | |
- return t.Copy() | |
- default: | |
- panic(fmt.Errorf("unknown trie type %T", t)) | |
- } | |
-} | |
- | |
-// ContractCode retrieves a particular contract's code. | |
-func (db *cachingDB) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) { | |
- if code := db.codeCache.Get(nil, codeHash.Bytes()); len(code) > 0 { | |
- return code, nil | |
- } | |
- code := rawdb.ReadCode(db.db.DiskDB(), codeHash) | |
- if len(code) > 0 { | |
- db.codeCache.Set(codeHash.Bytes(), code) | |
- db.codeSizeCache.Add(codeHash, len(code)) | |
- return code, nil | |
- } | |
- return nil, errors.New("not found") | |
-} | |
- | |
-// ContractCodeWithPrefix retrieves a particular contract's code. If the | |
-// code can't be found in the cache, then check the existence with **new** | |
-// db scheme. | |
-func (db *cachingDB) ContractCodeWithPrefix(addrHash, codeHash common.Hash) ([]byte, error) { | |
- if code := db.codeCache.Get(nil, codeHash.Bytes()); len(code) > 0 { | |
- return code, nil | |
- } | |
- code := rawdb.ReadCodeWithPrefix(db.db.DiskDB(), codeHash) | |
- if len(code) > 0 { | |
- db.codeCache.Set(codeHash.Bytes(), code) | |
- db.codeSizeCache.Add(codeHash, len(code)) | |
- return code, nil | |
- } | |
- return nil, errors.New("not found") | |
-} | |
- | |
-// ContractCodeSize retrieves a particular contracts code's size. | |
-func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, error) { | |
- if cached, ok := db.codeSizeCache.Get(codeHash); ok { | |
- return cached.(int), nil | |
- } | |
- code, err := db.ContractCode(addrHash, codeHash) | |
- return len(code), err | |
-} | |
- | |
-// TrieDB retrieves any intermediate trie-node caching layer. | |
-func (db *cachingDB) TrieDB() *trie.Database { | |
- return db.db | |
+func (p *triePrefetcher) trie(root common.Hash) Trie { | |
+ return nil | |
} | |
diff --git a/minigeth3/core/state/snapshot/snapshot.go b/minigeth/core/state/snapshot/snapshot.go | |
index 8889fa9..b12c543 100644 | |
--- a/minigeth3/core/state/snapshot/snapshot.go | |
+++ b/minigeth/core/state/snapshot/snapshot.go | |
@@ -1,835 +1,14 @@ | |
-// Copyright 2019 The go-ethereum Authors | |
-// This file is part of the go-ethereum library. | |
-// | |
-// The go-ethereum library is free software: you can redistribute it and/or modify | |
-// it under the terms of the GNU Lesser General Public License as published by | |
-// the Free Software Foundation, either version 3 of the License, or | |
-// (at your option) any later version. | |
-// | |
-// The go-ethereum library is distributed in the hope that it will be useful, | |
-// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
-// GNU Lesser General Public License for more details. | |
-// | |
-// You should have received a copy of the GNU Lesser General Public License | |
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | |
- | |
-// Package snapshot implements a journalled, dynamic state dump. | |
package snapshot | |
-import ( | |
- "bytes" | |
- "errors" | |
- "fmt" | |
- "sync" | |
- "sync/atomic" | |
+import "github.com/ethereum/go-ethereum/common" | |
- "github.com/ethereum/go-ethereum/common" | |
- "github.com/ethereum/go-ethereum/core/rawdb" | |
- "github.com/ethereum/go-ethereum/ethdb" | |
- "github.com/ethereum/go-ethereum/log" | |
- "github.com/ethereum/go-ethereum/metrics" | |
- "github.com/ethereum/go-ethereum/rlp" | |
- "github.com/ethereum/go-ethereum/trie" | |
-) | |
+// entirely stubs, this is never created | |
-var ( | |
- snapshotCleanAccountHitMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/hit", nil) | |
- snapshotCleanAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/miss", nil) | |
- snapshotCleanAccountInexMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/inex", nil) | |
- snapshotCleanAccountReadMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/read", nil) | |
- snapshotCleanAccountWriteMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/write", nil) | |
+type Tree interface { | |
+} | |
- snapshotCleanStorageHitMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/hit", nil) | |
- snapshotCleanStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/miss", nil) | |
- snapshotCleanStorageInexMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/inex", nil) | |
- snapshotCleanStorageReadMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/read", nil) | |
- snapshotCleanStorageWriteMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/write", nil) | |
- | |
- snapshotDirtyAccountHitMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/hit", nil) | |
- snapshotDirtyAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/miss", nil) | |
- snapshotDirtyAccountInexMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/inex", nil) | |
- snapshotDirtyAccountReadMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/read", nil) | |
- snapshotDirtyAccountWriteMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/write", nil) | |
- | |
- snapshotDirtyStorageHitMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/hit", nil) | |
- snapshotDirtyStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/miss", nil) | |
- snapshotDirtyStorageInexMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/inex", nil) | |
- snapshotDirtyStorageReadMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/read", nil) | |
- snapshotDirtyStorageWriteMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/write", nil) | |
- | |
- snapshotDirtyAccountHitDepthHist = metrics.NewRegisteredHistogram("state/snapshot/dirty/account/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) | |
- snapshotDirtyStorageHitDepthHist = metrics.NewRegisteredHistogram("state/snapshot/dirty/storage/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) | |
- | |
- snapshotFlushAccountItemMeter = metrics.NewRegisteredMeter("state/snapshot/flush/account/item", nil) | |
- snapshotFlushAccountSizeMeter = metrics.NewRegisteredMeter("state/snapshot/flush/account/size", nil) | |
- snapshotFlushStorageItemMeter = metrics.NewRegisteredMeter("state/snapshot/flush/storage/item", nil) | |
- snapshotFlushStorageSizeMeter = metrics.NewRegisteredMeter("state/snapshot/flush/storage/size", nil) | |
- | |
- snapshotBloomIndexTimer = metrics.NewRegisteredResettingTimer("state/snapshot/bloom/index", nil) | |
- snapshotBloomErrorGauge = metrics.NewRegisteredGaugeFloat64("state/snapshot/bloom/error", nil) | |
- | |
- snapshotBloomAccountTrueHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/truehit", nil) | |
- snapshotBloomAccountFalseHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/falsehit", nil) | |
- snapshotBloomAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/miss", nil) | |
- | |
- snapshotBloomStorageTrueHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/truehit", nil) | |
- snapshotBloomStorageFalseHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/falsehit", nil) | |
- snapshotBloomStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/miss", nil) | |
- | |
- // ErrSnapshotStale is returned from data accessors if the underlying snapshot | |
- // layer had been invalidated due to the chain progressing forward far enough | |
- // to not maintain the layer's original state. | |
- ErrSnapshotStale = errors.New("snapshot stale") | |
- | |
- // ErrNotCoveredYet is returned from data accessors if the underlying snapshot | |
- // is being generated currently and the requested data item is not yet in the | |
- // range of accounts covered. | |
- ErrNotCoveredYet = errors.New("not covered yet") | |
- | |
- // ErrNotConstructed is returned if the callers want to iterate the snapshot | |
- // while the generation is not finished yet. | |
- ErrNotConstructed = errors.New("snapshot is not constructed") | |
- | |
- // errSnapshotCycle is returned if a snapshot is attempted to be inserted | |
- // that forms a cycle in the snapshot tree. | |
- errSnapshotCycle = errors.New("snapshot cycle") | |
-) | |
- | |
-// Snapshot represents the functionality supported by a snapshot storage layer. | |
type Snapshot interface { | |
- // Root returns the root hash for which this snapshot was made. | |
- Root() common.Hash | |
- | |
- // Account directly retrieves the account associated with a particular hash in | |
- // the snapshot slim data format. | |
- Account(hash common.Hash) (*Account, error) | |
- | |
- // AccountRLP directly retrieves the account RLP associated with a particular | |
- // hash in the snapshot slim data format. | |
- AccountRLP(hash common.Hash) ([]byte, error) | |
- | |
// Storage directly retrieves the storage data associated with a particular hash, | |
// within a particular account. | |
Storage(accountHash, storageHash common.Hash) ([]byte, error) | |
} | |
- | |
-// snapshot is the internal version of the snapshot data layer that supports some | |
-// additional methods compared to the public API. | |
-type snapshot interface { | |
- Snapshot | |
- | |
- // Parent returns the subsequent layer of a snapshot, or nil if the base was | |
- // reached. | |
- // | |
- // Note, the method is an internal helper to avoid type switching between the | |
- // disk and diff layers. There is no locking involved. | |
- Parent() snapshot | |
- | |
- // Update creates a new layer on top of the existing snapshot diff tree with | |
- // the specified data items. | |
- // | |
- // Note, the maps are retained by the method to avoid copying everything. | |
- Update(blockRoot common.Hash, destructs map[common.Hash]struct{}, accounts map[common.Hash][]byte, storage map[common.Hash]map[common.Hash][]byte) *diffLayer | |
- | |
- // Journal commits an entire diff hierarchy to disk into a single journal entry. | |
- // This is meant to be used during shutdown to persist the snapshot without | |
- // flattening everything down (bad for reorgs). | |
- Journal(buffer *bytes.Buffer) (common.Hash, error) | |
- | |
- // Stale return whether this layer has become stale (was flattened across) or | |
- // if it's still live. | |
- Stale() bool | |
- | |
- // AccountIterator creates an account iterator over an arbitrary layer. | |
- AccountIterator(seek common.Hash) AccountIterator | |
- | |
- // StorageIterator creates a storage iterator over an arbitrary layer. | |
- StorageIterator(account common.Hash, seek common.Hash) (StorageIterator, bool) | |
-} | |
- | |
-// Tree is an Ethereum state snapshot tree. It consists of one persistent base | |
-// layer backed by a key-value store, on top of which arbitrarily many in-memory | |
-// diff layers are topped. The memory diffs can form a tree with branching, but | |
-// the disk layer is singleton and common to all. If a reorg goes deeper than the | |
-// disk layer, everything needs to be deleted. | |
-// | |
-// The goal of a state snapshot is twofold: to allow direct access to account and | |
-// storage data to avoid expensive multi-level trie lookups; and to allow sorted, | |
-// cheap iteration of the account/storage tries for sync aid. | |
-type Tree struct { | |
- diskdb ethdb.KeyValueStore // Persistent database to store the snapshot | |
- triedb *trie.Database // In-memory cache to access the trie through | |
- cache int // Megabytes permitted to use for read caches | |
- layers map[common.Hash]snapshot // Collection of all known layers | |
- lock sync.RWMutex | |
-} | |
- | |
-// New attempts to load an already existing snapshot from a persistent key-value | |
-// store (with a number of memory layers from a journal), ensuring that the head | |
-// of the snapshot matches the expected one. | |
-// | |
-// If the snapshot is missing or the disk layer is broken, the snapshot will be | |
-// reconstructed using both the existing data and the state trie. | |
-// The repair happens on a background thread. | |
-// | |
-// If the memory layers in the journal do not match the disk layer (e.g. there is | |
-// a gap) or the journal is missing, there are two repair cases: | |
-// | |
-// - if the 'recovery' parameter is true, all memory diff-layers will be discarded. | |
-// This case happens when the snapshot is 'ahead' of the state trie. | |
-// - otherwise, the entire snapshot is considered invalid and will be recreated on | |
-// a background thread. | |
-func New(diskdb ethdb.KeyValueStore, triedb *trie.Database, cache int, root common.Hash, async bool, rebuild bool, recovery bool) (*Tree, error) { | |
- // Create a new, empty snapshot tree | |
- snap := &Tree{ | |
- diskdb: diskdb, | |
- triedb: triedb, | |
- cache: cache, | |
- layers: make(map[common.Hash]snapshot), | |
- } | |
- if !async { | |
- defer snap.waitBuild() | |
- } | |
- // Attempt to load a previously persisted snapshot and rebuild one if failed | |
- head, disabled, err := loadSnapshot(diskdb, triedb, cache, root, recovery) | |
- if disabled { | |
- log.Warn("Snapshot maintenance disabled (syncing)") | |
- return snap, nil | |
- } | |
- if err != nil { | |
- if rebuild { | |
- log.Warn("Failed to load snapshot, regenerating", "err", err) | |
- snap.Rebuild(root) | |
- return snap, nil | |
- } | |
- return nil, err // Bail out the error, don't rebuild automatically. | |
- } | |
- // Existing snapshot loaded, seed all the layers | |
- for head != nil { | |
- snap.layers[head.Root()] = head | |
- head = head.Parent() | |
- } | |
- return snap, nil | |
-} | |
- | |
-// waitBuild blocks until the snapshot finishes rebuilding. This method is meant | |
-// to be used by tests to ensure we're testing what we believe we are. | |
-func (t *Tree) waitBuild() { | |
- // Find the rebuild termination channel | |
- var done chan struct{} | |
- | |
- t.lock.RLock() | |
- for _, layer := range t.layers { | |
- if layer, ok := layer.(*diskLayer); ok { | |
- done = layer.genPending | |
- break | |
- } | |
- } | |
- t.lock.RUnlock() | |
- | |
- // Wait until the snapshot is generated | |
- if done != nil { | |
- <-done | |
- } | |
-} | |
- | |
-// Disable interrupts any pending snapshot generator, deletes all the snapshot | |
-// layers in memory and marks snapshots disabled globally. In order to resume | |
-// the snapshot functionality, the caller must invoke Rebuild. | |
-func (t *Tree) Disable() { | |
- // Interrupt any live snapshot layers | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- for _, layer := range t.layers { | |
- switch layer := layer.(type) { | |
- case *diskLayer: | |
- // If the base layer is generating, abort it | |
- if layer.genAbort != nil { | |
- abort := make(chan *generatorStats) | |
- layer.genAbort <- abort | |
- <-abort | |
- } | |
- // Layer should be inactive now, mark it as stale | |
- layer.lock.Lock() | |
- layer.stale = true | |
- layer.lock.Unlock() | |
- | |
- case *diffLayer: | |
- // If the layer is a simple diff, simply mark as stale | |
- layer.lock.Lock() | |
- atomic.StoreUint32(&layer.stale, 1) | |
- layer.lock.Unlock() | |
- | |
- default: | |
- panic(fmt.Sprintf("unknown layer type: %T", layer)) | |
- } | |
- } | |
- t.layers = map[common.Hash]snapshot{} | |
- | |
- // Delete all snapshot liveness information from the database | |
- batch := t.diskdb.NewBatch() | |
- | |
- rawdb.WriteSnapshotDisabled(batch) | |
- rawdb.DeleteSnapshotRoot(batch) | |
- rawdb.DeleteSnapshotJournal(batch) | |
- rawdb.DeleteSnapshotGenerator(batch) | |
- rawdb.DeleteSnapshotRecoveryNumber(batch) | |
- // Note, we don't delete the sync progress | |
- | |
- if err := batch.Write(); err != nil { | |
- log.Crit("Failed to disable snapshots", "err", err) | |
- } | |
-} | |
- | |
-// Snapshot retrieves a snapshot belonging to the given block root, or nil if no | |
-// snapshot is maintained for that block. | |
-func (t *Tree) Snapshot(blockRoot common.Hash) Snapshot { | |
- t.lock.RLock() | |
- defer t.lock.RUnlock() | |
- | |
- return t.layers[blockRoot] | |
-} | |
- | |
-// Snapshots returns all visited layers from the topmost layer with specific | |
-// root and traverses downward. The layer amount is limited by the given number. | |
-// If nodisk is set, then disk layer is excluded. | |
-func (t *Tree) Snapshots(root common.Hash, limits int, nodisk bool) []Snapshot { | |
- t.lock.RLock() | |
- defer t.lock.RUnlock() | |
- | |
- if limits == 0 { | |
- return nil | |
- } | |
- layer := t.layers[root] | |
- if layer == nil { | |
- return nil | |
- } | |
- var ret []Snapshot | |
- for { | |
- if _, isdisk := layer.(*diskLayer); isdisk && nodisk { | |
- break | |
- } | |
- ret = append(ret, layer) | |
- limits -= 1 | |
- if limits == 0 { | |
- break | |
- } | |
- parent := layer.Parent() | |
- if parent == nil { | |
- break | |
- } | |
- layer = parent | |
- } | |
- return ret | |
-} | |
- | |
-// Update adds a new snapshot into the tree, if that can be linked to an existing | |
-// old parent. It is disallowed to insert a disk layer (the origin of all). | |
-func (t *Tree) Update(blockRoot common.Hash, parentRoot common.Hash, destructs map[common.Hash]struct{}, accounts map[common.Hash][]byte, storage map[common.Hash]map[common.Hash][]byte) error { | |
- // Reject noop updates to avoid self-loops in the snapshot tree. This is a | |
- // special case that can only happen for Clique networks where empty blocks | |
- // don't modify the state (0 block subsidy). | |
- // | |
- // Although we could silently ignore this internally, it should be the caller's | |
- // responsibility to avoid even attempting to insert such a snapshot. | |
- if blockRoot == parentRoot { | |
- return errSnapshotCycle | |
- } | |
- // Generate a new snapshot on top of the parent | |
- parent := t.Snapshot(parentRoot) | |
- if parent == nil { | |
- return fmt.Errorf("parent [%#x] snapshot missing", parentRoot) | |
- } | |
- snap := parent.(snapshot).Update(blockRoot, destructs, accounts, storage) | |
- | |
- // Save the new snapshot for later | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- t.layers[snap.root] = snap | |
- return nil | |
-} | |
- | |
-// Cap traverses downwards the snapshot tree from a head block hash until the | |
-// number of allowed layers are crossed. All layers beyond the permitted number | |
-// are flattened downwards. | |
-// | |
-// Note, the final diff layer count in general will be one more than the amount | |
-// requested. This happens because the bottom-most diff layer is the accumulator | |
-// which may or may not overflow and cascade to disk. Since this last layer's | |
-// survival is only known *after* capping, we need to omit it from the count if | |
-// we want to ensure that *at least* the requested number of diff layers remain. | |
-func (t *Tree) Cap(root common.Hash, layers int) error { | |
- // Retrieve the head snapshot to cap from | |
- snap := t.Snapshot(root) | |
- if snap == nil { | |
- return fmt.Errorf("snapshot [%#x] missing", root) | |
- } | |
- diff, ok := snap.(*diffLayer) | |
- if !ok { | |
- return fmt.Errorf("snapshot [%#x] is disk layer", root) | |
- } | |
- // If the generator is still running, use a more aggressive cap | |
- diff.origin.lock.RLock() | |
- if diff.origin.genMarker != nil && layers > 8 { | |
- layers = 8 | |
- } | |
- diff.origin.lock.RUnlock() | |
- | |
- // Run the internal capping and discard all stale layers | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- // Flattening the bottom-most diff layer requires special casing since there's | |
- // no child to rewire to the grandparent. In that case we can fake a temporary | |
- // child for the capping and then remove it. | |
- if layers == 0 { | |
- // If full commit was requested, flatten the diffs and merge onto disk | |
- diff.lock.RLock() | |
- base := diffToDisk(diff.flatten().(*diffLayer)) | |
- diff.lock.RUnlock() | |
- | |
- // Replace the entire snapshot tree with the flat base | |
- t.layers = map[common.Hash]snapshot{base.root: base} | |
- return nil | |
- } | |
- persisted := t.cap(diff, layers) | |
- | |
- // Remove any layer that is stale or links into a stale layer | |
- children := make(map[common.Hash][]common.Hash) | |
- for root, snap := range t.layers { | |
- if diff, ok := snap.(*diffLayer); ok { | |
- parent := diff.parent.Root() | |
- children[parent] = append(children[parent], root) | |
- } | |
- } | |
- var remove func(root common.Hash) | |
- remove = func(root common.Hash) { | |
- delete(t.layers, root) | |
- for _, child := range children[root] { | |
- remove(child) | |
- } | |
- delete(children, root) | |
- } | |
- for root, snap := range t.layers { | |
- if snap.Stale() { | |
- remove(root) | |
- } | |
- } | |
- // If the disk layer was modified, regenerate all the cumulative blooms | |
- if persisted != nil { | |
- var rebloom func(root common.Hash) | |
- rebloom = func(root common.Hash) { | |
- if diff, ok := t.layers[root].(*diffLayer); ok { | |
- diff.rebloom(persisted) | |
- } | |
- for _, child := range children[root] { | |
- rebloom(child) | |
- } | |
- } | |
- rebloom(persisted.root) | |
- } | |
- return nil | |
-} | |
- | |
-// cap traverses downwards the diff tree until the number of allowed layers are | |
-// crossed. All diffs beyond the permitted number are flattened downwards. If the | |
-// layer limit is reached, memory cap is also enforced (but not before). | |
-// | |
-// The method returns the new disk layer if diffs were persisted into it. | |
-// | |
-// Note, the final diff layer count in general will be one more than the amount | |
-// requested. This happens because the bottom-most diff layer is the accumulator | |
-// which may or may not overflow and cascade to disk. Since this last layer's | |
-// survival is only known *after* capping, we need to omit it from the count if | |
-// we want to ensure that *at least* the requested number of diff layers remain. | |
-func (t *Tree) cap(diff *diffLayer, layers int) *diskLayer { | |
- // Dive until we run out of layers or reach the persistent database | |
- for i := 0; i < layers-1; i++ { | |
- // If we still have diff layers below, continue down | |
- if parent, ok := diff.parent.(*diffLayer); ok { | |
- diff = parent | |
- } else { | |
- // Diff stack too shallow, return without modifications | |
- return nil | |
- } | |
- } | |
- // We're out of layers, flatten anything below, stopping if it's the disk or if | |
- // the memory limit is not yet exceeded. | |
- switch parent := diff.parent.(type) { | |
- case *diskLayer: | |
- return nil | |
- | |
- case *diffLayer: | |
- // Flatten the parent into the grandparent. The flattening internally obtains a | |
- // write lock on grandparent. | |
- flattened := parent.flatten().(*diffLayer) | |
- t.layers[flattened.root] = flattened | |
- | |
- diff.lock.Lock() | |
- defer diff.lock.Unlock() | |
- | |
- diff.parent = flattened | |
- if flattened.memory < aggregatorMemoryLimit { | |
- // Accumulator layer is smaller than the limit, so we can abort, unless | |
- // there's a snapshot being generated currently. In that case, the trie | |
- // will move from underneath the generator so we **must** merge all the | |
- // partial data down into the snapshot and restart the generation. | |
- if flattened.parent.(*diskLayer).genAbort == nil { | |
- return nil | |
- } | |
- } | |
- default: | |
- panic(fmt.Sprintf("unknown data layer: %T", parent)) | |
- } | |
- // If the bottom-most layer is larger than our memory cap, persist to disk | |
- bottom := diff.parent.(*diffLayer) | |
- | |
- bottom.lock.RLock() | |
- base := diffToDisk(bottom) | |
- bottom.lock.RUnlock() | |
- | |
- t.layers[base.root] = base | |
- diff.parent = base | |
- return base | |
-} | |
- | |
-// diffToDisk merges a bottom-most diff into the persistent disk layer underneath | |
-// it. The method will panic if called onto a non-bottom-most diff layer. | |
-// | |
-// The disk layer persistence should be operated in an atomic way. All updates should | |
-// be discarded if the whole transition if not finished. | |
-func diffToDisk(bottom *diffLayer) *diskLayer { | |
- var ( | |
- base = bottom.parent.(*diskLayer) | |
- batch = base.diskdb.NewBatch() | |
- stats *generatorStats | |
- ) | |
- // If the disk layer is running a snapshot generator, abort it | |
- if base.genAbort != nil { | |
- abort := make(chan *generatorStats) | |
- base.genAbort <- abort | |
- stats = <-abort | |
- } | |
- // Put the deletion in the batch writer, flush all updates in the final step. | |
- rawdb.DeleteSnapshotRoot(batch) | |
- | |
- // Mark the original base as stale as we're going to create a new wrapper | |
- base.lock.Lock() | |
- if base.stale { | |
- panic("parent disk layer is stale") // we've committed into the same base from two children, boo | |
- } | |
- base.stale = true | |
- base.lock.Unlock() | |
- | |
- // Destroy all the destructed accounts from the database | |
- for hash := range bottom.destructSet { | |
- // Skip any account not covered yet by the snapshot | |
- if base.genMarker != nil && bytes.Compare(hash[:], base.genMarker) > 0 { | |
- continue | |
- } | |
- // Remove all storage slots | |
- rawdb.DeleteAccountSnapshot(batch, hash) | |
- base.cache.Set(hash[:], nil) | |
- | |
- it := rawdb.IterateStorageSnapshots(base.diskdb, hash) | |
- for it.Next() { | |
- if key := it.Key(); len(key) == 65 { // TODO(karalabe): Yuck, we should move this into the iterator | |
- batch.Delete(key) | |
- base.cache.Del(key[1:]) | |
- snapshotFlushStorageItemMeter.Mark(1) | |
- | |
- // Ensure we don't delete too much data blindly (contract can be | |
- // huge). It's ok to flush, the root will go missing in case of a | |
- // crash and we'll detect and regenerate the snapshot. | |
- if batch.ValueSize() > ethdb.IdealBatchSize { | |
- if err := batch.Write(); err != nil { | |
- log.Crit("Failed to write storage deletions", "err", err) | |
- } | |
- batch.Reset() | |
- } | |
- } | |
- } | |
- it.Release() | |
- } | |
- // Push all updated accounts into the database | |
- for hash, data := range bottom.accountData { | |
- // Skip any account not covered yet by the snapshot | |
- if base.genMarker != nil && bytes.Compare(hash[:], base.genMarker) > 0 { | |
- continue | |
- } | |
- // Push the account to disk | |
- rawdb.WriteAccountSnapshot(batch, hash, data) | |
- base.cache.Set(hash[:], data) | |
- snapshotCleanAccountWriteMeter.Mark(int64(len(data))) | |
- | |
- snapshotFlushAccountItemMeter.Mark(1) | |
- snapshotFlushAccountSizeMeter.Mark(int64(len(data))) | |
- | |
- // Ensure we don't write too much data blindly. It's ok to flush, the | |
- // root will go missing in case of a crash and we'll detect and regen | |
- // the snapshot. | |
- if batch.ValueSize() > ethdb.IdealBatchSize { | |
- if err := batch.Write(); err != nil { | |
- log.Crit("Failed to write storage deletions", "err", err) | |
- } | |
- batch.Reset() | |
- } | |
- } | |
- // Push all the storage slots into the database | |
- for accountHash, storage := range bottom.storageData { | |
- // Skip any account not covered yet by the snapshot | |
- if base.genMarker != nil && bytes.Compare(accountHash[:], base.genMarker) > 0 { | |
- continue | |
- } | |
- // Generation might be mid-account, track that case too | |
- midAccount := base.genMarker != nil && bytes.Equal(accountHash[:], base.genMarker[:common.HashLength]) | |
- | |
- for storageHash, data := range storage { | |
- // Skip any slot not covered yet by the snapshot | |
- if midAccount && bytes.Compare(storageHash[:], base.genMarker[common.HashLength:]) > 0 { | |
- continue | |
- } | |
- if len(data) > 0 { | |
- rawdb.WriteStorageSnapshot(batch, accountHash, storageHash, data) | |
- base.cache.Set(append(accountHash[:], storageHash[:]...), data) | |
- snapshotCleanStorageWriteMeter.Mark(int64(len(data))) | |
- } else { | |
- rawdb.DeleteStorageSnapshot(batch, accountHash, storageHash) | |
- base.cache.Set(append(accountHash[:], storageHash[:]...), nil) | |
- } | |
- snapshotFlushStorageItemMeter.Mark(1) | |
- snapshotFlushStorageSizeMeter.Mark(int64(len(data))) | |
- } | |
- } | |
- // Update the snapshot block marker and write any remainder data | |
- rawdb.WriteSnapshotRoot(batch, bottom.root) | |
- | |
- // Write out the generator progress marker and report | |
- journalProgress(batch, base.genMarker, stats) | |
- | |
- // Flush all the updates in the single db operation. Ensure the | |
- // disk layer transition is atomic. | |
- if err := batch.Write(); err != nil { | |
- log.Crit("Failed to write leftover snapshot", "err", err) | |
- } | |
- log.Debug("Journalled disk layer", "root", bottom.root, "complete", base.genMarker == nil) | |
- res := &diskLayer{ | |
- root: bottom.root, | |
- cache: base.cache, | |
- diskdb: base.diskdb, | |
- triedb: base.triedb, | |
- genMarker: base.genMarker, | |
- genPending: base.genPending, | |
- } | |
- // If snapshot generation hasn't finished yet, port over all the starts and | |
- // continue where the previous round left off. | |
- // | |
- // Note, the `base.genAbort` comparison is not used normally, it's checked | |
- // to allow the tests to play with the marker without triggering this path. | |
- if base.genMarker != nil && base.genAbort != nil { | |
- res.genMarker = base.genMarker | |
- res.genAbort = make(chan chan *generatorStats) | |
- go res.generate(stats) | |
- } | |
- return res | |
-} | |
- | |
-// Journal commits an entire diff hierarchy to disk into a single journal entry. | |
-// This is meant to be used during shutdown to persist the snapshot without | |
-// flattening everything down (bad for reorgs). | |
-// | |
-// The method returns the root hash of the base layer that needs to be persisted | |
-// to disk as a trie too to allow continuing any pending generation op. | |
-func (t *Tree) Journal(root common.Hash) (common.Hash, error) { | |
- // Retrieve the head snapshot to journal from var snap snapshot | |
- snap := t.Snapshot(root) | |
- if snap == nil { | |
- return common.Hash{}, fmt.Errorf("snapshot [%#x] missing", root) | |
- } | |
- // Run the journaling | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- // Firstly write out the metadata of journal | |
- journal := new(bytes.Buffer) | |
- if err := rlp.Encode(journal, journalVersion); err != nil { | |
- return common.Hash{}, err | |
- } | |
- diskroot := t.diskRoot() | |
- if diskroot == (common.Hash{}) { | |
- return common.Hash{}, errors.New("invalid disk root") | |
- } | |
- // Secondly write out the disk layer root, ensure the | |
- // diff journal is continuous with disk. | |
- if err := rlp.Encode(journal, diskroot); err != nil { | |
- return common.Hash{}, err | |
- } | |
- // Finally write out the journal of each layer in reverse order. | |
- base, err := snap.(snapshot).Journal(journal) | |
- if err != nil { | |
- return common.Hash{}, err | |
- } | |
- // Store the journal into the database and return | |
- rawdb.WriteSnapshotJournal(t.diskdb, journal.Bytes()) | |
- return base, nil | |
-} | |
- | |
-// Rebuild wipes all available snapshot data from the persistent database and | |
-// discard all caches and diff layers. Afterwards, it starts a new snapshot | |
-// generator with the given root hash. | |
-func (t *Tree) Rebuild(root common.Hash) { | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- // Firstly delete any recovery flag in the database. Because now we are | |
- // building a brand new snapshot. Also reenable the snapshot feature. | |
- rawdb.DeleteSnapshotRecoveryNumber(t.diskdb) | |
- rawdb.DeleteSnapshotDisabled(t.diskdb) | |
- | |
- // Iterate over and mark all layers stale | |
- for _, layer := range t.layers { | |
- switch layer := layer.(type) { | |
- case *diskLayer: | |
- // If the base layer is generating, abort it and save | |
- if layer.genAbort != nil { | |
- abort := make(chan *generatorStats) | |
- layer.genAbort <- abort | |
- <-abort | |
- } | |
- // Layer should be inactive now, mark it as stale | |
- layer.lock.Lock() | |
- layer.stale = true | |
- layer.lock.Unlock() | |
- | |
- case *diffLayer: | |
- // If the layer is a simple diff, simply mark as stale | |
- layer.lock.Lock() | |
- atomic.StoreUint32(&layer.stale, 1) | |
- layer.lock.Unlock() | |
- | |
- default: | |
- panic(fmt.Sprintf("unknown layer type: %T", layer)) | |
- } | |
- } | |
- // Start generating a new snapshot from scratch on a background thread. The | |
- // generator will run a wiper first if there's not one running right now. | |
- log.Info("Rebuilding state snapshot") | |
- t.layers = map[common.Hash]snapshot{ | |
- root: generateSnapshot(t.diskdb, t.triedb, t.cache, root), | |
- } | |
-} | |
- | |
-// AccountIterator creates a new account iterator for the specified root hash and | |
-// seeks to a starting account hash. | |
-func (t *Tree) AccountIterator(root common.Hash, seek common.Hash) (AccountIterator, error) { | |
- ok, err := t.generating() | |
- if err != nil { | |
- return nil, err | |
- } | |
- if ok { | |
- return nil, ErrNotConstructed | |
- } | |
- return newFastAccountIterator(t, root, seek) | |
-} | |
- | |
-// StorageIterator creates a new storage iterator for the specified root hash and | |
-// account. The iterator will be move to the specific start position. | |
-func (t *Tree) StorageIterator(root common.Hash, account common.Hash, seek common.Hash) (StorageIterator, error) { | |
- ok, err := t.generating() | |
- if err != nil { | |
- return nil, err | |
- } | |
- if ok { | |
- return nil, ErrNotConstructed | |
- } | |
- return newFastStorageIterator(t, root, account, seek) | |
-} | |
- | |
-// Verify iterates the whole state(all the accounts as well as the corresponding storages) | |
-// with the specific root and compares the re-computed hash with the original one. | |
-func (t *Tree) Verify(root common.Hash) error { | |
- acctIt, err := t.AccountIterator(root, common.Hash{}) | |
- if err != nil { | |
- return err | |
- } | |
- defer acctIt.Release() | |
- | |
- got, err := generateTrieRoot(nil, acctIt, common.Hash{}, stackTrieGenerate, func(db ethdb.KeyValueWriter, accountHash, codeHash common.Hash, stat *generateStats) (common.Hash, error) { | |
- storageIt, err := t.StorageIterator(root, accountHash, common.Hash{}) | |
- if err != nil { | |
- return common.Hash{}, err | |
- } | |
- defer storageIt.Release() | |
- | |
- hash, err := generateTrieRoot(nil, storageIt, accountHash, stackTrieGenerate, nil, stat, false) | |
- if err != nil { | |
- return common.Hash{}, err | |
- } | |
- return hash, nil | |
- }, newGenerateStats(), true) | |
- | |
- if err != nil { | |
- return err | |
- } | |
- if got != root { | |
- return fmt.Errorf("state root hash mismatch: got %x, want %x", got, root) | |
- } | |
- return nil | |
-} | |
- | |
-// disklayer is an internal helper function to return the disk layer. | |
-// The lock of snapTree is assumed to be held already. | |
-func (t *Tree) disklayer() *diskLayer { | |
- var snap snapshot | |
- for _, s := range t.layers { | |
- snap = s | |
- break | |
- } | |
- if snap == nil { | |
- return nil | |
- } | |
- switch layer := snap.(type) { | |
- case *diskLayer: | |
- return layer | |
- case *diffLayer: | |
- return layer.origin | |
- default: | |
- panic(fmt.Sprintf("%T: undefined layer", snap)) | |
- } | |
-} | |
- | |
-// diskRoot is a internal helper function to return the disk layer root. | |
-// The lock of snapTree is assumed to be held already. | |
-func (t *Tree) diskRoot() common.Hash { | |
- disklayer := t.disklayer() | |
- if disklayer == nil { | |
- return common.Hash{} | |
- } | |
- return disklayer.Root() | |
-} | |
- | |
-// generating is an internal helper function which reports whether the snapshot | |
-// is still under the construction. | |
-func (t *Tree) generating() (bool, error) { | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- layer := t.disklayer() | |
- if layer == nil { | |
- return false, errors.New("disk layer is missing") | |
- } | |
- layer.lock.RLock() | |
- defer layer.lock.RUnlock() | |
- return layer.genMarker != nil, nil | |
-} | |
- | |
-// diskRoot is a external helper function to return the disk layer root. | |
-func (t *Tree) DiskRoot() common.Hash { | |
- t.lock.Lock() | |
- defer t.lock.Unlock() | |
- | |
- return t.diskRoot() | |
-} | |
diff --git a/minigeth3/core/state/state_object.go b/minigeth/core/state/state_object.go | |
index 38621ff..ee0cb70 100644 | |
--- a/minigeth3/core/state/state_object.go | |
+++ b/minigeth/core/state/state_object.go | |
@@ -26,7 +26,9 @@ import ( | |
"github.com/ethereum/go-ethereum/common" | |
"github.com/ethereum/go-ethereum/crypto" | |
"github.com/ethereum/go-ethereum/metrics" | |
+ "github.com/ethereum/go-ethereum/oracle" | |
"github.com/ethereum/go-ethereum/rlp" | |
+ "github.com/ethereum/go-ethereum/trie" | |
) | |
var emptyCodeHash = crypto.Keccak256(nil) | |
@@ -247,6 +249,7 @@ func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Has | |
if metrics.EnabledExpensive { | |
meter = &s.db.StorageReads | |
} | |
+ oracle.PrefetchStorage(db.BlockNumber, s.address, key, nil) | |
if enc, err = s.getTrie(db).TryGet(key.Bytes()); err != nil { | |
s.setError(err) | |
return common.Hash{} | |
@@ -353,8 +356,12 @@ func (s *stateObject) updateTrie(db Database) Trie { | |
var v []byte | |
if (value == common.Hash{}) { | |
+ //fmt.Println("delete", s.address, key) | |
+ // Get absense proof of key in case the deletion needs the sister node. | |
+ oracle.PrefetchStorage(big.NewInt(db.BlockNumber.Int64()+1), s.address, key, trie.GenPossibleShortNodePreimage) | |
s.setError(tr.TryDelete(key[:])) | |
} else { | |
+ //fmt.Println("update", s.address, key, value) | |
// Encoding []byte cannot fail, ok to ignore the error. | |
v, _ = rlp.EncodeToBytes(common.TrimLeftZeroes(value[:])) | |
s.setError(tr.TryUpdate(key[:], v)) | |
diff --git a/minigeth3/core/state/statedb.go b/minigeth/core/state/statedb.go | |
index 61f0f5b..ed65c6b 100644 | |
--- a/minigeth3/core/state/statedb.go | |
+++ b/minigeth/core/state/statedb.go | |
@@ -18,23 +18,25 @@ | |
package state | |
import ( | |
- "errors" | |
"fmt" | |
"math/big" | |
"sort" | |
"time" | |
"github.com/ethereum/go-ethereum/common" | |
- "github.com/ethereum/go-ethereum/core/rawdb" | |
"github.com/ethereum/go-ethereum/core/state/snapshot" | |
"github.com/ethereum/go-ethereum/core/types" | |
"github.com/ethereum/go-ethereum/crypto" | |
"github.com/ethereum/go-ethereum/log" | |
"github.com/ethereum/go-ethereum/metrics" | |
+ "github.com/ethereum/go-ethereum/oracle" | |
"github.com/ethereum/go-ethereum/rlp" | |
"github.com/ethereum/go-ethereum/trie" | |
) | |
+// for includes we don't have | |
+// | |
+ | |
type revision struct { | |
id int | |
journalIndex int | |
@@ -119,7 +121,6 @@ type StateDB struct { | |
SnapshotCommits time.Duration | |
} | |
-// New creates a new state from a given trie. | |
func New(root common.Hash, db Database, snaps *snapshot.Tree) (*StateDB, error) { | |
tr, err := db.OpenTrie(root) | |
if err != nil { | |
@@ -139,38 +140,16 @@ func New(root common.Hash, db Database, snaps *snapshot.Tree) (*StateDB, error) | |
accessList: newAccessList(), | |
hasher: crypto.NewKeccakState(), | |
} | |
- if sdb.snaps != nil { | |
+ /*if sdb.snaps != nil { | |
if sdb.snap = sdb.snaps.Snapshot(root); sdb.snap != nil { | |
sdb.snapDestructs = make(map[common.Hash]struct{}) | |
sdb.snapAccounts = make(map[common.Hash][]byte) | |
sdb.snapStorage = make(map[common.Hash]map[common.Hash][]byte) | |
} | |
- } | |
+ }*/ | |
return sdb, nil | |
} | |
-// StartPrefetcher initializes a new trie prefetcher to pull in nodes from the | |
-// state trie concurrently while the state is mutated so that when we reach the | |
-// commit phase, most of the needed data is already hot. | |
-func (s *StateDB) StartPrefetcher(namespace string) { | |
- if s.prefetcher != nil { | |
- s.prefetcher.close() | |
- s.prefetcher = nil | |
- } | |
- if s.snap != nil { | |
- s.prefetcher = newTriePrefetcher(s.db, s.originalRoot, namespace) | |
- } | |
-} | |
- | |
-// StopPrefetcher terminates a running prefetcher and reports any leftover stats | |
-// from the gathered metrics. | |
-func (s *StateDB) StopPrefetcher() { | |
- if s.prefetcher != nil { | |
- s.prefetcher.close() | |
- s.prefetcher = nil | |
- } | |
-} | |
- | |
// setError remembers the first non-nil error it is called with. | |
func (s *StateDB) setError(err error) { | |
if s.dbErr == nil { | |
@@ -308,6 +287,7 @@ func (s *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash { | |
return common.Hash{} | |
} | |
+/* | |
// GetProof returns the Merkle proof for a given account. | |
func (s *StateDB) GetProof(addr common.Address) ([][]byte, error) { | |
return s.GetProofByHash(crypto.Keccak256Hash(addr.Bytes())) | |
@@ -329,7 +309,7 @@ func (s *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, | |
} | |
err := trie.Prove(crypto.Keccak256(key.Bytes()), 0, &proof) | |
return proof, err | |
-} | |
+}*/ | |
// GetCommittedState retrieves a value from the given account's committed storage trie. | |
func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash { | |
@@ -468,9 +448,9 @@ func (s *StateDB) updateStateObject(obj *stateObject) { | |
// update mechanism is not symmetric to the deletion, because whereas it is | |
// enough to track account updates at commit time, deletions need tracking | |
// at transaction boundary level to ensure we capture state clearing. | |
- if s.snap != nil { | |
+ /*if s.snap != nil { | |
s.snapAccounts[obj.addrHash] = snapshot.SlimAccountRLP(obj.data.Nonce, obj.data.Balance, obj.data.Root, obj.data.CodeHash) | |
- } | |
+ }*/ | |
} | |
// deleteStateObject removes the given object from the state trie. | |
@@ -481,6 +461,8 @@ func (s *StateDB) deleteStateObject(obj *stateObject) { | |
} | |
// Delete the account from the trie | |
addr := obj.Address() | |
+ // Get absense proof of account in case the deletion needs the sister node. | |
+ oracle.PrefetchAccount(big.NewInt(s.db.BlockNumber.Int64()+1), addr, trie.GenPossibleShortNodePreimage) | |
if err := s.trie.TryDelete(addr[:]); err != nil { | |
s.setError(fmt.Errorf("deleteStateObject (%x) error: %v", addr[:], err)) | |
} | |
@@ -510,7 +492,7 @@ func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject { | |
data *Account | |
err error | |
) | |
- if s.snap != nil { | |
+ /*if s.snap != nil { | |
if metrics.EnabledExpensive { | |
defer func(start time.Time) { s.SnapshotAccountReads += time.Since(start) }(time.Now()) | |
} | |
@@ -532,12 +514,13 @@ func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject { | |
data.Root = emptyRoot | |
} | |
} | |
- } | |
+ }*/ | |
// If snapshot unavailable or reading from it failed, load from the database | |
if s.snap == nil || err != nil { | |
if metrics.EnabledExpensive { | |
defer func(start time.Time) { s.AccountReads += time.Since(start) }(time.Now()) | |
} | |
+ oracle.PrefetchAccount(s.db.BlockNumber, addr, nil) | |
enc, err := s.trie.TryGet(addr.Bytes()) | |
if err != nil { | |
s.setError(fmt.Errorf("getDeleteStateObject (%x) error: %v", addr.Bytes(), err)) | |
@@ -614,7 +597,7 @@ func (s *StateDB) CreateAccount(addr common.Address) { | |
} | |
func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error { | |
- so := db.getStateObject(addr) | |
+ /*so := db.getStateObject(addr) | |
if so == nil { | |
return nil | |
} | |
@@ -638,7 +621,8 @@ func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common | |
return nil | |
} | |
} | |
- } | |
+ }*/ | |
+ fmt.Println("ForEachStorage is BROKEN!!") | |
return nil | |
} | |
@@ -902,8 +886,22 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { | |
// Finalize any pending changes and merge everything into the tries | |
s.IntermediateRoot(deleteEmptyObjects) | |
+ for addr := range s.stateObjectsDirty { | |
+ if obj := s.stateObjects[addr]; !obj.deleted { | |
+ fmt.Println("dirty state object", addr) | |
+ // Write any contract code associated with the state object | |
+ if obj.code != nil && obj.dirtyCode { | |
+ fmt.Println("write code", common.BytesToHash(obj.CodeHash())) | |
+ } | |
+ // Write any storage changes in the state object to its storage trie | |
+ if err := obj.CommitTrie(s.db); err != nil { | |
+ return common.Hash{}, err | |
+ } | |
+ } | |
+ } | |
+ | |
// Commit objects to the trie, measuring the elapsed time | |
- codeWriter := s.db.TrieDB().DiskDB().NewBatch() | |
+ /*codeWriter := s.db.TrieDB().DiskDB().NewBatch() | |
for addr := range s.stateObjectsDirty { | |
if obj := s.stateObjects[addr]; !obj.deleted { | |
// Write any contract code associated with the state object | |
@@ -924,7 +922,8 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { | |
if err := codeWriter.Write(); err != nil { | |
log.Crit("Failed to commit dirty codes", "error", err) | |
} | |
- } | |
+ }*/ | |
+ | |
// Write the account trie changes, measuing the amount of wasted time | |
var start time.Time | |
if metrics.EnabledExpensive { | |
@@ -937,16 +936,16 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { | |
if err := rlp.DecodeBytes(leaf, &account); err != nil { | |
return nil | |
} | |
- if account.Root != emptyRoot { | |
+ /*if account.Root != emptyRoot { | |
s.db.TrieDB().Reference(account.Root, parent) | |
- } | |
+ }*/ | |
return nil | |
}) | |
if metrics.EnabledExpensive { | |
s.AccountCommits += time.Since(start) | |
} | |
// If snapshotting is enabled, update the snapshot tree with this new version | |
- if s.snap != nil { | |
+ /*if s.snap != nil { | |
if metrics.EnabledExpensive { | |
defer func(start time.Time) { s.SnapshotCommits += time.Since(start) }(time.Now()) | |
} | |
@@ -964,7 +963,8 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { | |
} | |
} | |
s.snap, s.snapDestructs, s.snapAccounts, s.snapStorage = nil, nil, nil, nil | |
- } | |
+ }*/ | |
+ //fmt.Println("Commit doesn't work!!!") | |
return root, err | |
} | |
diff --git a/minigeth3/core/state_processor.go b/minigeth/core/state_processor.go | |
index d4c77ae..2bde5eb 100644 | |
--- a/minigeth3/core/state_processor.go | |
+++ b/minigeth/core/state_processor.go | |
@@ -19,10 +19,10 @@ package core | |
import ( | |
"fmt" | |
"math/big" | |
+ "os" | |
"github.com/ethereum/go-ethereum/common" | |
"github.com/ethereum/go-ethereum/consensus" | |
- "github.com/ethereum/go-ethereum/consensus/misc" | |
"github.com/ethereum/go-ethereum/core/state" | |
"github.com/ethereum/go-ethereum/core/types" | |
"github.com/ethereum/go-ethereum/core/vm" | |
@@ -67,13 +67,16 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg | |
gp = new(GasPool).AddGas(block.GasLimit()) | |
) | |
// Mutate the block and state according to any hard-fork specs | |
- if p.config.DAOForkSupport && p.config.DAOForkBlock != nil && p.config.DAOForkBlock.Cmp(block.Number()) == 0 { | |
+ // lol, don't support the DAO block | |
+ /*if p.config.DAOForkSupport && p.config.DAOForkBlock != nil && p.config.DAOForkBlock.Cmp(block.Number()) == 0 { | |
misc.ApplyDAOHardFork(statedb) | |
- } | |
+ }*/ | |
blockContext := NewEVMBlockContext(header, p.bc, nil) | |
vmenv := vm.NewEVM(blockContext, vm.TxContext{}, statedb, p.config, cfg) | |
// Iterate over and process the individual transactions | |
for i, tx := range block.Transactions() { | |
+ //fmt.Println(i, tx.Hash()) | |
+ os.Stdout.WriteString(".") | |
msg, err := tx.AsMessage(types.MakeSigner(p.config, header.Number), header.BaseFee) | |
if err != nil { | |
return nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err) | |
diff --git a/minigeth3/crypto/blake2b/blake2b_ref.go b/minigeth/crypto/blake2b/blake2b_ref.go | |
index 9d0ade4..81133e4 100644 | |
--- a/minigeth3/crypto/blake2b/blake2b_ref.go | |
+++ b/minigeth/crypto/blake2b/blake2b_ref.go | |
@@ -2,8 +2,6 @@ | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
-// +build !amd64 appengine gccgo | |
- | |
package blake2b | |
func f(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) { | |
diff --git a/minigeth3/crypto/bn256/bn256_slow.go b/minigeth/crypto/bn256/bn256_slow.go | |
index 4902108..3189b9e 100644 | |
--- a/minigeth3/crypto/bn256/bn256_slow.go | |
+++ b/minigeth/crypto/bn256/bn256_slow.go | |
@@ -2,8 +2,6 @@ | |
// Use of this source code is governed by a BSD-style license that can be found | |
// in the LICENSE file. | |
-// +build !amd64,!arm64 | |
- | |
// Package bn256 implements the Optimal Ate pairing over a 256-bit Barreto-Naehrig curve. | |
package bn256 | |
diff --git a/minigeth3/crypto/signature_nocgo.go b/minigeth/crypto/signature_nocgo.go | |
index 77c8a1d..6ae1c32 100644 | |
--- a/minigeth3/crypto/signature_nocgo.go | |
+++ b/minigeth/crypto/signature_nocgo.go | |
@@ -14,8 +14,6 @@ | |
// You should have received a copy of the GNU Lesser General Public License | |
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | |
-// +build nacl js !cgo gofuzz | |
- | |
package crypto | |
import ( | |
@@ -25,7 +23,7 @@ import ( | |
"fmt" | |
"math/big" | |
- "github.com/btcsuite/btcd/btcec" | |
+ "github.com/ethereum/go-ethereum/crypto/btcec" | |
) | |
// Ecrecover returns the uncompressed public key that created the given signature. | |
diff --git a/minigeth3/go.mod b/minigeth/go.mod | |
index ee9ffa0..a8f85f5 100644 | |
--- a/minigeth3/go.mod | |
+++ b/minigeth/go.mod | |
@@ -1,76 +1,8 @@ | |
module github.com/ethereum/go-ethereum | |
-go 1.15 | |
+go 1.17 | |
require ( | |
- github.com/Azure/azure-pipeline-go v0.2.2 // indirect | |
- github.com/Azure/azure-storage-blob-go v0.7.0 | |
- github.com/Azure/go-autorest/autorest/adal v0.8.0 // indirect | |
- github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect | |
- github.com/VictoriaMetrics/fastcache v1.6.0 | |
- github.com/aws/aws-sdk-go-v2 v1.2.0 | |
- github.com/aws/aws-sdk-go-v2/config v1.1.1 | |
- github.com/aws/aws-sdk-go-v2/credentials v1.1.1 | |
- github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 | |
- github.com/btcsuite/btcd v0.20.1-beta | |
- github.com/cespare/cp v0.1.0 | |
- github.com/cloudflare/cloudflare-go v0.14.0 | |
- github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f | |
- github.com/davecgh/go-spew v1.1.1 | |
- github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea | |
- github.com/deepmap/oapi-codegen v1.8.2 // indirect | |
- github.com/dlclark/regexp2 v1.2.0 // indirect | |
- github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf | |
- github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498 | |
- github.com/edsrzf/mmap-go v1.0.0 | |
- github.com/fatih/color v1.7.0 | |
- github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 | |
- github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff | |
- github.com/go-ole/go-ole v1.2.1 // indirect | |
- github.com/go-sourcemap/sourcemap v2.1.2+incompatible // indirect | |
- github.com/go-stack/stack v1.8.0 | |
- github.com/golang/protobuf v1.4.3 | |
- github.com/golang/snappy v0.0.3 | |
- github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa | |
- github.com/google/uuid v1.1.5 | |
- github.com/gorilla/websocket v1.4.2 | |
- github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29 | |
- github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d | |
- github.com/holiman/bloomfilter/v2 v2.0.3 | |
github.com/holiman/uint256 v1.2.0 | |
- github.com/huin/goupnp v1.0.2 | |
- github.com/influxdata/influxdb v1.8.3 | |
- github.com/influxdata/influxdb-client-go/v2 v2.4.0 | |
- github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect | |
- github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 | |
- github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e | |
- github.com/julienschmidt/httprouter v1.2.0 | |
- github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 | |
- github.com/kylelemons/godebug v1.1.0 // indirect | |
- github.com/mattn/go-colorable v0.1.8 | |
- github.com/mattn/go-isatty v0.0.12 | |
- github.com/naoina/go-stringutil v0.1.0 // indirect | |
- github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 | |
- github.com/olekukonko/tablewriter v0.0.5 | |
- github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 | |
- github.com/prometheus/tsdb v0.7.1 | |
- github.com/rjeczalik/notify v0.9.1 | |
- github.com/rs/cors v1.7.0 | |
- github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible | |
- github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 | |
- github.com/stretchr/testify v1.7.0 | |
- github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 | |
- github.com/tklauser/go-sysconf v0.3.5 // indirect | |
- github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef | |
- golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 | |
- golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect | |
- golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | |
- golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 | |
- golang.org/x/text v0.3.6 | |
- golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba | |
- gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce | |
- gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 | |
- gopkg.in/urfave/cli.v1 v1.20.0 | |
- gopkg.in/yaml.v2 v2.4.0 // indirect | |
- gotest.tools v2.2.0+incompatible // indirect | |
+ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 | |
) | |
diff --git a/minigeth3/go.sum b/minigeth/go.sum | |
index d6e9639..5b64c93 100644 | |
--- a/minigeth3/go.sum | |
+++ b/minigeth/go.sum | |
@@ -1,656 +1,57 @@ | |
-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= | |
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= | |
-cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= | |
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= | |
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= | |
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= | |
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= | |
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= | |
-cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= | |
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | |
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | |
-cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= | |
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | |
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= | |
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= | |
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= | |
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= | |
-collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= | |
-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 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= | |
-github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= | |
-github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= | |
-github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= | |
-github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= | |
-github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= | |
-github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= | |
-github.com/Azure/go-autorest/autorest/adal v0.8.0 h1:CxTzQrySOxDnKpLjFJeZAS5Qrv/qFPkgLjx5bOAi//I= | |
-github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= | |
-github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= | |
-github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= | |
-github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= | |
-github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= | |
-github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= | |
-github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= | |
-github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= | |
-github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= | |
-github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= | |
-github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= | |
-github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= | |
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | |
-github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= | |
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | |
-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= | |
-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= | |
-github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= | |
-github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= | |
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= | |
-github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= | |
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= | |
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | |
-github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= | |
-github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= | |
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= | |
-github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= | |
-github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= | |
-github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= | |
-github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= | |
-github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= | |
-github.com/aws/aws-sdk-go-v2/credentials v1.1.1 h1:NbvWIM1Mx6sNPTxowHgS2ewXCRp+NGTzUYb/96FZJbY= | |
-github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= | |
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN0Cb8EgPUFGIoTMeqbzI= | |
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= | |
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= | |
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= | |
-github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 h1:cKr6St+CtC3/dl/rEBJvlk7A/IN5D5F02GNkGzfbtVU= | |
-github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= | |
-github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= | |
-github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= | |
-github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 h1:TJoIfnIFubCX0ACVeJ0w46HEH5MwjwYN4iFhuYIhfIY= | |
-github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= | |
-github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= | |
-github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= | |
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= | |
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= | |
-github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= | |
-github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= | |
-github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= | |
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= | |
+github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= | |
+github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= | |
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= | |
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= | |
+github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= | |
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= | |
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= | |
+github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= | |
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | |
+github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | |
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= | |
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= | |
-github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= | |
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | |
-github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= | |
-github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= | |
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= | |
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | |
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= | |
-github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | |
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | |
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | |
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= | |
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | |
-github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= | |
-github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= | |
-github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= | |
-github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f h1:C43yEtQ6NIf4ftFXD/V55gnGFgPbMQobd//YlnLjUJ8= | |
-github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= | |
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= | |
-github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= | |
-github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= | |
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |
-github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= | |
-github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= | |
-github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= | |
-github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= | |
-github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= | |
-github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | |
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | |
-github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= | |
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= | |
-github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= | |
-github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= | |
-github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= | |
-github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | |
-github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498 h1:Y9vTBSsV4hSwPSj4bacAU/eSnV3dAxVpepaghAdhGoQ= | |
-github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= | |
-github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= | |
-github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= | |
-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | |
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | |
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | |
-github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= | |
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | |
-github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= | |
-github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= | |
-github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= | |
+github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= | |
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | |
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= | |
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | |
-github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= | |
-github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= | |
-github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= | |
-github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= | |
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | |
-github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= | |
-github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= | |
-github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= | |
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= | |
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | |
-github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= | |
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= | |
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= | |
-github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= | |
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | |
-github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= | |
-github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= | |
-github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |
-github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |
-github.com/go-sourcemap/sourcemap v2.1.2+incompatible h1:0b/xya7BKGhXuqFESKM4oIiRo9WOt2ebz7KxfreD6ug= | |
-github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= | |
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | |
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | |
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | |
-github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= | |
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | |
-github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= | |
-github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= | |
-github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= | |
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | |
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | |
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | |
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | |
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | |
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= | |
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | |
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | |
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | |
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= | |
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= | |
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= | |
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | |
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | |
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | |
-github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= | |
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | |
-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.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= | |
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |
-github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= | |
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | |
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | |
-github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= | |
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | |
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |
-github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= | |
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |
-github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= | |
-github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | |
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= | |
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | |
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | |
-github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= | |
-github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | |
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | |
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | |
-github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= | |
-github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= | |
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | |
-github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29 h1:sezaKhEfPFg8W0Enm61B9Gs911H8iesGY5R8NDPtd1M= | |
-github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= | |
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | |
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | |
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= | |
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | |
-github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= | |
-github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= | |
github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= | |
github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= | |
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | |
-github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= | |
-github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= | |
-github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= | |
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | |
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | |
-github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= | |
-github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8= | |
-github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= | |
-github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= | |
-github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= | |
-github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= | |
-github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= | |
-github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= | |
-github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= | |
-github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= | |
-github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= | |
-github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= | |
-github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= | |
-github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= | |
-github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= | |
-github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= | |
-github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U= | |
-github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= | |
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | |
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | |
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | |
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | |
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= | |
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | |
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= | |
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= | |
-github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= | |
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | |
-github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= | |
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= | |
-github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= | |
-github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= | |
-github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= | |
-github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= | |
-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/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |
-github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |
-github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= | |
-github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | |
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= | |
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= | |
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | |
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | |
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |
-github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | |
-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | |
-github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= | |
-github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= | |
-github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= | |
-github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= | |
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |
-github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |
-github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |
-github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= | |
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | |
-github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |
-github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |
-github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= | |
-github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |
-github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= | |
-github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= | |
-github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= | |
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | |
-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |
-github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= | |
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= | |
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | |
-github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | |
-github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= | |
-github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | |
-github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | |
-github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= | |
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | |
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | |
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | |
-github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= | |
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | |
-github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= | |
-github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= | |
-github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= | |
-github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= | |
-github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= | |
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= | |
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | |
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= | |
-github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= | |
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | |
-github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= | |
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= | |
+github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | |
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | |
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | |
-github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= | |
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | |
-github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | |
-github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | |
-github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= | |
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | |
-github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= | |
-github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= | |
-github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= | |
-github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= | |
-github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= | |
-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/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= | |
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | |
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= | |
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | |
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | |
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | |
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= | |
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | |
-github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= | |
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | |
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | |
-github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= | |
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= | |
-github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= | |
-github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= | |
-github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= | |
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |
-github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= | |
-github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= | |
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | |
-github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= | |
-github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= | |
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | |
-github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= | |
-github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= | |
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | |
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | |
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | |
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | |
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | |
-github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= | |
-github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= | |
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |
-github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | |
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | |
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | |
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | |
-github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= | |
-github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= | |
-github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= | |
-github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= | |
-github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= | |
-github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= | |
-github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= | |
-github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= | |
-github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= | |
-github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= | |
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | |
-github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= | |
-github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= | |
-github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= | |
-github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= | |
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | |
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | |
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | |
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |
-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | |
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | |
-go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | |
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |
-golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |
-golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= | |
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | |
-golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |
-golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | |
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= | |
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= | |
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= | |
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= | |
-golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= | |
-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= | |
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | |
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | |
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= | |
-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/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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
+golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |
+golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |
+golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= | |
+golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | |
+golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= | |
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |
-golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |
-golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= | |
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= | |
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | |
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= | |
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
-golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= | |
-golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | |
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= | |
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= | |
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | |
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= | |
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |
-golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= | |
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-20190206041539-40960b6deb8e/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= | |
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | |
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | |
-golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | |
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | |
-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= | |
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | |
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |
-gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= | |
-gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= | |
-gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= | |
-gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= | |
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= | |
-gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= | |
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= | |
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= | |
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | |
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | |
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | |
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | |
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | |
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | |
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | |
-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | |
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | |
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |
-google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= | |
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |
-google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | |
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | |
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | |
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | |
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | |
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | |
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | |
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | |
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= | |
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | |
-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= | |
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | |
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | |
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | |
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | |
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | |
-gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= | |
-gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= | |
-gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= | |
-gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= | |
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | |
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | |
-gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= | |
-gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= | |
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= | |
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |
-gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= | |
-gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | |
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | |
-honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= | |
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= | |
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= | |
diff --git a/minigeth3/log/logger.go b/minigeth/log/logger.go | |
index 276d696..4675dff 100644 | |
--- a/minigeth3/log/logger.go | |
+++ b/minigeth/log/logger.go | |
@@ -2,244 +2,24 @@ package log | |
import ( | |
"fmt" | |
- "os" | |
- "time" | |
- | |
- "github.com/go-stack/stack" | |
) | |
-const timeKey = "t" | |
-const lvlKey = "lvl" | |
-const msgKey = "msg" | |
-const ctxKey = "ctx" | |
-const errorKey = "LOG15_ERROR" | |
-const skipLevel = 2 | |
- | |
-type Lvl int | |
- | |
-const ( | |
- LvlCrit Lvl = iota | |
- LvlError | |
- LvlWarn | |
- LvlInfo | |
- LvlDebug | |
- LvlTrace | |
-) | |
- | |
-// AlignedString returns a 5-character string containing the name of a Lvl. | |
-func (l Lvl) AlignedString() string { | |
- switch l { | |
- case LvlTrace: | |
- return "TRACE" | |
- case LvlDebug: | |
- return "DEBUG" | |
- case LvlInfo: | |
- return "INFO " | |
- case LvlWarn: | |
- return "WARN " | |
- case LvlError: | |
- return "ERROR" | |
- case LvlCrit: | |
- return "CRIT " | |
- default: | |
- panic("bad level") | |
- } | |
+func Debug(msg string, ctx ...interface{}) { | |
+ fmt.Println(msg, ctx) | |
} | |
-// Strings returns the name of a Lvl. | |
-func (l Lvl) String() string { | |
- switch l { | |
- case LvlTrace: | |
- return "trce" | |
- case LvlDebug: | |
- return "dbug" | |
- case LvlInfo: | |
- return "info" | |
- case LvlWarn: | |
- return "warn" | |
- case LvlError: | |
- return "eror" | |
- case LvlCrit: | |
- return "crit" | |
- default: | |
- panic("bad level") | |
- } | |
+func Info(msg string, ctx ...interface{}) { | |
+ fmt.Println(msg, ctx) | |
} | |
-// LvlFromString returns the appropriate Lvl from a string name. | |
-// Useful for parsing command line args and configuration files. | |
-func LvlFromString(lvlString string) (Lvl, error) { | |
- switch lvlString { | |
- case "trace", "trce": | |
- return LvlTrace, nil | |
- case "debug", "dbug": | |
- return LvlDebug, nil | |
- case "info": | |
- return LvlInfo, nil | |
- case "warn": | |
- return LvlWarn, nil | |
- case "error", "eror": | |
- return LvlError, nil | |
- case "crit": | |
- return LvlCrit, nil | |
- default: | |
- return LvlDebug, fmt.Errorf("unknown level: %v", lvlString) | |
- } | |
+func Warn(msg string, ctx ...interface{}) { | |
+ fmt.Println(msg, ctx) | |
} | |
-// A Record is what a Logger asks its handler to write | |
-type Record struct { | |
- Time time.Time | |
- Lvl Lvl | |
- Msg string | |
- Ctx []interface{} | |
- Call stack.Call | |
- KeyNames RecordKeyNames | |
+func Error(msg string, ctx ...interface{}) { | |
+ fmt.Println(msg, ctx) | |
} | |
-// RecordKeyNames gets stored in a Record when the write function is executed. | |
-type RecordKeyNames struct { | |
- Time string | |
- Msg string | |
- Lvl string | |
- Ctx string | |
-} | |
- | |
-// A Logger writes key/value pairs to a Handler | |
-type Logger interface { | |
- // New returns a new Logger that has this logger's context plus the given context | |
- New(ctx ...interface{}) Logger | |
- | |
- // GetHandler gets the handler associated with the logger. | |
- GetHandler() Handler | |
- | |
- // SetHandler updates the logger to write records to the specified handler. | |
- SetHandler(h Handler) | |
- | |
- // Log a message at the given level with context key/value pairs | |
- Trace(msg string, ctx ...interface{}) | |
- Debug(msg string, ctx ...interface{}) | |
- Info(msg string, ctx ...interface{}) | |
- Warn(msg string, ctx ...interface{}) | |
- Error(msg string, ctx ...interface{}) | |
- Crit(msg string, ctx ...interface{}) | |
-} | |
- | |
-type logger struct { | |
- ctx []interface{} | |
- h *swapHandler | |
-} | |
- | |
-func (l *logger) write(msg string, lvl Lvl, ctx []interface{}, skip int) { | |
- l.h.Log(&Record{ | |
- Time: time.Now(), | |
- Lvl: lvl, | |
- Msg: msg, | |
- Ctx: newContext(l.ctx, ctx), | |
- Call: stack.Caller(skip), | |
- KeyNames: RecordKeyNames{ | |
- Time: timeKey, | |
- Msg: msgKey, | |
- Lvl: lvlKey, | |
- Ctx: ctxKey, | |
- }, | |
- }) | |
-} | |
- | |
-func (l *logger) New(ctx ...interface{}) Logger { | |
- child := &logger{newContext(l.ctx, ctx), new(swapHandler)} | |
- child.SetHandler(l.h) | |
- return child | |
-} | |
- | |
-func newContext(prefix []interface{}, suffix []interface{}) []interface{} { | |
- normalizedSuffix := normalize(suffix) | |
- newCtx := make([]interface{}, len(prefix)+len(normalizedSuffix)) | |
- n := copy(newCtx, prefix) | |
- copy(newCtx[n:], normalizedSuffix) | |
- return newCtx | |
-} | |
- | |
-func (l *logger) Trace(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlTrace, ctx, skipLevel) | |
-} | |
- | |
-func (l *logger) Debug(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlDebug, ctx, skipLevel) | |
-} | |
- | |
-func (l *logger) Info(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlInfo, ctx, skipLevel) | |
-} | |
- | |
-func (l *logger) Warn(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlWarn, ctx, skipLevel) | |
-} | |
- | |
-func (l *logger) Error(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlError, ctx, skipLevel) | |
-} | |
- | |
-func (l *logger) Crit(msg string, ctx ...interface{}) { | |
- l.write(msg, LvlCrit, ctx, skipLevel) | |
- os.Exit(1) | |
-} | |
- | |
-func (l *logger) GetHandler() Handler { | |
- return l.h.Get() | |
-} | |
- | |
-func (l *logger) SetHandler(h Handler) { | |
- l.h.Swap(h) | |
-} | |
- | |
-func normalize(ctx []interface{}) []interface{} { | |
- // if the caller passed a Ctx object, then expand it | |
- if len(ctx) == 1 { | |
- if ctxMap, ok := ctx[0].(Ctx); ok { | |
- ctx = ctxMap.toArray() | |
- } | |
- } | |
- | |
- // ctx needs to be even because it's a series of key/value pairs | |
- // no one wants to check for errors on logging functions, | |
- // so instead of erroring on bad input, we'll just make sure | |
- // that things are the right length and users can fix bugs | |
- // when they see the output looks wrong | |
- if len(ctx)%2 != 0 { | |
- ctx = append(ctx, nil, errorKey, "Normalized odd number of arguments by adding nil") | |
- } | |
- | |
- return ctx | |
-} | |
- | |
-// Lazy allows you to defer calculation of a logged value that is expensive | |
-// to compute until it is certain that it must be evaluated with the given filters. | |
-// | |
-// Lazy may also be used in conjunction with a Logger's New() function | |
-// to generate a child logger which always reports the current value of changing | |
-// state. | |
-// | |
-// You may wrap any function which takes no arguments to Lazy. It may return any | |
-// number of values of any type. | |
-type Lazy struct { | |
- Fn interface{} | |
-} | |
- | |
-// Ctx is a map of key/value pairs to pass as context to a log function | |
-// Use this only if you really need greater safety around the arguments you pass | |
-// to the logging functions. | |
-type Ctx map[string]interface{} | |
- | |
-func (c Ctx) toArray() []interface{} { | |
- arr := make([]interface{}, len(c)*2) | |
- | |
- i := 0 | |
- for k, v := range c { | |
- arr[i] = k | |
- arr[i+1] = v | |
- i += 2 | |
- } | |
- | |
- return arr | |
+func Crit(msg string, ctx ...interface{}) { | |
+ fmt.Println(msg, ctx) | |
} | |
diff --git a/minigeth3/metrics/metrics.go b/minigeth/metrics/metrics.go | |
index 747d647..411b735 100644 | |
--- a/minigeth3/metrics/metrics.go | |
+++ b/minigeth/metrics/metrics.go | |
@@ -1,126 +1,3 @@ | |
-// Go port of Coda Hale's Metrics library | |
-// | |
-// <https://github.com/rcrowley/go-metrics> | |
-// | |
-// Coda Hale's original work: <https://github.com/codahale/metrics> | |
package metrics | |
-import ( | |
- "os" | |
- "runtime" | |
- "strings" | |
- "time" | |
- | |
- "github.com/ethereum/go-ethereum/log" | |
-) | |
- | |
-// Enabled is checked by the constructor functions for all of the | |
-// standard metrics. If it is true, the metric returned is a stub. | |
-// | |
-// This global kill-switch helps quantify the observer effect and makes | |
-// for less cluttered pprof profiles. | |
-var Enabled = false | |
- | |
-// EnabledExpensive is a soft-flag meant for external packages to check if costly | |
-// metrics gathering is allowed or not. The goal is to separate standard metrics | |
-// for health monitoring and debug metrics that might impact runtime performance. | |
var EnabledExpensive = false | |
- | |
-// enablerFlags is the CLI flag names to use to enable metrics collections. | |
-var enablerFlags = []string{"metrics"} | |
- | |
-// expensiveEnablerFlags is the CLI flag names to use to enable metrics collections. | |
-var expensiveEnablerFlags = []string{"metrics.expensive"} | |
- | |
-// Init enables or disables the metrics system. Since we need this to run before | |
-// any other code gets to create meters and timers, we'll actually do an ugly hack | |
-// and peek into the command line args for the metrics flag. | |
-func init() { | |
- for _, arg := range os.Args { | |
- flag := strings.TrimLeft(arg, "-") | |
- | |
- for _, enabler := range enablerFlags { | |
- if !Enabled && flag == enabler { | |
- log.Info("Enabling metrics collection") | |
- Enabled = true | |
- } | |
- } | |
- for _, enabler := range expensiveEnablerFlags { | |
- if !EnabledExpensive && flag == enabler { | |
- log.Info("Enabling expensive metrics collection") | |
- EnabledExpensive = true | |
- } | |
- } | |
- } | |
-} | |
- | |
-// CollectProcessMetrics periodically collects various metrics about the running | |
-// process. | |
-func CollectProcessMetrics(refresh time.Duration) { | |
- // Short circuit if the metrics system is disabled | |
- if !Enabled { | |
- return | |
- } | |
- refreshFreq := int64(refresh / time.Second) | |
- | |
- // Create the various data collectors | |
- cpuStats := make([]*CPUStats, 2) | |
- memstats := make([]*runtime.MemStats, 2) | |
- diskstats := make([]*DiskStats, 2) | |
- for i := 0; i < len(memstats); i++ { | |
- cpuStats[i] = new(CPUStats) | |
- memstats[i] = new(runtime.MemStats) | |
- diskstats[i] = new(DiskStats) | |
- } | |
- // Define the various metrics to collect | |
- var ( | |
- cpuSysLoad = GetOrRegisterGauge("system/cpu/sysload", DefaultRegistry) | |
- cpuSysWait = GetOrRegisterGauge("system/cpu/syswait", DefaultRegistry) | |
- cpuProcLoad = GetOrRegisterGauge("system/cpu/procload", DefaultRegistry) | |
- cpuThreads = GetOrRegisterGauge("system/cpu/threads", DefaultRegistry) | |
- cpuGoroutines = GetOrRegisterGauge("system/cpu/goroutines", DefaultRegistry) | |
- | |
- memPauses = GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) | |
- memAllocs = GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) | |
- memFrees = GetOrRegisterMeter("system/memory/frees", DefaultRegistry) | |
- memHeld = GetOrRegisterGauge("system/memory/held", DefaultRegistry) | |
- memUsed = GetOrRegisterGauge("system/memory/used", DefaultRegistry) | |
- | |
- diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) | |
- diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) | |
- diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) | |
- diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) | |
- diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) | |
- diskWriteBytesCounter = GetOrRegisterCounter("system/disk/writebytes", DefaultRegistry) | |
- ) | |
- // Iterate loading the different stats and updating the meters | |
- for i := 1; ; i++ { | |
- location1 := i % 2 | |
- location2 := (i - 1) % 2 | |
- | |
- ReadCPUStats(cpuStats[location1]) | |
- cpuSysLoad.Update((cpuStats[location1].GlobalTime - cpuStats[location2].GlobalTime) / refreshFreq) | |
- cpuSysWait.Update((cpuStats[location1].GlobalWait - cpuStats[location2].GlobalWait) / refreshFreq) | |
- cpuProcLoad.Update((cpuStats[location1].LocalTime - cpuStats[location2].LocalTime) / refreshFreq) | |
- cpuThreads.Update(int64(threadCreateProfile.Count())) | |
- cpuGoroutines.Update(int64(runtime.NumGoroutine())) | |
- | |
- runtime.ReadMemStats(memstats[location1]) | |
- memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) | |
- memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) | |
- memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) | |
- memHeld.Update(int64(memstats[location1].HeapSys - memstats[location1].HeapReleased)) | |
- memUsed.Update(int64(memstats[location1].Alloc)) | |
- | |
- if ReadDiskStats(diskstats[location1]) == nil { | |
- diskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount) | |
- diskReadBytes.Mark(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) | |
- diskWrites.Mark(diskstats[location1].WriteCount - diskstats[location2].WriteCount) | |
- diskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) | |
- | |
- diskReadBytesCounter.Inc(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) | |
- diskWriteBytesCounter.Inc(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) | |
- } | |
- time.Sleep(refresh) | |
- } | |
-} | |
diff --git a/minigeth3/rlp/unsafe.go b/minigeth/rlp/unsafe.go | |
index 94ed540..9be723b 100644 | |
--- a/minigeth3/rlp/unsafe.go | |
+++ b/minigeth/rlp/unsafe.go | |
@@ -14,8 +14,6 @@ | |
// You should have received a copy of the GNU Lesser General Public License | |
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | |
-// +build !nacl,!js,cgo | |
- | |
package rlp | |
import ( | |
diff --git a/minigeth3/trie/database.go b/minigeth/trie/database.go | |
index f140a56..3ec92de 100644 | |
--- a/minigeth3/trie/database.go | |
+++ b/minigeth/trie/database.go | |
@@ -1,96 +1,18 @@ | |
-// Copyright 2018 The go-ethereum Authors | |
-// This file is part of the go-ethereum library. | |
-// | |
-// The go-ethereum library is free software: you can redistribute it and/or modify | |
-// it under the terms of the GNU Lesser General Public License as published by | |
-// the Free Software Foundation, either version 3 of the License, or | |
-// (at your option) any later version. | |
-// | |
-// The go-ethereum library is distributed in the hope that it will be useful, | |
-// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
-// GNU Lesser General Public License for more details. | |
-// | |
-// You should have received a copy of the GNU Lesser General Public License | |
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | |
- | |
package trie | |
import ( | |
- "errors" | |
- "fmt" | |
+ "bytes" | |
"io" | |
- "reflect" | |
- "runtime" | |
+ "math/big" | |
"sync" | |
- "time" | |
- "github.com/VictoriaMetrics/fastcache" | |
"github.com/ethereum/go-ethereum/common" | |
- "github.com/ethereum/go-ethereum/core/rawdb" | |
- "github.com/ethereum/go-ethereum/ethdb" | |
- "github.com/ethereum/go-ethereum/log" | |
- "github.com/ethereum/go-ethereum/metrics" | |
+ "github.com/ethereum/go-ethereum/core/types" | |
+ "github.com/ethereum/go-ethereum/crypto" | |
+ "github.com/ethereum/go-ethereum/oracle" | |
"github.com/ethereum/go-ethereum/rlp" | |
) | |
-var ( | |
- memcacheCleanHitMeter = metrics.NewRegisteredMeter("trie/memcache/clean/hit", nil) | |
- memcacheCleanMissMeter = metrics.NewRegisteredMeter("trie/memcache/clean/miss", nil) | |
- memcacheCleanReadMeter = metrics.NewRegisteredMeter("trie/memcache/clean/read", nil) | |
- memcacheCleanWriteMeter = metrics.NewRegisteredMeter("trie/memcache/clean/write", nil) | |
- | |
- memcacheDirtyHitMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/hit", nil) | |
- memcacheDirtyMissMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/miss", nil) | |
- memcacheDirtyReadMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/read", nil) | |
- memcacheDirtyWriteMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/write", nil) | |
- | |
- memcacheFlushTimeTimer = metrics.NewRegisteredResettingTimer("trie/memcache/flush/time", nil) | |
- memcacheFlushNodesMeter = metrics.NewRegisteredMeter("trie/memcache/flush/nodes", nil) | |
- memcacheFlushSizeMeter = metrics.NewRegisteredMeter("trie/memcache/flush/size", nil) | |
- | |
- memcacheGCTimeTimer = metrics.NewRegisteredResettingTimer("trie/memcache/gc/time", nil) | |
- memcacheGCNodesMeter = metrics.NewRegisteredMeter("trie/memcache/gc/nodes", nil) | |
- memcacheGCSizeMeter = metrics.NewRegisteredMeter("trie/memcache/gc/size", nil) | |
- | |
- memcacheCommitTimeTimer = metrics.NewRegisteredResettingTimer("trie/memcache/commit/time", nil) | |
- memcacheCommitNodesMeter = metrics.NewRegisteredMeter("trie/memcache/commit/nodes", nil) | |
- memcacheCommitSizeMeter = metrics.NewRegisteredMeter("trie/memcache/commit/size", nil) | |
-) | |
- | |
-// Database is an intermediate write layer between the trie data structures and | |
-// the disk database. The aim is to accumulate trie writes in-memory and only | |
-// periodically flush a couple tries to disk, garbage collecting the remainder. | |
-// | |
-// Note, the trie Database is **not** thread safe in its mutations, but it **is** | |
-// thread safe in providing individual, independent node access. The rationale | |
-// behind this split design is to provide read access to RPC handlers and sync | |
-// servers even while the trie is executing expensive garbage collection. | |
-type Database struct { | |
- diskdb ethdb.KeyValueStore // Persistent storage for matured trie nodes | |
- | |
- cleans *fastcache.Cache // GC friendly memory cache of clean node RLPs | |
- dirties map[common.Hash]*cachedNode // Data and references relationships of dirty trie nodes | |
- oldest common.Hash // Oldest tracked node, flush-list head | |
- newest common.Hash // Newest tracked node, flush-list tail | |
- | |
- preimages map[common.Hash][]byte // Preimages of nodes from the secure trie | |
- | |
- gctime time.Duration // Time spent on garbage collection since last commit | |
- gcnodes uint64 // Nodes garbage collected since last commit | |
- gcsize common.StorageSize // Data storage garbage collected since last commit | |
- | |
- flushtime time.Duration // Time spent on data flushing since last commit | |
- flushnodes uint64 // Nodes flushed since last commit | |
- flushsize common.StorageSize // Data storage flushed since last commit | |
- | |
- dirtiesSize common.StorageSize // Storage size of the dirty node cache (exc. metadata) | |
- childrenSize common.StorageSize // Storage size of the external children tracking | |
- preimagesSize common.StorageSize // Storage size of the preimages cache | |
- | |
- lock sync.RWMutex | |
-} | |
- | |
// rawNode is a simple binary blob used to differentiate between collapsed trie | |
// nodes and already encoded RLP binary blobs (while at the same time store them | |
// in the same cache fields). | |
@@ -104,216 +26,36 @@ func (n rawNode) EncodeRLP(w io.Writer) error { | |
return err | |
} | |
-// rawFullNode represents only the useful data content of a full node, with the | |
-// caches and flags stripped out to minimize its data storage. This type honors | |
-// the same RLP encoding as the original parent. | |
-type rawFullNode [17]node | |
- | |
-func (n rawFullNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } | |
-func (n rawFullNode) fstring(ind string) string { panic("this should never end up in a live trie") } | |
- | |
-func (n rawFullNode) EncodeRLP(w io.Writer) error { | |
- var nodes [17]node | |
- | |
- for i, child := range n { | |
- if child != nil { | |
- nodes[i] = child | |
- } else { | |
- nodes[i] = nilValueNode | |
- } | |
- } | |
- return rlp.Encode(w, nodes) | |
+type Database struct { | |
+ BlockNumber *big.Int | |
+ Root common.Hash | |
+ lock sync.RWMutex | |
} | |
-// rawShortNode represents only the useful data content of a short node, with the | |
-// caches and flags stripped out to minimize its data storage. This type honors | |
-// the same RLP encoding as the original parent. | |
-type rawShortNode struct { | |
- Key []byte | |
- Val node | |
+func NewDatabase(header types.Header) Database { | |
+ triedb := Database{BlockNumber: header.Number, Root: header.Root} | |
+ //triedb.preimages = make(map[common.Hash][]byte) | |
+ //fmt.Println("init database") | |
+ oracle.PrefetchAccount(header.Number, common.Address{}, nil) | |
+ | |
+ //panic("preseed") | |
+ return triedb | |
} | |
-func (n rawShortNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } | |
-func (n rawShortNode) fstring(ind string) string { panic("this should never end up in a live trie") } | |
- | |
-// cachedNode is all the information we know about a single cached trie node | |
-// in the memory database write layer. | |
-type cachedNode struct { | |
- node node // Cached collapsed trie node, or raw rlp data | |
- size uint16 // Byte size of the useful cached data | |
- | |
- parents uint32 // Number of live nodes referencing this one | |
- children map[common.Hash]uint16 // External children referenced by this node | |
- | |
- flushPrev common.Hash // Previous node in the flush-list | |
- flushNext common.Hash // Next node in the flush-list | |
+// Node retrieves an encoded cached trie node from memory. If it cannot be found | |
+// cached, the method queries the persistent database for the content. | |
+func (db *Database) Node(hash common.Hash) ([]byte, error) { | |
+ panic("no Node function") | |
} | |
-// cachedNodeSize is the raw size of a cachedNode data structure without any | |
-// node data included. It's an approximate size, but should be a lot better | |
-// than not counting them. | |
-var cachedNodeSize = int(reflect.TypeOf(cachedNode{}).Size()) | |
- | |
-// cachedNodeChildrenSize is the raw size of an initialized but empty external | |
-// reference map. | |
-const cachedNodeChildrenSize = 48 | |
- | |
-// rlp returns the raw rlp encoded blob of the cached trie node, either directly | |
-// from the cache, or by regenerating it from the collapsed node. | |
-func (n *cachedNode) rlp() []byte { | |
- if node, ok := n.node.(rawNode); ok { | |
- return node | |
+// node retrieves a cached trie node from memory, or returns nil if none can be | |
+// found in the memory cache. | |
+func (db *Database) node(hash common.Hash) node { | |
+ //fmt.Println("node", hash) | |
+ if val := oracle.Preimage(hash); val != nil { | |
+ return mustDecodeNode(hash[:], val) | |
} | |
- blob, err := rlp.EncodeToBytes(n.node) | |
- if err != nil { | |
- panic(err) | |
- } | |
- return blob | |
-} | |
- | |
-// obj returns the decoded and expanded trie node, either directly from the cache, | |
-// or by regenerating it from the rlp encoded blob. | |
-func (n *cachedNode) obj(hash common.Hash) node { | |
- if node, ok := n.node.(rawNode); ok { | |
- return mustDecodeNode(hash[:], node) | |
- } | |
- return expandNode(hash[:], n.node) | |
-} | |
- | |
-// forChilds invokes the callback for all the tracked children of this node, | |
-// both the implicit ones from inside the node as well as the explicit ones | |
-// from outside the node. | |
-func (n *cachedNode) forChilds(onChild func(hash common.Hash)) { | |
- for child := range n.children { | |
- onChild(child) | |
- } | |
- if _, ok := n.node.(rawNode); !ok { | |
- forGatherChildren(n.node, onChild) | |
- } | |
-} | |
- | |
-// forGatherChildren traverses the node hierarchy of a collapsed storage node and | |
-// invokes the callback for all the hashnode children. | |
-func forGatherChildren(n node, onChild func(hash common.Hash)) { | |
- switch n := n.(type) { | |
- case *rawShortNode: | |
- forGatherChildren(n.Val, onChild) | |
- case rawFullNode: | |
- for i := 0; i < 16; i++ { | |
- forGatherChildren(n[i], onChild) | |
- } | |
- case hashNode: | |
- onChild(common.BytesToHash(n)) | |
- case valueNode, nil, rawNode: | |
- default: | |
- panic(fmt.Sprintf("unknown node type: %T", n)) | |
- } | |
-} | |
- | |
-// simplifyNode traverses the hierarchy of an expanded memory node and discards | |
-// all the internal caches, returning a node that only contains the raw data. | |
-func simplifyNode(n node) node { | |
- switch n := n.(type) { | |
- case *shortNode: | |
- // Short nodes discard the flags and cascade | |
- return &rawShortNode{Key: n.Key, Val: simplifyNode(n.Val)} | |
- | |
- case *fullNode: | |
- // Full nodes discard the flags and cascade | |
- node := rawFullNode(n.Children) | |
- for i := 0; i < len(node); i++ { | |
- if node[i] != nil { | |
- node[i] = simplifyNode(node[i]) | |
- } | |
- } | |
- return node | |
- | |
- case valueNode, hashNode, rawNode: | |
- return n | |
- | |
- default: | |
- panic(fmt.Sprintf("unknown node type: %T", n)) | |
- } | |
-} | |
- | |
-// expandNode traverses the node hierarchy of a collapsed storage node and converts | |
-// all fields and keys into expanded memory form. | |
-func expandNode(hash hashNode, n node) node { | |
- switch n := n.(type) { | |
- case *rawShortNode: | |
- // Short nodes need key and child expansion | |
- return &shortNode{ | |
- Key: compactToHex(n.Key), | |
- Val: expandNode(nil, n.Val), | |
- flags: nodeFlag{ | |
- hash: hash, | |
- }, | |
- } | |
- | |
- case rawFullNode: | |
- // Full nodes need child expansion | |
- node := &fullNode{ | |
- flags: nodeFlag{ | |
- hash: hash, | |
- }, | |
- } | |
- for i := 0; i < len(node.Children); i++ { | |
- if n[i] != nil { | |
- node.Children[i] = expandNode(nil, n[i]) | |
- } | |
- } | |
- return node | |
- | |
- case valueNode, hashNode: | |
- return n | |
- | |
- default: | |
- panic(fmt.Sprintf("unknown node type: %T", n)) | |
- } | |
-} | |
- | |
-// Config defines all necessary options for database. | |
-type Config struct { | |
- Cache int // Memory allowance (MB) to use for caching trie nodes in memory | |
- Journal string // Journal of clean cache to survive node restarts | |
- Preimages bool // Flag whether the preimage of trie key is recorded | |
-} | |
- | |
-// NewDatabase creates a new trie database to store ephemeral trie content before | |
-// its written out to disk or garbage collected. No read cache is created, so all | |
-// data retrievals will hit the underlying disk database. | |
-func NewDatabase(diskdb ethdb.KeyValueStore) *Database { | |
- return NewDatabaseWithConfig(diskdb, nil) | |
-} | |
- | |
-// NewDatabaseWithConfig creates a new trie database to store ephemeral trie content | |
-// before its written out to disk or garbage collected. It also acts as a read cache | |
-// for nodes loaded from disk. | |
-func NewDatabaseWithConfig(diskdb ethdb.KeyValueStore, config *Config) *Database { | |
- var cleans *fastcache.Cache | |
- if config != nil && config.Cache > 0 { | |
- if config.Journal == "" { | |
- cleans = fastcache.New(config.Cache * 1024 * 1024) | |
- } else { | |
- cleans = fastcache.LoadFromFileOrNew(config.Journal, config.Cache*1024*1024) | |
- } | |
- } | |
- db := &Database{ | |
- diskdb: diskdb, | |
- cleans: cleans, | |
- dirties: map[common.Hash]*cachedNode{{}: { | |
- children: make(map[common.Hash]uint16), | |
- }}, | |
- } | |
- if config == nil || config.Preimages { // TODO(karalabe): Flip to default off in the future | |
- db.preimages = make(map[common.Hash][]byte) | |
- } | |
- return db | |
-} | |
- | |
-// DiskDB retrieves the persistent storage backing the trie database. | |
-func (db *Database) DiskDB() ethdb.KeyValueStore { | |
- return db.diskdb | |
+ return nil | |
} | |
// insert inserts a collapsed trie node into the memory database. | |
@@ -321,569 +63,39 @@ func (db *Database) DiskDB() ethdb.KeyValueStore { | |
// All nodes inserted by this function will be reference tracked | |
// and in theory should only used for **trie nodes** insertion. | |
func (db *Database) insert(hash common.Hash, size int, node node) { | |
- // If the node's already cached, skip | |
- if _, ok := db.dirties[hash]; ok { | |
- return | |
- } | |
- memcacheDirtyWriteMeter.Mark(int64(size)) | |
+ // can put things in the oracle here if we care | |
+ //fmt.Println("insert", hash, size) | |
+} | |
- // Create the cached entry for this node | |
- entry := &cachedNode{ | |
- node: simplifyNode(node), | |
- size: uint16(size), | |
- flushPrev: db.newest, | |
- } | |
- entry.forChilds(func(child common.Hash) { | |
- if c := db.dirties[child]; c != nil { | |
- c.parents++ | |
+func GenPossibleShortNodePreimage(preimages map[common.Hash][]byte) { | |
+ newPreimages := make(map[common.Hash][]byte) | |
+ | |
+ for _, val := range preimages { | |
+ node, err := decodeNode(nil, val) | |
+ if err != nil { | |
+ continue | |
} | |
- }) | |
- db.dirties[hash] = entry | |
- // Update the flush-list endpoints | |
- if db.oldest == (common.Hash{}) { | |
- db.oldest, db.newest = hash, hash | |
- } else { | |
- db.dirties[db.newest].flushNext, db.newest = hash, hash | |
- } | |
- db.dirtiesSize += common.StorageSize(common.HashLength + entry.size) | |
-} | |
- | |
-// insertPreimage writes a new trie node pre-image to the memory database if it's | |
-// yet unknown. The method will NOT make a copy of the slice, | |
-// only use if the preimage will NOT be changed later on. | |
-// | |
-// Note, this method assumes that the database's lock is held! | |
-func (db *Database) insertPreimage(hash common.Hash, preimage []byte) { | |
- // Short circuit if preimage collection is disabled | |
- if db.preimages == nil { | |
- return | |
- } | |
- // Track the preimage if a yet unknown one | |
- if _, ok := db.preimages[hash]; ok { | |
- return | |
- } | |
- db.preimages[hash] = preimage | |
- db.preimagesSize += common.StorageSize(common.HashLength + len(preimage)) | |
-} | |
- | |
-// node retrieves a cached trie node from memory, or returns nil if none can be | |
-// found in the memory cache. | |
-func (db *Database) node(hash common.Hash) node { | |
- // Retrieve the node from the clean cache if available | |
- if db.cleans != nil { | |
- if enc := db.cleans.Get(nil, hash[:]); enc != nil { | |
- memcacheCleanHitMeter.Mark(1) | |
- memcacheCleanReadMeter.Mark(int64(len(enc))) | |
- return mustDecodeNode(hash[:], enc) | |
- } | |
- } | |
- // Retrieve the node from the dirty cache if available | |
- db.lock.RLock() | |
- dirty := db.dirties[hash] | |
- db.lock.RUnlock() | |
- | |
- if dirty != nil { | |
- memcacheDirtyHitMeter.Mark(1) | |
- memcacheDirtyReadMeter.Mark(int64(dirty.size)) | |
- return dirty.obj(hash) | |
- } | |
- memcacheDirtyMissMeter.Mark(1) | |
- | |
- // Content unavailable in memory, attempt to retrieve from disk | |
- enc, err := db.diskdb.Get(hash[:]) | |
- if err != nil || enc == nil { | |
- return nil | |
- } | |
- if db.cleans != nil { | |
- db.cleans.Set(hash[:], enc) | |
- memcacheCleanMissMeter.Mark(1) | |
- memcacheCleanWriteMeter.Mark(int64(len(enc))) | |
- } | |
- return mustDecodeNode(hash[:], enc) | |
-} | |
- | |
-// Node retrieves an encoded cached trie node from memory. If it cannot be found | |
-// cached, the method queries the persistent database for the content. | |
-func (db *Database) Node(hash common.Hash) ([]byte, error) { | |
- // It doesn't make sense to retrieve the metaroot | |
- if hash == (common.Hash{}) { | |
- return nil, errors.New("not found") | |
- } | |
- // Retrieve the node from the clean cache if available | |
- if db.cleans != nil { | |
- if enc := db.cleans.Get(nil, hash[:]); enc != nil { | |
- memcacheCleanHitMeter.Mark(1) | |
- memcacheCleanReadMeter.Mark(int64(len(enc))) | |
- return enc, nil | |
- } | |
- } | |
- // Retrieve the node from the dirty cache if available | |
- db.lock.RLock() | |
- dirty := db.dirties[hash] | |
- db.lock.RUnlock() | |
- | |
- if dirty != nil { | |
- memcacheDirtyHitMeter.Mark(1) | |
- memcacheDirtyReadMeter.Mark(int64(dirty.size)) | |
- return dirty.rlp(), nil | |
- } | |
- memcacheDirtyMissMeter.Mark(1) | |
- | |
- // Content unavailable in memory, attempt to retrieve from disk | |
- enc := rawdb.ReadTrieNode(db.diskdb, hash) | |
- if len(enc) != 0 { | |
- if db.cleans != nil { | |
- db.cleans.Set(hash[:], enc) | |
- memcacheCleanMissMeter.Mark(1) | |
- memcacheCleanWriteMeter.Mark(int64(len(enc))) | |
- } | |
- return enc, nil | |
- } | |
- return nil, errors.New("not found") | |
-} | |
- | |
-// preimage retrieves a cached trie node pre-image from memory. If it cannot be | |
-// found cached, the method queries the persistent database for the content. | |
-func (db *Database) preimage(hash common.Hash) []byte { | |
- // Short circuit if preimage collection is disabled | |
- if db.preimages == nil { | |
- return nil | |
- } | |
- // Retrieve the node from cache if available | |
- db.lock.RLock() | |
- preimage := db.preimages[hash] | |
- db.lock.RUnlock() | |
- | |
- if preimage != nil { | |
- return preimage | |
- } | |
- return rawdb.ReadPreimage(db.diskdb, hash) | |
-} | |
- | |
-// Nodes retrieves the hashes of all the nodes cached within the memory database. | |
-// This method is extremely expensive and should only be used to validate internal | |
-// states in test code. | |
-func (db *Database) Nodes() []common.Hash { | |
- db.lock.RLock() | |
- defer db.lock.RUnlock() | |
- | |
- var hashes = make([]common.Hash, 0, len(db.dirties)) | |
- for hash := range db.dirties { | |
- if hash != (common.Hash{}) { // Special case for "root" references/nodes | |
- hashes = append(hashes, hash) | |
- } | |
- } | |
- return hashes | |
-} | |
- | |
-// Reference adds a new reference from a parent node to a child node. | |
-// This function is used to add reference between internal trie node | |
-// and external node(e.g. storage trie root), all internal trie nodes | |
-// are referenced together by database itself. | |
-func (db *Database) Reference(child common.Hash, parent common.Hash) { | |
- db.lock.Lock() | |
- defer db.lock.Unlock() | |
- | |
- db.reference(child, parent) | |
-} | |
- | |
-// reference is the private locked version of Reference. | |
-func (db *Database) reference(child common.Hash, parent common.Hash) { | |
- // If the node does not exist, it's a node pulled from disk, skip | |
- node, ok := db.dirties[child] | |
- if !ok { | |
- return | |
- } | |
- // If the reference already exists, only duplicate for roots | |
- if db.dirties[parent].children == nil { | |
- db.dirties[parent].children = make(map[common.Hash]uint16) | |
- db.childrenSize += cachedNodeChildrenSize | |
- } else if _, ok = db.dirties[parent].children[child]; ok && parent != (common.Hash{}) { | |
- return | |
- } | |
- node.parents++ | |
- db.dirties[parent].children[child]++ | |
- if db.dirties[parent].children[child] == 1 { | |
- db.childrenSize += common.HashLength + 2 // uint16 counter | |
- } | |
-} | |
- | |
-// Dereference removes an existing reference from a root node. | |
-func (db *Database) Dereference(root common.Hash) { | |
- // Sanity check to ensure that the meta-root is not removed | |
- if root == (common.Hash{}) { | |
- log.Error("Attempted to dereference the trie cache meta root") | |
- return | |
- } | |
- db.lock.Lock() | |
- defer db.lock.Unlock() | |
- | |
- nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() | |
- db.dereference(root, common.Hash{}) | |
- | |
- db.gcnodes += uint64(nodes - len(db.dirties)) | |
- db.gcsize += storage - db.dirtiesSize | |
- db.gctime += time.Since(start) | |
- | |
- memcacheGCTimeTimer.Update(time.Since(start)) | |
- memcacheGCSizeMeter.Mark(int64(storage - db.dirtiesSize)) | |
- memcacheGCNodesMeter.Mark(int64(nodes - len(db.dirties))) | |
- | |
- log.Debug("Dereferenced trie from memory database", "nodes", nodes-len(db.dirties), "size", storage-db.dirtiesSize, "time", time.Since(start), | |
- "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) | |
-} | |
- | |
-// dereference is the private locked version of Dereference. | |
-func (db *Database) dereference(child common.Hash, parent common.Hash) { | |
- // Dereference the parent-child | |
- node := db.dirties[parent] | |
- | |
- if node.children != nil && node.children[child] > 0 { | |
- node.children[child]-- | |
- if node.children[child] == 0 { | |
- delete(node.children, child) | |
- db.childrenSize -= (common.HashLength + 2) // uint16 counter | |
- } | |
- } | |
- // If the child does not exist, it's a previously committed node. | |
- node, ok := db.dirties[child] | |
- if !ok { | |
- return | |
- } | |
- // If there are no more references to the child, delete it and cascade | |
- if node.parents > 0 { | |
- // This is a special cornercase where a node loaded from disk (i.e. not in the | |
- // memcache any more) gets reinjected as a new node (short node split into full, | |
- // then reverted into short), causing a cached node to have no parents. That is | |
- // no problem in itself, but don't make maxint parents out of it. | |
- node.parents-- | |
- } | |
- if node.parents == 0 { | |
- // Remove the node from the flush-list | |
- switch child { | |
- case db.oldest: | |
- db.oldest = node.flushNext | |
- db.dirties[node.flushNext].flushPrev = common.Hash{} | |
- case db.newest: | |
- db.newest = node.flushPrev | |
- db.dirties[node.flushPrev].flushNext = common.Hash{} | |
- default: | |
- db.dirties[node.flushPrev].flushNext = node.flushNext | |
- db.dirties[node.flushNext].flushPrev = node.flushPrev | |
- } | |
- // Dereference all children and delete the node | |
- node.forChilds(func(hash common.Hash) { | |
- db.dereference(hash, child) | |
- }) | |
- delete(db.dirties, child) | |
- db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) | |
- if node.children != nil { | |
- db.childrenSize -= cachedNodeChildrenSize | |
- } | |
- } | |
-} | |
- | |
-// Cap iteratively flushes old but still referenced trie nodes until the total | |
-// memory usage goes below the given threshold. | |
-// | |
-// Note, this method is a non-synchronized mutator. It is unsafe to call this | |
-// concurrently with other mutators. | |
-func (db *Database) Cap(limit common.StorageSize) error { | |
- // Create a database batch to flush persistent data out. It is important that | |
- // outside code doesn't see an inconsistent state (referenced data removed from | |
- // memory cache during commit but not yet in persistent storage). This is ensured | |
- // by only uncaching existing data when the database write finalizes. | |
- nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() | |
- batch := db.diskdb.NewBatch() | |
- | |
- // db.dirtiesSize only contains the useful data in the cache, but when reporting | |
- // the total memory consumption, the maintenance metadata is also needed to be | |
- // counted. | |
- size := db.dirtiesSize + common.StorageSize((len(db.dirties)-1)*cachedNodeSize) | |
- size += db.childrenSize - common.StorageSize(len(db.dirties[common.Hash{}].children)*(common.HashLength+2)) | |
- | |
- // If the preimage cache got large enough, push to disk. If it's still small | |
- // leave for later to deduplicate writes. | |
- flushPreimages := db.preimagesSize > 4*1024*1024 | |
- if flushPreimages { | |
- if db.preimages == nil { | |
- log.Error("Attempted to write preimages whilst disabled") | |
- } else { | |
- rawdb.WritePreimages(batch, db.preimages) | |
- if batch.ValueSize() > ethdb.IdealBatchSize { | |
- if err := batch.Write(); err != nil { | |
- return err | |
+ if node, ok := node.(*shortNode); ok { | |
+ for i := len(node.Key) - 1; i > 0; i-- { | |
+ n := shortNode{ | |
+ Key: hexToCompact(node.Key[i:]), | |
+ Val: node.Val, | |
} | |
- batch.Reset() | |
+ buf := new(bytes.Buffer) | |
+ if err := rlp.Encode(buf, n); err != nil { | |
+ panic("encode error: " + err.Error()) | |
+ } | |
+ preimage := buf.Bytes() | |
+ if len(preimage) < 32 { | |
+ continue | |
+ } | |
+ newPreimages[crypto.Keccak256Hash(preimage)] = preimage | |
} | |
} | |
} | |
- // Keep committing nodes from the flush-list until we're below allowance | |
- oldest := db.oldest | |
- for size > limit && oldest != (common.Hash{}) { | |
- // Fetch the oldest referenced node and push into the batch | |
- node := db.dirties[oldest] | |
- rawdb.WriteTrieNode(batch, oldest, node.rlp()) | |
- // If we exceeded the ideal batch size, commit and reset | |
- if batch.ValueSize() >= ethdb.IdealBatchSize { | |
- if err := batch.Write(); err != nil { | |
- log.Error("Failed to write flush list to disk", "err", err) | |
- return err | |
- } | |
- batch.Reset() | |
- } | |
- // Iterate to the next flush item, or abort if the size cap was achieved. Size | |
- // is the total size, including the useful cached data (hash -> blob), the | |
- // cache item metadata, as well as external children mappings. | |
- size -= common.StorageSize(common.HashLength + int(node.size) + cachedNodeSize) | |
- if node.children != nil { | |
- size -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) | |
- } | |
- oldest = node.flushNext | |
- } | |
- // Flush out any remainder data from the last batch | |
- if err := batch.Write(); err != nil { | |
- log.Error("Failed to write flush list to disk", "err", err) | |
- return err | |
- } | |
- // Write successful, clear out the flushed data | |
- db.lock.Lock() | |
- defer db.lock.Unlock() | |
- | |
- if flushPreimages { | |
- if db.preimages == nil { | |
- log.Error("Attempted to reset preimage cache whilst disabled") | |
- } else { | |
- db.preimages, db.preimagesSize = make(map[common.Hash][]byte), 0 | |
- } | |
- } | |
- for db.oldest != oldest { | |
- node := db.dirties[db.oldest] | |
- delete(db.dirties, db.oldest) | |
- db.oldest = node.flushNext | |
- | |
- db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) | |
- if node.children != nil { | |
- db.childrenSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) | |
- } | |
- } | |
- if db.oldest != (common.Hash{}) { | |
- db.dirties[db.oldest].flushPrev = common.Hash{} | |
- } | |
- db.flushnodes += uint64(nodes - len(db.dirties)) | |
- db.flushsize += storage - db.dirtiesSize | |
- db.flushtime += time.Since(start) | |
- | |
- memcacheFlushTimeTimer.Update(time.Since(start)) | |
- memcacheFlushSizeMeter.Mark(int64(storage - db.dirtiesSize)) | |
- memcacheFlushNodesMeter.Mark(int64(nodes - len(db.dirties))) | |
- | |
- log.Debug("Persisted nodes from memory database", "nodes", nodes-len(db.dirties), "size", storage-db.dirtiesSize, "time", time.Since(start), | |
- "flushnodes", db.flushnodes, "flushsize", db.flushsize, "flushtime", db.flushtime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) | |
- | |
- return nil | |
-} | |
- | |
-// Commit iterates over all the children of a particular node, writes them out | |
-// to disk, forcefully tearing down all references in both directions. As a side | |
-// effect, all pre-images accumulated up to this point are also written. | |
-// | |
-// Note, this method is a non-synchronized mutator. It is unsafe to call this | |
-// concurrently with other mutators. | |
-func (db *Database) Commit(node common.Hash, report bool, callback func(common.Hash)) error { | |
- // Create a database batch to flush persistent data out. It is important that | |
- // outside code doesn't see an inconsistent state (referenced data removed from | |
- // memory cache during commit but not yet in persistent storage). This is ensured | |
- // by only uncaching existing data when the database write finalizes. | |
- start := time.Now() | |
- batch := db.diskdb.NewBatch() | |
- | |
- // Move all of the accumulated preimages into a write batch | |
- if db.preimages != nil { | |
- rawdb.WritePreimages(batch, db.preimages) | |
- // Since we're going to replay trie node writes into the clean cache, flush out | |
- // any batched pre-images before continuing. | |
- if err := batch.Write(); err != nil { | |
- return err | |
- } | |
- batch.Reset() | |
- } | |
- // Move the trie itself into the batch, flushing if enough data is accumulated | |
- nodes, storage := len(db.dirties), db.dirtiesSize | |
- | |
- uncacher := &cleaner{db} | |
- if err := db.commit(node, batch, uncacher, callback); err != nil { | |
- log.Error("Failed to commit trie from trie database", "err", err) | |
- return err | |
- } | |
- // Trie mostly committed to disk, flush any batch leftovers | |
- if err := batch.Write(); err != nil { | |
- log.Error("Failed to write trie to disk", "err", err) | |
- return err | |
- } | |
- // Uncache any leftovers in the last batch | |
- db.lock.Lock() | |
- defer db.lock.Unlock() | |
- | |
- batch.Replay(uncacher) | |
- batch.Reset() | |
- | |
- // Reset the storage counters and bumped metrics | |
- if db.preimages != nil { | |
- db.preimages, db.preimagesSize = make(map[common.Hash][]byte), 0 | |
- } | |
- memcacheCommitTimeTimer.Update(time.Since(start)) | |
- memcacheCommitSizeMeter.Mark(int64(storage - db.dirtiesSize)) | |
- memcacheCommitNodesMeter.Mark(int64(nodes - len(db.dirties))) | |
- | |
- logger := log.Info | |
- if !report { | |
- logger = log.Debug | |
- } | |
- logger("Persisted trie from memory database", "nodes", nodes-len(db.dirties)+int(db.flushnodes), "size", storage-db.dirtiesSize+db.flushsize, "time", time.Since(start)+db.flushtime, | |
- "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) | |
- | |
- // Reset the garbage collection statistics | |
- db.gcnodes, db.gcsize, db.gctime = 0, 0, 0 | |
- db.flushnodes, db.flushsize, db.flushtime = 0, 0, 0 | |
- | |
- return nil | |
-} | |
- | |
-// commit is the private locked version of Commit. | |
-func (db *Database) commit(hash common.Hash, batch ethdb.Batch, uncacher *cleaner, callback func(common.Hash)) error { | |
- // If the node does not exist, it's a previously committed node | |
- node, ok := db.dirties[hash] | |
- if !ok { | |
- return nil | |
- } | |
- var err error | |
- node.forChilds(func(child common.Hash) { | |
- if err == nil { | |
- err = db.commit(child, batch, uncacher, callback) | |
- } | |
- }) | |
- if err != nil { | |
- return err | |
- } | |
- // If we've reached an optimal batch size, commit and start over | |
- rawdb.WriteTrieNode(batch, hash, node.rlp()) | |
- if callback != nil { | |
- callback(hash) | |
- } | |
- if batch.ValueSize() >= ethdb.IdealBatchSize { | |
- if err := batch.Write(); err != nil { | |
- return err | |
- } | |
- db.lock.Lock() | |
- batch.Replay(uncacher) | |
- batch.Reset() | |
- db.lock.Unlock() | |
- } | |
- return nil | |
-} | |
- | |
-// cleaner is a database batch replayer that takes a batch of write operations | |
-// and cleans up the trie database from anything written to disk. | |
-type cleaner struct { | |
- db *Database | |
-} | |
- | |
-// Put reacts to database writes and implements dirty data uncaching. This is the | |
-// post-processing step of a commit operation where the already persisted trie is | |
-// removed from the dirty cache and moved into the clean cache. The reason behind | |
-// the two-phase commit is to ensure ensure data availability while moving from | |
-// memory to disk. | |
-func (c *cleaner) Put(key []byte, rlp []byte) error { | |
- hash := common.BytesToHash(key) | |
- | |
- // If the node does not exist, we're done on this path | |
- node, ok := c.db.dirties[hash] | |
- if !ok { | |
- return nil | |
- } | |
- // Node still exists, remove it from the flush-list | |
- switch hash { | |
- case c.db.oldest: | |
- c.db.oldest = node.flushNext | |
- c.db.dirties[node.flushNext].flushPrev = common.Hash{} | |
- case c.db.newest: | |
- c.db.newest = node.flushPrev | |
- c.db.dirties[node.flushPrev].flushNext = common.Hash{} | |
- default: | |
- c.db.dirties[node.flushPrev].flushNext = node.flushNext | |
- c.db.dirties[node.flushNext].flushPrev = node.flushPrev | |
- } | |
- // Remove the node from the dirty cache | |
- delete(c.db.dirties, hash) | |
- c.db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) | |
- if node.children != nil { | |
- c.db.dirtiesSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) | |
- } | |
- // Move the flushed node into the clean cache to prevent insta-reloads | |
- if c.db.cleans != nil { | |
- c.db.cleans.Set(hash[:], rlp) | |
- memcacheCleanWriteMeter.Mark(int64(len(rlp))) | |
- } | |
- return nil | |
-} | |
- | |
-func (c *cleaner) Delete(key []byte) error { | |
- panic("not implemented") | |
-} | |
- | |
-// Size returns the current storage size of the memory cache in front of the | |
-// persistent database layer. | |
-func (db *Database) Size() (common.StorageSize, common.StorageSize) { | |
- db.lock.RLock() | |
- defer db.lock.RUnlock() | |
- | |
- // db.dirtiesSize only contains the useful data in the cache, but when reporting | |
- // the total memory consumption, the maintenance metadata is also needed to be | |
- // counted. | |
- var metadataSize = common.StorageSize((len(db.dirties) - 1) * cachedNodeSize) | |
- var metarootRefs = common.StorageSize(len(db.dirties[common.Hash{}].children) * (common.HashLength + 2)) | |
- return db.dirtiesSize + db.childrenSize + metadataSize - metarootRefs, db.preimagesSize | |
-} | |
- | |
-// saveCache saves clean state cache to given directory path | |
-// using specified CPU cores. | |
-func (db *Database) saveCache(dir string, threads int) error { | |
- if db.cleans == nil { | |
- return nil | |
- } | |
- log.Info("Writing clean trie cache to disk", "path", dir, "threads", threads) | |
- | |
- start := time.Now() | |
- err := db.cleans.SaveToFileConcurrent(dir, threads) | |
- if err != nil { | |
- log.Error("Failed to persist clean trie cache", "error", err) | |
- return err | |
- } | |
- log.Info("Persisted the clean trie cache", "path", dir, "elapsed", common.PrettyDuration(time.Since(start))) | |
- return nil | |
-} | |
- | |
-// SaveCache atomically saves fast cache data to the given dir using all | |
-// available CPU cores. | |
-func (db *Database) SaveCache(dir string) error { | |
- return db.saveCache(dir, runtime.GOMAXPROCS(0)) | |
-} | |
- | |
-// SaveCachePeriodically atomically saves fast cache data to the given dir with | |
-// the specified interval. All dump operation will only use a single CPU core. | |
-func (db *Database) SaveCachePeriodically(dir string, interval time.Duration, stopCh <-chan struct{}) { | |
- ticker := time.NewTicker(interval) | |
- defer ticker.Stop() | |
- | |
- for { | |
- select { | |
- case <-ticker.C: | |
- db.saveCache(dir, 1) | |
- case <-stopCh: | |
- return | |
- } | |
+ for hash, val := range newPreimages { | |
+ preimages[hash] = val | |
} | |
} | |
diff --git a/minigeth3/trie/secure_trie.go b/minigeth/trie/secure_trie.go | |
index e38471c..3453a00 100644 | |
--- a/minigeth3/trie/secure_trie.go | |
+++ b/minigeth/trie/secure_trie.go | |
@@ -132,12 +132,12 @@ func (t *SecureTrie) TryDelete(key []byte) error { | |
// GetKey returns the sha3 preimage of a hashed key that was | |
// previously used to store a value. | |
-func (t *SecureTrie) GetKey(shaKey []byte) []byte { | |
+/*func (t *SecureTrie) GetKey(shaKey []byte) []byte { | |
if key, ok := t.getSecKeyCache()[string(shaKey)]; ok { | |
return key | |
} | |
return t.trie.db.preimage(common.BytesToHash(shaKey)) | |
-} | |
+}*/ | |
// Commit writes all nodes and the secure hash pre-images to the trie's database. | |
// Nodes are stored with their sha3 hash as the key. | |
@@ -146,7 +146,7 @@ func (t *SecureTrie) GetKey(shaKey []byte) []byte { | |
// from the database. | |
func (t *SecureTrie) Commit(onleaf LeafCallback) (root common.Hash, err error) { | |
// Write all the pre-images to the actual disk database | |
- if len(t.getSecKeyCache()) > 0 { | |
+ /*if len(t.getSecKeyCache()) > 0 { | |
if t.trie.db.preimages != nil { // Ugly direct check but avoids the below write lock | |
t.trie.db.lock.Lock() | |
for hk, key := range t.secKeyCache { | |
@@ -155,7 +155,7 @@ func (t *SecureTrie) Commit(onleaf LeafCallback) (root common.Hash, err error) { | |
t.trie.db.lock.Unlock() | |
} | |
t.secKeyCache = make(map[string][]byte) | |
- } | |
+ }*/ | |
// Commit the trie to its intermediate node database | |
return t.trie.Commit(onleaf) | |
} | |
diff --git a/minigeth3/trie/stacktrie.go b/minigeth/trie/stacktrie.go | |
index f9ff10b..7bb1e31 100644 | |
--- a/minigeth3/trie/stacktrie.go | |
+++ b/minigeth/trie/stacktrie.go | |
@@ -204,7 +204,7 @@ func (st *StackTrie) Update(key, value []byte) { | |
} | |
func (st *StackTrie) Reset() { | |
- st.db = nil | |
+ //st.db = nil | |
st.key = st.key[:0] | |
st.val = nil | |
for i := range st.children { | |
diff --git a/minigeth3/trie/trie.go b/minigeth/trie/trie.go | |
index e492a53..ba5d396 100644 | |
--- a/minigeth3/trie/trie.go | |
+++ b/minigeth/trie/trie.go | |
@@ -435,16 +435,18 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) { | |
} | |
if pos >= 0 { | |
if pos != 16 { | |
+ //fmt.Println("delete fails here", pos, n.Children, prefix, n.Children[pos]) | |
// If the remaining entry is a short node, it replaces | |
// n and its key gets the missing nibble tacked to the | |
// front. This avoids creating an invalid | |
// shortNode{..., shortNode{...}}. Since the entry | |
// might not be loaded yet, resolve it just for this | |
// check. | |
- cnode, err := t.resolve(n.Children[pos], prefix) | |
- if err != nil { | |
- return false, nil, err | |
- } | |
+ | |
+ // When node is not resolved in next block's absence proof, | |
+ // it must be an extension node if the state transition is | |
+ // valid, so we ignore the error here. | |
+ cnode, _ := t.resolve(n.Children[pos], prefix) | |
if cnode, ok := cnode.(*shortNode); ok { | |
k := append([]byte{byte(pos)}, cnode.Key...) | |
return true, &shortNode{k, cnode.Val, t.newFlag()}, nil | |
@@ -464,6 +466,7 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) { | |
return false, nil, nil | |
case hashNode: | |
+ fmt.Println("delete hashNode", prefix, key) | |
// We've hit a part of the trie that isn't loaded yet. Load | |
// the node and delete from it. This leaves all child nodes on | |
// the path to the value in the trie. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment