|
|
|
// Package nodeconfig includes all the configuration variables for a node.
|
|
|
|
// It is a global configuration for node and other services.
|
|
|
|
// It will be included in node module, and other modules.
|
|
|
|
package nodeconfig
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/ecdsa"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
|
|
"github.com/harmony-one/bls/ffi/go/bls"
|
|
|
|
"github.com/harmony-one/harmony/p2p"
|
|
|
|
p2p_crypto "github.com/libp2p/go-libp2p-crypto"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Role defines a role of a node.
|
|
|
|
type Role byte
|
|
|
|
|
|
|
|
// All constants for different node roles.
|
|
|
|
const (
|
|
|
|
Unknown Role = iota
|
|
|
|
ShardLeader
|
|
|
|
ShardValidator
|
|
|
|
BeaconLeader
|
|
|
|
BeaconValidator
|
|
|
|
NewNode
|
|
|
|
ClientNode
|
|
|
|
WalletNode
|
|
|
|
)
|
|
|
|
|
|
|
|
func (role Role) String() string {
|
|
|
|
switch role {
|
|
|
|
case Unknown:
|
|
|
|
return "Unknown"
|
|
|
|
case ShardLeader:
|
|
|
|
return "ShardLeader"
|
|
|
|
case ShardValidator:
|
|
|
|
return "ShardValidator"
|
|
|
|
case BeaconLeader:
|
|
|
|
return "BeaconLeader"
|
|
|
|
case BeaconValidator:
|
|
|
|
return "BeaconValidator"
|
|
|
|
case NewNode:
|
|
|
|
return "NewNode"
|
|
|
|
case ClientNode:
|
|
|
|
return "ClientNode"
|
|
|
|
case WalletNode:
|
|
|
|
return "WalletNode"
|
|
|
|
}
|
|
|
|
return "Unknown"
|
|
|
|
}
|
|
|
|
|
|
|
|
// Global is the index of the global node configuration
|
|
|
|
const (
|
|
|
|
Global = 0
|
|
|
|
MaxShards = 32 // maximum number of shards. It is also the maxium number of configs.
|
|
|
|
)
|
|
|
|
|
|
|
|
// ConfigType is the structure of all node related configuration variables
|
|
|
|
type ConfigType struct {
|
|
|
|
// The three groupID design, please refer to https://github.com/harmony-one/harmony/blob/master/node/node.md#libp2p-integration
|
|
|
|
beacon p2p.GroupID // the beacon group ID
|
|
|
|
group p2p.GroupID // the group ID of the shard (note: for beacon chain node, the beacon and shard group are the same)
|
|
|
|
client p2p.GroupID // the client group ID of the shard
|
|
|
|
isClient bool // whether this node is a client node, such as wallet/txgen
|
|
|
|
isLeader bool // whether this node is a leader or not
|
|
|
|
ShardID uint32 // ShardID of this node
|
|
|
|
role Role // Role of the node
|
|
|
|
|
|
|
|
StringRole string
|
|
|
|
Host p2p.Host
|
|
|
|
StakingPriKey *ecdsa.PrivateKey
|
|
|
|
P2pPriKey p2p_crypto.PrivKey
|
|
|
|
ConsensusPriKey *bls.SecretKey
|
|
|
|
ConsensusPubKey *bls.PublicKey
|
|
|
|
MainDB *ethdb.LDBDatabase
|
|
|
|
BeaconDB *ethdb.LDBDatabase
|
|
|
|
|
|
|
|
SelfPeer p2p.Peer
|
|
|
|
Leader p2p.Peer
|
|
|
|
}
|
|
|
|
|
|
|
|
// configs is a list of node configuration.
|
|
|
|
// It has at least one configuration.
|
|
|
|
// The first one is the default, global node configuration
|
|
|
|
var shardConfigs []ConfigType
|
|
|
|
var defaultConfig ConfigType
|
|
|
|
var onceForConfigs sync.Once
|
|
|
|
|
|
|
|
// GetShardConfig return the shard's ConfigType variable
|
|
|
|
func GetShardConfig(shardID uint32) *ConfigType {
|
|
|
|
onceForConfigs.Do(func() {
|
|
|
|
shardConfigs = make([]ConfigType, MaxShards)
|
|
|
|
})
|
|
|
|
if int(shardID) >= cap(shardConfigs) {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &shardConfigs[shardID]
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetConfigs set ConfigType in the right index.
|
|
|
|
func SetConfigs(config ConfigType, shardID uint32) error {
|
|
|
|
onceForConfigs.Do(func() {
|
|
|
|
shardConfigs = make([]ConfigType, MaxShards)
|
|
|
|
})
|
|
|
|
if int(shardID) >= cap(shardConfigs) {
|
|
|
|
return errors.New("Failed to set ConfigType")
|
|
|
|
}
|
|
|
|
shardConfigs[int(shardID)] = config
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetDefaultConfig returns default config.
|
|
|
|
func GetDefaultConfig() *ConfigType {
|
|
|
|
return &defaultConfig
|
|
|
|
}
|
|
|
|
|
|
|
|
func (conf *ConfigType) String() string {
|
|
|
|
return fmt.Sprintf("%s/%s/%s:%v,%v,%v:%v", conf.beacon, conf.group, conf.client, conf.isClient, conf.IsBeacon(), conf.isLeader, conf.ShardID)
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetBeaconGroupID set the groupID for beacon group
|
|
|
|
func (conf *ConfigType) SetBeaconGroupID(g p2p.GroupID) {
|
|
|
|
conf.beacon = g
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetShardGroupID set the groupID for shard group
|
|
|
|
func (conf *ConfigType) SetShardGroupID(g p2p.GroupID) {
|
|
|
|
conf.group = g
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetClientGroupID set the groupID for client group
|
|
|
|
func (conf *ConfigType) SetClientGroupID(g p2p.GroupID) {
|
|
|
|
conf.client = g
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetIsClient set the isClient configuration
|
|
|
|
func (conf *ConfigType) SetIsClient(b bool) {
|
|
|
|
conf.isClient = b
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetIsLeader set the isLeader configuration
|
|
|
|
func (conf *ConfigType) SetIsLeader(b bool) {
|
|
|
|
conf.isLeader = b
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetShardID set the ShardID
|
|
|
|
func (conf *ConfigType) SetShardID(s uint32) {
|
|
|
|
conf.ShardID = s
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetRole set the role
|
|
|
|
func (conf *ConfigType) SetRole(r Role) {
|
|
|
|
conf.role = r
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetBeaconGroupID returns the groupID for beacon group
|
|
|
|
func (conf *ConfigType) GetBeaconGroupID() p2p.GroupID {
|
|
|
|
return conf.beacon
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetShardGroupID returns the groupID for shard group
|
|
|
|
func (conf *ConfigType) GetShardGroupID() p2p.GroupID {
|
|
|
|
return conf.group
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetClientGroupID returns the groupID for client group
|
|
|
|
func (conf *ConfigType) GetClientGroupID() p2p.GroupID {
|
|
|
|
return conf.client
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsClient returns the isClient configuration
|
|
|
|
func (conf *ConfigType) IsClient() bool {
|
|
|
|
return conf.isClient
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsBeacon returns the isBeacon configuration
|
|
|
|
func (conf *ConfigType) IsBeacon() bool {
|
|
|
|
return conf.ShardID == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsLeader returns the isLeader configuration
|
|
|
|
func (conf *ConfigType) IsLeader() bool {
|
|
|
|
return conf.isLeader
|
|
|
|
}
|
|
|
|
|
|
|
|
// Role returns the role
|
|
|
|
func (conf *ConfigType) Role() Role {
|
|
|
|
return conf.role
|
|
|
|
}
|