As mentioned before, Credit Smart Chain is a set of different modules, all connected to each other.
The Blockchain is connected to the State , or for example, Synchronization , which pipes new blocks into the Blockchain .
Copy func NewServer(logger hclog.Logger, config *Config) (*Server, error) {
m := &Server{
logger: logger,
config: config,
chain: config.Chain,
grpcServer: grpc.NewServer(),
}
m.logger.Info("Data dir", "path", config.DataDir)
// Generate all the paths in the dataDir
if err := setupDataDir(config.DataDir, dirPaths); err != nil {
return nil, fmt.Errorf("failed to create data directories: %v", err)
}
// Get the private key for the node
keystore := keystore.NewLocalKeystore(filepath.Join(config.DataDir, "keystore"))
key, err := keystore.Get()
if err != nil {
return nil, fmt.Errorf("failed to read private key: %v", err)
}
m.key = key
storage, err := leveldb.NewLevelDBStorage(filepath.Join(config.DataDir, "blockchain"), logger)
if err != nil {
return nil, err
}
m.storage = storage
// Setup consensus
if err := m.setupConsensus(); err != nil {
return nil, err
}
stateStorage, err := itrie.NewLevelDBStorage(filepath.Join(m.config.DataDir, "trie"), logger)
if err != nil {
return nil, err
}
st := itrie.NewState(stateStorage)
m.state = st
executor := state.NewExecutor(config.Chain.Params, st)
executor.SetRuntime(precompiled.NewPrecompiled())
executor.SetRuntime(evm.NewEVM())
// Blockchain object
m.blockchain, err = blockchain.NewBlockchain(logger, storage, config.Chain, m.consensus, executor)
if err != nil {
return nil, err
}
executor.GetHash = m.blockchain.GetHashHelper
// Setup sealer
sealerConfig := &sealer.Config{
Coinbase: crypto.PubKeyToAddress(&m.key.PublicKey),
}
m.Sealer = sealer.NewSealer(sealerConfig, logger, m.blockchain, m.consensus, executor)
m.Sealer.SetEnabled(m.config.Seal)
// Setup the libp2p server
if err := m.setupLibP2P(); err != nil {
return nil, err
}
// Setup the GRPC server
if err := m.setupGRPC(); err != nil {
return nil, err
}
// Setup jsonrpc
if err := m.setupJSONRPC(); err != nil {
return nil, err
}
// Setup the syncer protocol
m.syncer = protocol.NewSyncer(logger, m.blockchain)
m.syncer.Register(m.libp2pServer.GetGRPCServer())
m.syncer.Start()
// Register the libp2p GRPC endpoints
proto.RegisterHandshakeServer(m.libp2pServer.GetGRPCServer(), &handshakeService{s: m})
m.libp2pServer.Serve()
return m, nil
}