Skip to content

Recovering access to a node

One of the core benefits of Greenlight over self-hosted nodes is the ability to separate the state management in the form of the node database from the authorizing party, i.e., the Signer. This allows users to seamlessly recover access to their node in case of a boating accident, by simply proving ownership of the private key that corresponds to that node.

In order to recover access all you need to do is recover the seed from the BIP39 seed phrase and initialize the Signer with it:

let seed = read_file("seed");
let network = gl_client::bitcoin::Network::Bitcoin;
let creds = Nobody {
    cert: nobody_cert,
    key: nobody_key,
    ..Nobody::default()
};

let signer = gl_client::signer::Signer::new(seed, network, creds.clone()).unwrap();

let scheduler =
    gl_client::scheduler::Scheduler::new(gl_client::bitcoin::Network::Bitcoin, creds)
        .await
        .unwrap();

scheduler.recover(&signer).await
seed = read_file("seed")
network = "bitcoin"
signer_creds = Credentials.nobody_with(developer_cert, developer_key)
signer = Signer(seed, network, signer_creds)

scheduler = Scheduler(
    network,
    signer_creds,
)

scheduler_creds = signer_creds.upgrade(scheduler.inner, signer.inner)

scheduler = Scheduler(
    network,
    scheduler_creds,
)

scheduler.recover(signer)

Notice that we are using a TlsConfig that is not configured with a client certificate and key, because that's what we're trying to recover. In the background the scheduler instance will contact the Scheduler service, retrieve a challenge, sign that challenge with the signer, and then call recover with that proof signature. The Scheduler will then check the challenge-response passed to recover and if successful, generate a new certificate for the client, which will provide access to the node.

Important

Remember to store the device_cert and device_key from the result so you can load it next time you want to interact with the node.