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 }