am I doing this right? Changing colour for all clients

I have 3 instances of a local host game open, on each, when I press spacebar, I want the player associated with that client to turn green, and be shown green in all the other game windows.

The following code works, but is it the correct way of doing these things?

using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using UnityEngine;

public class test_box : NetworkBehaviour {

    public override void OnStartLocalPlayer()
{
GetComponent<MeshRenderer>().material.color = Color.blue;
}

    public void Update()
    {
        if (isLocalPlayer)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                CmdChangeColor(Color.green);
            }
            if (Input.GetKeyUp(KeyCode.Space))
            {
                CmdChangeColor(Color.blue);
            }
        }
    }
    [Command]
    void CmdChangeColor(Color color)
    {
        RpcChangeColor(color);
    }

    [ClientRpc]
    void RpcChangeColor(Color color)
    {
        if (color == Color.blue && !isLocalPlayer)
        {
            GetComponent<MeshRenderer>().material.color = Color.white;
        }
        else
        {
            GetComponent<MeshRenderer>().material.color = color;
        }
    }
}

seems a bit slow over matchmaker, the host will turn green before the clients even if spacebar is pressed by a client. Ideally I’m looking for a way to do this where the effect happens for all at the same time.

Answering my own post with updated code, this method only requires the colour change function once.

using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using UnityEngine;

public class test_box : NetworkBehaviour {

    // make the local player box have custom values
    public override void OnStartLocalPlayer()
{
        GetComponent<MeshRenderer>().material.color = Color.blue;
}

    public void Update() // Step 1
    {
        if (isLocalPlayer)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                ChangeColorGlobal(Color.green);
            }
            if (Input.GetKeyUp(KeyCode.Space))
            {
                ChangeColorGlobal(Color.blue);
            }
        }
    }

    // client makes a change.
    void ChangeColorGlobal(Color color) // Step 2
    {
        ChangeColor(color); //skip to step 5 locally
        // send change to server.
        CmdChangeColor(color);
    }

    [Command]
    void CmdChangeColor(Color color) // Step 3
    {
        //send change back to all clients.
        RpcChangeColor(color);
    }

    [ClientRpc]
    void RpcChangeColor(Color color) // Step 4
    {
        // don't recieve the change if we are the client that sent it.
        if (isLocalPlayer) return;
        // send the change to the clients locally.
        ChangeColor(color);
    }

    void ChangeColor(Color color) // Step 5, change the colour.
    {
        if (color == Color.blue && !isLocalPlayer)
        {
            GetComponent<MeshRenderer>().material.color = Color.white;
        }
        else
        {
            GetComponent<MeshRenderer>().material.color = color;
        }
    }
}

Is this as clean as the operation can be or is there a better way? (networking & effect wise)