configuration

package
v0.10.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 20, 2022 License: Apache-2.0 Imports: 15 Imported by: 3

Documentation

Index

Constants

View Source
const (
	DefaultURL                               = "http://localhost:8080"
	DefaultTimeout                           = 10
	DefaultMaxRetries                        = 5
	DefaultMaxOnlineConnections              = 120 // most OS have a default limit of 128
	DefaultMaxOfflineConnections             = 4   // we shouldn't need many connections for construction
	DefaultMaxSyncConcurrency                = 64
	DefaultActiveReconciliationConcurrency   = 16
	DefaultInactiveReconciliationConcurrency = 4
	DefaultInactiveReconciliationFrequency   = 250
	DefaultConfirmationDepth                 = 10
	DefaultStaleDepth                        = 30
	DefaultBroadcastLimit                    = 3
	DefaultTipDelay                          = 300
	DefaultBlockBroadcastLimit               = 5
	DefaultStatusPort                        = 9090
	DefaultMaxReorgDepth                     = 100

	// Check Perf Default Configs
	DefaultStartBlock                             = 100
	DefaultEndBlock                               = 10000
	DefaultNumTimesToHitEndpoints                 = 50
	DefaultOutputFile                             = "./check_perf_stats.json"
	DefaultBlockEndpointTimeConstraintMs          = 5000
	DefaultAccountBalanceEndpointTimeConstraintMs = 5000

	// ETH Defaults
	EthereumIDBlockchain = "Ethereum"
	EthereumIDNetwork    = "Ropsten"
)

Default Configuration Values

Variables

View Source
var (
	EthereumNetwork = &types.NetworkIdentifier{
		Blockchain: EthereumIDBlockchain,
		Network:    EthereumIDNetwork,
	}
)

Default Configuration Values

Functions

This section is empty.

Types

type CheckDataEndCondition added in v0.5.0

type CheckDataEndCondition string

CheckDataEndCondition is a type of "successful" end for the "check:data" method.

const (
	// IndexEndCondition is used to indicate that the index end condition
	// has been met.
	IndexEndCondition CheckDataEndCondition = "Index End Condition"

	// DurationEndCondition is used to indicate that the duration
	// end condition has been met.
	DurationEndCondition CheckDataEndCondition = "Duration End Condition"

	// TipEndCondition is used to indicate that the tip end condition
	// has been met.
	TipEndCondition CheckDataEndCondition = "Tip End Condition"

	// ReconciliationCoverageEndCondition is used to indicate that the reconciliation
	// coverage end condition has been met.
	ReconciliationCoverageEndCondition CheckDataEndCondition = "Reconciliation Coverage End Condition"
)

type CheckPerfConfiguration added in v0.7.7

type CheckPerfConfiguration struct {

	// StartBlock is the starting block for running check:perf.
	// If not provided, then this defaults to 0 (the genesis block)
	StartBlock int64 `json:"start_block,omitempty"`

	BlockEndpointTimeConstraintMs int64 `json:"block_endpoint_time_constraint_ms"`

	AccountBalanceEndpointTimeConstraintMs int64 `json:"account_balance_endpoint_time_constraint_ms"`

	// EndBlock is the ending block for running check:perf.
	// Must be provided when running check:perf
	EndBlock int64 `json:"end_block"`

	// NumTimesToHitEndpoints is the number of times each rosetta-server endpoint will be benchmarked
	NumTimesToHitEndpoints int `json:"num_times_to_hit_endpoints"`

	// Location to output test results
	StatsOutputFile string `json:"check_perf_output_dir"`
}

********************// Check Perf configs // ********************//

func DefaultPerfConfiguration added in v0.7.7

func DefaultPerfConfiguration() *CheckPerfConfiguration

DefaultPerfConfiguration returns the default *CheckPerfConfiguration for running `check:perf`.

type Configuration

type Configuration struct {
	// Network is the *types.NetworkIdentifier where transactions should
	// be constructed and where blocks should be synced to monitor
	// for broadcast success.
	Network *types.NetworkIdentifier `json:"network"`

	// OnlineURL is the URL of a Rosetta API implementation in "online mode".
	OnlineURL string `json:"online_url"`

	// DataDirectory is a folder used to store logs and any data used to perform validation.
	// The path can be absolute, or it can be relative to where rosetta-cli
	// binary is being executed.
	DataDirectory string `json:"data_directory"`

	// HTTPTimeout is the timeout for a HTTP request in seconds.
	HTTPTimeout uint64 `json:"http_timeout"`

	// MaxRetries is the number of times we will retry an HTTP request. If retry_elapsed_time
	// is also populated, we may stop attempting retries early.
	MaxRetries uint64 `json:"max_retries"`

	// RetryElapsedTime is the total time to spend retrying a HTTP request in seconds.
	RetryElapsedTime uint64 `json:"retry_elapsed_time"`

	// MaxOnlineConnections is the maximum number of open connections that the online
	// fetcher will open.
	MaxOnlineConnections int `json:"max_online_connections"`

	// ForceRetry overrides the default retry handling to retry
	// on all non-200 responses.
	ForceRetry bool `json:"force_retry,omitempty"`

	// MaxSyncConcurrency is the maximum sync concurrency to use while syncing blocks.
	// Sync concurrency is managed automatically by the `syncer` package.
	MaxSyncConcurrency int64 `json:"max_sync_concurrency"`

	// TipDelay dictates how many seconds behind the current time is considered
	// tip. If we are > TipDelay seconds from the last processed block,
	// we are considered to be behind tip.
	TipDelay int64 `json:"tip_delay"`

	// MaxReorgDepth specifies the maximum possible reorg depth of the blockchain
	// being synced. This value is used to determine how aggressively to prune
	// old block data.
	//
	// It is better to be overly cautious here as keeping a few
	// too many blocks around is much better than running into an
	// error caused by missing block data!
	MaxReorgDepth int `json:"max_reorg_depth,omitempty"`

	// LogConfiguration determines if the configuration settings
	// should be printed to the console when a file is loaded.
	LogConfiguration bool `json:"log_configuration"`

	// CompressionDisabled configures the storage layer to not
	// perform data compression before writing to disk. This leads
	// to significantly more on-disk storage usage but can lead
	// to performance gains.
	CompressionDisabled bool `json:"compression_disabled"`

	// L0InMemoryEnabled configures storage to increase memory
	// usage. Enabling this massively increases performance
	// but can use 10s of GBs of RAM, even with pruning enabled.
	L0InMemoryEnabled bool `json:"l0_in_memory_enabled"`

	// AllInMemoryDisabled configures storage to increase memory
	// usage. Enabling this massively increases performance
	// but can use >20s of GBs of RAM, even with pruning enabled.
	AllInMemoryEnabled bool `json:"all_in_memory_enabled"`

	// TableSize unit is GB, enable users to define MaxTableSize
	// when AllInMemoryEnabled == true or L0InMemoryEnabled== true, Cli will look up this config
	// default value is 2, modification range is [1, 100]
	TableSize *int64 `json:"table_size,omitempty"`

	// ValueLogFileSize unit is MB, enable users to define ValueLogFileSize
	// when AllInMemoryEnabled == true or L0InMemoryEnabled== true, Cli will look up this config
	// default value is 512, modification range is [128, 2048]
	ValueLogFileSize *int64 `json:"value_log_file_size,omitempty"`

	// SeenBlockWorkers is the number of goroutines spawned to store
	// seen blocks in storage before we attempt to sequence. If not populated,
	// this value defaults to runtime.NumCPU().
	SeenBlockWorkers int `json:"seen_block_workers,omitempty"`

	// SerialBlockWorkers is the number of goroutines spawned to help
	// with block sequencing (i.e. updating balances, updating coins, etc).
	// If not populated, this value defaults to runtime.NumCPU().
	SerialBlockWorkers int `json:"serial_block_workers,omitempty"`

	// ValidationFile is the file used for asset specific validation
	// If not provided, then this will be empty string and no asset
	// specific validation will be done
	ValidationFile string `json:"validation_file,omitempty"`

	// ErrorStackTraceDisabled if false then it will print error stack trace
	// if the data or construction check fails
	ErrorStackTraceDisabled bool `json:"error_stack_trace_disabled"`

	// CoinSupported indicates whether your implementation support coins or not.
	// If your implementation is based on account-based blockchain (e.g. Ethereum),
	// this value must be false. If your implementation is UTXO-based blockchain (e.g. Bitcoin),
	// then this value must be true.
	CoinSupported bool `json:"coin_supported"`

	Construction *ConstructionConfiguration `json:"construction"`
	Data         *DataConfiguration         `json:"data"`
	Perf         *CheckPerfConfiguration    `json:"perf"`
}

Configuration contains all configuration settings for running check:data, check:construction, or check:perf.

func DefaultConfiguration

func DefaultConfiguration() *Configuration

DefaultConfiguration returns a *Configuration with the EthereumNetwork, DefaultURL, DefaultTimeout, DefaultConstructionConfiguration and DefaultDataConfiguration.

func LoadConfiguration

func LoadConfiguration(ctx context.Context, filePath string) (*Configuration, error)

LoadConfiguration returns a parsed and asserted Configuration for running tests.

type ConstructionConfiguration

type ConstructionConfiguration struct {
	// OfflineURL is the URL of a Rosetta API implementation in "offline mode".
	OfflineURL string `json:"offline_url"`

	// MaxOffineConnections is the maximum number of open connections that the offline
	// fetcher will open.
	MaxOfflineConnections int `json:"max_offline_connections"`

	// ForceRetry overrides the default retry handling to retry
	// on all non-200 responses.
	ForceRetry bool `json:"force_retry,omitempty"`

	// StaleDepth is the number of blocks to wait before attempting
	// to rebroadcast after not finding a transaction on-chain.
	StaleDepth int64 `json:"stale_depth"`

	// BroadcastLimit is the number of times to attempt re-broadcast
	// before giving up on a transaction broadcast.
	BroadcastLimit int `json:"broadcast_limit"`

	// IgnoreBroadcastFailures determines if we should exit when there
	// are broadcast failures (that surpass the BroadcastLimit).
	IgnoreBroadcastFailures bool `json:"ignore_broadcast_failures"`

	// ClearBroadcasts indicates if all pending broadcasts should
	// be removed from BroadcastStorage on restart.
	ClearBroadcasts bool `json:"clear_broadcasts"`

	// BroadcastBehindTip indicates if we should broadcast transactions
	// when we are behind tip (as defined by TipDelay).
	BroadcastBehindTip bool `json:"broadcast_behind_tip"`

	// BlockBroadcastLimit is the number of transactions to attempt
	// broadcast in a single block. When there are many pending
	// broadcasts, it may make sense to limit the number of broadcasts.
	BlockBroadcastLimit int `json:"block_broadcast_limit"`

	// RebroadcastAll indicates if all pending broadcasts should be
	// rebroadcast from BroadcastStorage on restart.
	RebroadcastAll bool `json:"rebroadcast_all"`

	// PrefundedAccounts is an array of prefunded accounts
	// to use while testing.
	PrefundedAccounts []*modules.PrefundedAccount `json:"prefunded_accounts,omitempty"`

	// Workflows are executed by the rosetta-cli to test
	// certain construction flows.
	Workflows []*job.Workflow `json:"workflows"`

	// ConstructorDSLFile is the path relative to the configuration file
	// of a Rosetta Constructor DSL file (*.ros)
	// that describes which Workflows to test.
	//
	// DSL Spec: https://github.com/coinbase/rosetta-sdk-go/tree/master/constructor/dsl
	ConstructorDSLFile string `json:"constructor_dsl_file"`

	// EndConditions is a map of workflow:count that
	// indicates how many of each workflow should be performed
	// before check:construction should stop. For example,
	// {"create_account": 5} indicates that 5 "create_account"
	// workflows should be performed before stopping.
	EndConditions map[string]int `json:"end_conditions,omitempty"`

	// StatusPort allows the caller to query a running check:construction
	// test to get stats about progress. This can be used instead
	// of parsing logs to populate some sort of status dashboard.
	StatusPort uint `json:"status_port,omitempty"`

	// ResultsOutputFile is the absolute filepath of where to save
	// the results of a check:construction run.
	ResultsOutputFile string `json:"results_output_file,omitempty"`

	// Quiet is a boolean indicating if all request and response
	// logging should be silenced.
	Quiet bool `json:"quiet,omitempty"`

	// InitialBalanceFetchDisabled configures rosetta-cli
	// not to lookup the balance of newly seen accounts at the
	// parent block before applying operations. Disabling this
	// is only a good idea if you create multiple new accounts each block
	// and don't fund any accounts before starting check:construction.
	//
	// This is a separate config from the data config because it
	// is usually false whereas the data config by the same name is usually true.
	InitialBalanceFetchDisabled bool `json:"initial_balance_fetch_disabled"`
}

ConstructionConfiguration contains all configurations to run check:construction.

type DataConfiguration

type DataConfiguration struct {
	// ActiveReconciliationConcurrency is the concurrency to use while fetching accounts
	// during active reconciliation.
	ActiveReconciliationConcurrency uint64 `json:"active_reconciliation_concurrency"`

	// InactiveReconciliationConcurrency is the concurrency to use while fetching accounts
	// during inactive reconciliation.
	InactiveReconciliationConcurrency uint64 `json:"inactive_reconciliation_concurrency"`

	// InactiveReconciliationFrequency is the number of blocks to wait between
	// inactive reconciliations on each account.
	InactiveReconciliationFrequency uint64 `json:"inactive_reconciliation_frequency"`

	// LogBlocks is a boolean indicating whether to log processed blocks.
	LogBlocks bool `json:"log_blocks"`

	// LogTransactions is a boolean indicating whether to log processed transactions.
	LogTransactions bool `json:"log_transactions"`

	// LogBalanceChanges is a boolean indicating whether to log all balance changes.
	LogBalanceChanges bool `json:"log_balance_changes"`

	// LogReconciliations is a boolean indicating whether to log all reconciliations.
	LogReconciliations bool `json:"log_reconciliations"`

	// IgnoreReconciliationError determines if block processing should halt on a reconciliation
	// error. It can be beneficial to collect all reconciliation errors or silence
	// reconciliation errors during development.
	IgnoreReconciliationError bool `json:"ignore_reconciliation_error"`

	// ExemptAccounts is a path relative to the configuration file
	// to a file listing all accounts to exempt from balance
	// tracking and reconciliation. Look at the examples directory for an example of
	// how to structure this file.
	ExemptAccounts string `json:"exempt_accounts"`

	// BootstrapBalances is a path relative to the configuration file to a file used
	// to bootstrap balances before starting syncing. If this value is populated after
	// beginning syncing, it will be ignored.
	BootstrapBalances string `json:"bootstrap_balances"`

	// HistoricalBalanceDisabled is a boolean that dictates how balance lookup is performed.
	// When set to false, balances are looked up at the block where a balance
	// change occurred instead of at the current block. Blockchains that do not support
	// historical balance lookup should set this to true.
	HistoricalBalanceDisabled *bool `json:"historical_balance_disabled,omitempty"`

	// InterestingAccounts is a path to a file listing all accounts to check on each block. Look
	// at the examples directory for an example of how to structure this file.
	InterestingAccounts string `json:"interesting_accounts"`

	// ReconciliationDisabled is a boolean that indicates reconciliation should not
	// be attempted. When first testing an implementation, it can be useful to disable
	// some of the more advanced checks to confirm syncing is working as expected.
	ReconciliationDisabled bool `json:"reconciliation_disabled"`

	// ReconciliationDrainDisabled is a boolean that configures the rosetta-cli
	// to exit check:data before the entire active reconciliation queue has
	// been drained (if reconciliation is enabled).
	ReconciliationDrainDisabled bool `json:"reconciliation_drain_disabled"`

	// InactiveDiscrepancySearchDisabled is a boolean indicating if a search
	// should be performed to find any inactive reconciliation discrepancies.
	// Note, a search will never be performed if historical balance lookup
	// is disabled.
	InactiveDiscrepancySearchDisabled bool `json:"inactive_discrepancy_search_disabled"`

	// BalanceTrackingDisabled is a boolean that indicates balances calculation
	// should not be attempted. When first testing an implemenation, it can be
	// useful to just try to fetch all blocks before checking for balance
	// consistency.
	BalanceTrackingDisabled bool `json:"balance_tracking_disabled"`

	// CoinTrackingDisabled is a boolean that indicates coin (or UTXO) tracking
	// should not be attempted. When first testing an implemenation, it can be
	// useful to just try to fetch all blocks before checking for coin
	// consistency.
	CoinTrackingDisabled bool `json:"coin_tracking_disabled"`

	// StartIndex is the block height to start syncing from. If no StartIndex
	// is provided, syncing will start from the last saved block.
	// If no blocks have ever been synced, syncing will start from genesis.
	StartIndex *int64 `json:"start_index,omitempty"`

	// EndCondition contains the conditions for the syncer to stop.
	EndConditions *DataEndConditions `json:"end_conditions,omitempty"`

	// StatusPort allows the caller to query a running check:data
	// test to get stats about progress. This can be used instead
	// of parsing logs to populate some sort of status dashboard.
	StatusPort uint `json:"status_port,omitempty"`

	// ResultsOutputFile is the absolute filepath of where to save
	// the results of a check:data run.
	ResultsOutputFile string `json:"results_output_file"`

	// PruningBlockDisabled is a boolean that indicates storage pruning should
	// not be attempted. This should really only ever be set to true if you
	// wish to use `start_index` at a later point to restart from some
	// previously synced block.
	PruningBlockDisabled bool `json:"pruning_block_disabled"`

	// PruningBalanceDisabled is a boolean that indicates balance pruning
	// should not be attempted.
	PruningBalanceDisabled bool `json:"pruning_balance_disabled"`

	// PruningFrequency is the frequency (in seconds) that we attempt
	// to prune blocks. If not populated, we use the default value
	// provided in the `statefulsyncer` package.
	PruningFrequency *int `json:"pruning_frequency,omitempty"`

	// InitialBalanceFetchDisabled configures rosetta-cli
	// not to lookup the balance of newly seen accounts at the
	// parent block before applying operations. Disabling
	// this step can significantly speed up performance
	// without impacting validation accuracy (if all genesis
	// accounts are provided using bootstrap_balances and
	// syncing starts from genesis).
	InitialBalanceFetchDisabled bool `json:"initial_balance_fetch_disabled"`

	// ReconcilerActiveBacklog is the maximum number of pending changes
	// to keep in the active reconciliation backlog before skipping
	// reconciliation on new changes.
	ReconcilerActiveBacklog *int `json:"reconciler_active_backlog,omitempty"`
}

DataConfiguration contains all configurations to run check:data.

func DefaultDataConfiguration

func DefaultDataConfiguration() *DataConfiguration

DefaultDataConfiguration returns the default *DataConfiguration for running `check:data`.

type DataEndConditions added in v0.5.0

type DataEndConditions struct {
	// Index configures the syncer to stop once reaching a particular block height.
	Index *int64 `json:"index,omitempty"`

	// Tip configures the syncer to stop once it reached the tip.
	// Make sure to configure `tip_delay` if you use this end
	// condition.
	Tip *bool `json:"tip,omitempty"`

	// Duration configures the syncer to stop after running
	// for Duration seconds.
	Duration *uint64 `json:"duration,omitempty"`

	// ReconciliationCoverage configures the syncer to stop once it reaches
	// some level of reconciliation coverage.
	ReconciliationCoverage *ReconciliationCoverage `json:"reconciliation_coverage,omitempty"`
}

DataEndConditions contains all the conditions for the syncer to stop when running check:data. If any one of these conditions is considered true, `check:data` will stop with success.

type ReconciliationCoverage added in v0.5.8

type ReconciliationCoverage struct {
	// Coverage is some value [0.0, 1.0] that represents
	// the % of accounts reconciled.
	Coverage float64 `json:"coverage"`

	// FromTip is a boolean indicating if reconciliation coverage
	// should only be measured from tip (i.e. reconciliations
	// performed at or after tip was reached).
	FromTip bool `json:"from_tip,omitempty"`

	// Tip is a boolean indicating that tip must be reached
	// before reconciliation coverage is considered valid.
	Tip bool `json:"tip,omitempty"`

	// Index is an int64 indicating the height that must be
	// reached before reconciliation coverage is considered valid.
	Index *int64 `json:"index,omitempty"`

	// AccountCount is an int64 indicating the number of accounts
	// that must be observed before reconciliation coverage is considered
	// valid.
	AccountCount *int64 `json:"account_count,omitempty"`
}

ReconciliationCoverage is used to add conditions to reconciliation coverage for exiting `check:data`. All provided conditions must be satisfied before the end condition is considered satisfied.

If FromTip, Tip, Height, and AccountCount are not provided, `check:data` will halt as soon as coverage surpasses Coverage.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL