github.com/eris-ltd/erisdb@v0.25.0/core/config.go (about)

     1  package core
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/go-kit/kit/log"
     7  	"github.com/hyperledger/burrow/config"
     8  	"github.com/hyperledger/burrow/consensus/abci"
     9  	"github.com/hyperledger/burrow/consensus/tendermint"
    10  	"github.com/hyperledger/burrow/crypto"
    11  	"github.com/hyperledger/burrow/execution"
    12  	"github.com/hyperledger/burrow/keys"
    13  	"github.com/hyperledger/burrow/logging/lifecycle"
    14  	"github.com/hyperledger/burrow/logging/logconfig"
    15  	"github.com/hyperledger/burrow/logging/structure"
    16  	"github.com/hyperledger/burrow/project"
    17  	tmConfig "github.com/tendermint/tendermint/config"
    18  	"github.com/tendermint/tendermint/node"
    19  	tmTypes "github.com/tendermint/tendermint/types"
    20  )
    21  
    22  // LoadKeysFromConfig sets the keyClient & keyStore based on the given config
    23  func (kern *Kernel) LoadKeysFromConfig(conf *keys.KeysConfig) (err error) {
    24  	if conf.RemoteAddress != "" {
    25  		kern.keyClient, err = keys.NewRemoteKeyClient(conf.RemoteAddress, kern.Logger)
    26  		if err != nil {
    27  			return err
    28  		}
    29  	} else {
    30  		kern.keyStore = keys.NewKeyStore(conf.KeysDirectory, conf.AllowBadFilePermissions)
    31  		kern.keyClient = keys.NewLocalKeyClient(kern.keyStore, kern.Logger)
    32  	}
    33  	return nil
    34  }
    35  
    36  // LoadLoggerFromConfig adds a logging configuration to the kernel
    37  func (kern *Kernel) LoadLoggerFromConfig(conf *logconfig.LoggingConfig) error {
    38  	logger, err := lifecycle.NewLoggerFromLoggingConfig(conf)
    39  	kern.SetLogger(logger)
    40  	return err
    41  }
    42  
    43  // LoadExecutionOptionsFromConfig builds the execution options for the kernel
    44  func (kern *Kernel) LoadExecutionOptionsFromConfig(conf *execution.ExecutionConfig) error {
    45  	if conf != nil {
    46  		exeOptions, err := conf.ExecutionOptions()
    47  		if err != nil {
    48  			return err
    49  		}
    50  		kern.exeOptions = exeOptions
    51  		kern.timeoutFactor = conf.TimeoutFactor
    52  	}
    53  	return nil
    54  }
    55  
    56  // LoadTendermintFromConfig loads our consensus engine into the kernel
    57  func (kern *Kernel) LoadTendermintFromConfig(conf *config.BurrowConfig, privVal tmTypes.PrivValidator) (err error) {
    58  	if conf.Tendermint == nil || !conf.Tendermint.Enabled {
    59  		return nil
    60  	}
    61  
    62  	authorizedPeersProvider := conf.Tendermint.DefaultAuthorizedPeersProvider()
    63  	kern.database.Stats()
    64  
    65  	kern.info = fmt.Sprintf("Burrow_%s_%s_ValidatorID:%X", project.History.CurrentVersion().String(),
    66  		kern.Blockchain.ChainID(), privVal.GetPubKey().Address())
    67  
    68  	app := abci.NewApp(kern.info, kern.Blockchain, kern.State, kern.checker, kern.committer, kern.txCodec,
    69  		authorizedPeersProvider, kern.Panic, kern.Logger)
    70  
    71  	// We could use this to provide/register our own metrics (though this will register them with us). Unfortunately
    72  	// Tendermint currently ignores the metrics passed unless its own server is turned on.
    73  	metricsProvider := node.DefaultMetricsProvider(&tmConfig.InstrumentationConfig{
    74  		Prometheus:           false,
    75  		PrometheusListenAddr: "",
    76  	})
    77  
    78  	genesisDoc := kern.Blockchain.GenesisDoc()
    79  
    80  	// find node key
    81  	var nodeKey *crypto.PrivateKey
    82  	for _, v := range genesisDoc.Validators {
    83  		thisAddress, err := crypto.AddressFromHexString(privVal.GetPubKey().Address().String())
    84  		if err != nil {
    85  			break
    86  		}
    87  		if v.Address == thisAddress && v.NodeAddress != nil {
    88  			k, err := kern.keyStore.GetKey("", v.NodeAddress.Bytes())
    89  			if err == nil {
    90  				nodeKey = &k.PrivateKey
    91  			}
    92  			break
    93  		}
    94  	}
    95  
    96  	tmGenesisDoc := tendermint.DeriveGenesisDoc(&genesisDoc, kern.Blockchain.AppHashAfterLastBlock())
    97  	heightValuer := log.Valuer(func() interface{} { return kern.Blockchain.LastBlockHeight() })
    98  	tmLogger := kern.Logger.With(structure.CallerKey, log.Caller(LoggingCallerDepth+1)).With("height", heightValuer)
    99  	kern.Node, err = tendermint.NewNode(conf.TendermintConfig(), privVal, tmGenesisDoc, app, metricsProvider, nodeKey, tmLogger)
   100  	return err
   101  }
   102  
   103  // LoadKernelFromConfig builds and returns a Kernel based solely on the supplied configuration
   104  func LoadKernelFromConfig(conf *config.BurrowConfig) (*Kernel, error) {
   105  	kern, err := NewKernel(conf.BurrowDir)
   106  	if err != nil {
   107  		return nil, fmt.Errorf("could not create initial kernel: %v", err)
   108  	}
   109  
   110  	if err = kern.LoadLoggerFromConfig(conf.Logging); err != nil {
   111  		return nil, fmt.Errorf("could not configure logger: %v", err)
   112  	}
   113  
   114  	err = kern.LoadKeysFromConfig(conf.Keys)
   115  	if err != nil {
   116  		return nil, fmt.Errorf("could not configure keys: %v", err)
   117  	}
   118  
   119  	err = kern.LoadExecutionOptionsFromConfig(conf.Execution)
   120  	if err != nil {
   121  		return nil, fmt.Errorf("could not add execution options: %v", err)
   122  	}
   123  
   124  	err = kern.LoadState(conf.GenesisDoc)
   125  	if err != nil {
   126  		return nil, fmt.Errorf("could not load state: %v", err)
   127  	}
   128  
   129  	if conf.ValidatorAddress == nil {
   130  		return nil, fmt.Errorf("ValidatorAddress must be set")
   131  	}
   132  
   133  	privVal, err := kern.PrivValidator(*conf.ValidatorAddress)
   134  	if err != nil {
   135  		return nil, fmt.Errorf("could not form PrivValidator from ValidatorAddress: %v", err)
   136  	}
   137  
   138  	err = kern.LoadTendermintFromConfig(conf, privVal)
   139  	if err != nil {
   140  		return nil, fmt.Errorf("could not configure Tendermint: %v", err)
   141  	}
   142  
   143  	kern.AddProcesses(DefaultProcessLaunchers(kern, conf.RPC, conf.Keys)...)
   144  	return kern, nil
   145  }