func (s *loaderServer) CreateWallet(ctx context.Context, req *pb.CreateWalletRequest) ( *pb.CreateWalletResponse, error) { defer func() { zero.Bytes(req.PrivatePassphrase) zero.Bytes(req.Seed) }() // Use an insecure public passphrase when the request's is empty. pubPassphrase := req.PublicPassphrase if len(pubPassphrase) == 0 { pubPassphrase = []byte(wallet.InsecurePubPassphrase) } wallet, err := s.loader.CreateNewWallet(pubPassphrase, req.PrivatePassphrase, req.Seed) if err != nil { return nil, translateError(err) } s.mu.Lock() if s.rpcClient != nil { wallet.SynchronizeRPC(s.rpcClient) } s.mu.Unlock() return &pb.CreateWalletResponse{}, nil }
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 == btcrpcclient.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 }
func (s *loaderServer) OpenWallet(ctx context.Context, req *pb.OpenWalletRequest) ( *pb.OpenWalletResponse, error) { // Use an insecure public passphrase when the request's is empty. pubPassphrase := req.PublicPassphrase if len(pubPassphrase) == 0 { pubPassphrase = []byte(wallet.InsecurePubPassphrase) } wallet, err := s.loader.OpenExistingWallet(pubPassphrase, false) if err != nil { return nil, translateError(err) } s.mu.Lock() if s.rpcClient != nil { wallet.SynchronizeRPC(s.rpcClient) } s.mu.Unlock() return &pb.OpenWalletResponse{}, nil }