Some checks are pending
Build SimApp / build (amd64) (push) Waiting to run
Build SimApp / build (arm64) (push) Waiting to run
CodeQL / Analyze (push) Waiting to run
Build & Push / build (push) Waiting to run
Run Gosec / Gosec (push) Waiting to run
Lint / golangci-lint (push) Waiting to run
Checks dependencies and mocks generation / Check go mod tidy (push) Waiting to run
Checks dependencies and mocks generation / Check up to date mocks (push) Waiting to run
System Tests / setup (push) Waiting to run
System Tests / test-system (push) Blocked by required conditions
System Tests / test-system-legacy (push) Blocked by required conditions
Tests / Code Coverage / split-test-files (push) Waiting to run
Tests / Code Coverage / tests (00) (push) Blocked by required conditions
Tests / Code Coverage / tests (01) (push) Blocked by required conditions
Tests / Code Coverage / tests (02) (push) Blocked by required conditions
Tests / Code Coverage / tests (03) (push) Blocked by required conditions
Tests / Code Coverage / test-integration (push) Waiting to run
Tests / Code Coverage / test-e2e (push) Waiting to run
Tests / Code Coverage / repo-analysis (push) Blocked by required conditions
Tests / Code Coverage / test-sim-nondeterminism (push) Waiting to run
Tests / Code Coverage / test-clientv2 (push) Waiting to run
Tests / Code Coverage / test-core (push) Waiting to run
Tests / Code Coverage / test-depinject (push) Waiting to run
Tests / Code Coverage / test-errors (push) Waiting to run
Tests / Code Coverage / test-math (push) Waiting to run
Tests / Code Coverage / test-schema (push) Waiting to run
Tests / Code Coverage / test-collections (push) Waiting to run
Tests / Code Coverage / test-cosmovisor (push) Waiting to run
Tests / Code Coverage / test-confix (push) Waiting to run
Tests / Code Coverage / test-store (push) Waiting to run
Tests / Code Coverage / test-log (push) Waiting to run
Tests / Code Coverage / test-x-tx (push) Waiting to run
Tests / Code Coverage / test-x-nft (push) Waiting to run
Tests / Code Coverage / test-x-circuit (push) Waiting to run
Tests / Code Coverage / test-x-feegrant (push) Waiting to run
Tests / Code Coverage / test-x-evidence (push) Waiting to run
Tests / Code Coverage / test-x-upgrade (push) Waiting to run
Tests / Code Coverage / test-tools-benchmark (push) Waiting to run
239 lines
6.5 KiB
Go
239 lines
6.5 KiB
Go
package network
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
cmtcfg "git.cw.tr/mukan-network/mukan-consensus/config"
|
|
"git.cw.tr/mukan-network/mukan-consensus/node"
|
|
"git.cw.tr/mukan-network/mukan-consensus/p2p"
|
|
pvm "git.cw.tr/mukan-network/mukan-consensus/privval"
|
|
"git.cw.tr/mukan-network/mukan-consensus/proxy"
|
|
"git.cw.tr/mukan-network/mukan-consensus/rpc/client/local"
|
|
cmttypes "git.cw.tr/mukan-network/mukan-consensus/types"
|
|
cmttime "git.cw.tr/mukan-network/mukan-consensus/types/time"
|
|
"golang.org/x/sync/errgroup"
|
|
"google.golang.org/grpc"
|
|
|
|
"cosmossdk.io/log"
|
|
|
|
"git.cw.tr/mukan-network/mukan-sdk/server"
|
|
"git.cw.tr/mukan-network/mukan-sdk/server/api"
|
|
servergrpc "git.cw.tr/mukan-network/mukan-sdk/server/grpc"
|
|
servercmtlog "git.cw.tr/mukan-network/mukan-sdk/server/log"
|
|
authtypes "git.cw.tr/mukan-network/mukan-sdk/x/auth/types"
|
|
banktypes "git.cw.tr/mukan-network/mukan-sdk/x/bank/types"
|
|
"git.cw.tr/mukan-network/mukan-sdk/x/genutil"
|
|
genutiltypes "git.cw.tr/mukan-network/mukan-sdk/x/genutil/types"
|
|
)
|
|
|
|
func startInProcess(cfg Config, val *Validator) error {
|
|
logger := val.Ctx.Logger
|
|
cmtCfg := val.Ctx.Config
|
|
cmtCfg.Instrumentation.Prometheus = false
|
|
|
|
if err := val.AppConfig.ValidateBasic(); err != nil {
|
|
return err
|
|
}
|
|
|
|
nodeKey, err := p2p.LoadOrGenNodeKey(cmtCfg.NodeKeyFile())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
app := cfg.AppConstructor(*val)
|
|
val.app = app
|
|
|
|
appGenesisProvider := func() (*cmttypes.GenesisDoc, error) {
|
|
appGenesis, err := genutiltypes.AppGenesisFromFile(cmtCfg.GenesisFile())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return appGenesis.ToGenesisDoc()
|
|
}
|
|
|
|
cmtApp := server.NewCometABCIWrapper(app)
|
|
tmNode, err := node.NewNode( //resleak:notresource
|
|
cmtCfg,
|
|
pvm.LoadOrGenFilePV(cmtCfg.PrivValidatorKeyFile(), cmtCfg.PrivValidatorStateFile()),
|
|
nodeKey,
|
|
proxy.NewLocalClientCreator(cmtApp),
|
|
appGenesisProvider,
|
|
cmtcfg.DefaultDBProvider,
|
|
node.DefaultMetricsProvider(cmtCfg.Instrumentation),
|
|
servercmtlog.CometLoggerWrapper{Logger: logger.With("module", val.Moniker)},
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := tmNode.Start(); err != nil {
|
|
return err
|
|
}
|
|
val.tmNode = tmNode
|
|
|
|
if val.RPCAddress != "" {
|
|
val.RPCClient = local.New(tmNode)
|
|
}
|
|
|
|
// We'll need a RPC client if the validator exposes a gRPC or REST endpoint.
|
|
if val.APIAddress != "" || val.AppConfig.GRPC.Enable {
|
|
val.ClientCtx = val.ClientCtx.
|
|
WithClient(val.RPCClient)
|
|
|
|
app.RegisterTxService(val.ClientCtx)
|
|
app.RegisterTendermintService(val.ClientCtx)
|
|
app.RegisterNodeService(val.ClientCtx, *val.AppConfig)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
ctx, val.cancelFn = context.WithCancel(ctx)
|
|
val.errGroup, ctx = errgroup.WithContext(ctx)
|
|
|
|
grpcCfg := val.AppConfig.GRPC
|
|
|
|
if grpcCfg.Enable {
|
|
grpcLogger := logger.With(log.ModuleKey, "grpc-server")
|
|
var grpcSrv *grpc.Server
|
|
grpcSrv, val.ClientCtx, err = servergrpc.NewGRPCServerAndContext(val.ClientCtx, app, grpcCfg, grpcLogger)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Start the gRPC server in a goroutine. Note, the provided ctx will ensure
|
|
// that the server is gracefully shut down.
|
|
val.errGroup.Go(func() error {
|
|
return servergrpc.StartGRPCServer(ctx, grpcLogger, grpcCfg, grpcSrv)
|
|
})
|
|
|
|
val.grpc = grpcSrv
|
|
}
|
|
|
|
if val.APIAddress != "" {
|
|
apiSrv := api.New(val.ClientCtx, logger.With(log.ModuleKey, "api-server"), val.grpc)
|
|
app.RegisterAPIRoutes(apiSrv, val.AppConfig.API)
|
|
|
|
val.errGroup.Go(func() error {
|
|
return apiSrv.Start(ctx, *val.AppConfig)
|
|
})
|
|
|
|
val.api = apiSrv
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error {
|
|
genTime := cmttime.Now()
|
|
|
|
for i := range cfg.NumValidators {
|
|
cmtCfg := vals[i].Ctx.Config
|
|
|
|
nodeDir := filepath.Join(outputDir, vals[i].Moniker, "simd")
|
|
gentxsDir := filepath.Join(outputDir, "gentxs")
|
|
|
|
cmtCfg.Moniker = vals[i].Moniker
|
|
cmtCfg.SetRoot(nodeDir)
|
|
|
|
initCfg := genutiltypes.NewInitConfig(cfg.ChainID, gentxsDir, vals[i].NodeID, vals[i].PubKey)
|
|
|
|
genFile := cmtCfg.GenesisFile()
|
|
appGenesis, err := genutiltypes.AppGenesisFromFile(genFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
appState, err := genutil.GenAppStateFromConfig(cfg.Codec, cfg.TxConfig,
|
|
cmtCfg, initCfg, appGenesis, banktypes.GenesisBalancesIterator{}, genutiltypes.DefaultMessageValidator, cfg.TxConfig.SigningContext().ValidatorAddressCodec())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// overwrite each validator's genesis file to have a canonical genesis time
|
|
if err := genutil.ExportGenesisFileWithTime(genFile, cfg.ChainID, nil, appState, genTime); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance, genFiles []string) error {
|
|
// set the accounts in the genesis state
|
|
var authGenState authtypes.GenesisState
|
|
cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[authtypes.ModuleName], &authGenState)
|
|
|
|
accounts, err := authtypes.PackAccounts(genAccounts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
authGenState.Accounts = append(authGenState.Accounts, accounts...)
|
|
cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(&authGenState)
|
|
|
|
// set the balances in the genesis state
|
|
var bankGenState banktypes.GenesisState
|
|
cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[banktypes.ModuleName], &bankGenState)
|
|
|
|
bankGenState.Balances = append(bankGenState.Balances, genBalances...)
|
|
cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(&bankGenState)
|
|
|
|
appGenStateJSON, err := json.MarshalIndent(cfg.GenesisState, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
appGenesis := genutiltypes.AppGenesis{
|
|
ChainID: cfg.ChainID,
|
|
AppState: appGenStateJSON,
|
|
Consensus: &genutiltypes.ConsensusGenesis{
|
|
Validators: nil,
|
|
},
|
|
}
|
|
|
|
// generate empty genesis files for each validator and save
|
|
for i := range cfg.NumValidators {
|
|
if err := appGenesis.SaveAs(genFiles[i]); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func writeFile(name, dir string, contents []byte) error {
|
|
file := filepath.Join(dir, name)
|
|
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
return fmt.Errorf("could not create directory %q: %w", dir, err)
|
|
}
|
|
|
|
if err := os.WriteFile(file, contents, 0o600); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Get a free address for a test CometBFT server
|
|
// protocol is either tcp, http, etc
|
|
func FreeTCPAddr() (addr, port string, closeFn func() error, err error) {
|
|
l, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
return "", "", nil, err
|
|
}
|
|
|
|
closeFn = func() error {
|
|
return l.Close()
|
|
}
|
|
|
|
portI := l.Addr().(*net.TCPAddr).Port
|
|
port = fmt.Sprintf("%d", portI)
|
|
addr = fmt.Sprintf("tcp://0.0.0.0:%s", port)
|
|
return addr, port, closeFn, err
|
|
}
|