// startChainRPC opens a RPC client connection to a dtcd server for blockchain // services. This function uses the RPC options from the global config and // there is no recovery in case the server is not available or if there is an // authentication error. Instead, all requests to the client will simply error. func startChainRPC(certs []byte) (*chain.RPCClient, error) { log.Infof("Attempting RPC client connection to %v", cfg.RPCConnect) rpcc, err := chain.NewRPCClient(activeNet.Params, cfg.RPCConnect, cfg.DcrdUsername, cfg.DcrdPassword, certs, cfg.DisableClientTLS, 0) if err != nil { return nil, err } err = rpcc.Start() return rpcc, err }
func (s *loaderServer) StartConsensusRpc(ctx context.Context, req *pb.StartConsensusRpcRequest) ( *pb.StartConsensusRpcResponse, error) { defer zero.Bytes(req.Password) defer s.mu.Unlock() s.mu.Lock() if s.rpcClient != nil { return nil, grpc.Errorf(codes.FailedPrecondition, "RPC client already created") } networkAddress, err := cfgutil.NormalizeAddress(req.NetworkAddress, s.activeNet.RPCClientPort) if err != nil { return nil, grpc.Errorf(codes.InvalidArgument, "Network address is ill-formed: %v", err) } // Error if the wallet is already syncing with the network. wallet, walletLoaded := s.loader.LoadedWallet() if walletLoaded && wallet.SynchronizingToNetwork() { return nil, grpc.Errorf(codes.FailedPrecondition, "wallet is loaded and already synchronizing") } rpcClient, err := chain.NewRPCClient(s.activeNet.Params, networkAddress, req.Username, string(req.Password), req.Certificate, len(req.Certificate) == 0, 1) if err != nil { return nil, translateError(err) } err = rpcClient.Start() if err != nil { if err == dcrrpcclient.ErrInvalidAuth { return nil, grpc.Errorf(codes.InvalidArgument, "Invalid RPC credentials: %v", err) } return nil, grpc.Errorf(codes.NotFound, "Connection to RPC server failed: %v", err) } s.rpcClient = rpcClient if walletLoaded { wallet.SynchronizeRPC(rpcClient) } return &pb.StartConsensusRpcResponse{}, nil }