2020-10-27 15:53:49 +00:00
package cli
import (
"fmt"
"github.com/c2h5oh/datasize"
2021-05-20 18:25:53 +00:00
"github.com/ledgerwatch/erigon/cmd/utils"
"github.com/ledgerwatch/erigon/common/etl"
"github.com/ledgerwatch/erigon/eth/ethconfig"
"github.com/ledgerwatch/erigon/ethdb"
"github.com/ledgerwatch/erigon/log"
"github.com/ledgerwatch/erigon/node"
"github.com/ledgerwatch/erigon/turbo/snapshotsync"
2021-03-23 09:00:07 +00:00
"github.com/spf13/pflag"
2020-10-27 15:53:49 +00:00
"github.com/urfave/cli"
)
var (
2021-04-27 12:31:00 +00:00
DatabaseVerbosityFlag = cli . IntFlag {
Name : "database.verbosity" ,
2021-05-11 08:22:34 +00:00
Usage : "Enabling internal db logs. Very high verbosity levels may require recompile db. Default: 2, means warning." ,
Value : 2 ,
2021-04-27 12:31:00 +00:00
}
2020-10-27 15:53:49 +00:00
BatchSizeFlag = cli . StringFlag {
Name : "batchSize" ,
Usage : "Batch size for the execution stage" ,
Value : "512M" ,
}
EtlBufferSizeFlag = cli . StringFlag {
Name : "etl.bufferSize" ,
Usage : "Buffer size for ETL operations." ,
Value : etl . BufferOptimalSize . String ( ) ,
}
2021-07-01 03:14:10 +00:00
BlockDownloaderWindowFlag = cli . IntFlag {
Name : "blockDownloaderWindow" ,
Usage : "Outstanding limit of block bodies being downloaded" ,
Value : 65536 ,
}
2020-10-27 15:53:49 +00:00
PrivateApiAddr = cli . StringFlag {
Name : "private.api.addr" ,
Usage : "private api network address, for example: 127.0.0.1:9090, empty string means not to start the listener. do not expose to public network. serves remote database interface" ,
Value : "" ,
}
2021-03-23 07:28:04 +00:00
PrivateApiRateLimit = cli . IntFlag {
Name : "private.api.ratelimit" ,
Usage : "Amount of requests server handle simultaneously - requests over this limit will wait. Increase it - if clients see 'request timeout' while server load is low - it means your 'hot data' is small or have much RAM. " ,
Value : 500 ,
}
2021-06-13 20:14:52 +00:00
MaxPeersFlag = cli . IntFlag {
Name : "maxpeers" ,
Usage : "Maximum number of network peers (network disabled if set to 0)" ,
Value : node . DefaultConfig . P2P . MaxPeers ,
}
2020-10-27 15:53:49 +00:00
StorageModeFlag = cli . StringFlag {
Name : "storage-mode" ,
Usage : ` Configures the storage mode of the app :
* h - write history to the DB
* r - write receipts to the DB
2021-05-08 22:07:16 +00:00
* t - write tx lookup index to the DB
2021-05-27 13:54:55 +00:00
* c - write call traces index to the DB ,
* e - write TEVM translated code to the DB ` ,
2021-05-08 22:07:16 +00:00
Value : "default" ,
2020-10-27 15:53:49 +00:00
}
SnapshotModeFlag = cli . StringFlag {
2020-11-13 16:16:47 +00:00
Name : "snapshot.mode" ,
2021-02-09 15:48:55 +00:00
Usage : ` Configures the snapshot mode of the app :
2020-10-27 15:53:49 +00:00
* h - download headers snapshot
* b - download bodies snapshot
* s - download state snapshot
* r - download receipts snapshot
` ,
2020-11-13 16:16:47 +00:00
Value : snapshotsync . DefaultSnapshotMode . ToString ( ) ,
2020-10-27 15:53:49 +00:00
}
SeedSnapshotsFlag = cli . BoolTFlag {
2020-11-13 16:16:47 +00:00
Name : "snapshot.seed" ,
Usage : ` Seed snapshot seeding(default: true) ` ,
}
2021-05-08 08:45:40 +00:00
//todo replace to BoolT
SnapshotDatabaseLayoutFlag = cli . BoolFlag {
Name : "snapshot.layout" ,
Usage : ` Enable snapshot db layout(default: false) ` ,
}
2020-11-13 16:16:47 +00:00
ExternalSnapshotDownloaderAddrFlag = cli . StringFlag {
Name : "snapshot.downloader.addr" ,
Usage : ` enable external snapshot downloader ` ,
2020-10-27 15:53:49 +00:00
}
// mTLS flags
TLSFlag = cli . BoolFlag {
Name : "tls" ,
Usage : "Enable TLS handshake" ,
}
TLSCertFlag = cli . StringFlag {
Name : "tls.cert" ,
Usage : "Specify certificate" ,
Value : "" ,
}
TLSKeyFlag = cli . StringFlag {
Name : "tls.key" ,
Usage : "Specify key file" ,
Value : "" ,
}
TLSCACertFlag = cli . StringFlag {
Name : "tls.cacert" ,
Usage : "Specify certificate authority" ,
Value : "" ,
}
2021-05-23 14:53:18 +00:00
StateStreamFlag = cli . BoolFlag {
Name : "state.stream" ,
Usage : "Enable streaming of state changes from core to RPC daemon" ,
}
2020-10-27 15:53:49 +00:00
)
2021-03-23 09:00:07 +00:00
func ApplyFlagsForEthConfig ( ctx * cli . Context , cfg * ethconfig . Config ) {
2020-10-27 15:53:49 +00:00
mode , err := ethdb . StorageModeFromString ( ctx . GlobalString ( StorageModeFlag . Name ) )
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
cfg . StorageMode = mode
2020-11-13 16:16:47 +00:00
snMode , err := snapshotsync . SnapshotModeFromString ( ctx . GlobalString ( SnapshotModeFlag . Name ) )
2020-10-27 15:53:49 +00:00
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
cfg . SnapshotMode = snMode
cfg . SnapshotSeeding = ctx . GlobalBool ( SeedSnapshotsFlag . Name )
2021-05-08 08:45:40 +00:00
cfg . SnapshotLayout = ctx . GlobalBool ( SnapshotDatabaseLayoutFlag . Name )
2020-10-27 15:53:49 +00:00
if ctx . GlobalString ( BatchSizeFlag . Name ) != "" {
err := cfg . BatchSize . UnmarshalText ( [ ] byte ( ctx . GlobalString ( BatchSizeFlag . Name ) ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
}
if ctx . GlobalString ( EtlBufferSizeFlag . Name ) != "" {
sizeVal := datasize . ByteSize ( 0 )
size := & sizeVal
err := size . UnmarshalText ( [ ] byte ( ctx . GlobalString ( EtlBufferSizeFlag . Name ) ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
etl . BufferOptimalSize = * size
}
2020-11-13 16:16:47 +00:00
cfg . ExternalSnapshotDownloaderAddr = ctx . GlobalString ( ExternalSnapshotDownloaderAddrFlag . Name )
2021-05-23 14:53:18 +00:00
cfg . StateStream = ctx . GlobalBool ( StateStreamFlag . Name )
2021-07-01 03:14:10 +00:00
cfg . BlockDownloaderWindow = ctx . GlobalInt ( BlockDownloaderWindowFlag . Name )
2020-10-27 15:53:49 +00:00
}
2021-03-23 09:00:07 +00:00
func ApplyFlagsForEthConfigCobra ( f * pflag . FlagSet , cfg * ethconfig . Config ) {
if v := f . String ( StorageModeFlag . Name , StorageModeFlag . Value , StorageModeFlag . Usage ) ; v != nil {
mode , err := ethdb . StorageModeFromString ( * v )
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
cfg . StorageMode = mode
}
if v := f . String ( SnapshotModeFlag . Name , SnapshotModeFlag . Value , SnapshotModeFlag . Usage ) ; v != nil {
snMode , err := snapshotsync . SnapshotModeFromString ( * v )
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
cfg . SnapshotMode = snMode
}
if v := f . Bool ( SeedSnapshotsFlag . Name , false , SeedSnapshotsFlag . Usage ) ; v != nil {
cfg . SnapshotSeeding = * v
}
if v := f . String ( BatchSizeFlag . Name , BatchSizeFlag . Value , BatchSizeFlag . Usage ) ; v != nil {
err := cfg . BatchSize . UnmarshalText ( [ ] byte ( * v ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
}
if v := f . String ( EtlBufferSizeFlag . Name , EtlBufferSizeFlag . Value , EtlBufferSizeFlag . Usage ) ; v != nil {
sizeVal := datasize . ByteSize ( 0 )
size := & sizeVal
err := size . UnmarshalText ( [ ] byte ( * v ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
etl . BufferOptimalSize = * size
}
if v := f . String ( ExternalSnapshotDownloaderAddrFlag . Name , ExternalSnapshotDownloaderAddrFlag . Value , ExternalSnapshotDownloaderAddrFlag . Usage ) ; v != nil {
cfg . ExternalSnapshotDownloaderAddr = * v
}
2021-05-23 14:53:18 +00:00
if v := f . Bool ( StateStreamFlag . Name , false , StateStreamFlag . Usage ) ; v != nil {
cfg . StateStream = * v
}
2021-03-23 09:00:07 +00:00
}
2020-10-27 15:53:49 +00:00
func ApplyFlagsForNodeConfig ( ctx * cli . Context , cfg * node . Config ) {
setPrivateApi ( ctx , cfg )
2021-04-27 12:31:00 +00:00
cfg . DatabaseVerbosity = ethdb . DBVerbosityLvl ( ctx . GlobalInt ( DatabaseVerbosityFlag . Name ) )
2020-10-27 15:53:49 +00:00
}
// setPrivateApi populates configuration fields related to the remote
// read-only interface to the databae
func setPrivateApi ( ctx * cli . Context , cfg * node . Config ) {
cfg . PrivateApiAddr = ctx . GlobalString ( PrivateApiAddr . Name )
2021-03-23 07:28:04 +00:00
cfg . PrivateApiRateLimit = uint32 ( ctx . GlobalUint64 ( PrivateApiRateLimit . Name ) )
maxRateLimit := uint32 ( ethdb . ReadersLimit - 16 )
if cfg . PrivateApiRateLimit > maxRateLimit {
log . Warn ( "private.api.ratelimit is too big" , "force" , maxRateLimit )
cfg . PrivateApiRateLimit = maxRateLimit
}
2020-10-27 15:53:49 +00:00
if ctx . GlobalBool ( TLSFlag . Name ) {
certFile := ctx . GlobalString ( TLSCertFlag . Name )
keyFile := ctx . GlobalString ( TLSKeyFlag . Name )
if certFile == "" {
log . Warn ( "Could not establish TLS grpc: missing certificate" )
return
} else if keyFile == "" {
log . Warn ( "Could not establish TLS grpc: missing key file" )
return
}
cfg . TLSConnection = true
cfg . TLSCertFile = certFile
cfg . TLSKeyFile = keyFile
cfg . TLSCACert = ctx . GlobalString ( TLSCACertFlag . Name )
}
}