Skip to main content

Overview

RGB Lightning Node (RLN) can run in external-signer mode. In this mode the node holds no seed and no private keys. Every signing operation it needs — channel signing, node cryptography (ECDH, inbound payments, peer storage, offers), and RGB PSBT signing — is answered by a signer built on Validating Lightning Signer (VLS). VLS does not sign blindly: it checks every request for protocol correctness and against its policy before producing a signature, and rejects anything that fails. External-signer mode is part of the Utexo RLN (#27, #95) and is used by the Utexo WDK today. Like the rest of RLN it is in beta: on mainnet, RLN supports on-chain RGB operations only.

Deployment modes

Both modes share one signer contract (rln-external-signer) and a VLS core patched for RGB channels.

Validation flow

Because the keys never reach the node:
  • Reduced attack surface: a compromised node cannot read signing keys.
  • Policy enforcement: the signer refuses requests that break protocol rules or its policy.
  • Self-custody: keys stay in the environment you control.

What changes in external-signer mode

Run the remote signer daemon

The daemon and the node’s remote-signer support are behind the remote-signer cargo feature. It is not enabled in the default build or the Docker image, so build from source:
1

Start the daemon

A new seed is generated (file mode 0600) if --seed-file does not exist. The daemon keeps its VLS state in --data-dir (default: a signer-db directory next to the seed file). Persist this directory — it is what lets a restarted daemon keep signing for existing channels.--network accepts bitcoin, testnet, signet, or regtest.
2

Copy the auth token to the node

From v0.16.0-beta.3, every connection to the daemon must start with a shared auth token, including connections on loopback. On first start the daemon generates the token (mode 0600) at --auth-token-file, by default auth-token inside --data-dir. Copy it into the node’s storage directory as remote-signer-auth-token:
The file must be readable only by its owner. If the node’s copy does not match the daemon’s token, the daemon rejects the connection and the node reports that its remote-signer-auth-token does not match.
3

Print the signer identity

This prints the daemon’s bootstrap identity as JSON and exits.
4

Start the node pointing at the daemon

5

Initialise external-signer mode

Send the bootstrap JSON from step 2 to the locked node:
The node probes the daemon at --remote-signer-addr and rejects the request if the submitted identity does not match the live daemon.
6

Unlock

Call POST /unlock as usual. In external-signer mode the password field is not checked; the Biscuit token is the credential that protects the node.
If remote-signer-tls/ca.pem is missing, the node connects to the daemon without TLS. Always provision the TLS directory when the node and the signer are not on the same host.
--permissive relaxes the VLS policy for development and testing. Never use it with real funds; the daemon refuses it on mainnet.