|
|
|
// Copyright 2014 The go-ethereum Authors
|
|
|
|
// This file is part of go-ethereum.
|
|
|
|
//
|
|
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// go-ethereum 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 General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
// geth is the official command-line client for Ethereum.
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"sort"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/accounts"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
|
|
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/console/prompt"
|
|
|
|
"github.com/ethereum/go-ethereum/eth"
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
"github.com/ethereum/go-ethereum/eth/downloader"
|
|
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
|
|
"github.com/ethereum/go-ethereum/internal/debug"
|
|
|
|
"github.com/ethereum/go-ethereum/internal/ethapi"
|
|
|
|
"github.com/ethereum/go-ethereum/internal/flags"
|
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
|
"github.com/ethereum/go-ethereum/metrics"
|
|
|
|
"github.com/ethereum/go-ethereum/node"
|
|
|
|
|
|
|
|
// Force-load the tracer engines to trigger registration
|
|
|
|
_ "github.com/ethereum/go-ethereum/eth/tracers/js"
|
|
|
|
_ "github.com/ethereum/go-ethereum/eth/tracers/native"
|
|
|
|
|
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
clientIdentifier = "geth" // Client identifier to advertise over the network
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// Git SHA1 commit hash of the release (set via linker flags)
|
|
|
|
gitCommit = ""
|
|
|
|
gitDate = ""
|
|
|
|
// The app that holds all commands and flags.
|
|
|
|
app = flags.NewApp(gitCommit, gitDate, "the go-ethereum command line interface")
|
|
|
|
// flags that configure the node
|
|
|
|
nodeFlags = flags.Merge([]cli.Flag{
|
|
|
|
utils.IdentityFlag,
|
|
|
|
utils.UnlockedAccountFlag,
|
|
|
|
utils.PasswordFileFlag,
|
|
|
|
utils.BootnodesFlag,
|
|
|
|
utils.MinFreeDiskSpaceFlag,
|
|
|
|
utils.KeyStoreDirFlag,
|
accounts, eth, clique, signer: support for external signer API (#18079)
* accounts, eth, clique: implement external backend + move sighash calc to backend
* signer: implement account_Version on external API
* accounts/external: enable ipc, add copyright
* accounts, internal, signer: formatting
* node: go fmt
* flags: disallow --dev in combo with --externalsigner
* accounts: remove clique-specific signing method, replace with more generic
* accounts, consensus: formatting + fix error in tests
* signer/core: remove (test-) import cycle
* clique: remove unused import
* accounts: remove CliqueHash and avoid dependency on package crypto
* consensus/clique: unduplicate header encoding
6 years ago
|
|
|
utils.ExternalSignerFlag,
|
|
|
|
utils.NoUSBFlag,
|
|
|
|
utils.USBFlag,
|
|
|
|
utils.SmartCardDaemonPathFlag,
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
3 years ago
|
|
|
utils.OverrideTerminalTotalDifficulty,
|
|
|
|
utils.OverrideTerminalTotalDifficultyPassed,
|
|
|
|
utils.EthashCacheDirFlag,
|
|
|
|
utils.EthashCachesInMemoryFlag,
|
|
|
|
utils.EthashCachesOnDiskFlag,
|
|
|
|
utils.EthashCachesLockMmapFlag,
|
|
|
|
utils.EthashDatasetDirFlag,
|
|
|
|
utils.EthashDatasetsInMemoryFlag,
|
|
|
|
utils.EthashDatasetsOnDiskFlag,
|
|
|
|
utils.EthashDatasetsLockMmapFlag,
|
|
|
|
utils.TxPoolLocalsFlag,
|
|
|
|
utils.TxPoolNoLocalsFlag,
|
|
|
|
utils.TxPoolJournalFlag,
|
|
|
|
utils.TxPoolRejournalFlag,
|
|
|
|
utils.TxPoolPriceLimitFlag,
|
|
|
|
utils.TxPoolPriceBumpFlag,
|
|
|
|
utils.TxPoolAccountSlotsFlag,
|
|
|
|
utils.TxPoolGlobalSlotsFlag,
|
|
|
|
utils.TxPoolAccountQueueFlag,
|
|
|
|
utils.TxPoolGlobalQueueFlag,
|
|
|
|
utils.TxPoolLifetimeFlag,
|
|
|
|
utils.SyncModeFlag,
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
utils.ExitWhenSyncedFlag,
|
|
|
|
utils.GCModeFlag,
|
|
|
|
utils.SnapshotFlag,
|
|
|
|
utils.TxLookupLimitFlag,
|
|
|
|
utils.LightServeFlag,
|
|
|
|
utils.LightIngressFlag,
|
|
|
|
utils.LightEgressFlag,
|
|
|
|
utils.LightMaxPeersFlag,
|
|
|
|
utils.LightNoPruneFlag,
|
|
|
|
utils.LightKDFFlag,
|
|
|
|
utils.UltraLightServersFlag,
|
|
|
|
utils.UltraLightFractionFlag,
|
|
|
|
utils.UltraLightOnlyAnnounceFlag,
|
|
|
|
utils.LightNoSyncServeFlag,
|
|
|
|
utils.EthRequiredBlocksFlag,
|
|
|
|
utils.LegacyWhitelistFlag,
|
all: bloom-filter based pruning mechanism (#21724)
* cmd, core, tests: initial state pruner
core: fix db inspector
cmd/geth: add verify-state
cmd/geth: add verification tool
core/rawdb: implement flatdb
cmd, core: fix rebase
core/state: use new contract code layout
core/state/pruner: avoid deleting genesis state
cmd/geth: add helper function
core, cmd: fix extract genesis
core: minor fixes
contracts: remove useless
core/state/snapshot: plugin stacktrie
core: polish
core/state/snapshot: iterate storage concurrently
core/state/snapshot: fix iteration
core: add comments
core/state/snapshot: polish code
core/state: polish
core/state/snapshot: rebase
core/rawdb: add comments
core/rawdb: fix tests
core/rawdb: improve tests
core/state/snapshot: fix concurrent iteration
core/state: run pruning during the recovery
core, trie: implement martin's idea
core, eth: delete flatdb and polish pruner
trie: fix import
core/state/pruner: add log
core/state/pruner: fix issues
core/state/pruner: don't read back
core/state/pruner: fix contract code write
core/state/pruner: check root node presence
cmd, core: polish log
core/state: use HEAD-127 as the target
core/state/snapshot: improve tests
cmd/geth: fix verification tool
cmd/geth: use HEAD as the verification default target
all: replace the bloomfilter with martin's fork
cmd, core: polish code
core, cmd: forcibly delete state root
core/state/pruner: add hash64
core/state/pruner: fix blacklist
core/state: remove blacklist
cmd, core: delete trie clean cache before pruning
cmd, core: fix lint
cmd, core: fix rebase
core/state: fix the special case for clique networks
core/state/snapshot: remove useless code
core/state/pruner: capping the snapshot after pruning
cmd, core, eth: fixes
core/rawdb: update db inspector
cmd/geth: polish code
core/state/pruner: fsync bloom filter
cmd, core: print warning log
core/state/pruner: adjust the parameters for bloom filter
cmd, core: create the bloom filter by size
core: polish
core/state/pruner: sanitize invalid bloomfilter size
cmd: address comments
cmd/geth: address comments
cmd/geth: address comment
core/state/pruner: address comments
core/state/pruner: rename homedir to datadir
cmd, core: address comments
core/state/pruner: address comment
core/state: address comments
core, cmd, tests: address comments
core: address comments
core/state/pruner: release the iterator after each commit
core/state/pruner: improve pruner
cmd, core: adjust bloom paramters
core/state/pruner: fix lint
core/state/pruner: fix tests
core: fix rebase
core/state/pruner: remove atomic rename
core/state/pruner: address comments
all: run go mod tidy
core/state/pruner: avoid false-positive for the middle state roots
core/state/pruner: add checks for middle roots
cmd/geth: replace crit with error
* core/state/pruner: fix lint
* core: drop legacy bloom filter
* core/state/snapshot: improve pruner
* core/state/snapshot: polish concurrent logs to report ETA vs. hashes
* core/state/pruner: add progress report for pruning and compaction too
* core: fix snapshot test API
* core/state: fix some pruning logs
* core/state/pruner: support recovering from bloom flush fail
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
4 years ago
|
|
|
utils.BloomFilterSizeFlag,
|
|
|
|
utils.CacheFlag,
|
|
|
|
utils.CacheDatabaseFlag,
|
|
|
|
utils.CacheTrieFlag,
|
|
|
|
utils.CacheTrieJournalFlag,
|
|
|
|
utils.CacheTrieRejournalFlag,
|
|
|
|
utils.CacheGCFlag,
|
|
|
|
utils.CacheSnapshotFlag,
|
|
|
|
utils.CacheNoPrefetchFlag,
|
|
|
|
utils.CachePreimagesFlag,
|
|
|
|
utils.CacheLogSizeFlag,
|
|
|
|
utils.FDLimitFlag,
|
|
|
|
utils.ListenPortFlag,
|
|
|
|
utils.DiscoveryPortFlag,
|
|
|
|
utils.MaxPeersFlag,
|
|
|
|
utils.MaxPendingPeersFlag,
|
|
|
|
utils.MiningEnabledFlag,
|
|
|
|
utils.MinerThreadsFlag,
|
|
|
|
utils.MinerNotifyFlag,
|
|
|
|
utils.LegacyMinerGasTargetFlag,
|
|
|
|
utils.MinerGasLimitFlag,
|
|
|
|
utils.MinerGasPriceFlag,
|
|
|
|
utils.MinerEtherbaseFlag,
|
|
|
|
utils.MinerExtraDataFlag,
|
|
|
|
utils.MinerRecommitIntervalFlag,
|
|
|
|
utils.MinerNoVerifyFlag,
|
|
|
|
utils.NATFlag,
|
|
|
|
utils.NoDiscoverFlag,
|
|
|
|
utils.DiscoveryV5Flag,
|
|
|
|
utils.NetrestrictFlag,
|
|
|
|
utils.NodeKeyFileFlag,
|
|
|
|
utils.NodeKeyHexFlag,
|
|
|
|
utils.DNSDiscoveryFlag,
|
|
|
|
utils.DeveloperFlag,
|
|
|
|
utils.DeveloperPeriodFlag,
|
|
|
|
utils.DeveloperGasLimitFlag,
|
|
|
|
utils.VMEnableDebugFlag,
|
|
|
|
utils.NetworkIdFlag,
|
|
|
|
utils.EthStatsURLFlag,
|
|
|
|
utils.FakePoWFlag,
|
|
|
|
utils.NoCompactionFlag,
|
|
|
|
utils.GpoBlocksFlag,
|
|
|
|
utils.GpoPercentileFlag,
|
|
|
|
utils.GpoMaxGasPriceFlag,
|
|
|
|
utils.GpoIgnoreGasPriceFlag,
|
|
|
|
utils.MinerNotifyFullFlag,
|
|
|
|
utils.IgnoreLegacyReceiptsFlag,
|
|
|
|
configFileFlag,
|
|
|
|
}, utils.NetworkFlags, utils.DatabasePathFlags)
|
|
|
|
|
|
|
|
rpcFlags = []cli.Flag{
|
|
|
|
utils.HTTPEnabledFlag,
|
|
|
|
utils.HTTPListenAddrFlag,
|
|
|
|
utils.HTTPPortFlag,
|
|
|
|
utils.HTTPCORSDomainFlag,
|
|
|
|
utils.AuthListenFlag,
|
|
|
|
utils.AuthPortFlag,
|
|
|
|
utils.AuthVirtualHostsFlag,
|
|
|
|
utils.JWTSecretFlag,
|
|
|
|
utils.HTTPVirtualHostsFlag,
|
|
|
|
utils.GraphQLEnabledFlag,
|
|
|
|
utils.GraphQLCORSDomainFlag,
|
|
|
|
utils.GraphQLVirtualHostsFlag,
|
|
|
|
utils.HTTPApiFlag,
|
|
|
|
utils.HTTPPathPrefixFlag,
|
|
|
|
utils.WSEnabledFlag,
|
|
|
|
utils.WSListenAddrFlag,
|
|
|
|
utils.WSPortFlag,
|
|
|
|
utils.WSApiFlag,
|
|
|
|
utils.WSAllowedOriginsFlag,
|
|
|
|
utils.WSPathPrefixFlag,
|
|
|
|
utils.IPCDisabledFlag,
|
|
|
|
utils.IPCPathFlag,
|
|
|
|
utils.InsecureUnlockAllowedFlag,
|
|
|
|
utils.RPCGlobalGasCapFlag,
|
|
|
|
utils.RPCGlobalEVMTimeoutFlag,
|
|
|
|
utils.RPCGlobalTxFeeCapFlag,
|
|
|
|
utils.AllowUnprotectedTxs,
|
|
|
|
}
|
|
|
|
|
|
|
|
metricsFlags = []cli.Flag{
|
|
|
|
utils.MetricsEnabledFlag,
|
|
|
|
utils.MetricsEnabledExpensiveFlag,
|
|
|
|
utils.MetricsHTTPFlag,
|
|
|
|
utils.MetricsPortFlag,
|
|
|
|
utils.MetricsEnableInfluxDBFlag,
|
|
|
|
utils.MetricsInfluxDBEndpointFlag,
|
|
|
|
utils.MetricsInfluxDBDatabaseFlag,
|
|
|
|
utils.MetricsInfluxDBUsernameFlag,
|
|
|
|
utils.MetricsInfluxDBPasswordFlag,
|
|
|
|
utils.MetricsInfluxDBTagsFlag,
|
|
|
|
utils.MetricsEnableInfluxDBV2Flag,
|
|
|
|
utils.MetricsInfluxDBTokenFlag,
|
|
|
|
utils.MetricsInfluxDBBucketFlag,
|
|
|
|
utils.MetricsInfluxDBOrganizationFlag,
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
// Initialize the CLI app and start Geth
|
|
|
|
app.Action = geth
|
|
|
|
app.HideVersion = true // we have a command to print the version
|
|
|
|
app.Copyright = "Copyright 2013-2022 The go-ethereum Authors"
|
|
|
|
app.Commands = []*cli.Command{
|
|
|
|
// See chaincmd.go:
|
|
|
|
initCommand,
|
|
|
|
importCommand,
|
|
|
|
exportCommand,
|
|
|
|
importPreimagesCommand,
|
|
|
|
exportPreimagesCommand,
|
|
|
|
removedbCommand,
|
|
|
|
dumpCommand,
|
|
|
|
dumpGenesisCommand,
|
|
|
|
// See accountcmd.go:
|
|
|
|
accountCommand,
|
|
|
|
walletCommand,
|
|
|
|
// See consolecmd.go:
|
|
|
|
consoleCommand,
|
|
|
|
attachCommand,
|
|
|
|
javascriptCommand,
|
|
|
|
// See misccmd.go:
|
|
|
|
makecacheCommand,
|
|
|
|
makedagCommand,
|
|
|
|
versionCommand,
|
|
|
|
versionCheckCommand,
|
|
|
|
licenseCommand,
|
|
|
|
// See config.go
|
|
|
|
dumpConfigCommand,
|
|
|
|
// see dbcmd.go
|
|
|
|
dbCommand,
|
|
|
|
// See cmd/utils/flags_legacy.go
|
|
|
|
utils.ShowDeprecated,
|
all: bloom-filter based pruning mechanism (#21724)
* cmd, core, tests: initial state pruner
core: fix db inspector
cmd/geth: add verify-state
cmd/geth: add verification tool
core/rawdb: implement flatdb
cmd, core: fix rebase
core/state: use new contract code layout
core/state/pruner: avoid deleting genesis state
cmd/geth: add helper function
core, cmd: fix extract genesis
core: minor fixes
contracts: remove useless
core/state/snapshot: plugin stacktrie
core: polish
core/state/snapshot: iterate storage concurrently
core/state/snapshot: fix iteration
core: add comments
core/state/snapshot: polish code
core/state: polish
core/state/snapshot: rebase
core/rawdb: add comments
core/rawdb: fix tests
core/rawdb: improve tests
core/state/snapshot: fix concurrent iteration
core/state: run pruning during the recovery
core, trie: implement martin's idea
core, eth: delete flatdb and polish pruner
trie: fix import
core/state/pruner: add log
core/state/pruner: fix issues
core/state/pruner: don't read back
core/state/pruner: fix contract code write
core/state/pruner: check root node presence
cmd, core: polish log
core/state: use HEAD-127 as the target
core/state/snapshot: improve tests
cmd/geth: fix verification tool
cmd/geth: use HEAD as the verification default target
all: replace the bloomfilter with martin's fork
cmd, core: polish code
core, cmd: forcibly delete state root
core/state/pruner: add hash64
core/state/pruner: fix blacklist
core/state: remove blacklist
cmd, core: delete trie clean cache before pruning
cmd, core: fix lint
cmd, core: fix rebase
core/state: fix the special case for clique networks
core/state/snapshot: remove useless code
core/state/pruner: capping the snapshot after pruning
cmd, core, eth: fixes
core/rawdb: update db inspector
cmd/geth: polish code
core/state/pruner: fsync bloom filter
cmd, core: print warning log
core/state/pruner: adjust the parameters for bloom filter
cmd, core: create the bloom filter by size
core: polish
core/state/pruner: sanitize invalid bloomfilter size
cmd: address comments
cmd/geth: address comments
cmd/geth: address comment
core/state/pruner: address comments
core/state/pruner: rename homedir to datadir
cmd, core: address comments
core/state/pruner: address comment
core/state: address comments
core, cmd, tests: address comments
core: address comments
core/state/pruner: release the iterator after each commit
core/state/pruner: improve pruner
cmd, core: adjust bloom paramters
core/state/pruner: fix lint
core/state/pruner: fix tests
core: fix rebase
core/state/pruner: remove atomic rename
core/state/pruner: address comments
all: run go mod tidy
core/state/pruner: avoid false-positive for the middle state roots
core/state/pruner: add checks for middle roots
cmd/geth: replace crit with error
* core/state/pruner: fix lint
* core: drop legacy bloom filter
* core/state/snapshot: improve pruner
* core/state/snapshot: polish concurrent logs to report ETA vs. hashes
* core/state/pruner: add progress report for pruning and compaction too
* core: fix snapshot test API
* core/state: fix some pruning logs
* core/state/pruner: support recovering from bloom flush fail
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
4 years ago
|
|
|
// See snapshot.go
|
|
|
|
snapshotCommand,
|
|
|
|
}
|
|
|
|
sort.Sort(cli.CommandsByName(app.Commands))
|
|
|
|
|
|
|
|
app.Flags = flags.Merge(
|
|
|
|
nodeFlags,
|
|
|
|
rpcFlags,
|
|
|
|
consoleFlags,
|
|
|
|
debug.Flags,
|
|
|
|
metricsFlags,
|
|
|
|
)
|
|
|
|
|
|
|
|
app.Before = func(ctx *cli.Context) error {
|
|
|
|
flags.MigrateGlobalFlags(ctx)
|
|
|
|
return debug.Setup(ctx)
|
|
|
|
}
|
|
|
|
app.After = func(ctx *cli.Context) error {
|
|
|
|
debug.Exit()
|
|
|
|
prompt.Stdin.Close() // Resets terminal mode.
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
if err := app.Run(os.Args); err != nil {
|
|
|
|
fmt.Fprintln(os.Stderr, err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// prepare manipulates memory cache allowance and setups metric system.
|
|
|
|
// This function should be called before launching devp2p stack.
|
|
|
|
func prepare(ctx *cli.Context) {
|
|
|
|
// If we're running a known preset, log it for convenience.
|
|
|
|
switch {
|
|
|
|
case ctx.IsSet(utils.RopstenFlag.Name):
|
|
|
|
log.Info("Starting Geth on Ropsten testnet...")
|
|
|
|
|
|
|
|
case ctx.IsSet(utils.RinkebyFlag.Name):
|
|
|
|
log.Info("Starting Geth on Rinkeby testnet...")
|
|
|
|
|
|
|
|
case ctx.IsSet(utils.GoerliFlag.Name):
|
|
|
|
log.Info("Starting Geth on Görli testnet...")
|
|
|
|
|
|
|
|
case ctx.IsSet(utils.SepoliaFlag.Name):
|
|
|
|
log.Info("Starting Geth on Sepolia testnet...")
|
|
|
|
|
|
|
|
case ctx.IsSet(utils.KilnFlag.Name):
|
|
|
|
log.Info("Starting Geth on Kiln testnet...")
|
|
|
|
|
|
|
|
case ctx.IsSet(utils.DeveloperFlag.Name):
|
|
|
|
log.Info("Starting Geth in ephemeral dev mode...")
|
|
|
|
log.Warn(`You are running Geth in --dev mode. Please note the following:
|
|
|
|
|
|
|
|
1. This mode is only intended for fast, iterative development without assumptions on
|
|
|
|
security or persistence.
|
|
|
|
2. The database is created in memory unless specified otherwise. Therefore, shutting down
|
|
|
|
your computer or losing power will wipe your entire block data and chain state for
|
|
|
|
your dev environment.
|
|
|
|
3. A random, pre-allocated developer account will be available and unlocked as
|
|
|
|
eth.coinbase, which can be used for testing. The random dev account is temporary,
|
|
|
|
stored on a ramdisk, and will be lost if your machine is restarted.
|
|
|
|
4. Mining is enabled by default. However, the client will only seal blocks if transactions
|
|
|
|
are pending in the mempool. The miner's minimum accepted gas price is 1.
|
|
|
|
5. Networking is disabled; there is no listen-address, the maximum number of peers is set
|
|
|
|
to 0, and discovery is disabled.
|
|
|
|
`)
|
|
|
|
|
|
|
|
case !ctx.IsSet(utils.NetworkIdFlag.Name):
|
|
|
|
log.Info("Starting Geth on Ethereum mainnet...")
|
|
|
|
}
|
|
|
|
// If we're a full node on mainnet without --cache specified, bump default cache allowance
|
|
|
|
if ctx.String(utils.SyncModeFlag.Name) != "light" && !ctx.IsSet(utils.CacheFlag.Name) && !ctx.IsSet(utils.NetworkIdFlag.Name) {
|
|
|
|
// Make sure we're not on any supported preconfigured testnet either
|
|
|
|
if !ctx.IsSet(utils.RopstenFlag.Name) &&
|
|
|
|
!ctx.IsSet(utils.SepoliaFlag.Name) &&
|
|
|
|
!ctx.IsSet(utils.RinkebyFlag.Name) &&
|
|
|
|
!ctx.IsSet(utils.GoerliFlag.Name) &&
|
|
|
|
!ctx.IsSet(utils.KilnFlag.Name) &&
|
|
|
|
!ctx.IsSet(utils.DeveloperFlag.Name) {
|
|
|
|
// Nope, we're really on mainnet. Bump that cache up!
|
|
|
|
log.Info("Bumping default cache on mainnet", "provided", ctx.Int(utils.CacheFlag.Name), "updated", 4096)
|
|
|
|
ctx.Set(utils.CacheFlag.Name, strconv.Itoa(4096))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// If we're running a light client on any network, drop the cache to some meaningfully low amount
|
|
|
|
if ctx.String(utils.SyncModeFlag.Name) == "light" && !ctx.IsSet(utils.CacheFlag.Name) {
|
|
|
|
log.Info("Dropping default light client cache", "provided", ctx.Int(utils.CacheFlag.Name), "updated", 128)
|
|
|
|
ctx.Set(utils.CacheFlag.Name, strconv.Itoa(128))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start metrics export if enabled
|
|
|
|
utils.SetupMetrics(ctx)
|
|
|
|
|
|
|
|
// Start system runtime metrics collection
|
|
|
|
go metrics.CollectProcessMetrics(3 * time.Second)
|
|
|
|
}
|
|
|
|
|
|
|
|
// geth is the main entry point into the system if no special subcommand is ran.
|
|
|
|
// It creates a default node based on the command line arguments and runs it in
|
|
|
|
// blocking mode, waiting for it to be shut down.
|
|
|
|
func geth(ctx *cli.Context) error {
|
|
|
|
if args := ctx.Args().Slice(); len(args) > 0 {
|
|
|
|
return fmt.Errorf("invalid command: %q", args[0])
|
|
|
|
}
|
|
|
|
|
|
|
|
prepare(ctx)
|
|
|
|
stack, backend := makeFullNode(ctx)
|
|
|
|
defer stack.Close()
|
|
|
|
|
|
|
|
startNode(ctx, stack, backend, false)
|
|
|
|
stack.Wait()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// startNode boots up the system node and all registered protocols, after which
|
|
|
|
// it unlocks any requested accounts, and starts the RPC/IPC interfaces and the
|
|
|
|
// miner.
|
|
|
|
func startNode(ctx *cli.Context, stack *node.Node, backend ethapi.Backend, isConsole bool) {
|
|
|
|
debug.Memsize.Add("node", stack)
|
|
|
|
|
|
|
|
// Start up the node itself
|
|
|
|
utils.StartNode(ctx, stack, isConsole)
|
|
|
|
|
|
|
|
// Unlock any account specifically requested
|
|
|
|
unlockAccounts(ctx, stack)
|
|
|
|
|
|
|
|
// Register wallet event handlers to open and auto-derive wallets
|
|
|
|
events := make(chan accounts.WalletEvent, 16)
|
|
|
|
stack.AccountManager().Subscribe(events)
|
|
|
|
|
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
5 years ago
|
|
|
// Create a client to interact with local geth node.
|
|
|
|
rpcClient, err := stack.Attach()
|
|
|
|
if err != nil {
|
|
|
|
utils.Fatalf("Failed to attach to self: %v", err)
|
|
|
|
}
|
|
|
|
ethClient := ethclient.NewClient(rpcClient)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
// Open any wallets already attached
|
|
|
|
for _, wallet := range stack.AccountManager().Wallets() {
|
|
|
|
if err := wallet.Open(""); err != nil {
|
|
|
|
log.Warn("Failed to open wallet", "url", wallet.URL(), "err", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Listen for wallet event till termination
|
|
|
|
for event := range events {
|
|
|
|
switch event.Kind {
|
|
|
|
case accounts.WalletArrived:
|
|
|
|
if err := event.Wallet.Open(""); err != nil {
|
|
|
|
log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err)
|
|
|
|
}
|
|
|
|
case accounts.WalletOpened:
|
|
|
|
status, _ := event.Wallet.Status()
|
|
|
|
log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status)
|
|
|
|
|
|
|
|
var derivationPaths []accounts.DerivationPath
|
|
|
|
if event.Wallet.URL().Scheme == "ledger" {
|
|
|
|
derivationPaths = append(derivationPaths, accounts.LegacyLedgerBaseDerivationPath)
|
|
|
|
}
|
|
|
|
derivationPaths = append(derivationPaths, accounts.DefaultBaseDerivationPath)
|
|
|
|
|
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
5 years ago
|
|
|
event.Wallet.SelfDerive(derivationPaths, ethClient)
|
|
|
|
|
|
|
|
case accounts.WalletDropped:
|
|
|
|
log.Info("Old wallet dropped", "url", event.Wallet.URL())
|
|
|
|
event.Wallet.Close()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
|
|
|
|
// Spawn a standalone goroutine for status synchronization monitoring,
|
|
|
|
// close the node when synchronization is complete if user required.
|
|
|
|
if ctx.Bool(utils.ExitWhenSyncedFlag.Name) {
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
go func() {
|
|
|
|
sub := stack.EventMux().Subscribe(downloader.DoneEvent{})
|
|
|
|
defer sub.Unsubscribe()
|
|
|
|
for {
|
|
|
|
event := <-sub.Chan()
|
|
|
|
if event == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
done, ok := event.Data.(downloader.DoneEvent)
|
|
|
|
if !ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if timestamp := time.Unix(int64(done.Latest.Time), 0); time.Since(timestamp) < 10*time.Minute {
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
log.Info("Synchronisation completed", "latestnum", done.Latest.Number, "latesthash", done.Latest.Hash(),
|
|
|
|
"age", common.PrettyAge(timestamp))
|
|
|
|
stack.Close()
|
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input
* cmd, eth: 16400 Add an option to stop geth once in sync.
* cmd: 16400 Add an option to stop geth once in sync. WIP
* cmd/geth/main, les/fletcher: added in light mode support
* cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode
* cmd: 16400 Fixed formatting issue and cleaned code
* cmd, eth, les: 16400 Fixed formatting issues
* cmd, eth, les: Performed gofmt to update formatting
* cmd, eth, les: Fixed bugs resulting formatting
* cmd/geth, eth/, les: switched to downloader event
* eth: Fixed styling and gen_config
* eth/: Fix nil error in config file
* cmd/geth: Updated countdown log
* les/fetcher.go: Removed depcreated channel
* eth/downloader.go: Removed deprecated select
* cmd/geth, cmd/utils: Fixed minor issues
* eth: Reverted config files to proper format
* eth: Fixed typo in config file
* cmd/geth, eth/down: Updated code to use header time stamp
* eth/downloader: Changed the time threshold to 10 minutes
* cmd/geth, eth/downloader: Updated downloading event to pass latest header
* cmd/geth: Updated main to use right timer object
* cmd/geth: Removed unused failed event
* cmd/geth: added in correct time field with type assertion
* cmd/geth, cmd/utils: Updated flag to use boolean
* cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations
* cmd/geth: Removed unneeded import
* cmd/geth, eth/downloader: fixed event field and suggested changes
* cmd/geth, cmd/utils: Updated flag and linting issue
6 years ago
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start auxiliary services if enabled
|
|
|
|
if ctx.Bool(utils.MiningEnabledFlag.Name) || ctx.Bool(utils.DeveloperFlag.Name) {
|
|
|
|
// Mining only makes sense if a full Ethereum node is running
|
|
|
|
if ctx.String(utils.SyncModeFlag.Name) == "light" {
|
|
|
|
utils.Fatalf("Light clients do not support mining")
|
|
|
|
}
|
|
|
|
ethBackend, ok := backend.(*eth.EthAPIBackend)
|
|
|
|
if !ok {
|
|
|
|
utils.Fatalf("Ethereum service not running")
|
|
|
|
}
|
|
|
|
// Set the gas price to the limits from the CLI and start mining
|
|
|
|
gasprice := flags.GlobalBig(ctx, utils.MinerGasPriceFlag.Name)
|
|
|
|
ethBackend.TxPool().SetGasPrice(gasprice)
|
|
|
|
// start mining
|
|
|
|
threads := ctx.Int(utils.MinerThreadsFlag.Name)
|
|
|
|
if err := ethBackend.StartMining(threads); err != nil {
|
|
|
|
utils.Fatalf("Failed to start mining: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// unlockAccounts unlocks any account specifically requested.
|
|
|
|
func unlockAccounts(ctx *cli.Context, stack *node.Node) {
|
|
|
|
var unlocks []string
|
|
|
|
inputs := strings.Split(ctx.String(utils.UnlockedAccountFlag.Name), ",")
|
|
|
|
for _, input := range inputs {
|
|
|
|
if trimmed := strings.TrimSpace(input); trimmed != "" {
|
|
|
|
unlocks = append(unlocks, trimmed)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Short circuit if there is no account to unlock.
|
|
|
|
if len(unlocks) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// If insecure account unlocking is not allowed if node's APIs are exposed to external.
|
|
|
|
// Print warning log to user and skip unlocking.
|
|
|
|
if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() {
|
|
|
|
utils.Fatalf("Account unlock with HTTP access is forbidden!")
|
|
|
|
}
|
|
|
|
ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
|
|
|
|
passwords := utils.MakePasswordList(ctx)
|
|
|
|
for i, account := range unlocks {
|
|
|
|
unlockAccount(ks, account, i, passwords)
|
|
|
|
}
|
|
|
|
}
|